猫抓 cat-catch 深度解析:浏览器资源嗅探扩展的 5 个关键设计决策
猫抓 cat-catch 深度解析浏览器资源嗅探扩展的 5 个关键设计决策【免费下载链接】cat-catch猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch猫抓cat-catch是一个开源的浏览器资源嗅探扩展它监听页面发出的每一个网络请求把视频、音频、文档等资源列成清单并直接帮你下载。当前版本 2.7.2manifest.json已解决资源看到了但下不下来的问题带鉴权的链接、加密的 M3U8 直播流、无法整片下载的分片视频都是它的处理对象。一、它解决了什么问题从看到资源到拿到文件场景一网络面板里的假链接打开 DevTools 网络面板复制一个 mp4 的 URL 到新标签页经常直接 403。原因是服务端校验referer、cookie或自定义 header裸链接不带这些上下文。猫抓在捕获时就随资源一起记录请求头见 js/background.js 中getRequestHeaders对referer、authorization等字段白名单提取下载时原样补回去让链接变成可下载的任务。场景二M3U8 直播流下不了整片M3U8 是 HLS 直播/点播的播放列表格式本体只是一份切片索引直接下载它没有任何意义。猫抓内嵌完整的 M3U8 解析器解析播放列表 → 并发拉取 TS 切片 → 解密 → 合并/转封装成 mp4还支持录制正在直播的流。界面如下图popup 资源列表页按标签页展示捕获到的资源支持筛选、预览与一键下载二、核心能力拆解捕获、解析、下载三条流水线能力入口文件一句话机制资源捕获js/background.js监听 webRequest 事件按扩展名/MIME/大小/正则过滤后按标签页缓存M3U8 解析js/m3u8.js、js/m3u8.downloader.js基于 hls.js 解析自研多线程下载器拉片合并MPD/DASH 解析js/mpd.js解析 DASH 的 mpd 文件提取其中 m3u8 交给解析器捕获脚本catch-script/catch.js 缓存捕获、search.js 深度搜索、webrtc.js 录制 WebRTC 流下载出口下载器/aria2 RPC/m3u8dl 协议/调用本地程序/数据发送/MQTT同一个资源六种去向捕获流水线两级事件与多级过滤捕获分两级事件onSendHeaders在请求发出时做正则匹配并暂存请求头onResponseStarted在收到首个字节时依据content-type、content-length判定资源类型——等真实响应头再判断避免把 JS 请求误判成视频。过滤链的顺序是扩展名 → MIME 类型 → 附件文件名 → 大小表达式支持100 KB、500-1000 MB这类写法见operatorCheck→ 用户正则。去重是 CPU 与内存之间最典型的取舍if (G.checkDuplicates cacheData[data.tabId].length 500) { const tabFingerprints G.urlMap.get(data.tabId) || new Set(); if (tabFingerprints.has(data.url)) return; // 重复直接丢弃 tabFingerprints.add(data.url); G.urlMap.set(data.tabId, tabFingerprints); if (tabFingerprints.size 500) { tabFingerprints.clear(); // 超过500条不再查重 } }这段代码说明查重只在单标签 500 条以内启用且用 Set 存 URL 指纹做 O(1) 查找——早期版本是全量线性扫描超过 500 条会把 CPU 打满现在干脆降级为不查重。另外单标签最多缓存 9999 条资源2.5.9 引入超限直接清空把内存占用封在确定上界内。M3U8 解析与下载从切片列表到成片下载器是一个事件驱动的类核心结构如下class Downloader { MAX_RETRIES 3; // 最大重试次数 constructor(fragments [], thread 6) { this.fragments fragments; // 切片列表 this.thread thread; // 线程数 this.pipeline []; // 数据处理管线 this.autoRetry false; this.init(); } // 启动时按线程数开出相同数量的下载器 start(start 0, end this.fragments.length) { for (let i 0; i this.thread i this.fragments.length; i) { this.downloader(); } } }这段代码说明整个下载模型6 个并发槽位同时拉片失败切片最多重试 3 次2.7.1 起默认自动重试。围绕它解析器还叠加了几项关键能力能力引入版本说明6 线程下载2.4.7此前为固定线程此版本定调为 6直播录制失败重试2.6.2直播流断片后从最后切片续录HEVC/H265 预览2.6.2借助 hls.js 播放高编码内容EXT-X-BYTERANGE 合并2.6.8支持多个切片共享同一文件的 m3u8 结构自动重试2.7.1下载出错自动重试提升成功率隐藏已下载切片2.7.2直播录制时只看待下部分图M3U8 解析器可验证疑似密钥、选择切片范围、设置请求头与转码方式下载出口则刻意做成了适配器模式浏览器内置下载器js/downloader.js支持边下边存流式写盘、Aria2 RPC、m3u8dl://协议调用 N_m3u8DL-CLI、调用任意本地程序自定义参数模板、把完整嗅探数据 POST 到本地服务、以及 2.6.4 加入的 MQTT 消息推送。转码交给 mux.js 本地封装 mp4 或嵌套的在线 ffmpeg 页面两条路都不强制装软件。三、关键设计决策为什么这样选决策一用心跳对抗 Service Worker 强制休眠Manifest V3Chrome 扩展的第三代清单规范禁止常驻后台页Service Worker扩展的后台运行环境空闲约 5 分钟会被浏览器强制杀死。对一个要一直监听网络请求的扩展来说这是生死问题。猫抓在 2.0.0 的解法是主动保活chrome.runtime.onConnect.addListener(function (Port) { if (chrome.runtime.lastError || Port.name ! HeartBeat) return; Port.postMessage(HeartBeat); const interval setInterval(function () { clearInterval(interval); Port.disconnect(); }, 250000); // 4分10秒给5分钟休眠线留足余量 Port.onDisconnect.addListener(function () { interval clearInterval(interval); if (chrome.runtime.lastError) { return; } }); });这段代码说明保活的三件套popup 页每 4 分 10 秒通过长连接发一次心跳另加每 25 秒调用一次chrome.runtime.getPlatformInfo和两个 webNavigation 监听兜底即使 Worker 被杀死任何一次网络事件都会触发它重启而重启后的findMedia会等待全局状态初始化完成再继续处理initSyncComplete检查 500ms 延时重入。代价是扩展常驻时无法进入完全休眠收益是监听零丢失——对一个以持续嗅探为核心价值的扩展这是正确的取舍。决策二存储选 session 而非 local并发选固定 6 而非动态方案对比选择放弃项原因运行时数据存储storage.session2.5.3 起内存级storage.local磁盘级高并发写盘曾导致 IO 错误拖垮扩展session 丢失数据的风险用内存 cacheData 为准 alarms 定时落盘 老版本回退 local兜住下载并发固定 6 线程 3 次重试动态线程池6 是浏览器并发下载的经验甜点位固定值行为可预测、排障简单动态化收益有限却引入网络测速等新故障面落盘频率防抖100 条时 5 秒一次间隔 500ms 时 2 秒一次每条资源立即写直播页切片可达每秒数条防抖把写入量压到量级上差几个数量级跨浏览器双 manifestChrome 用 V3 Service WorkerFirefox 用 V2 scripts 模式manifest.firefox.json单一构建Firefox 的 webRequest 权限与后台模型差异大共用 js/background.js 一套逻辑、两份清单是维护成本最低的兼容路径四、边界与适用人群哪些场景用不了先明确它不做什么所有数据仅本地存储不发往任何远程服务器无跟踪器对不希望被抓取网站项目提供 Opt-Out 流程站长提交后域名会进入全局屏蔽列表见 README.md。它也不替代专用下载器复杂任务更推荐经 m3u8dl 协议交给本地 N_m3u8DL-CLI。边界项数值/条件出处Chromium 最低内核93完整功能需 104侧边栏需 114 以上README.md、2.6.3 修复记录Firefox 最低版本113深度搜索/缓存录制等脚本功能需 128 以上manifest.firefox.json、2.5.7单标签资源上限9999 条超限清空2.5.9去重开关单标签超过 500 条自动失效js/background.js下载线程数6js/m3u8.downloader.jsFirefox 缺少的能力侧边栏模式、部分脚本功能受限2.6.2 / 2.5.7语言支持中/英/日/韩/西/俄/土/越/葡/繁中共 10 个语言包_locales/适用人群按场景判断需要看到就能下的普通用户装上即用popup 里筛选 下载即可下载受鉴权/Referer 保护的直链核心价值区请求头会随资源一起带出处理 M3U8/MPD 流媒体的用户解析器 转码 直播录制是完整方案需要批量/后台下载走 Aria2 RPC 或 m3u8dl 协议猫抓只做发现 调度对网站运营方注意它默认抓取全站资源敏感站点应走屏蔽申请流程五、前景与上手路径从源码到构建方向上它最近的演进集中在三处m3u8 下载成功率自动重试、隐藏已下载切片、Firefox 与 Android 端修复2.7.1 / 2.7.2以及嵌套在线 ffmpeg这类把转码留在扩展内的能力2.6.8。可以预期后续继续补强流媒体长尾场景如更多鉴权方式、BYTERANGE 类复杂结构而不是扩张新的业务面——这个定位对维护成本很友好。上手建议三步走普通使用从 Chrome/Edge/Firefox 官方商店安装先看设置页把抓取类型/大小过滤调到你的场景再进 popup 试一次 M3U8 解析源码阅读按 js/background.js捕获主链路→ js/m3u8.js解析编排→ js/m3u8.downloader.js下载引擎的顺序读再翻 CHANGELOG.md 对照版本理解每个机制的来由本地构建仓库使用 justfile 管理构建克隆后执行just build即可产出 crx 与 zip日常开发用just prepare后在扩展页加载已解压的扩展程序指向 build 目录改代码重新just prepare刷新即可git clone https://gitcode.com/GitHub_Trending/ca/cat-catch just prepare # 复制源码到 build/供开发者模式加载一句话价值判断如果你需要一个资源发现 流媒体落地的扩展猫抓是目前开源方案里对 M3U8 场景覆盖最完整的一个先装上用一次 m3u8 解析器再决定要不要读它的源码。【免费下载链接】cat-catch猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考