0%

ddrk之m3u8视频源地址解码

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({
//headers: { 'origin': "https://ddrk.me" },
type: "get",
url: "http://test.codezm.com/test/cors",
data: {},
dataType: "json"
}).done(function(data) {
console.log(data)
var encodedData = data.pin;
//var decodedData = window.atob(encodedData);
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

总结
  1. index 请求地址有时效性,过期后需要重新获取 index 地址。

  2. index 地址做了 origin 限制,需要在服务端做个跨域中转请求,才能拿到其响应数据。

  3. index 中的 ts 地址没有时间限制。