返回提交历史
Modified
docs/misc/sign/wbi.md
+116
-0
XFEstudio/bilibili-API-collect
Update wbi.md (#866)
86ba552
代码差异
1 个文件
+116
-0
@@ -600,3 +600,119 @@ public class WbiTest {
600
600
}
601
601
}
602
602
```
603
604
### PHP
605
606
来自[SocialSisterYi/bilibili-API-collect#813](https://github.com/SocialSisterYi/bilibili-API-collect/issues/813)
607
608
```php
609
<?php
610
/**
611
* B站 Wbi 测试
612
* @author Prk
613
*/
614
615
616
class Bilibili {
617
618
private $mixinKeyEncTab = [
619
46, 47, 18, 2, 53, 8, 23, 32, 15, 50, 10, 31, 58, 3, 45, 35, 27, 43, 5, 49,
620
33, 9, 42, 19, 29, 28, 14, 39, 12, 38, 41, 13, 37, 48, 7, 16, 24, 55, 40,
621
61, 26, 17, 0, 1, 60, 51, 30, 4, 22, 25, 54, 21, 56, 59, 6, 63, 57, 62, 11,
622
36, 20, 34, 44, 52
623
];
624
625
function __construct() {
626
}
627
628
public function reQuery(array $query) {
629
$wbi_keys = $this->getWbiKeys();
630
return $this->encWbi($query, $wbi_keys['img_key'], $wbi_keys['sub_key']);
631
}
632
633
private function getMixinKey($orig) {
634
$t = '';
635
foreach ($this->mixinKeyEncTab as $n) $t .= $orig[$n];
636
return substr($t, 0, 32);
637
}
638
639
private function encWbi($params, $img_key, $sub_key) {
640
$mixin_key = $this->getMixinKey($img_key . $sub_key);
641
$curr_time = time();
642
$chr_filter = "/[!'()*]/";
643
644
$query = [];
645
$params['wts'] = $curr_time;
646
647
ksort($params);
648
649
foreach ($params as $key => $value) {
650
$value = preg_replace($chr_filter, '', $value);
651
$query[] = urlencode($key) . '=' . urlencode($value);
652
}
653
654
$query = implode('&', $query);
655
$wbi_sign = md5($query . $mixin_key);
656
657
return $query . '&w_rid=' . $wbi_sign;
658
}
659
660
private function getWbiKeys() {
661
$resp = @json_decode(
662
$this->curl_get(
663
'https://api.bilibili.com/x/web-interface/nav',
664
null,
665
'https://www.bilibili.com/'
666
), true
667
);
668
669
if (!$resp) throw new Exception('请求失败');
670
671
$img_url = $resp['data']['wbi_img']['img_url'];
672
$sub_url = $resp['data']['wbi_img']['sub_url'];
673
674
return [
675
'img_key' => substr(basename($img_url), 0, strpos(basename($img_url), '.')),
676
'sub_key' => substr(basename($sub_url), 0, strpos(basename($sub_url), '.'))
677
];
678
}
679
680
private function curl_get($url, $cookies = null, $referer = 'https://www.bilibili.com/', $ua = null, $proxy = null, $header = []) {
681
$ch = curl_init();
682
$header[] = "Accept: */*";
683
$header[] = "Accept-Language: en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7";
684
$header[] = "Connection: close";
685
$header[] = "Cache-Control: max-age=0";
686
curl_setopt_array($ch, [
687
CURLOPT_HTTPGET => 1,
688
CURLOPT_CUSTOMREQUEST => 'GET',
689
CURLOPT_RETURNTRANSFER => 1,
690
CURLOPT_HTTPHEADER => $header,
691
CURLOPT_ENCODING => '',
692
CURLOPT_URL => $url,
693
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',
694
CURLOPT_TIMEOUT => 15
695
]);
696
697
if ($cookies) curl_setopt(
698
$ch,
699
CURLOPT_COOKIE,
700
$cookies
701
);
702
703
if ($referer) curl_setopt_array($ch, [
704
CURLOPT_AUTOREFERER => $referer,
705
CURLOPT_REFERER => $referer
706
]);
707
708
$content = curl_exec($ch);
709
curl_close($ch);
710
return $content;
711
}
712
}
713
714
$c = new Bilibili();
715
echo $c->reQuery(['foo' => '114', 'bar' => '514', 'baz' => 1919810]);
716
// bar=514&baz=1919810&foo=114&wts=1700384803&w_rid=4614cb98d60a43e50c3a3033fe3d116b
717
718
```