diff --git a/docs/misc/sign/wbi.md b/docs/misc/sign/wbi.md index a5d1bfb..c35a84d 100644 --- a/docs/misc/sign/wbi.md +++ b/docs/misc/sign/wbi.md @@ -600,3 +600,119 @@ public class WbiTest { } } ``` + +### PHP + +来自[SocialSisterYi/bilibili-API-collect#813](https://github.com/SocialSisterYi/bilibili-API-collect/issues/813) + +```php +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; + } +} + +$c = new Bilibili(); +echo $c->reQuery(['foo' => '114', 'bar' => '514', 'baz' => 1919810]); +// bar=514&baz=1919810&foo=114&wts=1700384803&w_rid=4614cb98d60a43e50c3a3033fe3d116b + +```