$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; } }