首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 解析優酷視頻真實下載鏈接(FLV/MP4)完整實現

     編輯:PHP 相關知識

PHP 解析優酷視頻真實下載鏈接(FLV/MP4)完整實現

優酷視頻頁面不直接暴露媒體文件地址,需通過分析播放器請求獲取真實流媒體 URL。本文提供基於優酷播放列表 API 的完整解析方案,支持 FLV/MP4 格式選擇,附帶 Sid 生成、文件 ID 解密、種子混淆還原核心算法。

核心流程

  1. 從視頻頁面 URL 提取 Video ID(如 id_XMjA5MjQ0OTQ0.html → XMjA5MjQ0OTQ0)。
  2. 請求播放列表 API:https://v.youku.com/player/getPlayList/VideoIDS/{$id},獲取 JSON 數據(含 streamfileids、seed、segs、key 等)。
  3. 遍歷流類型(flv/hd/mp4 等),使用 seed 還原混淆字符串,解密 fileid。
  4. 生成 Sid(時間戳+隨機數),拼接最終下載地址: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

注意事項與法律聲明

  • 優酷 API 可能隨時變更,本代碼僅供技術研究學習。
  • 下載視頻請遵守《著作權法》及優酷服務條款,僅限個人合理使用。
  • 商業用途需獲得版權方授權,否則構成侵權。
  • 現代優酷多採用 HLS (m3u8) 或 DASH 分段加密傳輸,FLV/MP4 直鏈可能不可用,需進一步解析 m3u8 並合併 ts 片段。

擴展方向

  • 解析 m3u8 並使用 FFmpeg 合併:ffmpeg -i "m3u8_url" -c copy output.mp4
  • 支持會員專屬清晰度(需 Cookie 模擬登錄)。
  • 封裝為 Composer 包,提供統一多平台(B站、騰訊、愛奇藝)解析接口。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved