get_video_info YouTube 端点突然返回 404 未找到

Posted

技术标签:

【中文标题】get_video_info YouTube 端点突然返回 404 未找到【英文标题】:get_video_info YouTube endpoint suddenly returning 404 not found 【发布时间】:2021-08-09 09:45:26 【问题描述】:

https://www.youtube.com/get_video_info?video_id=videoId 正在投掷

响应状态码不表示成功:404(未找到)。

【问题讨论】:

页面元数据中不是这个信息吗?我注意到 Youtube 现在正在使用标准元数据和 OG 标签。 解决方案是使用 noembed.com 服务获取视频信息: 示例 URL:"noembed.com/embed?url=https://www.youtube.com/…" copywrites @Marco ***.com/a/47768013/348589 【参考方案1】:

编辑:我发现这可行。我不知道为什么。但它确实有效。

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


您可以在url中添加&html5=1来修复它。

【讨论】:

现在这种方式也失败了。 这种新方法有一点不同。上传和发布日期不可用!只有我得到这个吗? 我添加了&html5=1&c=TVHTML5&cver=6.20180913(来自主帖中的 URL),似乎它解决了问题 @EricZhao,我认为它也停止使用新解决方案。 新方法今天也停止工作了。 @EricZhao 你找到解决这个兄弟的方法了吗?【参考方案2】:
function getVideo($url)
    
        parse_str(file_get_contents("https://www.youtube.com/get_video_info?video_id=$url&html5=1"), $data);
        return $finalData = json_decode($data['player_response'], true);
    
    header('Content-Type: application/json');
    echo json_encode(getVideo('Zrcg7w67Ots'));

我就是这样使用它,但有时它有效,有时它不,即当它返回信息时,有时它不 你能在里面修什么吗,非常感谢

【讨论】:

你修复它后我看不出有什么不同!它仍然显示为空【参考方案3】:

出于某种原因,Google 正试图让它变得更难。


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 启用此功能的事实。

【讨论】:

您的解决方案运行良好。您是从哪里获得此更新信息的? Google 不喜欢他们无法完全控制一切。 ? 为什么你认为他们停止了“不作恶”的座右铭?这与他们的目标不再兼容。 ¬_¬ 添加 &html5=1&c=TVHTML5&cver=6.20180913 为我修复了 404 连接错误 - 看起来 eurl= 查询参数可能是可选的。 确实不行。现在所有这些 URL 都返回“410-gone”。需要尽快找到新技巧 有人已经找到解决方案了吗?【参考方案4】:

我想我找到了 YouTube get_video_info 端点的替代方法。

下面是 CURL 和 php (CURL) 的实现 POSTyoutubei/v1/player 端点发出请求,请求的标头和参数最少。

我已经从请求中删除了许多请求标头和参数,以保持简单和尽可能匿名,就像使用 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 (CURL)

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;


【讨论】:

但是钥匙从哪里来?莫非,短期内钥匙会被封杀? 密钥是从他们捕获的请求中生成的,它可能是每个用户的密钥。 我在window.ytcfg.data_的javascript中发现key和其他播放器数据是在嵌入HTML的脚本中设置的,所以应该很容易抓取。【参考方案5】:

更新(2021 年 7 月)

我已经尝试过这种方式

发布: https://youtubei.googleapis.com/youtubei/v1/player?key=AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8

与身体:


 "context": 
   "client": 
    "hl": "en",
    "clientName": "WEB",
    "clientVersion": "2.20210721.00.00",
    "mainAppWebInfo": 
        "graftUrl": "/watch?v=VIDEO_ID"
    
   
  ,
  "videoId": "VIDEO_ID"

这个工作就像一个魅力

【讨论】:

它适用于公共视频。私人视频的任何可能性。 get_video_info 也可以返回私人视频。 我也可以通过上述方式获得未列出的视频 很抱歉... ...但您的计算机或网络可能正在发送自动查询。为了保护我们的用户,我们现在无法处理您的请求。 @toan-huynh 你是怎么拿到钥匙的?使用安全吗?【参考方案6】:

你可以试试这个插件

new YouTubeToHtml5();
<script src="https://cdn.jsdelivr.net/gh/thelevicole/youtube-to-html5-loader@4.0.1/dist/YouTubeToHtml5.js"></script>
<video data-yt2html5="https://www.youtube.com/watch?v=ScMzIvxBSi4" controls></video>

【讨论】:

【参考方案7】:

尝试 1060 修复 - 此问题尚未在 Pytube 包中修复。在 Pytube 正式可用之前,您可以在系统中安装以下一个以进行下载工作。 https://github.com/Zeecka/pytube/tree/fix_1060

更多详情可以参考https://github.com/pytube/pytube/issues/1060

【讨论】:

【参考方案8】:

Youtube (在 2021 年 8 月 8 日撰写本文时) 看起来已将等效输出移至 watch?v= 端点。您应该在它返回的 html 中的 ytInitialPlayerResponse (json) 变量中找到视频格式。

例如https://youtube.com/watch?v=SA8ZBJWo73E 返回 html。在该 html 响应中,ytInitialPlayerResponse 变量包含一个 json 字符串。在该字符串中,您可以在以下位置找到视频格式:[streamingData][formats]

我很想把所有功劳都归功于这个例子 commit 是我找到答案的地方。

【讨论】:

好一个! defo 在我的项目中使用这种方法。【参考方案9】:

这就是我现在获取 youtube 流数据格式的方式。也许它可以帮助某人。

