XHR Hook如何伪造APP端取流:Bilibili-Old网络模拟实现全解析

发布时间:2026/10/23 20:53:18

XHR Hook如何伪造APP端取流:Bilibili-Old网络模拟实现全解析 XHR Hook如何伪造APP端取流Bilibili-Old网络模拟实现全解析【免费下载链接】Bilibili-Old恢复旧版Bilibili页面为了那些念旧的人。项目地址: https://gitcode.com/gh_mirrors/bi/Bilibili-OldBilibili-Old 是一款恢复 B 站旧版页面的开源用户脚本与浏览器扩展其最硬核的能力之一就是通过网络模拟Network Mock技术让网页播放器以APP/TV 端身份请求视频流从而解锁更高画质的视频源。本文将带新手读者彻底看懂XHR Hook 拦截机制如何工作、网络模拟在哪里生效、以及浏览器扩展版如何用声明式规则实现同样的伪装效果。为什么需要伪造APP端取流要理解网络模拟先要明白 B 站播放器的取流过程播放器先请求/playurl接口拿到一段视频流地址通常是.m4s或.flv结尾随后用XMLHttpRequestXHR发起真实的流媒体请求下载音视频数据。而服务端会对第 2 步的请求做身份校验User-Agent、referer、origin等请求头必须匹配。网页端默认的身份只能拿到网页源若想拿到TV/APP 源更高画质、无水印请求头就必须长得像官方客户端。项目默认使用的就是 TV 端身份标志见 userstatus.tsUser-Agent: Bilibili Freedoooooom/MarkII同时TV/APP 源要求referer必须为空——网页端天然携带referer直接请求必然 403。网络模拟要解决的就是把网页发的请求改成客户端发的请求。网络模拟的总入口networkMock() ⚙️核心逻辑集中在 network-mock.ts 的networkMock()函数中它根据运行环境走两条完全不同的路线运行环境伪造手段本质用户脚本TampermonkeyxhrHook.ultraGM.xmlHttpRequestJS 层劫持页面 XHR重新发起带 APP 请求头的跨域请求浏览器扩展Manifest V3GM.modifyRequestheader declarativeNetRequest 规则声明式网络规则在网络层直接改写请求/响应头两条路线殊途同归让最终的.m4s/.flv请求带上 APP 端 User-Agent、去掉referer并让响应通过跨域校验。XHR Hook网页请求拦截的基石 用户脚本路线依赖自研的 XHR 拦截工具 hook/xhr.ts。它的原理非常巧妙劫持入口覆写XMLHttpRequest.prototype.open。浏览器里所有 XHR 都必须先调用open(method, url, ...)这是天经地义的必经之路规则表匹配所有注册的拦截规则存放在rules数组中每次open被调用时遍历规则、检查 URL 是否同时包含所有匹配关键词命中则执行回调三级拦截能力由浅入深xhrHook(url, modifyOpen, modifyResponse)修改请求参数或改写响应内容适合接口换数据xhrHook.async(url, condition, modifyResponse)阻断真实请求由脚本异步取到数据后伪造readyState、load、loadend等事件喂回 XHR 实例还能周期性派发progress事件模拟加载进度让上层代码完全察觉不到异常xhrHook.ultra(url, modify)完全接管XHR 实例——你可以随意重定义它的任何属性和方法。网络模拟用的正是这个终极形态。此外拦截默认是一次性的once true命中即注销避免长期挂全局钩子带来的性能开销这个细节在 xhrHook 的源码注释 中有明确说明。ultra 接管一步步伪造取流请求 networkMock() 的取流劫持流程 可以分为四步① 精准定位目标请求只对 URL 中包含.m4s的 XHR 动手——这正是 dash 播放器拉取音视频流的路径其他接口一律不碰。② 用影子对象重定义整个 XHR 实例通过Object.defineProperties把原 XHR 实例的send、setRequestHeader、onload、onprogress、onerror、responseType、timeout等属性全部替换成 getter/setter 代理。所有属性读写都被透明转发到一个内部对象obj——它正是GM.xmlHttpRequest所需的标准参数结构。③ 换头重发被替换的send方法不再走浏览器原生网络栈而是调用脚本环境提供的跨域请求接口GM.xmlHttpRequest(obj)重新发起请求并注入 APP 端 User-Agent见 headers 设置。原实例的abort也被绑定到代理请求上取消行为保持一致。④ 把响应写回原实例defineRes()源码是关键收尾动作它把代理请求返回的status、statusText、response、responseText、responseURL等属性逐一defineProperty回原始 XHR 对象然后才触发播放器注册的onload回调。最终效果是播放器代码以为自己在正常地收流实际上数据来自一次换了身份的请求。onprogress回调里还会重建ProgressEvent源码保证播放器的加载进度条、缓存显示等行为完全正常。扩展版路线不改 JS只改网络 浏览器扩展版没有 Tampermonkey 的跨域 XHR 特权改用了更底层的方案declarativeNetRequest 声明式网络规则在请求真正发出前于网络层改头。规则由GM.modifyRequestheaderchrome/utils/gm.ts动态注入与静态规则文件 network-mock.json 的结构完全对应。以.m4s规则为例{ action: { type: modifyHeaders, requestHeaders: [ { header: user-agent, operation: set, value: Bilibili Freedoooooom/MarkII }, { header: referer, operation: remove }, { header: origin, operation: remove } ], responseHeaders: [ { header: Access-Control-Allow-Origin, operation: set, value: * } ] }, condition: { urlFilter: .m4s?, resourceTypes: [xmlhttprequest] } }三个细节值得注意只拦 XHRresourceTypes限定为xmlhttprequest不影响video标签直接播放等其他资源类型改写请求头设置 APP User-Agent、删除referer和origin与用户脚本路线完全等价补上跨域放行响应头注入Access-Control-Allow-Origin: *和Access-Control-Expose-Headers否则跨域响应头拿不到播放器仍会报错。网络模拟在哪里被触发networkMock()采用首次调用生效、永久驻留的策略networkMocked标志位主要由两个场景触发区域限制视频代理videolimit.ts 处理泰区/港澳台限制视频时先通过networkMock()确保取流通道可用再走代理接口拿到access_key参数换取高画质流地址东南亚泰区番剧bangumi.ts 的 initGlobal() 在尝试东南亚接口前同样会启用网络模拟。也就是说当你打开一部受限制的番剧、脚本成功解锁 APP 源的那一刻这套 XHR Hook 声明式规则的伪装系统就已经在后台默默工作了。总结一次身份伪装的工程教科书 回顾 Bilibili-Old 的网络模拟实现它给出了网页端伪装客户端取流的两种标准解法脚本环境xhrHook.ultra全面接管 XHR 实例 →GM.xmlHttpRequest带 APP 身份重发 →defineRes把响应无缝写回播放器全程无感知扩展环境declarativeNetRequest 规则在网络层改写请求头、补跨域响应头一行 JS 都不用改。这套设计对任何想在网页里越级获取资源的项目都有很强的参考价值先劫持必经之路open/send再透明重写行为最后保证事件序列与原生完全一致——伪装的最高境界就是让对方系统完全看不出来。项目源码均为 TypeScript 编写相关核心文件网络模拟 network-mock.ts、XHR 拦截器 xhr.ts、扩展网络规则 network-mock.json欢迎深入阅读。【免费下载链接】Bilibili-Old恢复旧版Bilibili页面为了那些念旧的人。项目地址: https://gitcode.com/gh_mirrors/bi/Bilibili-Old创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/10/22 13:04:56

