VideoUrlParser 是一個 PHP 工具類,支援從國內主流視頻網站(優酷、騰訊視頻、愛奇藝、B站、西瓜視頻、抖音、快手等)的分享頁面 URL 中提取:
適用場景:CMS 視頻聚合、編輯器自動嵌入、資料採集、前端無需載入重型 SDK 即可預覽。
# Composer 安裝(假設已發布至 Packagist)
composer require your-vendor/video-url-parser
# 或直接下載 VideoUrlParser.php 放入專案
require_once 'VideoUrlParser.php';
use VideoUrlParser\VideoUrlParser;
$url = 'https://v.youku.com/v_show/id_XMjkwMzc0Njg4.html';
$info = VideoUrlParser::parse($url);
if ($info) {
echo "標題: {$info['title']}\n";
echo "縮略圖: {$info['img']}\n";
echo "播放頁: {$info['url']}\n";
echo "嵌入碼: {$info['embed']}\n";
} else {
echo "不支援的網站或解析失敗\n";
}
| 站點 | 支援 URL 格式範例 | 備註 |
|---|---|---|
| 優酷 | https://v.youku.com/v_show/id_X...html | 支援播放列表、單視頻 |
| 騰訊視頻 | https://v.qq.com/x/cover/...html, https://v.qq.com/x/page/...html | 需解析 vid、cid 參數 |
| 愛奇藝 | https://www.iqiyi.com/v_...html, https://www.iqiyi.com/w_...html | 支援專輯、單集 |
| B站 | https://www.bilibili.com/video/BV.../, https://b23.tv/.../ | 支援 BV/AV 號、短鏈接 |
| 西瓜視頻 | https://www.ixigua.com/.../ | 字節系,解析較複雜 |
| 抖音/快手 | https://v.douyin.com/.../, https://www.kuaishou.com/short-video/.../ | 需處理重定向、簽名參數 |
| 微博視頻 | https://video.weibo.com/show?fid=... | 支援二級頁面 |
<?php
namespace VideoUrlParser;
abstract class BaseParser {
abstract public function parse(string $url): ?array;
protected function fetch(string $url): string { /* curl + gzip 解壓 */ }
protected function extractJson(string $html, string $pattern): ?array { /* 正則提取 JSON */ }
}
class YoukuParser extends BaseParser { /* 實作優酷邏輯 */ }
class QqParser extends BaseParser { /* 實作騰訊邏輯 */ }
// ...
class VideoUrlParser {
private static array $parsers = [
'youku.com' => YoukuParser::class,
'v.qq.com' => QqParser::class,
// ...
];
public static function parse(string $url): ?array {
$host = parse_url($url, PHP_URL_HOST) ?? '';
foreach (self::$parsers as $domain => $class) {
if (str_contains($host, $domain)) {
return (new $class())->parse($url);
}
}
return null;
}
}
?>
<?php
private function fetch(string $url): string {
// 優先使用 curl(支援 cookie、header、proxy、timeout 控制)
if (function_exists('curl_init')) {
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_MAXREDIRS => 5,
CURLOPT_CONNECTTIMEOUT => 5,
CURLOPT_TIMEOUT => 15,
CURLOPT_USERAGENT => self::UA,
CURLOPT_ENCODING => 'gzip,deflate', // 自動解壓
CURLOPT_SSL_VERIFYPEER => false, // 開發環境可關閉驗證
]);
$html = curl_exec($ch);
curl_close($ch);
if ($html !== false) return $html;
}
// 降級:file_get_contents (需 allow_url_fopen=On)
return @file_get_contents($url) ?: '';
}
?>
setCookies() 介面。大多數站點已加密播放鏈接(m3u8、flv、mp4 簽名、DRM),僅靠解析分享頁無法直接獲取直鏈。若需真實播放地址,建議:
you-get、yt-dlp 等成熟下載工具作為後端服務:<?php
// 呼叫 yt-dlp 獲取直鏈(需伺服器安裝 yt-dlp)
function getDirectUrl(string $pageUrl): ?string {
$cmd = escapeshellcmd("yt-dlp -g --no-playlist '$pageUrl'");
$output = shell_exec($cmd);
return trim($output) ?: null;
}
?>
| 問題 | 原因 | 解決方案 |
|---|---|---|
| 解析返回 null | 域名不在支援列表 / URL 格式變更 | 檢查 $host 是否匹配;提交 Issue 或自行擴充解析器 |
| 標題/縮略圖為空 | 頁面結構變更 / 需登入 / 反爬攔截 | 更新正則/JSON 提取邏輯;注入有效 Cookie |
| 獲取不到 embed 代碼 | 站點已棄用 Flash embed,改用 iframe/JS SDK | 改用官方 iframe 嵌入代碼生成邏輯 |
| 請求超時/失敗 | 網路不通 / 伺服器在國外 / 防火牆攔截 | 增加 timeout、配置 proxy、使用國內鏡像節點 |
NewSiteParser.php 繼承 BaseParser。parse():分析目標站點分享頁 HTML/JSON/JS 變數,提取所需欄位。VideoUrlParser::$parsers 註冊域名映射。僅供學習研究與個人非商業用途。商業聚合請申請各平台開放平台授權,遵守《著作權法》、《網絡安全法》及平台服務條款。請勿大規模爬取、儲存、分發受版權保護的視頻內容。