ddrk m3u8视频源地址解码
低端影视
网站可观看各种电影,网速及分辨率也满足需求,但唯独没有视频对应下载地址(网络高峰期不给力,经常卡顿,无法正常观影~),通过网络请求分析,应该是 m3u8 格式的资源。
m3u8 index 文件
这里以星际迷航电影源解析为例:
打开链接地址 https://ddrk.me/star-trek-discovery/?ep=1,打开 chrome 开发者工具,在 network 面板中监听 XHR
异步网络请求,点击视频可观察到:
![image-20201115155154892]()
![image-20201115155239705]()
第一个 video
请求应该就是 m3u8 文件的 index,但响应值中的 pin
明显是加密过的。
接着通过 Sources
面板,全局搜索下源代码中的 pin
关键字,最终找到相关后续处理的 javascript 代码,里面有 ungzip
关键字,可得出是 pin
值通过 gzip
加密的。
![image-20201115155509206]()
而这里也可以看出结果是通过第三方库 pako
,接着我们本地搭建下开发环境,模拟解析下 pin
值,示例代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8"> <title>Document</title> <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script> <script src="https://cdn.bootcss.com/pako/1.0.6/pako.min.js"></script>
</head> <body> <button onclick="decode()">decode</button> <div id="ciphertext"></div> </body> </html> <script type="text/javascript"> function decode(){ $.ajax({ type: "get", url: "http://test.codezm.com/test/cors", data: {}, dataType: "json" }).done(function(data) { console.log(data) var encodedData = data.pin; var data = pako.ungzip(encodedData, {to: "string"}); $('#ciphertext').text(data); }).fail(function(){ }) } </script>
|
服务端对应做了个可跨域请求接口,PHP
代码如下:
1 2 3 4 5 6 7 8 9
| public function corsAction() { header("Access-Control-Allow-Origin: *");
$result = Tools_help::getget('https://v.ddrk.me:9543/video?id=lKwK4yQuvITOqPfIV5uAXv4YBvZ0qNX5owCjNlFG3JixIwBLvmOcfTj442xQP28mq17kzCVdO8BhYqQP4tHv36OKHGdc5oM5liL2h86V4j3CnHXFUF6W07W5%2BDu7LfwYXbdBDNqxxKahlDQIz7lZwQ%3D%3D&type=mix'); $result = json_decode($result, true);
Tools_help::ajaxReturn($result); exit; }
|
此时访问前端页面,即可解出 index 地址。
![image-20201115154854708]()
总结
index 请求地址有时效性,过期后需要重新获取 index 地址。
index 地址做了 origin
限制,需要在服务端做个跨域中转请求,才能拿到其响应数据。
index 中的 ts 地址没有时间限制。