资源嗅探扩展猫抓实战:一门 100 集课程从“抓不到“到全自动整理
资源嗅探扩展猫抓实战一门 100 集课程从抓不到到全自动整理【免费下载链接】cat-catch猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch如果你下载过在线课程大概率经历过这种崩溃页面里明明有高清视频右键却没有任何保存入口用录屏软件硬录画质糊成一团还占内存。这篇文章不是概念科普而是一份可直接照做的实战记录——我用浏览器资源嗅探扩展「猫抓 cat-catch」把一门 100 集的付费课程完整抓了下来并自动整理成了按集数排序的本地媒体库。整个过程你会遇到五道坎每道坎我都给到对应配置和踩坑经验。先交代任务目标后面每一步都围绕它展开集数100 集每集约 20 分钟总大小约 15GB目标自动识别全部视频 → 把 m3u8 流媒体合并成单个 MP4 → 按「集数_标题」规范命名 → 批量下载不卡浏览器附加需求只保留 720p 以上的主视频过滤掉广告和乱七八糟的碎片资源第一道坎打开视频页面板里空空如也第一天的真实情况是视频正常播放但猫抓的弹出面板里一条资源都没有。别急着怀疑扩展坏了先搞清楚它到底靠什么看见资源。猫抓的核心捕获逻辑在catch-script/catch.js里由一个CatCatcher类完成。它的思路不是抓包而是在页面里截胡浏览器原生 API——凡是页面发出的媒体请求都会先经过它的监控代码class CatCatcher { constructor() { this.enable true; // 捕获总开关 this.catchMedia []; // 捕获到的媒体列表 this.mediaSize 0; // 累计大小 // 代理 MediaSource监控 MSE 播放的流媒体 this.proxyMediaSourceMethods(); } proxyMediaSourceMethods() { // 重写 addSourceBufferHLS/DASH 这类走 MediaSource 的资源也能被感知 const original MediaSource.prototype.addSourceBuffer; MediaSource.prototype.addSourceBuffer function (mimeType) { const sourceBuffer original.call(this, mimeType); return sourceBuffer; }; } }一句话解释它监听的是请求本身而不是页面 DOM所以理论上任何请求都逃不掉。那为什么你抓不到90% 的原因是下面这几种按顺序排查即可症状排查项对应配置完全没反应扩展权限被浏览器收窄检查manifest.json里host_permissions是否为all_urls能抓到主站资源抓不到 iframe 内嵌的内嵌 iframe 未被注入脚本确认 content script 开启了all_frames: true桌面端能播但请求走了手机版页面网站对桌面端隐藏了直链开启模拟手机UA见下方说明动态加载的流媒体抓不全页面用 MediaSource 边播边下开启缓存捕获与自动跳转缓冲尾如果你用的是 Chromium 系浏览器可以在manifest.json里核对这两处它们是捕获能力的地基{ host_permissions: [*://*/*, all_urls], content_scripts: [ { matches: [https://*/*, http://*/*], run_at: document_start, all_frames: true } ] }run_at: document_start意味着页面一启动就注入脚本all_frames: true则保证 iframe 里的请求同样被监控。这两个是官方默认值别手贱改掉。我这次抓不到的原因其实是第二个课程播放器嵌在跨域 iframe 里。猫抓在catch-script/catch.js中专门有一段setupIframeProcessing()用来处理带sandbox属性的 iframe对应官方 issue #576——因为某些站点用 sandbox 限制 iframe 权限导致脚本无法注入。如果遇到这种站点你可以在页面上手动触发一次捕获一般就能补上。另一个高频解法是模拟手机很多平台对桌面端防得严但对移动端几乎不设防。在设置页把MobileUserAgent换成默认提供的 iPhone UAjs/init.js里已内置打开面板里的模拟手机环境刷新页面再播一次通常直链就全出来了。面板采用标签页导航当前页面本页捕获的资源、其他页面其他标签页的资源、媒体控制/设置远程控制任意标签页的播放甚至能调倍速、画中画、截图。第二道坎抓到一堆 .m3u8却不知道怎么用权限没问题、资源也抓到了但列表里全是.m3u8结尾的链接双击下载下来是个只有几 KB 的文本文件——第二道坎来了。先一句话解释 m3u8它是 HLS 流媒体协议的索引文件本身不含视频内容只记录了一长串.ts分片的下载地址。所以正确的用法不是直接下 m3u8而是把它交给猫抓的m3u8 解析器面板里点对应按钮或按快捷键 m3u8它会自动拉取全部分片、按顺序合并成一个完整文件。解析器页面从上到下是URL 输入与信息区 → 分片列表区可逐个验证→ 下载/播放/转换按钮 → 高级配置区。对应到js/m3u8.js它启动时解析的 URL 参数就说明了它能做什么const key params.get(key); // 自定义解密密钥 const retryCount parseInt(params.get(retryCount)); // 分片重试次数 const tsAddArg params.get(tsAddArg);// 自定义切片请求参数 const autoReferer params.get(autoReferer); // 是否已自动修正 Referer这个项目我没敢用默认设置直接开下因为 100 集 × 每集几十上百个分片串行下载会等到天荒地老。以下是实测后的推荐配置默认值见js/init.js的M3u8*系列字段配置项默认值我的推荐值解决什么问题M3u8Thread下载线程68~16线程越高分片下载越快但别超过 32浏览器会吃不消M3u8Ffmpegffmpeg 合并开开把分片和音轨封装成标准 MP4M3u8OnlyAudio关按需开只要音频时省流量M3u8SkipDecrypt关遇到解密失败时临时开快速定位是不是加密导致的合并失败分片下载器本身在js/m3u8.downloader.js的Downloader类里默认最大重试 3 次、出错分片会被记录到errorIndexes并自动重试——这就是为什么偶尔几个分片 404 也能下完整个视频。加密流的处理是我最想强调的一点。现在主流平台基本都上了 AES-128 加密症状是合并出来的文件播放黑屏或只有前几秒。解法优先级如下先勾选跳过解密试一次——如果跳过后能播放说明是解密参数问题而非密钥问题在解析器里手动填 keyjs/m3u8.js会通过keyContent保存已获取的密钥也支持你从可能密钥标签页里挑确认 IV 是否与服务器一致AES-128/CBC 是当前绝对主流别浪费时间试其他算法经验之谈解密失败九成是 Referer 不对而不是密钥不对。猫抓的autoReferer参数会自动修正 Referer如果失败优先检查这个而不是折腾密钥。第三道坎100 集下完文件名全是乱码下到第 30 集时我看了眼下载目录崩溃了文件名全是1080_1a2b3c.mp4这种天书。第三道坎——命名。如果不解决100 集下完就是 100 个乱码文件整理工作比下载还痛苦。好在猫抓内置了一套变量模板系统实现在js/templates.js的Template类里。你只需在设置页的下载文件名默认downFileName: ${title}.${ext}里拼模板即可。先看它支持哪些变量全部来自真实代码trimData${url} ${title} ${ext} ${referer} ${origin} ${initiator} ${fullDate} ${year} ${month} ${date} ${day} ${time} ${hours} ${minutes} ${seconds} ${now} ${timestamp} ${fileName} ${fullFileName} ${cookie} ${tabId}模板还支持管道处理器把变量加工成你想要的样子。以下是js/templates.js里真实存在的处理器处理器作用示例slice截取字符串${title\|slice:0,50}replaceAll全局替换${title\|replaceAll:/,_}regexp正则提取${title\|regexp:(\\d{2,3})集}to:lowerCase转小写${title\|to:lowerCase}exists变量存在时拼接${referer\|exists:-H Referer:*}filter清理非法字符${title\|filter}对应到我的课程任务最终命名模板是这样配置的// js/init.js 中 downFileName 的推荐值 downFileName: ${title|regexp:第(\\d)集|to:lowerCase}_第${index}_${title|slice:0,20|filter}.${ext}它解决了两个具体问题一是用正则把第 1 集 课程导论这类标题拆出集数二是filter处理器自动剔除\ / : * ? |等 Windows 非法字符——这个坑我踩过不过滤的话有大约 5% 的文件名会因为含/或?导致保存失败。如果你喜欢按日期归档可以这样组织${fullDate}/${title|slice:0,50|filter}.${ext}每天的视频自动进当天的文件夹适合日更类内容。命名规则一旦配置好100 集批量下载会全部按同一套规则落盘后续整理几乎为零。第四道坎下载太慢浏览器还卡成 PPT第 60 集开始笔记本风扇狂转Chrome 标签页切一下卡三秒——第四道坎性能。这一环节有三个层次由浅入深。第一层调线程解决慢m3u8 解析器里的线程数M3u8Thread从默认 6 提到 12分片并行下载速度肉眼可见提升。注意一个隐藏逻辑线程数不等于连接数每个分片又是独立的 HTTPS 请求所以 12 线程 ≈ 12 条并发连接普通家用网络 8~16 之间是甜点区再高反而触发站点限速。第二层边下边存解决卡浏览器内存里攒分片是卡顿元凶。一个大文件的分片全部堆在内存里等合并Chrome 会越用越臃肿。猫抓的解法是downStream边下边存基于 StreamSaver 把数据流式写入磁盘。实测同样一集视频开downStream后浏览器内存占用从 800MB 掉到 200MB 左右。第三层交给 Aria2彻底解放浏览器如果你像我一样要批量下 15GB最省心的方案是把下载任务交给 Aria2 这类专业下载器。猫抓内置了 Aria2 RPC 集成配置在js/init.js// Aria2 RPC 集成配置 aria2Rpc: http://localhost:6800/jsonrpc, // Aria2 的 RPC 地址 enableAria2Rpc: true, // 开启后将下载转交 Aria2 aria2RpcToken: , // 有 token 就填没有留空 aria2RpcDir: /data/videos/course, // 指定保存目录开启后猫抓面板里的下载按钮会把任务推到 Aria2浏览器只负责发现下载交给独立进程——卡顿问题彻底消失还能断点续传。这层配置对批量下载的场景收益最大网上教程很少讲这一点。方案内存占用速度适合场景猫抓内置下载默认高攒分片在内存中单集临时下载内置下载 边下边存低中常规单集Aria2 RPC 集成极低浏览器不参与高可多任务并发批量大文件另外两个容易被忽略的小开关saveAs下载时弹出另存为选择目录和save1GB每 1GB 保存一次进度。Chrome 的 downloads API 对超大文件有约 1.8GB 的隐性限制chromeLimitSize默认值save1GB就是为了绕开它——大文件下载时务必开启。第五道坎想要的只有 720p 主视频其他全是噪音资源终于源源不断地抓到了但列表里混进了广告、缩略图、音效碎片……第五道坎过滤。总不能每集都从 20 条候选里手选目标。猫抓的过滤系统分三层全部在设置页options.html里维护逻辑见js/options.js第一层扩展名过滤Ext 列表。按文件后缀匹配支持大小过滤。默认已内置mp4 / flv / ts / m3u8等常见后缀每条记录有不小于和~范围两种运算符// Ext 列表中的一条规则mp4且大小 10MB { ext: mp4, size: 10, operator: , unit: MB, state: true }第二层MIME 类型过滤Type 列表。按 Content-Type 匹配适合后缀不明显的资源比如video/*、application/x-mpegurlm3u8 的 MIME、application/dashxmlDASH 协议。第三层正则过滤Regex 列表 URL 屏蔽blockUrl。正则规则最灵活还支持黑名单/白名单切换blackList字段——黑名单意思是匹配到就忽略。比如某平台的广告域名是ads.example.com你可以加一条// Regex 列表匹配到的 URL 一律不显示黑名单模式 { type: ig, regex: .*ads\\.example\\.com/.*, ext: , blackList: true, state: true }我的课程项目最终配置是Ext 保留mp4 / m3u8 / tsType 保留video/*和application/x-mpegurl其余全关再加两条正则黑名单把播放器壳和广告域名屏蔽掉。这样面板里每集只剩 1~2 条目标资源勾选后直接批量下载不会再选错。收尾把整套流程串成一条流水线五道坎全踩完后这套流程基本定型了。最后一步是把它从手动升级成自动自动下载在页面上打开猫抓的完成捕获自动下载对应catch.js里的autoDown复选框配合m3u8AutoDown播放一集就自动抓一集——适合课程这种逐集观看的节奏快捷键manifest.json里注册了一组命令catch缓存捕获、m3u8打开解析器、preview预览、deepSearch深度搜索、clear清空都能绑定全局快捷键不用每次点面板发送到本地send2local可以把捕获到的资源信息 POST 到你本地的 HTTP 服务默认http://127.0.0.1:8000/适合配合自己的自动化脚本做进一步加工播放器直连设置页的播放器调用协议支持 PotPlayer、VLC、MX Player 等模板见js/options.js预览视频不用下载直接甩给本地播放器画质无损最后提醒一句跨浏览器差异如果你用 Firefoxmanifest.firefox.json里的 API 支持和 Chromium 版略有不同猫抓在js/polyfill.js里做了兼容处理遇到个别功能不可用先检查浏览器版本是否过旧。下一步你可以试着把同一套流程迁移到自己的场景播客批量归档、纪录片收藏、甚至会议录屏整理。配置一次长期受益——这才是资源嗅探工具的正确打开方式。【免费下载链接】cat-catch猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考