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

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

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

19957 次点击
所在节点    程序员
93 条回复
Louis423Lee
2022-05-31 17:41:26 +08:00
感谢 op ,请问能选择视频的清晰度下载吗?
dabaisuv
2022-05-31 17:44:03 +08:00
@Louis423Lee 可以的,原理就是 hook 播放的视频的二进制流,你只要能把视频的画质调到对应的清晰度即可。
goodhellonice
2022-05-31 17:50:25 +08:00
试了下哔哩哔哩。。。。结果只下载了音频
dabaisuv
2022-05-31 17:54:35 +08:00
@goodhellonice 我测试的时候,各大网站都行的,你看看是不是有下载被拦截了,我的谷歌浏览器在一次性弹两个下载时会自动拦截一个,这个需要你同意多个文件下载权限
linglin0924
2022-05-31 17:57:15 +08:00
刚试了油管,看完视频自动下载了视频和一个音频。感觉自动下载有点那啥。

可以的话让用户给选择是否下载
linglin0924
2022-05-31 17:58:28 +08:00
最近有一些不能下载的视频,我都是用这个插件,看他的运行方式,应该也是读流合并的

https://chrome.google.com/webstore/detail/video-downloader-cococut/gddbgllpilhpnjpkdbopahnpealaklle
creanme
2022-05-31 17:58:41 +08:00
IDM 可以自动识别
HeyWeGo
2022-05-31 17:58:45 +08:00
试了下油管:
如果一个视频有 4 分钟,开头我看了 10s ,然后手动跳过一部分未缓存的,继续播 3 分之后的内容,是不是就没法完整缓存整个了,分两段下载?
hbtech
2022-05-31 18:00:21 +08:00
libook
2022-05-31 18:02:37 +08:00
这个东西很厉害,基本能突破很多 HLS 加密方案了。
dabaisuv
2022-05-31 18:02:58 +08:00
@HeyWeGo 也是一段,但是最终通过 ffmpeg 合成后,播放到你跳过的那段好像会空白还是跳过,这个不太记得了
goodhellonice
2022-05-31 18:07:34 +08:00
@dabaisuv 好的 我再看看 是不是我开着其他脚本或扩展的问题 谢谢
dabaisuv
2022-05-31 18:09:14 +08:00
@linglin0924 这个可以选择,在源代码里面把 window.autoDownload 设置为 0 就行,然后想下载的话在控制台输入 window.downloadAll = 1 。我设置成自动下载,主要是因为有些视频网站是 iframe 里面播放的,这样在控制台输入 window.downloadAll = 1 的话,下载的会是空白的,因为视频的缓存是在 iframe 里面,两者的 window 指向不同 document 。以后可能会更新就算视频在 iframe 里面也能下载到的功能。现在的最佳解决办法就是自动下载,配合油猴的开关插件,在需要的时候再载入插件
dabaisuv
2022-05-31 18:17:33 +08:00
@linglin0924
@hbtech
看了下说明,没安装,他这个可能是获取 m3u8 格式的 ts 文件后合并下载的,如果是这样的话,适用范围可能不是太广。你有用它试过下载 xilixili 视频吗,如果能下载的话,可能就是直接获取二进制流的,那跟我原理差不多
linglin0924
2022-05-31 18:37:21 +08:00
@dabaisuv 这个插件,下载 b 站的视频得用录制模式,也是得等加载完才算下载完
teasick
2022-05-31 18:39:15 +08:00
以为无下限视频
dabaisuv
2022-05-31 18:43:49 +08:00
@linglin0924
感谢回复,那应该是一样的。我写脚本之前搜到有人推荐类似的,不过说的是下载 m3u8 。我这才写了这个脚本,不过好像白折腾了。
crab
2022-05-31 18:50:08 +08:00
91 上音频没问题,视频文件大小 OK ,时间不对。
libook
2022-05-31 18:51:00 +08:00
目前测试了主流的 HLS 加密,以及小鹅通那种比较强一些的加密也都是可以下载下来的。

不过小鹅通下载下来的音频有问题,声音非常低沉,不知道是不是开了 16 倍速的原因。
dabaisuv
2022-05-31 18:51:23 +08:00
@crab 感谢回复,能说下具体情况吗

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

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

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

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

© 2021 V2EX