猫抓Cat-Catch浏览器资源嗅探扩展深度解析:藏在沙盒里的媒体处理平台
2026/8/21 2:15:41 网站建设 项目流程

猫抓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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询