早期視頻網站使用 Flash 播放器,通過解析頁面 HTML/JS 可提取 .swf 或 .flv/.mp4 直鏈。現今主流站點均已遷移至 HTML5(HLS/m3u8、MP4 分段、DRM 加密),且接口加密簽名、Referer 校驗、Cookie 驗證嚴格,**直接解析播放地址已極難且違反服務條款**。
本文僅作**技術原理歷史歸檔**,展示早期 Flash 時代的解析思路,**不提供當前可用的破解代碼**。生產項目請使用官方開放平台 API 或嵌入官方播放器(iframe/JS SDK)。
<?php
/**
* 歷史參考:通用視頻解析基類(Flash 時代)
* 當前主流站點已不適用,僅供學習正則、DOM 解析、HTTP 協議
*/
abstract class LegacyVideoParser
{
protected string $url;
protected array $headers = [
'User-Agent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
'Referer' => 'https://www.google.com/',
];
public function __construct(string $url)
{
$this->url = $url;
}
public function parse(): ?array
{
$html = $this->fetch($this->url);
if (!$html) return null;
return $this->extract($html);
}
protected function fetch(string $url): string|false
{
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTPHEADER => array_map(fn($k, $v) => "$k: $v", array_keys($this->headers), $this->headers),
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_TIMEOUT => 15,
]);
$res = curl_exec($ch);
curl_close($ch);
return $res;
}
abstract protected function extract(string $html): ?array;
}
// 優酷(舊版)解析器示例
class YoukuLegacyParser extends LegacyVideoParser
{
protected function extract(string $html): ?array
{
// 1. 頁面內內嵌 JSON 數據
if (preg_match('/videoId[=:]["\']?([\w-]+)["\']?/', $html, $m)) {
$vid = $m[1];
return [
'type' => 'swf',
'url' => "https://player.youku.com/player.php/sid/$vid/v.swf",
'title'=> '優酷視頻',
];
}
// 2. 頁面 input 隱藏域
if (preg_match('/id="link2"\s+value="([^"]+)"/', $html, $m)) {
return ['type' => 'swf', 'url' => $m[1]];
}
return null;
}
}
// 土豆(舊版)
class TudouLegacyParser extends LegacyVideoParser
{
protected function extract(string $html): ?array
{
if (preg_match('/iid\s*[:=]\s*["\']?(\d+)["\']?/', $html, $m)) {
return [
'type' => 'swf',
'url' => "https://www.tudou.com/player/skin/plu.swf?iid={$m[1]}",
];
}
return null;
}
}
// 使用方式(歷史)
// $parser = new YoukuLegacyParser('https://v.youku.com/v_show/id_XMTIz.html');
// print_r($parser->parse());
| 站點 | 視頻ID特徵 | 播放器類型 | 解析關鍵點 |
|---|---|---|---|
| 優酷 | id_XXXX.html / sid/XXXX | SWF → HTML5 | 頁面 JSON videoId、link2 隱藏域 |
| 騰訊視頻 | vid=xxxx / cover/xxxx.html | SWF → HTML5 | player 請求獲取 vkey、m3u8 |
| 搜狐視頻 | vid=xxxx | SWF → HTML5 | meta og:video 標簽 |
| 56網 | v_XXXX.html | SWF | URL 直接構造 player.56.com/XXXX.swf |
| 鳳凰視頻 | guid=xxxx | SWF | 外鏈 exterior.swf?guid= |
| 音悅台 | video/XXXX | SWF → HTML5 | 頁面 JSON 數據 |
https://api.bilibili.com/x/web-interface/view?bvid=BVxxxx 獲取 cid,再請求 /x/player/playurl 獲取 m3u8(需登錄 Cookie/SESSDATA)<!-- 優酷嵌入 -->
<iframe src="https://player.youku.com/embed/XMTIzNDU2" allowfullscreen></iframe>
<!-- B站嵌入 -->
<iframe src="https://player.bilibili.com/player.html?bvid=BV1xx411c7xx" allowfullscreen></iframe>
<!-- 騰訊視頻嵌入 -->
<iframe src="https://v.qq.com/txp/iframe/player.html?vid=xxxx" allowfullscreen></iframe>
若有合法授權需自建播放器,可通過 PHP 代理轉發 m3u8/ts 分段:
<?php
// proxy_m3u8.php?url=https://example.com/video.m3u8
$targetUrl = $_GET['url'] ?? '';
if (!$targetUrl || !filter_var($targetUrl, FILTER_VALIDATE_URL)) {
http_response_code(400);
exit('Invalid URL');
}
// 簡單代理(生產需加緩存、限流、權限校驗)
$ch = curl_init($targetUrl);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Referer: https://v.qq.com/'], // 根據目標站點設置
CURLOPT_FOLLOWLOCATION => true,
]);
$content = curl_exec($ch);
$contentType = curl_getinfo($ch, CURLINFO_CONTENT_TYPE);
curl_close($ch);
header('Content-Type: ' . ($contentType ?: 'application/vnd.apple.mpegurl'));
// 重寫 m3u8 內的相對路徑為絕對代理路徑
if (strpos($contentType, 'mpegurl') !== false) {
$base = rtrim(dirname($targetUrl), '/') . '/';
$content = preg_replace('/^(?!#|https?:\/\/)/m', $base, $content);
$content = preg_replace('/(https?:\/\/[^\/]+)\//', 'proxy_m3u8.php?url=$1/', $content);
}
echo $content;