var videoInfoUrl =  $"https://www.youtube.com/watch?v=videoId";
using (var client = new HttpClient())

  var videoPageContent = await client.GetStringAsync(videoInfoUrl);

  var regex = new Regex(@"ytInitialPlayerResponse\s*=\s*(\.+?\)\s*;", RegexOptions.Multiline);
  var match = regex.Match(videoPageContent);

  if (!match.Success)
     return "";

  var json = match.Result("$1");

  var playerResponseJson = JToken.Parse(json);
  var formats = playerResponseJson.SelectToken("streamingData.formats").ToList();

【讨论】:

我发现现在 ytInitialPlayerResponse 有时可用有时不可用。你也注意到了吗?【参考方案10】:

到目前为止,对于需要来自get_video_info API 的数据的 Python 项目,我发现的最佳解决方案似乎是使用来自pytube project 的the InnerTube API:

>>> from pytube.innertube import InnerTube
>>> innertube = InnerTube()
>>> video_info = innertube.player("dQw4w9WgXcQ")
>>> video_info.keys()
dict_keys(['responseContext', 'trackingParams', 'adBreakParams', 'playabilityStatus', 'streamingData', 'playbackTracking', 'videoDetails', 'annotations', 'playerConfig', 'storyboards', 'attestation', 'videoQualityPromoSupportedRenderers', 'messages', 'endscreen', 'playerSettingsMenuData'])
>>> video_info["videoDetails"]
'videoId': 'dQw4w9WgXcQ', 'title': 'Rick Astley - Never Gonna Give You Up (Official Music Video)', 'lengthSeconds': '212', 'keywords': ['rick astley', 'Never Gonna Give You Up', 'nggyu', 'never gonna give you up lyrics', 'rick rolled', 'the boys soundtrack', 'the boys amazon prime', 'Never gonna give you up the boys', 'official', 'Rick Roll', 'music video', 'Rick Astley album', 'rick astley official', 'together forever', 'Whenever You Need Somebody', 'rickrolled', 'WRECK-IT RALPH 2', 'Fortnite song', 'Fortnite event', 'Fortnite dance', 'fortnite never gonna give you up', 'rick astley never gonna give you up', 'rick astley never gonna give you up lyrics'], 'channelId': 'UCuAXFkgsw1L7xaCfnd5JJOw', 'isOwnerViewing': False, 'shortDescription': "Rick Astley's official music video for “Never Gonna Give You Up” \n\nSubscribe to the official Rick Astley YouTube channel: https://RickAstley.lnk.to/YTSubID\n\nFollow Rick Astley:\nFacebook: https://RickAstley.lnk.to/FBFollowID \nTwitter: https://RickAstley.lnk.to/TwitterID \nInstagram: https://RickAstley.lnk.to/InstagramID \nWebsite: https://RickAstley.lnk.to/storeID \nTikTok: https://RickAstley.lnk.to/TikTokID\n\nListen to Rick Astley:\nSpotify: https://RickAstley.lnk.to/SpotifyID \nApple Music: https://RickAstley.lnk.to/AppleMusicID \nAmazon Music: https://RickAstley.lnk.to/AmazonMusicID \nDeezer: https://RickAstley.lnk.to/DeezerID \n\nLyrics:\nWe’re no strangers to love\nYou know the rules and so do I\nA full commitment’s what I’m thinking of\nYou wouldn’t get this from any other guy\n\nI just wanna tell you how I’m feeling\nGotta make you understand\n\nNever gonna give you up\nNever gonna let you down\nNever gonna run around and desert you\nNever gonna make you cry\nNever gonna say goodbye\nNever gonna tell a lie and hurt you\n\nWe’ve known each other for so long\nYour heart’s been aching but you’re too shy to say it\nInside we both know what’s been going on\nWe know the game and we’re gonna play it\n\nAnd if you ask me how I’m feeling\nDon’t tell me you’re too blind to see\n\nNever gonna give you up\nNever gonna let you down\nNever gonna run around and desert you\nNever gonna make you cry\nNever gonna say goodbye\nNever gonna tell a lie and hurt you\n\n#RickAstley #NeverGonnaGiveYouUp #OfficialMusicVideo", 'isCrawlable': True, 'thumbnail': 'thumbnails': ['url': 'https://i.ytimg.com/vi/dQw4w9WgXcQ/default.jpg', 'width': 120, 'height': 90, 'url': 'https://i.ytimg.com/vi/dQw4w9WgXcQ/mqdefault.jpg', 'width': 320, 'height': 180, 'url': 'https://i.ytimg.com/vi/dQw4w9WgXcQ/hqdefault.jpg', 'width': 480, 'height': 360, 'url': 'https://i.ytimg.com/vi/dQw4w9WgXcQ/sddefault.jpg', 'width': 640, 'height': 480], 'averageRating': 4.893901, 'allowRatings': True, 'viewCount': '1031179782', 'author': 'Rick Astley', 'isPrivate': False, 'isUnpluggedCorpus': False, 'isLiveContent': False

【讨论】:

以上是关于get_video_info YouTube 端点突然返回 404 未找到的主要内容,如果未能解决你的问题,请参考以下文章

YouTube get_video_info 引发限制错误

如何获取 Youtube Vevo 视频的视频信息?

PHP curl函数制 exec_ch和get_headers

如何在未经授权的情况下上传到 YouTube

微服务:啥是智能端点和哑管道?

从 YouTube api 中自动生成的频道中获取视频