優酷視頻頁面不直接暴露媒體文件地址,需通過分析播放器請求獲取真實流媒體 URL。本文提供基於優酷播放列表 API 的完整解析方案,支持 FLV/MP4 格式選擇,附帶 Sid 生成、文件 ID 解密、種子混淆還原核心算法。
id_XMjA5MjQ0OTQ0.html → XMjA5MjQ0OTQ0)。https://v.youku.com/player/getPlayList/VideoIDS/{$id},獲取 JSON 數據(含 streamfileids、seed、segs、key 等)。https://f.youku.com/player/getFlvPath/sid/{$sid}_00/st/{$type}/fileid/{$fileid}?K={$key}。<?php
/**
* 解析優酷視頻真實下載地址
* @param string $url 優酷視頻頁面 URL
* @return string|false 真實 FLV/MP4 下載鏈接
*/
function fetch_youku_flv($url) {
// 1. 提取 Video ID
if (!preg_match('#id_(.*?)\.html#', $url, $m)) return false;
$id = $m[1];
// 2. 獲取播放列表 JSON
$json = get_curl_contents("https://v.youku.com/player/getPlayList/VideoIDS/$id");
$data = json_decode($json);
if (!$data || empty($data->data)) return false;
$video = $data->data[0];
$seed = $video->seed;
$streamFileIds = $video->streamfileids;
$segs = $video->segs;
// 3. 生成混淆字符串表
$mixed = getMixString($seed);
// 4. 遍歷流類型優先返回 flv/mp4
foreach ($streamFileIds as $type => $fileId) {
if (!in_array($type, ['flv', 'mp4'])) continue;
$realId = getFileId($fileId, $mixed);
$sid = getSid();
$key = $segs->$type[0]->k; // 獲取加密 key
return "https://f.youku.com/player/getFlvPath/sid/{$sid}_00/st/{$type}/fileid/{$realId}?K={$key}";
}
return false;
}
/** 獲取帶隨機數的時間戳 Sid */
function getSid() {
return time() . (rand(0, 9000) + 10000);
}
/** 種子生成混淆字符串(核心算法) */
function getMixString($seed) {
$source = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ/:._-1234567890';
$len = strlen($source);
$mixed = '';
for ($i = 0; $i < $len; ++$i) {
$seed = ($seed * 211 + 30031) % 65536;
$index = floor(($seed / 65536) * strlen($source));
$c = $source[$index];
$mixed .= $c;
$source = str_replace($c, '', $source);
}
return $mixed;
}
/** 解密 fileId */
function getFileId($fileId, $mixed) {
$ids = explode('*', $fileId);
array_pop($ids); // 最後一個為空
$realId = '';
foreach ($ids as $idx) {
$realId .= $mixed[$idx];
}
return $realId;
}
/** 安全的 cURL 獲取內容 */
function get_curl_contents($url, $timeout = 5) {
if (!function_exists('curl_init')) die('需開啟 php_curl 擴展');
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => $url,
CURLOPT_USERAGENT => $_SERVER['HTTP_USER_AGENT'] ?? 'PHP Script',
CURLOPT_HEADER => 0,
CURLOPT_TIMEOUT => $timeout,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_SSL_VERIFYPEER => false, // 如需驗證請配置 CA
]);
$content = curl_exec($ch);
curl_close($ch);
// 編碼自動檢測轉換
return mb_check_encoding($content, 'utf-8') ? $content : iconv('gbk', 'utf-8//IGNORE', $content);
}
// === 使用示例 ===
$url = 'https://v.youku.com/v_show/id_XMzg2OTQ3MjQw.html';
$downloadUrl = fetch_youku_flv($url);
if ($downloadUrl) {
echo "真實下載地址: $downloadUrl";
// 可直接重定向下載: header("Location: $downloadUrl");
} else {
echo "解析失敗,請檢查視頻鏈接或 API 變更";
}
?>
真實下載地址: https://f.youku.com/player/getFlvPath/sid/138035737110468_00/st/flv/fileid/03000201004F97EF4A2E350467A09DB266E872-5522-225F-DC45-40B4E1F9BE49?K=c2a4327df2bb5a65261d40ea
ffmpeg -i "m3u8_url" -c copy output.mp4