XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet
公开
关注 0 Fork 0 Star 0
返回提交历史

XFEstudio/bilibili-API-collect

Update wbi.md (#866)

86ba552
LaMerChiang <catlair@qq.com>
提交于

代码差异

1 个文件 +116 -0
Modified docs/misc/sign/wbi.md +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 ```