写了一个无限制视频下载脚本

2022-05-31 17:38:14 +08:00
 dabaisuv

在家想下载视频到本地,发现很多视频网站的video标签的src指向了 Blob: http(s)://xxx.xxx.xxx/xxx,直接进这个链接的话会显示链接已禁用。 想法:既然能播放视频,就证明视频到最后一定是被 video 拿到了的.

谷歌一圈后发现了: 1.window.URL.createObjectURL(object)方法会返回该链接

A File, Blob, or MediaSource object to create an object URL for.( https://developer.mozilla.org/en-US/docs/Web/API/URL/createObjectURL

2.window.URL.revokeObjectURL(objectURL),禁用上面返回的链接

A string representing a object URL that was previously created by calling createObjectURL().( https://developer.mozilla.org/en-US/docs/Web/API/URL/revokeObjectURL)

尝试:

1.hook 了window.URL.revokeObjectURL(objectURL)来忽略禁用请求,结果没用,依旧被禁用。

2.换个方法,直接 hook 二进制流,你缓存多少,我给你复制多少。查了下MediaSource, 他结合上面的createObjectURL(object)可以分片的方式加载视频,大概就是看多少,就加多少。 其中的音频和视频分别放在两个 sourceBuffer 中,直接 hook 住SourceBuffer.appendBuffer()就能实现视频流的截取了。再将每个分片以数组的方式保存下来,最后等视频缓存完后 new Blob(video/audio bufferArray)这样就实现了视频和音频的保存。

3.由于播放的时候,视频和音频分在两个 SourceBuffer 中,所以最后会得到两个文件。又是一番谷歌,有如下命令:

ffmpeg -i video.mp4 -i audio.mp4 -c:v copy -c:a aac -strict experimental output.mp4

可以将其合并为一个视频。

4.想过用 ffmpeg 的 wasm 库来在线合并,最后输出的,发现 ffmpeg-core 初始化时所需要的文件在国内下载不下来导致报错,从而导致适用的用户可能有点少,所以就没加,可能是我使用方法不对,以后有时间可以改改。

5.发现有些网站的视频是在iframe标签下的,并且加了sandbox属性,而有该属性的话就会导致最后的下载被拦截,于是,我使用了如下代码来将页面中的所有frame替换成无sandbox属性的:

 (function (that) {
          let removeSandboxInterval = setInterval(() => {
             if (that.document.querySelectorAll('iframe')[0] !== undefined) {
                that.document.querySelectorAll('iframe').forEach((v, i, a) => {
                   let ifr = v;
                   ifr.removeAttribute('sandbox');
                   const parentElem = that.document.querySelectorAll('iframe')[i].parentElement;
                   a[i].remove();
                   parentElem.appendChild(ifr);
                });
                clearInterval(removeSandboxInterval);
             }
          }, 1000);
       })(window);

于是有了如下油猴脚本:

英文名:Unlimited_downloader

https://greasyfork.org/en/scripts/445751-unlimited-downloader

Ps: 都是谷歌翻译成英文的,因为英文是个通用语言,所以不同地方的人看起来可能要方便点。

简短说明:

原理:直接 hook 媒体二进制流,换句话说就是你能看到,你就能下载,你能缓存多快,你就能下载多快。

使用方法:安装后,打开任意有视频或音频的网站,等视频缓存条加载完后会自动下载下来。

也可以自己手动开 16 倍速加速缓存,控制台输入:document.querySelector('video').playbackRate = x

最后,免责声明:请在合法范围内使用脚本,请勿用作任何非法用途,后果与作者无关。

23647 次点击
所在节点    程序员
95 条回复
darer
2022-05-31 20:18:00 +08:00
提个小建议 文件名可以改成 title_format
darer
2022-05-31 20:20:35 +08:00
@libook 倍速后音频会过一个变速不变调算法 估计是这个的缘故
HFX3389
2022-05-31 20:30:04 +08:00
@Buges #22 知道了在哪改的话,弄个按量付费的云服务器,24G 内存的 80~100 左右一天(因为我没试过编译 chromium 需要多久所以就按一天算),而且浏览器这类应用编译完一次可以用很久的
dabaisuv
2022-05-31 20:33:05 +08:00
@darer 感谢回复,我一会就改成 title_format 格式。
Buges
2022-05-31 20:39:07 +08:00
@HFX3389 没试过这种方式,但我盲猜国内服务器第一步代码都拉不下来。而且修改了以后还是要调试的,增量编译+链接一次也要几分钟。
HFX3389
2022-05-31 20:46:33 +08:00
@Buges #45 那就弄香港、日本、韩国、新加坡的服务器呗,这样代码拉下来就容易多了;至于后面的修改调试就得看前期代码熟练度了,不能啥都没看就直接上服务器吧,这样太烧钱了,一天一百。应该是先在本地上看完大致有个思路、模板什么的,到时候一击必中或者只要经过很小的调试就可以用
Hansah
2022-05-31 20:49:55 +08:00
@libook 正在下小鹅通。分享链接到傲游 PC 端,然后扫码或者短信登录,自带的资源管理器能嗅探到文件链接,下载就行了。如果播放不了就在点播放后切换线路就行了。
dabaisuv
2022-05-31 21:19:47 +08:00
@ijrou 感谢回复,看了下它的 js 源码,定位到这一行是检测代码
//(t || 1 == i || n && "auto" !== n || r && -1 === r.indexOf("360") || o) && (s.remove(), s.setStorage(), s.destroy())
是循环检测的。注释掉就行了。但是我不打算加入到脚本,这个太有针对性了,有法律风险;
dabaisuv
2022-05-31 21:45:27 +08:00
@darer 感谢建议,插件更新了,目前可以简单的防止 hook 检测,并且下载的文件名会是:网站标题+audio/video.mp4
lizhenda
2022-05-31 21:51:08 +08:00
思路不错哦
dabaisuv
2022-05-31 21:59:29 +08:00
@lizhenda 谢谢支持
zhw2590582
2022-05-31 21:59:34 +08:00
和我之前写得一个 chrome 扩展差不多原理,用来转码获取 B 站直播间的 Flv 流,后面发现直播地址会因为网络波动而变化,获取到的流不能合并在一起,后面换了个思路,直接用 MediaRecorder ,随他地址怎么切换都能录制

https://chrome.google.com/webstore/detail/bilibili-%E5%BD%95%E6%92%AD%E5%A7%AC/nagmkdppcmenlcgelpgkjoknakghllml
xx3122
2022-05-31 23:13:29 +08:00
马了,期待支持所有网站
dabaisuv
2022-05-31 23:25:32 +08:00
@zhw2590582 感谢回复,MediaRecorder ,涨知识了,之前我还没查到这个函数
dabaisuv
2022-05-31 23:26:19 +08:00
@xx3122 感谢回复,有问题可以在这里或者 github or greasyFork 提哦
ufan0
2022-05-31 23:33:17 +08:00
很久之前捯饬过,没用到啥技术,只是扒 ie 浏览器的缓存,直接提取缓存文件拼接。

希望楼主工具越做越好,mark ~
neptuno
2022-06-01 00:00:42 +08:00
@libook #40 小鹅通链接替换下就行了,很简单的
dabaisuv
2022-06-01 00:02:59 +08:00
@ufan0 感谢支持,会持续更新的.
byte10
2022-06-01 08:14:43 +08:00
这个样的插件是不是很多?我以前好像用到过这样的脚本,也是用谷歌的插件去下载视频。可以下载腾讯课堂的视频
hahahahahahahah
2022-06-01 09:38:38 +08:00
a 站下载音频有问题,没有倍速

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/856510

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX