深度拆解抖音无水印视频下载油猴脚本:五路寻源智能打分,四重降级流式落盘全解析

前言:本文深度拆解一款抖音无水印视频下载油猴脚本的完整原理:通过网络拦截、递归解析JSON、读取播放器实例等多源归集,智能打分选出最优视频直链;再以FileSystem Access API流式落盘、GM_download与GM_xmlhttpRequest梯队降级完成抖音网页版视频下载,并在保存前校验文件真实性,教你绕过防盗链与跨域限制,把抖音视频批量保存到本地硬盘。

我把那个抖音下载脚本,翻了个底朝天

前两天一个朋友甩给我一个文件,一个js文件,说,你看看这个,能下抖音无水印的视频。

我寻思,这不就是个油猴脚本吗,网上遍地都是,有什么好看的。

他就回我一句,你扒开看看就知道了。

我扒开了。

看完之后我愣了半天。

怎么说呢,这玩意儿根本不是我以为的那种,拿一个a标签点一下、或者干脆糊弄你一个带水印视频的小脚本。它是一个,迷你版的专业下载器。有网络拦截,有多源归集,有梯队降级,有数据校验,甚至会在保存之前,先闻一闻这个文件到底是不是真视频。

你敢信???

想存下来,但它带水印
想存下来,但它带水印

先交代下背景。经常在抖音刷到想存下来的视频的朋友,应该都有体会。官方下载自带水印,就算你装了一堆去水印App,很多也就是帮你录个屏,画质糊成一片。所以网上一直流传着各种土办法,其中比较靠谱的一类,就是油猴脚本。

油猴脚本是什么,就是跑在浏览器里的一段JS。你装个浏览器插件,访问抖音网页版,脚本就在你背后偷偷帮你干活。

但说实话,愚钝如我,以前一直觉得这类脚本能干的事挺有限的。毕竟视频是人家平台的,防盗链、跨域限制、各种反爬签名,一道一道墙垒在那儿。一个跑在浏览器角落里的脚本,能翻出什么浪来。

结果这脚本直接给我上了一课。真的,一堂大课。

跑在浏览器角落里的代码
跑在浏览器角落里的代码

先说最基础的问题,视频的下载地址,到底是从哪来的。

我原来以为,就是去网页里找那个video标签,把src抠出来,完事儿。

这脚本确实也这么干,但这是它最后一步的兜底。它的正经路子,是五条渠道同时撒网,捞回来的URL再打分,选最优的。

哪五条,我跟你说。

第一路,网络拦截。脚本在页面一加载的时候就动手了,把浏览器原生的fetch和XMLHttpRequest全给hook住,所有网络请求都得从它手里过一遍。只要长得像视频地址的,带.mp4的,带douyinvod的,带video/tos这种关键字的,全给你记到小本本上。它还注册了一个PerformanceObserver,把页面上加载过的所有资源,整个翻了一遍。

第二路,更暴力。抖音网页版不是要调接口拿视频数据吗,脚本直接把接口返回的那整棵JSON树,递归遍历一遍。它压根不看字段名叫什么,因为抖音的字段三天两头变,就一条铁规则,把所有长得像视频链接的字符串,全给我抓出来。你接口随便改,正则总不会变吧。

第三路,掏播放器底裤。抖音网页版用的播放器是西瓜播放器,脚本直接去window上找播放器的全局实例,把播放器内存里的配置读出来。download_url,video_url,播放器正打算请求的无水印流,直接被人在兜里掏走了。这算不算偷家。

第四路,扒内联数据。有些视频信息是服务端直接写在HTML的script标签里发回来的,脚本就把所有script标签抠出来,解析里面的RENDER_DATA和隐藏的JSON,再用那套递归扫描法,扫一遍。

第五路,才轮到我们以为的常规操作,找页面上的video标签,拿currentSrc,拿src,拿source子节点。

五条渠道捞上来的URL,少说十几个,标清的,高清的,全混在一起。。。然后有个打分函数,键名带download的加分,是mp4直链的加分,长得像音频的,狠狠扣分。得分最高的当主链接,剩下的打包成候选列表,等着前面那个挂了,顶上去。

所有请求,都得从它手里过
所有请求,都得从它手里过

坦率的讲,看到这儿,我已经有点服气了。但真正给我一下子整不会的,是它的下载引擎。

下载地址搞到手了,怎么变成硬盘里的一个文件。我原来以为,创建一个a标签,地址填进去,模拟点一下,浏览器自己会下。

这脚本确实有这么一步,但那是它最后用来唤起保存弹窗的体面。真正的下载过程,它准备了四招,一招一招往下试,像排雷一样。

