猫抓Cat-Catch浏览器资源嗅探扩展深度解析:藏在沙盒里的媒体处理平台
【免费下载链接】cat-catch猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch
视频网站播放时,你右键"另存为"只能拿到一个几十字节的 m3u8 清单文件;用开发者工具翻遍 Network 面板,几百条请求里找不到真正的媒体流。这正是猫抓(Cat-Catch)要解决的核心问题——作为一款开源的浏览器资源嗅探扩展,它能在严格的浏览器安全限制下,把页面里隐藏的媒体资源完整捞出来,并顺手完成解析、合并与下载。
一张能力版图,看懂猫抓在做什么 🗺️
猫抓不是单一的"嗅探工具",而是一条完整的媒体处理链。用一句话概括:凡是页面加载过的媒体,它都能找到;凡是找到的媒体,它都能下载。
猫抓能力版图 ├── 捕获层:webRequest 请求拦截 + MediaSource 方法代理 + iframe 深度嗅探 ├── 解析层:M3U8 解析器 + MPD(DASH) 解析器 + AES-128 解密识别 ├── 加工层:TS→MP4 合并、切片级选择、在线 FFmpeg 转发 ├── 输出层:本地下载 + StreamSaver 流式存储 + aria2 RPC + MQTT 推送 └── 扩展层:深度搜索、录制脚本、媒体控制、多语言(10种)它适合三类人:被 DRM 或加密流困扰的普通用户、需要批量归档视频的媒体从业者,以及想研究浏览器扩展极限的开发者。核心逻辑分布在 js/background.js 与 catch-script/catch.js 两个文件中。
核心结论:猫抓的本质是在浏览器允许的 API 边界内,自建了一条媒体"发现-解析-输出"流水线。
猫抓的主弹出界面,捕获列表与操作入口一目了然
双阶段嗅探:为什么一次请求要听两遍 👂
普通嗅探器只在请求发出时看 URL,但这会漏掉大量情况:真实媒体地址藏在响应头里、由 JavaScript 动态拼接、或者要等服务器返回 Content-Type 才能确认类型。猫抓的处理是"听两遍":
单次资源请求的监听链路 ├── onSendHeaders(请求发出前) │ ├── 正则匹配 URL,命中黑名单则拉黑 │ └── 缓存完整请求头,备用 │ └── onResponseStarted(收到首个响应字节) ├── 拿回缓存请求头,拼齐上下文 ├── 结合 Content-Type 判定媒体类型 └── 进入 findMedia() 分析管线这个设计在 js/background.js 中体现得很清楚:
// 请求发出前:先看 URL 与请求头 chrome.webRequest.onSendHeaders.addListener( function (data) { G.requestHeaders.set(data.requestId, data.requestHeaders); findMedia(data, true); // 第一遍:正则初筛 }, { urls: ["<all_urls>"] }, ["requestHeaders"]); // 收到响应后:此时信息最全,再做最终判定 chrome.webRequest.onResponseStarted.addListener( function (data) { data.allRequestHeaders = G.requestHeaders.get(data.requestId); findMedia(data); // 第二遍:类型确认 }, { urls: ["<all_urls>"] }, ["responseHeaders"]);配合请求失败时的onErrorOccurred清理缓存,避免内存泄漏。而面对不走 HTTP 的流媒体(比如 MSE 喂给<video>的分段数据),猫抓在 catch-script/catch.js 里直接代理MediaSource的方法,把浏览器内部的数据通路也纳入监听。
核心结论:嗅探的准确性不取决于单一 API,而取决于把请求生命周期切成几个观测点、并在信息最完整的时刻做判断。
沙盒里的生存术:让 Service Worker 别睡着 ⏰
MV3 最大的变化是后台脚本变成 Service Worker,5 分钟不活跃就被浏览器强制终止,状态全部丢失。对持续监听请求的扩展来说这是致命伤。猫抓的解法是两条腿走路:
Service Worker 保活决策 ├── 方案A:webNavigation 空监听 │ ├── 原理:导航事件会唤醒 SW │ └── 代价:仅在页面跳转时生效 │ ├── 方案B:HeartBeat 长连接 │ ├── 原理:content script 建立端口,定时 ping-pong │ └── 代价:需管理端口生命周期 │ └── 方案C:定时器轮询 ├── 原理:setInterval 调用平台 API 保持活跃 └── 猫抓采用:A+B+C 组合,每 25 秒调用一次// HeartBeat 机制:content script 主动维持端口存活 chrome.runtime.onConnect.addListener(function (Port) { if (Port.name !== "HeartBeat") return; Port.postMessage("HeartBeat"); // 双向心跳 const interval = setInterval(() => { clearInterval(interval); Port.disconnect(); // 250秒后主动断开 }, 250000); }); setInterval(chrome.runtime.getPlatformInfo, 25 * 1000);更聪明的是findMedia入口的自愈逻辑:每次处理请求前先检查全局状态是否初始化完毕,若 SW 刚被杀死重启,就延迟 500ms 重试,等数据恢复后再工作。被杀死不可怕,可怕的是死而复生后不认识自己了——猫抓为此在每次唤醒后都做了状态自检。
核心结论:在 MV3 下做长驻任务,核心不是"对抗休眠",而是设计好"唤醒后的自恢复协议"。
性能与体验的平衡术:6 线程背后的算账 ⚖️
下载 M3U8 时线程开多了会压垮服务器、开少了浪费带宽。猫抓把默认值设在 6,这不是拍脑袋——在 js/init.js 里M3u8Thread: 6,用户可调。核心下载器 js/m3u8.downloader.js 的实现体现了"克制":
| 方案 | 优势 | 代价 | 适用场景 | 取舍结论 |
|---|---|---|---|---|
| 单线程顺序下载 | 服务器压力最小 | 速度慢,长视频等待久 | 低配服务器 | 保底方案 |
| 无上限并发 | 速度最大化 | 易触发限流/封IP | 高带宽自建源 | 不可取 |
| 固定 6 线程 | 速度与友好度的折中 | 需动态调优 | 通用场景 | 猫抓默认 |
| 线程+重试联动 | 成功率更高 | 逻辑复杂度上升 | 不稳定网络 | 2.7.1 起引入 |
两个细节值得注意:一是MAX_RETRIES = 3的失败重试,2.7.1 版本专门为此提升了下载成功率;二是大文件绕过策略——超过 1.8GB 的文件(Chrome 下载 API 的隐性瓶颈)自动切换 StreamSaver 边下边写,不占内存:
// 超过 1.8G 自动启用流式下载,绕过浏览器内存瓶颈 if (estimateFileSize > G.chromeLimitSize && confirm("文件超过2G,切换流式下载?")) { fileStream = createStreamSaver(_fragments[0].url); // 边下边存 }核心结论:并发数不是越大越好,而是让服务器、带宽、成功率三者同时可接受的"最大公约数"。
版本故事:从 1.0 的嗅探器到 2.7 的媒体平台 📜
猫抓的演进史在 CHANGELOG.md 里写得很清楚,几个关键节点:
- 1.0 时代:MIT 许可,只做基础嗅探。功能单一,胜在简单可靠。
- 2.0 时代:改 GPL-3.0 许可,理由是"希望使用猫抓源码的扩展仍然保持开源"——这是开源生态的明确表态。
- 2.4.x:调整下载线程策略,m3u8 下载更稳。
- 2.6.x:引入 MQTT 推送与在线 FFmpeg 转发,把"下载器"升级成"分发器"——媒体可以发到本地程序、发到云端、发到自己的服务器。
- 2.7.x:俄语、韩语、越南语翻译相继合入,右键菜单、切片级选择、AES 密钥深度搜索等细节功能补全。
路线图背后是一条清晰的判断:嗅探是入口,解析是护城河,输出通道的多样性才是用户粘性。这也是为什么它从"捕获→列表"的简单工具,长成了"捕获→解析→转码→分发"的平台。
M3U8 解析器的切片列表与下载控制台,是平台化演进的代表性界面
核心结论:把"下载"这一个动词拆成"发现、解析、转码、分发"四个动词,工具的边界就打开了。
开源生态:十种语言背后的协作机制 🌐
猫抓的国际化和模块化做得很实在。_locales/下躺着 10 种语言的 messages.json 文件,翻译贡献者只需要改 JSON,不需要理解任何代码——这是典型的低门槛协作设计。配合工具脚本 tools/sync-locales.js 做语言文件的同步检查,避免翻译缺失。
生态的另一面是"外接能力":支持 aria2 RPC、自定义协议唤起本地下载器(如 m3u8dl)、MQTT 推送、在线 FFmpeg 转码。第三方服务地址、MQTT Broker 全部可配置,等于把扩展做成了"媒体中控台"。2.6.9 之后还支持了 Firefox 与 Android,跨平台覆盖面逐步补齐。
多语言 M3U8 分析界面,社区翻译直接决定产品触达范围
核心结论:开源项目的生态力,一半取决于架构是否允许外部低成本接入,一半取决于翻译这类协作门槛有多低。
收束:三条可以带走的方法论 💡
回到开篇的场景——你在播放器里看到了视频,但"看到"和"拿到"之间隔着一整条技术链路。猫抓把这条链路走通了,也为浏览器扩展开发留下了三条可迁移的经验:
方法论一:把平台限制当成接口契约,而不是障碍。Service Worker 会死、storage 有容量上限、下载 API 有大小限制——猫抓不是对抗这些限制,而是围绕它们设计自恢复协议、session 存储回退、流式下载分流。限制反而成了架构的"边界条件",让设计更清晰。
方法论二:信息完整性决定功能上限。双阶段嗅探的本质,是在对的时间点获取对的信息。任何"为什么功能做不到"的问题,先问"是不是信息拿得不够全",往往比直接上更重的方案更有效。
方法论三:默认参数要能讲出理由。6 线程、3 次重试、1.8G 阈值,每个默认值背后都有可验证的依据。好的默认参数是产品对用户的第一次承诺,也是团队技术判断力的外显。
核心结论:真正复杂的设计,不是堆功能的复杂度,而是让每个简单参数背后都站着一个经过权衡的理由。
猫抓证明了浏览器扩展完全可以承载"媒体处理平台"级别的野心——只要你在沙盒里足够诚实:诚实地观测、诚实地权衡、诚实地把每个默认值背后的账算给用户看。
【免费下载链接】cat-catch猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考