PHP 幾行核心程式碼實現提取快手水印視訊播放地址

一隻碼發表於2020-04-12

原理分析

從快手App拿到視訊分享連結在瀏覽器中訪問,比如地址 https://f.kuaishou.com/1mqmxe 然後會重定向,開啟瀏覽器控制檯點選左上角的手機圖片,重新整理模擬手機請求,觀察控制檯原始碼可以看到下面的一段程式碼裡包含一個srcNoWark欄位的MP4視訊地址,提取出來在瀏覽器中訪問可以看到視訊是汙水印的。

完整程式碼

下載Guzzle庫並引入

composer require guzzlehttp/guzzle

require __DIR__.'/vendor/autoload.php';
$url = $_GET['url'] ?? '';
$headers = [  
    'Connection' => 'keep-alive',  
    'User-Agent'=>'Mozilla/5.0 (iPhone; CPU iPhone OS 12_1_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/16D57 Version/12.0 Safari/604.1'
];
$client = new \GuzzleHttp\Client(['timeout' => 2, 'headers' => $headers, 'http_errors' => false,]);
$data['headers'] = $headers;
$jar = new \GuzzleHttp\Cookie\CookieJar;
$data['cookies'] = $jar;
$response = $client->request('GET', $url, $data);
$body = $response->getBody();
if ($body instanceof \GuzzleHttp\Psr7\Stream) {  
    $body = $body->getContents();
}
$result = htmlspecialchars_decode($body);
$pattern = '#"srcNoMark":"(.*?)"#';
preg_match($pattern, $result, $match);
$data['video_src'] = $match[1];
$pattern = '#"poster":"(.*?)"#';
preg_match($pattern, $result, $match);
if (!empty($match[1])) {  
    $data['cover_image'] = $match[1];
    echo json_encode($data);die();
}

下載安裝並引入guzzle請求PHP包, 初始化傳入模擬手機瀏覽器的請求頭,以及cookie。對請求返回的html頁面進行正則匹配出無水印播放URL

另附上我辛苦開發的多平臺整合API服務專案地址 https://github.com/leixiaokou/short-video

本作品採用《CC 協議》,轉載必須註明作者和本文連結

PHP是世界上最好的語言,那麼我該如何成為最好的PHPer

相關文章