h332F 发表于 2023-10-28 22:25:32

B站直播代理

访问方式:直播间ID参数 bili.php?id=xxxx

<?php
const INIT_URL = "https://api.live.bilibili.com/room/v1/Room/room_init";
const INFO_URL = "https://api.live.bilibili.com/xlive/web-room/v1/index/getInfoByRoom?room_id=";
const PLAY_URL = "https://api.live.bilibili.com/xlive/web-room/v2/index/getRoomPlayInfo";
const COOKIE = "YOUR COOKIE";

class BiliBiliClient {
    public function get($rid, $headers = null) {
      $response = $this->request(INIT_URL, ['id' => $rid], $headers);
      if (!isset($response['data']['live_status']) || $response['data']['live_status'] != 1) {
            return null;
      }
      $rid = $response['data']['room_id'];
      $streamInfo = $this->getBiliStreamInfo($rid, 10000);
      $max = 0;
      foreach ($streamInfo as $data) {
            $acceptQn = $data['format']['codec']['accept_qn'];
            foreach ($acceptQn as $qn) {
                $max = max($qn, $max);
            }
      }
      if ($max != 10000) {
            $streamInfo = $this->getBiliStreamInfo($rid, $max);
      }
      $urls = [];
      foreach ($streamInfo as $data) {
            foreach ($data['format'] as $format) {
                foreach ($format['codec'] as $codec) {
                  $baseUrl = $codec['base_url'];
                  foreach ($codec['url_info'] as $urlInfo) {
                        $host = $urlInfo['host'];
                        $extra = $urlInfo['extra'];
                        $urls[] = $host . $baseUrl . $extra;
                  }
                }
            }
      }
      $workingUrl = $this->getFirstWorkingUrl($urls);
                if ($workingUrl) {
                        header('location:'.$workingUrl);
                        exit;
                } else {
                        echo "No working URLs found.";
                }
    }
        private function getFirstWorkingUrl($urls) {
                $ch = curl_init();
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
                curl_setopt($ch, CURLOPT_TIMEOUT, 5);// 设置超时时间为5秒
                curl_setopt($ch, CURLOPT_NOBODY, true);// 只检查HTTP头部,不下载整个页面
                curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)
Chrome/91.0.4472.124 Safari/537.36');
                curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
                curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
                curl_setopt($ch, CURLOPT_COOKIE, COOKIE);
                foreach ($urls as $url) {
                        curl_setopt($ch, CURLOPT_URL, $url);
                        curl_exec($ch);
                        $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

                        if ($httpCode == 0) {
                                echo "cURL error for URL $url: " . curl_error($ch) . "\n";
                        }
                        if ($httpCode == 200) {
                                curl_close($ch);
                                return $url;
                        }
                }
                curl_close($ch);
                return null;
        }
    private function getBiliStreamInfo($rid, $qn) {
      $params = [
            'room_id' => $rid,
            'protocol' => '0,1',
            'format' => '0,1,2',
            'codec' => '0,1',
            'qn' => $qn,
            'platform' => 'h5',
            'ptype' => 8
      ];
      $response = $this->request(PLAY_URL, $params);
      return $response['data']['playurl_info']['playurl']['stream'] ?? [];
    }
    private function request($url, $params = [], $headers = null) {
      $ch = curl_init();
      $url = $url . '?' . http_build_query($params);
      curl_setopt($ch, CURLOPT_URL, $url);
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
                curl_setopt($ch, CURLOPT_COOKIE, COOKIE);
                curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
                curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
      if ($headers) {
            curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
      }
      $result = curl_exec($ch);
      curl_close($ch);
      return json_decode($result, true);
    }
}
// Example usage
$client = new BiliBiliClient();
$result = $client->get($_GET['id']);
print_r($result);
?>

Wen1989 发表于 2023-10-30 18:05:04

rkp2006 发表于 2023-11-5 15:18:40

楼主啊,看了半天没看懂完整代理地址

Tesla 发表于 2023-11-5 16:28:07

谢谢分享了。{:4_108:}

easy2003 发表于 2024-2-17 13:52:52

啃瓜子,看好贴。
页: [1]
查看完整版本: B站直播代理