因为m3u8地址常被JS动态生成、base64编码、AES加密或藏于WebAssembly中,明文正则匹配仅覆盖不到20%场景;可靠方法是通过Network面板定位真实请求,再逆向分析fetch/XHR接口、atob解码、Referer/Cookie校验及JS签名逻辑。

为什么直接用正则找 m3u8 地址经常失败?
因为真实页面里 m3u8 地址往往不以明文形式裸露在 HTML 源码中:可能被 JS 动态拼接、藏在 base64 字符串里、通过 AES 加密的 JSON 返回、甚至写在 WebAssembly 模块里。单纯 re.findall(r'https?://\S+\.m3u8', html) 只能捕获不到 20% 的有效地址。
真正可靠的路径是「先定位资源加载行为,再逆向提取」。你需要盯住浏览器开发者工具的 Network 面板 → Filter 输入 m3u8 → 刷新页面,观察实际发起请求的 URL 是怎么生成的。
- 常见模式:JS 调用
fetch()或XMLHttpRequest请求一个接口(如/api/play?id=123),返回含m3u8字段的 JSON - 更隐蔽情况:地址藏在
video标签的data-src属性里,或由player.js内部用atob()解码后拼接 - 注意 Referer 和 Cookie:很多视频接口会校验
Referer头,漏掉就返回 403
用 requests + execjs 解析 JS 拼接的 m3u8 地址
当看到类似 src: atob("aHR0cHM6Ly9leGFtcGxlLmNvbS92aWRlby8xMjMubTN1OA==") + "?t=" + Date.now() 这种代码时,不能靠字符串匹配,得执行 JS 逻辑。
推荐组合:requests 获取页面 HTML → 用 BeautifulSoup 提取内联 <script> 或 JS 文件 URL → 用 execjs 执行关键片段。
立即学习“Python免费学习笔记(深入)”;
- 安装:
pip install requests beautifulsoup4 PyExecJS(注意PyExecJS在 Windows 上需额外装 Node.js) - 关键点:不要尝试运行整段 JS,只提取「生成地址」那一小段,例如:
execjs.eval('atob("aHR0cHM6Ly9leGFtcGxlLmNvbS92aWRlby8xMjMubTN1OA==")') - 警惕
window.location、document.cookie等浏览器全局变量 ——execjs默认没有 DOM 环境,需手动 mock 或改用py_mini_racer(性能更好,但安装稍麻烦)
处理加密的 m3u8 响应体(AES-128)
拿到 m3u8 地址后,用 requests.get(url) 请求,如果响应里出现 #EXT-X-KEY:METHOD=AES-128,URI="https://xxx.com/key",说明分片是加密的。此时必须先获取密钥,再解密 .ts 片段。
- 密钥 URL 通常和
m3u8同域,但可能需要携带Cookie或Referer才能访问 - 密钥是二进制内容(16 字节),不是文本!别用
.text读取,要用.content - 解密示例(用
pycryptodome):from Crypto.Cipher import AES<br>decrypted = AES.new(key, AES.MODE_CBC, iv).decrypt(encrypted_ts)
- 注意:有些站点用自定义 IV(写在
#EXT-X-KEY的IV参数里),有些用全零 IV —— 不看清楚会解出乱码
绕过反爬导致的 m3u8 地址 403/404
很多视频站对 m3u8 接口做了强防护:URL 带有时效性签名、校验 User-Agent、限制 IP 频率、甚至要求 WebSocket 握手后才放行。
- 最简单验证:把浏览器里复制的完整
m3u8URL 粘贴到curl -v或 Postman,看是否返回 403 —— 如果是,说明服务端做了 UA/Referer/Token 校验 - 必须复现浏览器请求头:至少带上
Referer(和播放页 URL 一致)、User-Agent(用最新 Chrome 的)、Cookie(从浏览器复制) - 更复杂情况:URL 中的
sign=xxx是由 JS 计算的,需逆向sign生成函数(比如 HMAC-SHA256 + 时间戳 + 随机数) - 别忽略
robots.txt和terms of service—— 有些平台明确禁止解析视频流,技术可行 ≠ 合法可用
真正难的从来不是“怎么拿到地址”,而是“怎么让服务器相信你是合法播放器”。每个站点的防护逻辑都不同,没有银弹,只能逐个分析 Network 请求链路。


















