猫抓 cat-catch 深度拆解资源嗅探扩展如何从 webRequest 钩子到切片合并下载【免费下载链接】cat-catch猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch猫抓 cat-catch 是一款浏览器资源嗅探扩展被动监听页面请求、识别媒体资源并提供 M3U8/MPD 解析与切片合并下载。本文以 2.7.4 版本的真实代码为依据回答两个问题一条请求如何变成列表里的一项沿途每个机制付出了什么代价。读完可以带走一套可复用的嗅探扩展架构。资源嗅探链路如何工作跟一条请求走五步先看结论一条媒体请求从发出到出现在 popup 列表只经过两个 webRequest 钩子、一次规则过滤、一个内存分桶、一条消息总线全程发生在后台。谁接到它请求发出瞬间js/background.js 的webRequest.onSendHeaders钩子最先触发把requestHeaders按requestId暂存进内存 MapG.requestHeaders——因为 Referer 这类请求头在响应阶段拿不到必须提前保住该钩子同时以正则模式调用findMedia(data, true)让用户自定义正则先过一轮。// 要解决的问题Referer 等请求头在响应阶段拿不到先按 requestId 暂存 chrome.webRequest.onSendHeaders.addListener( function (data) { if (G G.initSyncComplete !G.enable) { return; } if (data.requestHeaders) { G.requestHeaders.set(data.requestId, data.requestHeaders); data.allRequestHeaders data.requestHeaders; } try { findMedia(data, true); } catch (e) { console.log(e); } }, { urls: [all_urls] }, [requestHeaders, chrome.webRequest.OnBeforeSendHeadersOptions.EXTRA_HEADERS].filter(Boolean) );第一轮过滤响应首个字节到达onResponseStarted用同一个requestId取回暂存头并合并进入findMedia先查总开关G.enable、屏蔽列表、OPTIONS 预检、特殊页面再过 URL 后缀默认清单在 js/init.jsts默认关闭、Content-Type、attachment 文件名最后data.type media的资源直接放行都不命中即丢弃。它去哪命中的资源按tabId分桶写入内存cacheData并用urlMap按 URL 去重超过 500 条关闭查重以省 CPU。save()带两级防抖单标签超 100 条等 5 秒落盘一次、写入间隔小于 500ms 等 2 秒超过 99 条停止逐条落盘由名为save的chrome.alarms定时任务补写超过 9999 条手机端 999直接清空该页数据。谁读它popup 或侧边栏打开时js/popup.js 向后台发getData消息拿回本标签的分桶数据渲染列表后台每抓到一条新资源还会主动推送popupAddData消息实时追加并附带深度搜索挖出的疑似密钥标签。最终去向勾选 M3U8 资源点解析 → 打开m3u8.htmljs/m3u8.js 用 hls.js 解析出切片并抓取 AES 密钥清单拉取失败时改从页面 HTTP 缓存里取回解决一次性 URL→ 切片交给下载器 6 线程并发下载 → 管线完成去伪头、AES 解密、mp4 转码 → 浏览器保存、边下边存、在线 ffmpeg 转码或发给 aria2、MQTT、本地程序。整条路径收束成一行onSendHeaders 存头 → onResponseStarted 进 findMedia → 按 tab 分桶 cacheData → session 存储落盘 → popup 消息读取 → m3u8 解析器 Downloader 合并落盘。资源嗅探能力全景四组能力与四层分工按数据流切分猫抓的四组能力分别落在四层上层与层之间只靠消息和存储交接。能力典型场景实现模块被动嗅探打开网页视频音频自动入库列表js/background.js、js/init.js主动挖掘blob / XHR 密钥回捞、WebRTC 录制catch-script/search.js、catch-script/webrtc.js、catch-script/catch.js流媒体解析M3U8/MPD 切片解析、密钥验证、合并下载、录制js/m3u8.js、js/m3u8.downloader.js、js/mpd.js结果输出浏览器保存、边下边存、在线 ffmpeg 转码、aria2/MQTT/本地程序js/popup.js、js/downloader.js、lib/StreamSaver.js监听层webRequest 双钩子 webNavigation tabs/windows 事件全部在 js/background.js 注册只负责看见。过滤层findMedia规则引擎——后缀、MIME、正则、大小表达式2.6.8 起支持100 KB这类写法规则表可热更新。存储层cacheData按 tab 分桶 storage.session 落盘 alarms 补写解决写多少、何时写。输出层popup 列表、m3u8 解析器、Downloader 与各发送通道互不依赖只消费上游数据。作者犹豫的地方四个取舍四个取舍各回答一个问题后台被杀怎么办、存储怎么选、并发与顺序怎么摆、看不见的流怎么抓。取舍一后台保活机制如何工作问题MV3 的 Service Worker后台工作进程空闲约 5 分钟会被浏览器强杀存在内存里的cacheData随之清零。解法双保活 醒来重放。页面侧 js/content-script.js 维持一条名为HeartBeat的长连接 Port断开即自动重连后台侧 250 秒主动断开由页面重连续命外加 25 秒一次的getPlatformInfoAPI 调用防休眠。findMedia入口再检查全局变量未就绪说明刚被唤醒就 500ms 后重放本次请求。// 后台侧Port 建立 4 分 10 秒后主动断开让页面侧重连提前于 5 分钟阈值 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); Port.onDisconnect.addListener(function () { interval clearInterval(interval); }); }); setInterval(chrome.runtime.getPlatformInfo, 25 * 1000); // 定期调用 API 防休眠// 页面侧Port 断开即重连形成循环js/content-script.js function connect() { Port chrome.runtime.connect(chrome.runtime.id, { name: HeartBeat }); Port.postMessage(HeartBeat); Port.onDisconnect.addListener(connect); } connect();放弃了什么整套机制和 Chromium 的进程管理打时间差绑定具体实现细节版本升级可能悄悄失效——CHANGELOG 2.0.0 的条目[Fixed] 该死的 Service Worker... 继续用肮脏的手段对抗 Manifest V3就是这条路线的注脚。Firefox 走background.scripts事件页常驻见 manifest.firefox.json完全不需要这套逻辑代价是两种生命周期长期双维护。取舍二会话存储如何降级问题嗅探列表是高频读写的临时数据2.5.3 之前用 storage.local 时出现过磁盘 IO 错误导致扩展整体不可用。解法运行期数据迁到 storage.session全部写入点统一成带降级的单行形式并配合 99 条阈值防写放大// 单标签超过 99 条只留在内存靠 alarms 定时补写防磁盘写放大 if (cacheData[tabId]?.length 99) { (chrome.storage.session ?? chrome.storage.local).set({ MediaData: cacheData }); }放弃了什么storage.session要求 Chrome 104低版本回落 local磁盘写放大的老风险仍在列表只活在当前会话关浏览器即清空无法跨会话恢复抓取历史。偏好设置、屏蔽列表仍走 local/sync两分法避免临时数据污染持久配置。取舍三切片下载状态机如何保顺序问题6 线程2.4.7 定为默认值并发下载快但切片合并必须严格按原始顺序还要同时应对断网、加密、单片中断。解法js/m3u8.downloader.js 的Downloader把推进与输出拆成两个指针index只管推下载pushIndex只管按序推送pipeline挂预处理剔除伪装成 PNG/JPG 的切片、AES 解密、mux.js 转码errorIndexes记录失败切片2.7.1 起autoRetry自动重试 3 次controller数组支持按切片 abort。// 下载可以乱序输出必须有序某片没回来就停在这里等 sequentialPush() { if (!this.events[sequentialPush]) { return; } for (; this.pushIndex this.fragments.length; this.pushIndex) { if (this.buffer[this.pushIndex]) { this.emit(sequentialPush, this.buffer[this.pushIndex]); delete this.buffer[this.pushIndex]; continue; } break; } }放弃了什么状态机复杂度。CHANGELOG 几乎每版都有它的回归项——2.4.8下载失败丢失线程全部重新下载、2.6.8 补EXT-X-BYTERANGE合并、2.7.0 补从缓存读取 m3u8。取舍四注入脚本如何挖掘密钥问题webRequest 只能看见 HTTP 请求blob:资源、MediaStream 和 XHR/fetch 响应体里的 AES 密钥对它全不可见。解法catch-script/ 下的 search.js 注入页面 MAIN world主世界hook XHR/fetch 并递归遍历响应对象把疑似密钥通过 postMessage 发回后台展示为疑似密钥标签// 32 位纯十六进制字符串也判定为疑似密钥catch-script/search.js const key data.replaceAll(\u0010, ); if (key.length 32 hexRegex.test(key)) { postData({ action: catCatchAddKey, key: key, href: location.href, ext: key }); }放弃了什么对页面的副作用成对出现。CHANGELOG 2.6.5、2.6.6、2.7.3 反复修复深度搜索导致某些网站无法显示/无法使用2.6.5 因此加入全局强制屏蔽兜底脚本类功能也全部默认关闭深度搜索需手动开启。版本记录留下的话五条兼容与回归项CHANGELOG 2.6.3[Fixed] Chromium 114 版本以下缺少sidePanel功能导致扩展无法使用——硬性兼容下限写在版本号里。CHANGELOG 2.5.7firefox 128 以上版本 支持使用深度搜索 缓存录制 等脚本功能——能力矩阵按浏览器版本分级Firefox 128 以下无主动挖掘类功能。CHANGELOG 2.5.9限制每页面最大储存 9999 条资源配合save()的单标签 99 条阈值高频站点下列表可能被截。CHANGELOG 2.5.3storage.local 更改为 storage.session……(要求 chrome 104 以上)——低版本回落 local写放大风险仍在。CHANGELOG 2.7.0m3u8 解析器 从缓存中读取数据 m3u8 解决一次性url问题——清单 403/404 时经 content-script 的getM3u8Cache用fetch(url, { cache: force-cache })从浏览器 HTTP 缓存里捞回文本。带走清单哪些机制值得抄哪些坑要避开✅ 可直接复用webRequest 双钩子 按requestId暂存请求头js/background.js 的G.requestHeaders任何做流量嗅探的扩展都绕不开这个模式响应阶段拿不到请求头是 API 的结构性限制。(storage.session ?? storage.local)一行降级js/background.js 十余处兼容低版本与存储选型一次解决高频临时数据与持久配置天然分库。Downloader 四个状态字段 管线js/m3u8.downloader.jsindex/pushIndex/errorIndexes/controller分别覆盖乱序下载、顺序合并、失败重试、按片中断比调线程数更值得抄。醒来 500ms 重放js/background.jsfindMedia入口后台状态不可靠时的通用补丁第一波请求不丢。⚠️ 要避开的坑HeartBeat 保活是时间差 hack依赖 Chromium 具体行为更稳的路线是后台状态可重建——storage.session 落盘 alarms 补写 重放猫抓自己也把这套当作被杀后的自愈底线。MAIN world 注入脚本必须连安全配套一起上全局强制屏蔽清单js/init.js 的G.damnUrl、blockUrl、默认关闭开关、不破坏页面的回归测试三者缺一不可否则功能增强与页面损坏会交替出现在你的版本记录里猫抓 2.6.5 到 2.7.3 的修复史就是反面教材。猫抓的设计哲学一句话不和浏览器的生命周期死磕而是让每一分状态都可重建——保活只是止痛落盘与重放才是药。【免费下载链接】cat-catch猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
企业数字化 ERP 产品动态
相关推荐
独角数卡部署要几步?5分钟免费搭好开源自动发卡系统的完整指南 独角数卡部署要几步?5分钟免费搭好开源自动发卡系统的完整指南 【免费下载链接】dujiaoka 🦄独角数卡(自动售货系统)-开源站长自动化售货解决方案、高效、稳定、快速!🚀🚀🎉🎉 项目地址: https://gitcod… · 2026/11/4 2:20:06
工程可靠性优化与鲁棒设计:应对不确定性的关键技术 1. 可靠性优化与鲁棒设计:应对工程不确定性的双刃剑 在工程实践中,我经常遇到这样的困境:实验室里表现完美的设计方案,一旦投入实际生产就会暴露出各种问题。材料批次间的性能差异、制造过程中的微小偏差、使用环境的波动——这些… · 2026/11/4 14:17:23
企业健康申报系统设计与高并发优化实践 1. 项目背景与核心需求职工健康每日申报系统是近年来企事业单位健康管理的重要数字化工具。这套系统最初源于2020年特殊时期的企业防疫需求,如今已演变为常态化健康管理平台。以某制造企业(代号M193)为例,其拥有2000余名员工&… · 2026/11/4 14:16:23
Redis读写分离架构与Spring Boot整合实战 1. Redis读写分离架构解析Redis作为高性能键值数据库,在实际生产环境中经常会遇到读多写少的场景。我经历过一个电商项目,大促期间读请求量达到写请求的20倍以上,单节点Redis实例的CPU直接飙到100%。这时候就需要引入读写分离架构来分担主节点… · 2026/11/4 14:16:23
从Claude Code到Pi:AI Coding迁移潮与harness工程实践 1. 这场“迁移潮”到底在迁移什么 最近半年,AI Coding 圈子里一个越来越明显的现象是:不少原本重度使用 Claude Code 的开发者,开始把日常主力工具换成了 Pi。注意,这里说的“放弃”并不是说 Claude Code 一夜之间不能用了&#x… · 2026/11/4 14:16:23
无人船MPAPF路径规划:动态避障与实时决策技术 1. 无人船路径规划的技术挑战与创新方案在无人船自主航行领域,复杂动态环境下的路径规划一直是困扰工程师的核心难题。传统人工势场法(APF)虽然计算效率高,但在多障碍物场景容易陷入局部最优;而模型预测控制࿰… · 2026/11/4 14:16:23
Context即服务:AI时代的新基础设施 1. 入口战争早已结束:当搜索框、App图标和浏览器标签都开始“失语”我第一次意识到“入口”这个词正在失效,是在去年帮一家做智能客服SaaS的客户做架构复盘时。他们花了整整18个月、投入三支前端团队,把产品首页重做了7版——从瀑布流到卡片式… · 2026/11/4 14:16:23
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38
AI辅助技术栈评估:提升研发决策效率60% 1. 项目背景与核心价值技术决策一直是研发团队面临的重大挑战。随着技术生态的快速演进,技术栈的选择、维护和迭代变得愈发复杂。我们团队在过去两年里,先后经历了三次重大技术栈迁移,每次都需要投入大量人力进行技术评估和风险分析。直到去年… · 2026/11/4 0:00:17
从生成Token到直接决策:Jev如何重塑AI Agent工程实践 1. 从"生成文字"到"拍板决策":Jev 到底在解决什么问题大多数人第一次接触大模型,脑子里建立的模型是"输入问题、输出文字"。你问它今天天气怎么样,它给你一段描述;你让它写个周报,它给你… · 2026/11/4 0:00:17
32G统一内存跑大模型:内存账、TPS实测与端云分流 想在一台 32G 统一内存的小主机上把大模型跑成"日常可用",这件事我前后折腾了小半年。标题里说的这台 Mac mini M6,是我们这次讨论的目标平台,具体到手规格以实物为准;但下面这套推算方法和实测思路,对任何统… · 2026/11/4 0:00:17
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38