第一招,浏览器原生的FileSystem Access API。你在批量下载的时候授权了目录,脚本就用fetch把视频流拉下来,用ReadableStream的getReader()一块一块读,再用FileSystemWritableFileStream,直接往硬盘上写。这招的妙处在于,视频根本不用整个塞进内存,边下边写,再大的视频,再多的批量任务,内存都不会爆。就这一手,多少正经下载器都没做到。

第二招,GM_download。浏览器不给目录权限没关系,油猴给了脚本管理器权限就行,直接调GM_download,让脚本管理器自己发请求。这玩意儿能绕过绝大多数浏览器级别的跨域限制和防盗链Referrer限制,因为请求压根不走网页,是管理器层面发的。

第三招,GM_xmlhttpRequest。连GM_download都不行,就再退一步,用GM_xmlhttpRequest去拿二进制流,拿成一个Blob对象,同样是走脚本管理器的特权,不吃CORS那一套。

第四招,最朴素的兜底。啥特权都没有,就用标准fetch硬拉,把二进制块一块一块缓存在数组里,最后拼成一个Blob。

四招全走不通?那这个视频就是真的下不下来了,脚本会老老实实给你弹一句,下载失败。

四招,一招一招往下试
四招,一招一招往下试

光有这四招还不够。这脚本有个特别较真的地方,它居然会校验下载回来的东西。

你们知道吗,抖音的服务器有时候会返回一个状态码200,但内容其实是反爬的错误页。你要直接存下来,就存了个寂寞。。。所以脚本在保存之前,会先闻一闻这个文件,检查它到底是不是真的MP4,轨道正不正常,文件大小够不够,Content-Type对不对。不是视频?直接扔。

我当时看到这段,第一反应是???

一个浏览器脚本,至于吗。

至于。而且这就是我今天最想说的东西。

你想想看,这套逻辑放在任何一个正经下载软件里,都够写进宣传页当卖点了。多源归集,智能打分,梯队降级,流式落盘,数据校验。而它只是一个几百行的油猴脚本,作者可能没收过一分钱,就把它挂在论坛上,或者挂在GitHub上,让所有人白嫖。

当然,你可能会说,平台防盗也是有道理的,创作者还要靠这个吃饭,版权这东西该尊重。对,这话我同意,版权就是该尊重,盗版也该抵制。但给自己存一个喜欢的视频,跟盗版,是两码事。我刷到一条好内容,想留在自己硬盘里慢慢看,这没什么好指摘的吧。

行,公道话说完了,我们回到正题。这背后其实是场没完没了的猫鼠游戏。平台那边,防盗链、跨域、签名、风控,一层一层加高围墙,就是不让你把内容带走。脚本这边,hook网络,扒JSON,掏播放器,递归扫字符串,各种你想都想不到的姿势,就是想从墙上拆出个洞来。这边加固,那边拆墙,谁也不服谁。

一场没完没了的猫鼠游戏
一场没完没了的猫鼠游戏

这话听着有点刺耳但,我有时候觉得,互联网最浪漫的部分,恰恰就是这些拆墙的人。平台是巨头,是资本,是几千人的安全团队。而这边的作者,可能就是个下班之后窝在出租屋里,对着调试工具盯了三个通宵的普通人。他没别的本事,就是觉得,我刷到的视频,我想存下来,这有什么错。

互联网的底层精神是什么,是共享。这话现在听着有点理想主义了,但你看这些脚本你就知道,这种精神没死。它只是换了个形态,藏在一个个油猴脚本里,藏在那些没人给钱、也照样有人维护的代码里。

写完这段分析,我其实挺想找找这个作者是谁。没找到。脚本就光秃秃地挂在那儿,连个作者名都没留。就那种,我做了个好东西,你们随便拿去用,别问我是谁的姿态。

我突然觉得,这样也挺好的。

大时代啊,朋友们。当平台们用几千人的团队研究怎么把内容锁得更死的时候,某个角落里,有人用几百行代码,把墙拆了。而且你根本不知道他是谁。

这大概就是互联网最古老的那种浪漫。

磨平一些信息差。

回到开头那个问题。没错,它就是一个油猴脚本,只不过,它比你想象中,能干得多。

/ 注意,本项目仅在 SyncMein 的500人小群分享。
/ 谢谢你看完了我的文章,我们下次再见吧。
/ 作者:明察
/ 投稿或爆料,请联系邮箱:mingcha@gqmg.com

© 版权声明
THE END
喜欢就支持一下吧
点赞6 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容