getWbiKeys(); return $this->encWbi($query, $wbi_keys['img_key'], $wbi_keys['sub_key']); } private function getMixinKey($orig) { $t = ''; foreach ($this->mixinKeyEncTab as $n) $t .= $orig[$n]; return substr($t, 0, 32); } private function encWbi($params, $img_key, $sub_key) { $mixin_key = $this->getMixinKey($img_key . $sub_key); $curr_time = time(); $chr_filter = "/[!'()*]/"; $query = []; $params['wts'] = $curr_time; ksort($params); foreach ($params as $key => $value) { $value = preg_replace($chr_filter, '', $value); $query[] = urlencode($key) . '=' . urlencode($value); } $query = implode('&', $query); $wbi_sign = md5($query . $mixin_key); return $query . '&w_rid=' . $wbi_sign; } private function getWbiKeys() { $resp = @json_decode( $this->curl_get( 'https://api.bilibili.com/x/web-interface/nav', null, 'https://www.bilibili.com/' ), true ); if (!$resp) throw new Exception('请求失败'); $img_url = $resp['data']['wbi_img']['img_url']; $sub_url = $resp['data']['wbi_img']['sub_url']; return [ 'img_key' => substr(basename($img_url), 0, strpos(basename($img_url), '.')), 'sub_key' => substr(basename($sub_url), 0, strpos(basename($sub_url), '.')) ]; } private function curl_get($url, $cookies = null, $referer = 'https://www.bilibili.com/', $ua = null, $proxy = null, $header = []) { $ch = curl_init(); $header[] = "Accept: */*"; $header[] = "Accept-Language: en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7"; $header[] = "Connection: close"; $header[] = "Cache-Control: max-age=0"; curl_setopt_array($ch, [ CURLOPT_HTTPGET => 1, CURLOPT_CUSTOMREQUEST => 'GET', CURLOPT_RETURNTRANSFER => 1, CURLOPT_HTTPHEADER => $header, CURLOPT_ENCODING => '', CURLOPT_URL => $url, CURLOPT_USERAGENT => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.63 Safari/537.36 Edg/102.0.1245.39', CURLOPT_TIMEOUT => 15 ]); if ($cookies) curl_setopt( $ch, CURLOPT_COOKIE, $cookies ); if ($referer) curl_setopt_array($ch, [ CURLOPT_AUTOREFERER => $referer, CURLOPT_REFERER => $referer ]); $content = curl_exec($ch); curl_close($ch); return $content; } }