完整拆解猫抓 Cat-Catch:浏览器资源嗅探扩展如何在沙盒限制中构建专业媒体处理流水线
【免费下载链接】cat-catch猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch
猫抓(Cat-Catch)是一款开源的浏览器资源嗅探扩展,它能在不侵入页面代码的前提下,把网页里藏着的视频、音频、m3u8 流、加密密钥等资源"找出来、拿下来、存下来"。本文将围绕"在限制中创造可能性"这条主线,从真实使用场景出发,逐步拆解猫抓的资源嗅探架构、下载流水线与工程哲学,帮助技术决策者和开发者理解一个浏览器扩展如何把看似不可能的媒体处理任务变成日常。
一、一个深夜追剧者的困境:为什么"右键另存为"救不了你
想象这样一个场景:你在某个网站看到了一个很想收藏的课程视频,点开浏览器开发者工具,找到了.mp4的直链,右键另存为——却只下载到一个 200 字节的 HTML 错误页。再换个思路,用录屏软件——画质糊、卡顿、还带上鼠标指针。
这个困境的本质,是现代网站的媒体投递方式早已从"静态文件直链"演变为动态、分片、加密的复杂形态:
- HLS/DASH 流式协议:视频被切成几十上百个
.ts或.m4s分片,由播放器按需拉取,你看到的直链只是入口; - 加密传输:分片普遍使用 AES-128 加密,密钥另走接口,单独拿一个分片毫无意义;
- 动态生成:URL 是一次性的,刷新即失效,连"复制链接"都无从谈起。
面对这样的现实,普通用户需要的不是一个抓包工具,而是一个能替自己完成"发现—拼装—解密—合并—保存"全流程的工具。这正是猫抓存在的理由。它把一个专业媒体处理平台,装进了 Chrome/Edge/Firefox 的扩展机制里。而要做到这一点,项目必须先回答一个根本问题:在浏览器严格的安全沙盒里,资源嗅探到底有哪几条路可走?
二、核心能力拆解:按用户价值划分的四种"搞定"
与其按技术模块罗列功能,不如从用户视角看猫抓到底提供了哪几层价值。每一层都对应一类真实痛点,也对应一组不同的技术方案。
2.1 找得到:多引擎被动嗅探,覆盖"看得见的网络流量"
猫抓最基础的能力,是在后台用webRequestAPI 监听页面发起的每一个请求,再通过正则与 Content-Type 识别出媒体资源。核心逻辑在 js/background.js 中:
onSendHeaders:在请求发出前记录请求头(Referer、Cookie 等),这些信息是后续下载成功的关键;onResponseStarted:在收到响应第一个字节时判断资源类型,此时能拿到比 URL 更可靠的信息;findMedia():把 URL、请求头、响应信息组装成一条结构化资源记录。
但被动嗅探有一个致命盲区:它只能看到网络层发生了什么。如果视频通过MediaSource分片投喂、数据流经URL.createObjectURL生成,URL 层面根本无迹可寻。于是有了第二层能力。
2.2 搞得定:主动捕获引擎,从"看流量"升级到"管播放器"
针对被动嗅探的盲区,猫抓在页面内注入了CatCatcher类(catch-script/catch.js),直接对播放器底层动手:
- 代理 MediaSource 方法:重写
MediaSource的addSourceBuffer等方法,把追加进来的数据分片完整记录下来; - 缓存捕获:从浏览器缓存中直接读取已播放的视频数据,解决"一次性 URL"问题;
- iframe 沙箱突破:通过
MutationObserver监听并处理带sandbox属性的 iframe,让注入脚本能深入嵌套页面。
一句话总结:被动引擎负责"广",主动引擎负责"深"。这也是猫抓与普通下载器最大的差异——它不是一个抓链接的工具,而是一个能接管播放流程的代理。
图:popup 面板按标签页组织捕获到的资源,支持预览、筛选与批量下载,是"找得到"能力的用户入口。
2.3 拿得下:m3u8 解析器与下载流水线,把"分片"变"成片"
流媒体是猫抓投入最深的领域。m3u8.html页面(逻辑在 js/m3u8.js)内置了 hls.js、AES 解密器、mp4 转码器与 ffmpeg 桥接,能力覆盖:
- 解析:拉取 m3u8 清单,递归解析嵌套索引文件,列出全部切片与密钥;
- 解密:
AESDecryptor处理 AES-128 加密分片,并自动收集"疑似密钥"供用户验证; - 合并:切片下载后通过
mux.js转封装为 mp4,或发送到在线 ffmpeg 完成更复杂的转码合并; - 下载:新的
Downloader类(js/downloader.js)支持多线程并行、断点重试、边下边存(StreamSaver 流式写入,适合直播录制)。
值得一提的是,下载进度更新通过lastEmitted做 100ms 节流,避免高频 DOM 操作拖垮界面——这是大量真实使用场景下打磨出来的细节。
图:m3u8 解析器将清单展开为切片列表,支持单切片选择、线程数设置、ffmpeg 合并与 m3u8DL 命令导出。
2.4 用得好:从"下载"到"媒体管理"的体验延伸
猫抓没有止步于下载。媒体控制脚本(js/content-script.js)可以直接操控页面里的视频:倍速、画中画、截图;深度搜索脚本会尝试分析密钥;JSON 查看器、二维码分享、发送到 Aria2/MQTT 等"周边能力"则把资源从浏览器扩展到了用户自己的工具链。下载不是终点,资源进入用户自己的媒体库才是。
三、关键实现机制亮点:三个值得反复琢磨的设计决策
选三个最有代表性的实现细节,讲讲"为什么这样设计"以及背后的取舍。
3.1 双引擎混合嗅探:为什么要"既看网络,又管播放器"
如果只做被动嗅探,实现简单但漏掉 MediaSource 内容;如果只做主动代理,性能开销大且难以覆盖所有站点。猫抓的选择是两套引擎并存、互不干扰:
嗅探引擎分工 ├── 被动引擎(后台) │ ├── webRequest.onSendHeaders 记录请求头 │ ├── webRequest.onResponseStarted 识别响应类型 │ └── 适用:直链、常规 HTTP 媒体 │ └── 主动引擎(页面注入) ├── MediaSource 方法代理 捕获分片数据流 ├── 缓存读取 解决一次性 URL └── 适用:DRM 前的加密流、动态分片这个设计的核心代价是架构复杂度:两套引擎需要统一的数据模型(addMedia消息协议),还要处理重复捕获、去重(G.urlMap)、数据合并等问题。但收益是覆盖率的质变——这正是"混合策略"的经典取舍:用复杂度换取能力上限。
3.2 对抗 Service Worker 生命周期:Heart Beat 与"脏手段"
Manifest V3 的 Service Worker 会在空闲约 30 秒后被浏览器回收,这会让扩展后台"失忆"。猫抓的应对堪称教科书级的"与平台博弈"(代码见 js/background.js 开头):
- Heart Beat 保活:页面脚本通过
chrome.runtime.connect建立一个名为HeartBeat的 Port,后台收到后回复消息并维持连接,每 250 秒断开重连一次,让 Service Worker 始终处于"活跃"状态; - 定时唤醒:
setInterval(chrome.runtime.getPlatformInfo, 25 * 1000)周期性调用扩展 API,阻止休眠; - 被动兜底:
webNavigation监听器注册空回调,借助浏览器导航事件间接保活。
项目作者在 CHANGELOG 里直言这是"肮脏的手段对抗 Manifest V3"。这种设计当然不优雅,但它揭示了一个残酷现实:在平台限制面前,工程上的"够用"往往比理论上的"正确"更重要。
3.3 存储策略的权衡:为什么从storage.local换到storage.session
在 2.5.3 版本,猫抓把资源数据从storage.local迁移到storage.session(代码中统一写作chrome.storage.session ?? chrome.storage.local)。这背后的权衡很有意思:
| 维度 | storage.local | storage.session |
|---|---|---|
| 持久性 | 永久保存 | 会话级,浏览器重启即清空 |
| 稳定性 | 高频写入易触发 IO 错误,扩展可能整体失效 | 内存级,稳定可靠 |
| 适用场景 | 配置、需要跨会话保留的数据 | 高频变化的临时资源列表 |
猫抓把"稳定性优先于持久性"作为决策依据:资源列表本来就是临时数据,丢了无伤大雅;但扩展因 IO 错误崩溃,用户损失的是整个工具。把数据按生命周期分级,而不是一刀切地"全都存下来",这个思路值得任何扩展开发者借鉴。
四、工程智慧与设计哲学:可以迁移到其他项目的方法论
从猫抓的代码里,能提炼出几条超越"浏览器扩展"范畴的工程经验。
4.1 松耦合的资源处理流水线
猫抓把媒体处理拆成"捕获 → 解析 → 处理 → 输出"四个阶段,每个阶段独立成模块。受益是显而易见的:当 2.6.2 版本让 m3u8 预览支持 HEVC/H.265 编码时,改动只发生在预览模块,捕获与下载完全不受影响;当下载器需要支持"边下边存"时,也只需要在输出阶段增加 StreamSaver 分支。渐进式演进的前提,是组件间只通过稳定的消息协议通信,而不是互相调用内部实现。
4.2 面向真实场景的"够用主义"
猫抓的许多设计在"学院派"眼里并不完美:Heart Beat 是脏手段、正则嗅探是笨办法、Trusted Types 兼容要写 try/catch 回退。但它始终回答一个问题:用户的任务完成了吗?每个功能都有明确的用户价值背书——"下载线程调到 6"是网络生态与下载体验的平衡,"每 1GB 保存一次"是为了防直播录制中断丢数据,"下载完成后自动关闭页面"是给批量任务收尾。技术永远服务于场景。
4.3 尊重版权边界的工程自律
这是猫抓最值得称道的一点。项目在 README 与代码层面都内置了版权自律机制:声明仅允许下载有授权的内容、维护"避免抓取列表"并接受网站的[Opt-Out Request]申请、在 2.6.5 版本加入全局强制屏蔽名单。一个嗅探工具的长期生命力,恰恰来自它对"不该抓什么"的克制。这种自律也让项目规避了多数同类工具面临的法律与平台风险,是可持续开源的隐性架构。
五、演进脉络与生态:从 1.0 的嗅探器到 2.7 的媒体平台
猫抓的版本历史本身就是一部"需求驱动架构"的教科书:
- 1.0 时代:核心是正则嗅探与基础下载,1.0.24 引入 Heart Beat 对抗 MV3,1.0.26 开始支持手机端模拟以适配移动页面;
- 2.0 时代:2.0.0 加入视频捕获与录制,解决被动嗅探的盲区;2.2.4 引入 DASH/mpd 解析与深度搜索;2.4.7 将 m3u8 下载线程调整为 6 并默认启用新下载器;
- 2.5 时代:2.5.0 上线多语言支持,2.5.3 完成
storage.session迁移,2.5.7 Firefox 升级 MV3; - 2.6–2.7 时代:2.6.4 引入 MQTT 协议为云原生铺路,2.6.8 支持 EXT-X-BYTERANGE 合并下载与任意切片选择,2.7.2 完善下载成功切片的隐藏与倒序排列。
在生态层面,猫抓的国际化和社区参与做得非常扎实。通过_locales/标准目录(zh_CN、zh_TW、en、es、ja、ko、ru、tr、vi、pt_BR 等十余种语言),普通用户也能提交翻译——贡献者名字直接写入 CHANGELOG(如韩语的 @moduvoice、俄语的 @Nikitamce)。配套的 tools/sync-locales.js 脚本保证各语言文件不因版本迭代而失同步。
图:西班牙语版 m3u8 解析界面,展示同一套架构如何通过
_locales目录低成本覆盖多语言用户。
社区治理上,猫抓在 2.0 版本将许可从 MIT 改为 GPL-3.0,理由是"希望使用猫抓源码的扩展仍然保持开源"——这是开源项目面对生态分叉时的典型防御性决策。同时 README 明确警告存在"加了广告代码后上架"的伪猫抓,要求用户以官方渠道为准,体现了对用户数据安全的负责。
六、落地建议与开放式思考:你能从猫抓带走什么
对普通用户,最实用的三条建议:
- 先被动后主动:多数直链资源直接下载即可;遇到视频无法下载时,优先尝试"缓存捕获"与"录制脚本",而非放弃;
- 善用 m3u8 解析器的高级选项:遇到加密流时,把深度搜索到的疑似密钥填入验证,能大幅提升解密成功率;
- 配置一次、长期受益:在设置里自定义请求头、文件名模板(
${title}、${url}等替换标签)与自动下载规则,日常使用会顺畅很多。
对开发者,猫抓最值得学习的不是某个 API 的用法,而是它的问题分解方式:把"下载一个视频"这个模糊需求,拆解为发现、捕获、解析、解密、合并、输出六个可独立迭代的子问题,再为每个子问题寻找平台限制内的最优解。
最后,留下一个开放的问题:随着 AI 时代的到来,猫抓的嗅探引擎能否结合浏览器端模型,从"识别资源"进化为"预测资源"——比如根据页面结构预判下一个分片请求?浏览器扩展的边界会继续收紧还是重新开放?这些问题没有标准答案,但猫抓已经证明了一件事:真正的好工具,从来不是技术最强的工具,而是把用户从困境中解放出来的工具。在浏览器沙盒这个"戴着镣铐跳舞"的舞台上,猫抓用 2.7 个版本的故事告诉我们:镣铐之下,依然可以跳出完整的舞蹈。
【免费下载链接】cat-catch猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考