猫抓Cat-Catch技术拆解:浏览器资源嗅探扩展如何把“看得到“变成“存得下“ 📅 2026/8/21 17:55:31 猫抓Cat-Catch技术拆解浏览器资源嗅探扩展如何把看得到变成存得下【免费下载链接】cat-catch猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch网页上看视频很轻松想把视频留下来却处处碰壁——浏览器没有给开发者提供任何一条官方通道让你截获正在播放的媒体数据。猫抓Cat-Catch就是为填补这个空白而生的浏览器资源嗅探扩展它不破坏浏览器的安全模型却把嗅探、解析、下载、转码一整条链路做成了开箱即用的产品。读完这篇文章你将弄清三件事媒体资源到底藏在哪里、扩展如何在随时可能被回收的后台进程里保住数据、以及一个开源项目如何同时支撑起十种语言的下载体验。第一层看得见却摸不着媒体资源到底被藏在哪里 ⚙️一个网页里的媒体其实有三个藏身处发往服务器的网络请求、播放器内部不断流动的MediaSource缓冲区、以及被iframe包裹的嵌套页面。猫抓的思路不是只盯其中一处而是三路并行、互相补位。这有点像小区安防——只装一个摄像头总有死角多角度布点才能拼出完整画面。网络请求是第一道闸门对普通直链资源mp3、mp4、图片最直接的捕捉方式就是监听请求本身。猫抓的后台脚本挂在webRequest的生命周期上请求发出前记下请求头响应返回第一个字节时再核对响应头两层信息合在一起判断这是不是媒体。判断依据是三重过滤器文件后缀、Content-Type类型、以及用户自定义的正则。比如js/init.js里维护了一张几十种格式的清单从flv、m4s这类冷门格式到m3u8、mpd这种流媒体清单都覆盖到了。更贴心的是过滤条件支持表达式100 KB、1 GB、500-1000 MB这样的写法都能直接填进设置里省去了要么全收、要么全丢的两难。给MediaSource装一个监控探头直链好抓流媒体却藏在播放器内部。现代网页播放器大多走MediaSource API视频数据被切成小分片通过appendBuffer()灌进缓冲区播放器再从缓冲区解码播放。整个过程不经过普通网络监听能看到的完整文件。猫抓的解法是给MediaSource的入口方法套一层代理像在管道上接了一根分线器——数据照样流向播放器但同时也被复制了一份进自己的缓存// 播放器通过 addSourceBuffer 申请缓冲区我们在入口做手脚 const originalAdd MediaSource.prototype.addSourceBuffer; MediaSource.prototype.addSourceBuffer function (mimeType) { const buffer originalAdd.call(this, mimeType); // appendBuffer 是数据真正流入的管道逐个拦截、抄录一份 const originalAppend buffer.appendBuffer; buffer.appendBuffer function (chunk) { stashToCache(chunk); // 复制进本地缓存 return originalAppend.call(this, chunk); // 原样放行不影响播放 }; return buffer; };这段思路对应catch-script/catch.js里的核心逻辑。它解决的是数据已经进了解码器、网络层早已看不到的问题代价是缓存会随播放时长增长所以扩展提供了每1GB自动存盘、下载完成清空缓存等配套选项。拆掉iframe的套娃围墙很多视频站把播放器嵌在iframe里而iframe默认带sandbox属性限制了脚本运行能力资源也可能因此藏在嵌套页面里。猫抓的做法是先克隆节点、去掉sandbox属性再替换回去同时用MutationObserver盯着DOM一旦有新iframe加入就立即处理。这是三类来源中唯一需要改动页面的环节所以做得非常克制只在捕获生效时介入不改变页面原有功能。嗅探来源捕获对象实现手段典型场景主要短板网络请求静态文件直链webRequest监听请求/响应头mp3、mp4、图片下载对blob:、data:协议无能为力MediaSource缓冲流媒体分片代理addSourceBuffer/appendBufferHLS、DASH直播与点播缓存随播放时长增长iframe注入嵌套页面资源去除sandboxDOM监听多播放器聚合页面轻微改动页面结构第二层后台随时可能断电数据怎么保得住 浏览器扩展圈有个共识Manifest V3下的Service Worker非常短命。它不是一个常驻进程空闲约30秒就可能被浏览器回收所有内存里的变量随之蒸发。对一款靠后台脚本累积媒体清单的工具来说这是致命的——辛辛苦苦嗅探到的资源可能因为用户多看了会儿别的页面就全部丢失。心跳端口让后台假装还活着猫抓的方案很朴素既然回收发生在空闲时那就让自己永远不空闲。后台通过runtime.onConnect维护一个名为HeartBeat的端口定时收发消息制造活动迹象从而推迟回收。这种手法看起来取巧却是在Chromium策略下为数不多的实用招数之一对应js/background.js里那几十行关键代码// Service Worker 闲置过久会被强制回收心跳端口用来延续生命周期 chrome.runtime.onConnect.addListener((port) { if (port.name ! HeartBeat) return; port.postMessage(HeartBeat); const guard setInterval(() { clearInterval(guard); port.disconnect(); // 生命周期续满后主动断开避免泄漏 }, 250_000); });会话级存储快、稳、够用光续命还不够万一进程还是被回收数据得有个落脚处。Manifest V3把扩展存储划分成local和session两档前者持久化但容易遇到并发写入的IO问题后者驻留内存、读写快缺点是关浏览器就清空。猫抓的选择是优先session缺了才退回local——一行chrome.storage.session ?? chrome.storage.local把降级逻辑写得明明白白。这个取舍很实际媒体清单本身就是临时数据用户看完一页就下载了根本不需要跨会话保留反倒是稳定性和写入速度更重要。配合chrome.alarms定时落盘即使中途崩溃也能把损失控制在几十秒内。第三层上千个切片拼成一部电影m3u8引擎的工程细节 如果说嗅探是眼力那么m3u8解析下载就是手艺。HLS直播流把一个视频拆成成百上千个TS分片外加一份描述分片顺序的清单文件。想还原完整视频得先把清单读明白再按顺序把分片取回来、拼起来。先读清单再谈下载猫抓在解析器里内置了hls.js由它负责把m3u8清单解析成结构化的切片列表。开发者可以在这个基础上做很多精细操作单独勾选或取消某个切片、指定下载的起止范围、预览分辨率与码率。换句话说它把下载一个视频拆成了管理一批资源。并发线程6是反复验证的平衡点分片下载天然适合并发但并发不是越大越好。线程太少跑不满带宽线程太多容易触发CDN限流甚至封禁IP。猫抓默认把最大下载线程数设为6这个数字来自大量真实场景的验证兼顾了速度和网络公德// 默认并发线程数6一个被反复实测的平衡值 M3u8Thread: 6, // 用户可在解析器界面实时调高调低 // 对应 js/m3u8.js 中通过 #thread 输入框读写该配置加密切片密钥探测与自动解密很多正版源给TS分片做了AES-128加密直接拼出来的文件是花屏的。猫抓的处理分两步先从页面脚本和网络记录里嗅出疑似密钥再借助从hls.js中分离出的解密器AESDecryptor逐片解密。深度搜索功能甚至能在某些站点把藏在JS逻辑里的密钥挖出来这也是它比普通下载器更专业的地方。边下边存最后交给ffmpeg收尾分片全部下载完还差最后一步——合并转封装。对于纯TS分片直接用字节拼接即可但如果用户想要mp4或需要转码猫抓会调用在线ffmpeg完成合并。大文件场景下lib/StreamSaver.js支持边下边存把数据流式写进磁盘避免内存被撑爆。一条媒体请求的完整旅程 ┌─────────────────────────────────────────────┐ │ 1. 网页发出媒体请求 │ │ ↓ webRequest 监听请求头与响应头 │ │ 2. 后台按后缀/Content-Type/正则三重过滤 │ │ ↓ 命中规则则登记入列 │ │ 3. 媒体清单写入 storage.session弹出面板展示 │ │ ↓ 用户点击下载 │ │ 4. m3u8解析器接管解析清单、探测密钥 │ │ ↓ 多线程并发拉取分片 │ │ 5. StreamSaver 边下边存逐片写入磁盘 │ │ ↓可选 │ │ 6. 在线ffmpeg合并转封装产出最终文件 │ └─────────────────────────────────────────────┘第四层一套代码十种语言国际化是门工程 国际化对开源项目来说从来不是翻译工作量的问题而是怎么让几百个词条不失控的工程问题。猫抓的答案很简单也很经典把所有界面文案收敛进_locales目录每种语言一个messages.json界面代码只认键名、不认文案。_locales/ ├── en/messages.json # 英文默认基准 ├── zh_CN/messages.json # 简体中文 ├── zh_TW/messages.json # 繁体中文 ├── es/messages.json # 西班牙语 ├── ja/messages.json # 日语 ├── ru/messages.json # 俄语 ├── ko/messages.json # 韩语 ├── pt_BR/messages.json # 巴西葡萄牙语 ├── tr/messages.json # 土耳其语 └── vi/messages.json # 越南语结构只是基础真正的难点在于维护。社区贡献者散落各地有人翻译、有人改键名稍不留神就会出现某个语言文件多了过时词条、少了新词条的漂移。tools/sync-locales.js就是用来治这个病的它把英文文件当作唯一基准扫描每个语言文件自动补齐缺失的键、用英文占位并报告新增和删除数量。整个同步过程一条命令跑完翻译者永远只需关心翻译得好不好而不必操心结构对不对。第五层猫抓给浏览器扩展开发的五条方法论 看完整个技术链路真正值得带走的不是某个具体技巧而是几条可复用的判断准则多路嗅探优于单点依赖。网络请求、MediaSource、iframe三个来源互有盲区组合使用才能覆盖从直链到流媒体的完整生态。给短命进程设计留痕机制。凡是重要数据都要在进程被回收前落到可靠存储里别把宝押在内存变量上。默认值就是产品决策。并发线程数设为6、过滤阈值怎么写这些参数背后是对真实网络环境的观察而不是拍脑袋。国际化是CI的一部分。用脚本保证语言文件与基准同步比靠人工自觉可靠得多。边界要清晰。注入iframe、改MediaSource这类侵入性操作尽量少做、做得克制才能在不破坏页面的前提下长期共存。浏览器扩展的舞台其实很窄权限受限、进程短命、API频繁换代。猫抓给我们的启示是与其抱怨限制不如把限制当成设计约束——嗅探不到就换一条路进程会死就让数据先走文件太大就边下边存。所谓专业不过是把每一个没办法都拆解成了换种办法。未来随着AI识别与云端能力的引入这类工具还能在资源分类、质量预测上走得更远但底层那条在约束里找解法的思路始终不会变。【免费下载链接】cat-catch猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考