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

2022 年 5 月 31 日
 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

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

25684 次点击
所在节点    程序员
95 条回复
shaojz2005
2022 年 6 月 2 日
@dabaisuv 我用了这个帖子里另外一个
dabaisuv
2022 年 6 月 2 日
@heiyutian 这个不太会,有时间会考虑的
@Rrrrrr 这个。。不下的话就把插件关掉吧,自动下载主要针对 iframe 的,如果手动的话,会出现控制不了 iframe 里面视频的情况。你看打开一个视频网页,这个插件会加载多次(出现多个 start.....),这就是因为每个 iframe 也会加载一次插件,他们在不同的上下文中。手动的话只能控制最上层那个,就会出现视频下载空白的现象
MiketsuSmasher
2022 年 6 月 13 日
楼主的这个脚本无法下载学习通课程视频,即便在脚本文件里设置 window.autoDownload = 1 也没有用,在控制台设置 window.downloadAll = 1 下载到的是空白文件
dabaisuv
2022 年 6 月 13 日
@MiketsuSmasher 它视频就没加密,直链就能下载。。。。,记得把 refer 标头改成视频页面网址就行的
xff236
2023 年 2 月 4 日
@libook 遇到同样问题,音频声音低沉,这个怎么解决?谢谢
dsyrock
2023 年 2 月 4 日
你好,感谢做了这个插件。有个问题是,有些视频有不同的清晰度选择。我则腾讯上测试,选择了 720P 的,然后刷新一次,保证从头播放的时候就是这个清晰度,但是脚本下载下来也是 480P 的,请问这个清晰度可以选择吗?
Memorainer
2023 年 2 月 5 日
@libook 同样遇到了这个问题。下载下来的音频本来就是低沉的带有很重的机械音,根本听不清楚。可以结合上面提到的插件 cococut 配合爬取。
Memorainer
2023 年 2 月 5 日
@xff236 配合 CoCocut 插件。CoCocut 本来也可以爬小鹅通,但文件体积不知道为什么比脚本爬取的小很多。如果担心文件质量有问题的话,可以用 ffmpeg 把插件下下来的视频里的音频流提出来再混到脚本下载的视频流里去。
Memorainer
2023 年 2 月 11 日
关于合并两条流,OP 的命令似乎有不可预知的问题。chatGPT 给出了方案,流直接复制,无需再编码:ffmpeg -i videoA.mp4 -i videoB.mp4 -map 0:v -map 1:a -c:v copy -c:a copy videoC.mp4
-i videoA.mp4 和 -i videoB.mp4 表示读取视频 A 和视频 B 的源文件。
-map 0:v 和 -map 1:a 分别表示选择视频 A 的画面和视频 B 的声音。
-c:v copy 和 -c:a copy 表示复制视频 A 的画面和视频 B 的声音。
最后,videoC.mp4 表示合并后的新视频的输出文件。
BetterSci
2023 年 2 月 26 日
@dabaisuv 小鹅通怎么下载视频呢?
BetterSci
2023 年 2 月 26 日
小鹅通、知网视频都无法下载,求解决方案
xxxxLyq
2023 年 6 月 28 日
@Memorainer 这个命令解决了我的问题。我遇到的情况是:下载下来的音频视频两个文件,用 quicktimeplayer 打开看长度都是原视频的两倍,前面一半正常,后面一半是空的。用你的命令处理出来一切都正常。
recall704
2023 年 8 月 13 日
ffmpeg 合并的小工具 https://github.com/rxaa/MediaMux
fang5566
2024 年 12 月 18 日
这个脚本咋在 greasyfork 上面删除了呢?
attbxbm
2025 年 8 月 5 日
那我是不是可以这样理解,所有能在谷歌浏览器播放的视频,谷歌都能 download,毕竟浏览器都是谷歌写的,底层怎么样都绕不开。

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

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

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

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

© 2021 V2EX