i64与i128:大整数数据类型原理、应用与避坑指南

1. 从“够用”到“溢出”:为什么我们需要i64和i128 在编程和数据处理的日常里,我们最常打交道的是 int ,也就是整数。在大多数现代编程语言和系统中,一个默认的 int 通常是32位有符号整数,它能表示的范围大约是-21…

2026/10/23 11:51:22

弹性碰撞模型与等价转换:从“蚂蚁感冒”问题解析算法思维

1. 问题引入:从一道经典算法题说起 最近在整理一些经典的编程题目,发现一道非常有意思的题目,它来自蓝桥杯的历年真题,名字叫“蚂蚁感冒”。这道题初看描述很简单,甚至有点“小儿科”,但真正动手去实现&…

2026/10/21 3:26:19

C++函数模板调用规则与重载决议深度解析

1. 从一次编译错误说起:为什么我的模板函数不工作了? 最近在重构一个老项目的日志模块,里面有个 formatLog 函数,用来把不同级别的日志信息( int 级别的错误码、 std::string 消息、自定义的 LogEntry 结构体&…

2026/10/23 20:51:46

协同克里金法原理与ArcGIS实战:破解多变量空间插值失效之谜

简介:本资源是一份面向GIS专业学习者、科研人员及空间分析从业者的ArcGIS协同克里金法系统教程,聚焦解决多变量空间插值精度不足的问题,适用于环境监测、资源评估、地理国情分析等实际场景。内容深入解析普通协同克里金法的数学假设&#xff…

2026/10/23 20:51:46

MQL4编程入门:从变量、数组到自定义指标的核心避坑指南

简介:《MT4的MQL4编程入门》是一份面向外汇交易初学者和编程零基础用户的MQL4语言入门教程,基于韬客外汇论坛经典入门系列整理而成。教程系统讲解从自定义变量到函数的完整语法:包括int、double、string、bool四种基本类型,extern…

2026/10/23 20:51:46

MATLAB信号处理实验全流程:从序列生成到FFT频谱分析与采样定理验证

简介:这份资源是南京邮电大学「信号分析与处理实验」课程的完整实验报告,面向正在修读数字信号处理、信号与系统相关课程的高校学生,以及需要借助 MATLAB 完成信号处理实验与课程设计的自学者。报告覆盖信号的产生和运算、连续时间信号的频域…

2026/10/23 20:51:46

麦语言函数实战手册:期货程序化交易的底层逻辑与避坑指南

简介:本资源是文华财经官方麦语言函数手册的完整整理版,面向量化交易初学者、程序化策略开发者及期货/证券技术分析人员,解决麦语言函数调用不熟、参数理解不清、高频数据引用困难等核心问题。手册系统涵盖历史价格引用(CLOSE/HIG…

2026/10/23 20:51:46

cachebench实战:Linux缓存层级性能测试、避坑与回归基线

简介:LLCbench 是一套面向 Linux 平台的底层表征基准测试工具,集成了 MPBench、CacheBench 与 BLASBench,此处聚焦其中的 CacheBench,用于评估处理器缓存层次与内存访问性能。适合系统软件、体系结构方向的学习者和开发者开展性能…

2026/10/23 20:41:44

麦语言函数实战避坑指南:REF、#IMPORT与L2盘口的正确用法

简介:本资源是文华财经官方麦语言函数手册的完整整理版,面向量化交易初学者、程序化策略开发者及期货/证券技术分析人员,解决麦语言函数调用不熟、参数理解不清、高频数据引用困难等核心问题。手册系统涵盖历史价格引用(CLOSE/HIG…

2026/10/22 11:29:28

金融AI落地指南:从调研报告到技术选型与工程实践

简介:这份PDF报告聚焦2025年金融服务业中国AI现状与趋势,面向金融科技从业者、AI战略规划人员及关注行业数字化转型的研究者,帮助读者把握生成式AI在银行、支付、交易等场景中的落地路径与投资方向。资源包内含1个PDF文件,大小约1…

2026/10/23 0:02:26

Verilog实现FPGA密码锁:矩阵键盘与状态机设计实战

说实话,这几年接触了不少想入门FPGA的朋友,如果你问哪个项目能一口气把Verilog的核心基本功串起来,我通常会推荐电子密码锁。这个项目看着不起眼,却把矩阵键盘扫描、按键消抖、状态机设计、动态显示刷新、外设控制这些数字逻辑里的…

2026/10/23 0:02:26

数据服务监控运维实战:从指标体系到告警治理与故障排查

周末凌晨两点,手机震了。第一反应是“数据服务挂了”。打开电脑看了下,果然,某张核心报表的数据产出时间已经超过SLA两小时,下游三个业务方连着发来问询。这种场景,做过大数据运维的人都不会陌生。数据服务的监控与运维…

2026/10/23 0:02:26

FreeRTOS任务通知实战详解:内核原理、API与避坑指南

裸机编程切到RTOS之后,任务之间的通信和同步永远是躲不开的坎。前面聊过队列、信号量、互斥锁、事件组,这次把FreeRTOS任务通知(Task Notification)单独拎出来讲透。原因很简单:任务通知是FreeRTOS里最容易用错、也最容…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