PHP调用YouTube API获取MP4链接本地正常主机失效问题求助
问题:本地正常的YouTube API获取MP4代码,上传主机后返回“此内容不可用”
我用PHP通过YouTube API获取视频MP4链接,本地服务器运行正常,能成功拿到MP4链接;但上传到主机后,API返回的MP4文件显示“此内容不可用”。
错误截图:
使用的PHP代码:
<?php function getVideoInfo($video_id){ $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, 'https://www.youtube.com/youtubei/v1/player?key=[key]'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, '{ "context": { "client": { "hl": "en", "clientName": "WEB", "clientVersion": "2.20210721.00.00", "clientFormFactor": "UNKNOWN_FORM_FACTOR", "clientScreen": "WATCH", "mainAppWebInfo": { "graftUrl": "/watch?v='.$video_id.'", } }, "user": { "lockedSafetyMode": false }, "request": { "useSsl": true, "internalExperimentFlags": [], "consistencyTokenJars": [] } }, "videoId": "'.$video_id.'", "playbackContext": { "contentPlaybackContext": { "vis": 0, "splay": false, "autoCaptionsDefaultOn": false, "autonavState": "STATE_NONE", "html5Preference": "HTML5_PREF_WANTS", "lactMilliseconds": "-1" } }, "racyCheckOk": false, "contentCheckOk": true}'); curl_setopt($ch, CURLOPT_ENCODING, 'gzip, deflate'); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); $headers = array(); $headers[] = 'Content-Type: application/json'; curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); $result = curl_exec($ch); if (curl_errno($ch)) { echo 'Error:' . curl_error($ch); } curl_close($ch); return $result; } print_r(getVideoInfo("[video_id]"));
相同代码为何在本地与主机表现不同?该如何解决此问题?
可能的原因及解决办法
1. 主机IP被YouTube限制
YouTube会对高频请求或异常IP进行访问限制,主机服务器的IP可能因同服务器其他用户滥用、请求量过大被标记,导致API返回内容不可用。
- 解决:
- 给请求添加真实浏览器的
User-Agent头,模拟正常访问:在$headers数组中添加$headers[] = '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'; - 控制请求频率,避免短时间内多次调用API
- 尝试更换主机IP(如使用代理IP)
- 给请求添加真实浏览器的
2. API密钥的IP白名单限制
你的Google API密钥可能设置了IP白名单,仅允许本地IP访问,主机的公网IP不在允许范围内。
- 解决:
- 登录Google Cloud控制台,找到对应的YouTube Data API密钥
- 进入密钥设置页面,在「IP限制」中添加主机的公网IP
- 确认YouTube Data API v3已在控制台中启用
3. 请求参数版本过时
代码中使用的clientVersion是2021年的旧版本,YouTube的API可能已更新客户端版本要求,本地环境因缓存或兼容机制正常运行,主机环境则被拒绝。
- 解决:
- 打开YouTube官网,按F12进入开发者工具,切换到「网络」标签
- 找到向
youtubei/v1/player发送的POST请求,查看请求体中的clientVersion值,替换代码中的旧版本号 - 同步检查
context.client中的其他参数(如clientName)是否符合当前API的要求
4. 主机CURL配置限制
主机服务器的PHP-CURL可能禁用了某些功能,或无法处理gzip/deflate编码,导致请求解析失败。
- 解决:
- 尝试移除
CURLOPT_ENCODING设置,或仅保留gzip编码:curl_setopt($ch, CURLOPT_ENCODING, 'gzip'); - 联系主机服务商,确认服务器是否允许访问YouTube的API域名,是否有防火墙拦截
- 检查主机的PHP配置,确保CURL扩展正常启用,且相关选项未被禁用
- 尝试移除
内容的提问来源于stack exchange,提问作者Enes Akarsu
相关产品推荐
相关产品推荐

