get_video_infoYouTube端点突然返回404notfound
https://www.youtube.com/get_video_info?video_id={videoId}正在抛出
响应状态代码不表示成功:404(未找到)。
回答
编辑:我发现这可以工作。我不知道为什么。但它确实有效。
https://www.youtube.com/get_video_info?video_id=onz2k4zoLjQ&eurl=https%3A%2F%2Fyoutube.googleapis.com%2Fv%2Fonz2k4zoLjQ&html5=1&c=TVHTML5&cver=6.20180913
您可以添加&html5=1url 来修复它。
- Now this way failed too.
- @EricZhao,我认为它也停止使用新解决方案。
- I added `&html5=1&c=TVHTML5&cver=6.20180913` (from the URL in the main post) and it seems like it fixed the problem
回答
出于某种原因,谷歌正试图让它变得更难。
2021 年 8 月编辑:
我刚刚为 C# 开发人员发布了一个新的 NuGet,它带来了 get_video_info 的 URL。享受!
https://www.nuget.org/packages/Youtube.VideoInfo
初始值为
https://www.youtube.com/get_video_info?video_id={videoId}&eurl=https://youtube.googleapis.com/v/{videoId}
然后添加了 HTML5 标签:
https://www.youtube.com/get_video_info?html5=1&video_id={videoId}&eurl=https://youtube.googleapis.com/v/{videoId}
现在(2021 年 6 月)新的解决方案是:
https://www.youtube.com/get_video_info?video_id={videoId}&eurl=https%3A%2F%2Fyoutube.googleapis.com%2Fv%2Fonz2k4zoLjQ&html5=1&c=TVHTML5&cver=6.20180913
我们需要睁大眼睛。看起来谷歌中的某个人不喜欢 YouTube 启用此功能的事实。
- 没有任何解决方案?
回答
我想我找到了 YouTube get_video_info端点的替代方法。
以下是对youtubei/v1/player端点的POST请求的 CURL 和 PHP (CURL) 实现,
具有最少的请求标头和参数。
我已经从请求中删除了许多请求标头和参数,以保持简单和尽可能匿名,就像使用GET get_video_info端点时一样。例如 cookie、用户代理等。
下面的示例可能仍然包含可选的请求参数,因为它是在紧急情况下完成的。
在将用户代理设置为电视后,我通过检查 Firefox 中的 XHR 网络请求发现了这个新 API。
firefox-inspect-network-xhr-requests-television-user-agent
以下 CURL 请求中使用的示例视频链接:
https://www.youtube.com/watch?v=UF8uR6Z6KLc
卷曲
curl 'https://www.youtube.com/youtubei/v1/player?key=AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8' -H 'Content-Type: application/json' --data '{ "context": { "client": { "hl": "en", "clientName": "WEB", "clientVersion": "2.20210721.00.00", "clientFormFactor": "UNKNOWN_FORM_FACTOR", "clientScreen": "WATCH", "mainAppWebInfo": { "graftUrl": "/watch?v=UF8uR6Z6KLc", } }, "user": { "lockedSafetyMode": false }, "request": { "useSsl": true, "internalExperimentFlags": [], "consistencyTokenJars": [] } }, "videoId": "UF8uR6Z6KLc", "playbackContext": { "contentPlaybackContext": { "vis": 0, "splay": false, "autoCaptionsDefaultOn": false, "autonavState": "STATE_NONE", "html5Preference": "HTML5_PREF_WANTS", "lactMilliseconds": "-1" } }, "racyCheckOk": false, "contentCheckOk": false}'
PHP(卷曲)
function getVideoInfo($video_id){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://www.youtube.com/youtubei/v1/player?key=AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 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": false}');
curl_setopt($ch, CURLOPT_ENCODING, 'gzip, deflate');
$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;
}