<?php
use RingCentral\Psr7\Response;
function handler($request, $context): Response {
$upstream_pc_url = 'https://api.bilibili.com/pgc/player/web/playurl'; $upstream_app_url = 'https://api.bilibili.com/pgc/player/api/playurl'; $upstream_pc_search_url = 'https://api.bilibili.com/x/web-interface/search/type'; $timeout = 5;
$request_method = $request->getMethod(); $request_query = substr(stristr($request->getAttribute("requestURI"), '?'),1); $req_referer = "https://www.bilibili.com"; $request_headers = $request->getHeaders(); $request_body = $request->getBody()->getContents(); $request_uri = $request->getAttribute('requestURI');
$ch = curl_init();
$request_headers = array_remove_by_key($request_headers,'X-Forwarded-Proto'); $request_headers = array_remove_by_key($request_headers,'Host'); $request_headers = array_remove_by_key($request_headers,'Referer'); $request_headers = array_remove_by_key($request_headers,'Accept-Encoding'); curl_setopt($ch, CURLOPT_ENCODING, "identity");
$headers = array(); foreach ($request_headers as $key => $value) { $headers[] = $key . ": " .implode($value); }
if(substr_count($request_uri,'/search/type')!=0){ $url = $upstream_pc_search_url . '?' .$request_query; curl_setopt($ch, CURLOPT_REFERER, $req_referer); }elseif (substr_count($request_uri,'playurl')!=0){ if(substr_count($request_query,'platform=android')!=0){ $url = $upstream_app_url . '?' .$request_query; curl_setopt($ch, CURLOPT_USERAGENT, 'Bilibili Freedoooooom/MarkII'); }else{ $url = $upstream_pc_url . '?' .$request_query; curl_setopt($ch, CURLOPT_REFERER, $req_referer); } }else{ $header['Content-Type'] = 'text/plain'; return new Response( 502, $header, 'Failed to match interface.' ); } curl_setopt($ch, CURLOPT_TIMEOUT, $timeout); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $request_method); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_POSTFIELDS, $request_body); curl_setopt($ch, CURLOPT_HEADER, true); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch); $header = array();
if ($response === false) { $header['Content-Type'] = 'text/plain'; return new Response( 502, $header, 'Upstream host did not respond.' ); } else { $header_length = curl_getinfo($ch, CURLINFO_HEADER_SIZE); $response_headers = explode("\n", substr($response, 0, $header_length)); $response_body = substr($response, $header_length); foreach ($response_headers as $n => $response_header) { if (strpos($response_header, "Content-Encoding") !== false) { $response_headers[$n] = "Content-Encoding: identity\n"; } if (strpos($response_header, "Content-Length") !== false) { unset($response_headers[$n]); } if (strpos($response_header, "Access-Control-Allow-Credentials") !== false) { unset($response_headers[$n]); } } unset($response_header); foreach ($response_headers as $header_string) { $header_tmp = explode(': ', $header_string, 2); if (count($header_tmp) == 2) { $header[$header_tmp[0]] = trim($header_tmp[1]); } }
curl_close($ch); return new Response( 200, $header, $response_body ); } }
function str_n_pos($str, $find, $n) { $pos_val = 0; for ($i = 1; $i <= $n; $i++) { $pos = strpos($str, $find); $str = substr($str, $pos + 1); $pos_val = $pos + $pos_val + 1; } $count = $pos_val - 1; return $count; }
function array_remove_by_key($arr, $key) { if(!array_key_exists($key, $arr)){ return $arr; } $keys = array_keys($arr); $index = array_search($key, $keys); if($index !== FALSE){ array_splice($arr, $index, 1); }
return $arr; }
|