当前位置: 首页 > Web前端 > HTML5

Blob协议-浏览器数据封装

时间:2023-04-05 14:15:14 HTML5

我们在使用网页展示数据的时候,都会使用data:协议来展示数据。上传图片等常见场景,一般都是从文件中读取后,转成base64编码,然后使用data:协议显示图片。具体操作有很多,比如FileReader从文件中读取二进制,用Canvas绘制然后转为二进制等,我提出来的主要原因是为了网络视频下载。现代HTML5视频播放常用操作相比之下,对于视频提取,我们通常提取视频的原始地址,如https://hostname/path/to/video.mp4?token=token_value?t=some_time,版权owner或videoowner会通过各种验证(包括不限于时间、机器、IP、登录session)确保视频不会被下载。在早期,大多数视频都处于HTML5时代。都是原视频链接,加上一堆验证码保证视频下载难度。经过一段时间的开发,大家似乎找到了一个通用的解决方案,就是blob:协议,通过JS处理来自服务端的视频分享。slice,然后在浏览器本地通过URL.createObjectURL创建一个URI提供视频下载,代码如下:vardata=URL.createObjectURL(newBlob(["hello,world"],{type:"text/plain"}))得到的URI如下:blob:https://dxkite.cn/1fbd093a-d40f-4798-9114-85992f0929fb,浏览器新标签页打开会是hello,world的纯文本响应,页面存活有效定期或手动调用URL.revokeObjectURL回收数据。数据回收后,该文件将被删除。在视频播放器的运行中,通常是这样一段代码,从后端获取数据,处理成blob:协议的数据。播放时,很难通过视频链接获取视频(这里是blob协议的地址),因为创建后被删除constvideo=document.getElementById('video');constobj_url=window.URL.createObjectURL(blob);video.src=obj_url;video.play()window.URL.revokeObjectURL(obj_url);获取blob流的可行方案一般来说,在播放视频的时候,视频创建的blob流会被回收,但是众所周知,浏览器是我们自己的东西,想换成不是很容易我们自己的形状?JS的一切都可以改变,例如:(function(){'usestrict';console.log('挂钩运行');var_cou=window.URL.createObjectURL;window.URL.createObjectURL=function(obj){varurl=_cou(obj)console.log("createObjectURLobj:",obj)console.log("createObjectURLurl:",url)returnurl}window.URL.revokeObjectURL=function(url){console.log("revokeObjectURL:",url)}})();在所有脚本执行前HOOK就够了。比如你在B站hook,可以看到hook的地址和播放器的地址:PS:crumbs,如果blob没有释放,也会失败。我可能需要更多替代方法才能继续。我无法播放视频。我已经入侵了你的网页,你为什么显示不在我的控制之下?继续修改JS,增加一层MediaSource方法Hook://调用SourceBuffervar_addSourceBuffer=window.MediaSource.prototype.addSourceBufferwindow.MediaSource.prototype.addSourceBuffer=function(mime){console.log("MediaSource.addSourceBuffer",mime)varsourceBuffer=_addSourceBuffer.call(this,mime)var_append=sourceBuffer.appendBuffersourceBuffer.appendBuffer=function(buffer){console.log(mime,buffer)_append.call(this,buffer)}returnsourceBuffer}上面的代码实现了HOOK网页中媒体资源的控制,没错,获取到的是视频的原始二进制数据,scraps,这个时候文档到这里就没了,网站就没了如果继续的话,还是拜年Offering,ArrayBuffer是视频二进制数据,然后export一下就可以参考https://developer.mozilla.org...https://developer.mozilla.org...https://developer.mozilla.org。..https://developer.mozilla.org...https://developer.mozilla.org...https://developer.mozilla.org...回复:https://dxkite.cn/index。PHP/一个...