file_get_contents()读取YouTube视频信息失效,请求协助排查原因
问题分析与解决方案
这种情况我碰到过很多次,大概率是YouTube的反爬策略更新导致的——毕竟他们一直在调整机制来限制非官方工具的访问。咱们一步步来拆解原因和解决办法:
核心原因
你之前的代码失效,主要是这几个关键点:
- YouTube现在会严格校验请求的User-Agent标识,
file_get_contents默认发送的请求没有模拟浏览器的UA头,会被直接拦截返回空内容 - 原代码用的是HTTP协议,现在YouTube会强制将HTTP请求重定向到HTTPS,而
file_get_contents默认不自动跟随重定向 - 部分服务器可能禁用了
allow_url_fopen配置,导致无法远程获取内容
修复方案
方案1:给file_get_contents添加请求头并启用重定向
修改代码,通过stream_context_create模拟浏览器请求,同时开启重定向支持:
$vid = 'WwVZBfMlNPA'; // 改用HTTPS协议 $vurl = 'https://youtube.com/get_video_info?video_id=' . $vid; // 模拟Chrome浏览器的请求头 $context = stream_context_create([ 'http' => [ 'header' => "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36\r\n", 'follow_location' => 1 // 自动跟随重定向 ] ]); $contents = file_get_contents($vurl, false, $context); var_dump($contents); parse_str($contents, $info);
方案2:改用cURL(更稳定可靠)
如果服务器禁用了allow_url_fopen,或者需要更复杂的请求控制,cURL是更好的选择:
$vid = 'WwVZBfMlNPA'; $vurl = 'https://youtube.com/get_video_info?video_id=' . $vid; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $vurl); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 模拟浏览器UA curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36'); // 跟随重定向 curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // 禁用SSL证书校验(如果服务器有证书问题) curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); $contents = curl_exec($ch); curl_close($ch); var_dump($contents); parse_str($contents, $info);
补充说明
- 即使修复后,这个非公开接口未来可能还会失效,因为YouTube一直在调整反爬规则,官方并不推荐使用这类非正规途径
- 如果需要长期稳定获取视频信息,建议使用YouTube Data API,这是官方提供的合法合规途径
内容的提问来源于stack exchange,提问作者Nick Buck
相关产品推荐
相关产品推荐

