修复短视频解析工具

This commit is contained in:
net909
2025-09-20 17:10:47 +08:00
parent ad228a550b
commit f5a6c11dda
19 changed files with 1766 additions and 18 deletions
+129
View File
@@ -0,0 +1,129 @@
<?php
namespace plugin\utility\videoparse\api;
use Exception;
use plugin\utility\videoparse\api;
class douyu implements api
{
private static $version = '220320250920';
public function parse($url){
if(preg_match('!\/show\/([a-zA-Z0-9]+)!', $url, $match)){
$vid = $match[1];
$requrl = 'https://v.douyu.com/show/' . $vid;
$res = get_curl($requrl);
if(preg_match('/DATA:\{content: (.*?),videoTag:/', $res, $match)){
$arr = json_decode($match[1], true);
if(isset($arr['point_id'])){
$result = [
'title' => $arr['title'],
'desc' => $arr['contents'],
'cover' => $arr['video_pic'],
'time' => date('Y-m-d H:i:s', $arr['create_time']),
'author' => $arr['author'],
'avatar' => $arr['authorIcon']
];
$requrl = 'https://v.douyu.com/wgapi/vodnc/front/stream/getStreamUrlWeb';
$dy_did = md5(microtime(true).rand(1000,9999));
$time = time();
$sign = $this->getsign($arr['point_id'], $dy_did, $time);
$data = [
'v' => self::$version,
'did' => $dy_did,
'tt' => $time,
'sign' => $sign,
'vid' => $arr['hash_id']
];
$cookie = 'dy_did='.$dy_did.';';
$res = get_curl($requrl, http_build_query($data), $url, $cookie);
$arr = json_decode($res, true);
if(isset($arr['error']) && $arr['error'] == 0 && isset($arr['data']['thumb_video'])){
if(isset($arr['data']['thumb_video']['super'])) $info = $arr['data']['thumb_video']['super'];
elseif(isset($arr['data']['thumb_video']['high'])) $info = $arr['data']['thumb_video']['high'];
elseif(isset($arr['data']['thumb_video']['normal'])) $info = $arr['data']['thumb_video']['normal'];
else throw new Exception('视频解析失败,无可用视频地址');
$result['url'] = $info['url'];
return $result;
}else{
throw new Exception('视频解析失败,'.($arr['msg'] ?? ''));
}
}
}
throw new Exception('视频解析失败');
}else{
throw new Exception('视频id获取失败');
}
}
private function getsign($xx0, $xx1, $xx2)
{
$k2 = [0x551983fb, 0x63c94be2, 0x0054dfe2, 0x3ba6bd08];
$MASK = 0xFFFFFFFF;
$add = fn(int $a, int $b) => ($a + $b) & $MASK;
$rotr = fn(int $x, int $n) => ((($x & $MASK) >> ($n & 31)) | (($x << (32 - ($n & 31))) & $MASK)) & $MASK;
$rotl = fn(int $x, int $n) => (((($x << ($n & 31)) & $MASK) | (($x & $MASK) >> (32 - ($n & 31))))) & $MASK;
$cb = $xx0 . $xx1 . $xx2 . self::$version;
$md = hash('md5', $cb, true);
$re = array_values(unpack('V4', $md));
for ($I = 0; $I < 2; $I++) {
$v0 = $re[$I * 2]; $v1 = $re[$I * 2 + 1];
$sum = 0; $delta = 0x9e3779b9;
for ($i = 0; $i < 32; $i++) {
$sum = $add($sum, $delta);
$v0 = $add($v0, ((($v1 << 4) + $k2[0]) ^ ($v1 + $sum) ^ (((($v1) & $MASK) >> 5) + $k2[1])) & $MASK);
$v1 = $add($v1, ((($v0 << 4) + $k2[2]) ^ ($v0 + $sum) ^ (((($v0) & $MASK) >> 5) + $k2[3])) & $MASK);
}
$re[$I * 2] = $v0 & $MASK;
$re[$I * 2 + 1] = $v1 & $MASK;
}
$re[0] = $rotr($re[0], $k2[0] % 16);
$re[0] = $rotl($re[0], $k2[2] % 16);
$re[0] = $rotl($re[0], $k2[0] % 16);
$re[0] = $rotr($re[0], $k2[2] % 16);
$re[0] = $rotl($re[0], $k2[2] % 16);
$re[1] = ($re[1] ^ $k2[1]) & $MASK;
$re[1] = $add($re[1], $k2[3]);
$re[1] = $add($re[1], $k2[1]);
$re[1] = ($re[1] ^ $k2[3]) & $MASK;
$re[1] = ($re[1] ^ $k2[3]) & $MASK;
$re[2] = $add($re[2], $k2[0]);
$re[2] = ($re[2] - $k2[2]) & $MASK;
$re[2] = ($re[2] - $k2[0]) & $MASK;
$re[2] = $add($re[2], $k2[2]);
$re[2] = $rotl($re[2], $k2[2] % 16);
$re[3] = $rotl($re[3], $k2[1] % 16);
$re[3] = $rotr($re[3], $k2[3] % 16);
$re[3] = $rotr($re[3], $k2[1] % 16);
$re[3] = ($re[3] - $k2[3]) & $MASK;
$re[0] = $add($re[0], $k2[0]);
$re[0] = $add($re[0], $k2[2]);
$re[0] = $rotl($re[0], $k2[2] % 16);
$re[1] = $rotr($re[1], $k2[1] % 16);
$re[1] = $rotl($re[1], $k2[3] % 16);
$re[1] = ($re[1] ^ $k2[3]) & $MASK;
$re[2] = $add($re[2], $k2[0]);
$re[2] = ($re[2] - $k2[2]) & $MASK;
$re[2] = $add($re[2], $k2[2]);
$re[2] = $rotr($re[2], $k2[2] % 16);
$re[3] = $rotl($re[3], $k2[1] % 16);
$re[3] = ($re[3] - $k2[3]) & $MASK;
$re[3] = $rotl($re[3], $k2[3] % 16);
$sign = bin2hex(pack('V*', $re[0], $re[1], $re[2], $re[3]));
return $sign;
}
}