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

问题描述 投票:0回答:11

https://www.youtube.com/get_video_info?video_id={videoId}正在抛出

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

google-api youtube youtube-api
11个回答
27
投票

编辑:我发现这可行。我不明白为什么。但确实有效。

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=1
来修复它。


14
投票

我想我已经找到了 YouTube get_video_info 端点的替代方案。

下面是 CURL 和 PHP (CURL) 的实现 POSTyoutubei/v1/player 端点发出请求,其中包含所需的最少请求标头和参数。

我从请求中删除了许多请求标头和参数,以保持简单和尽可能匿名,就像使用 GET get_video_info 端点时一样。例如 cookies、用户代理等

下面的示例可能仍然包含可选的请求参数,因为它是在紧急情况下完成的。

将用户代理设置为电视后,我通过检查 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;

}

13
投票

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


编辑 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

我们需要擦亮眼睛。看起来 Google 中的某个人不喜欢 YouTube 启用此功能。


11
投票

Youtube (截至 2021 年 8 月 8 日撰写本文时) 看起来已将等效输出移至

watch?v=
终点。您应该在它返回的 html 中的
ytInitialPlayerResponse
(json) 变量中找到视频格式。

例如https://youtube.com/watch?v=SA8ZBJWo73E 返回 html。在该 html 响应中,

ytInitialPlayerResponse
变量包含一个 json 字符串。在该字符串中,您可以在以下位置找到视频格式:
[streamingData][formats]

我很乐意接受所有的功劳,但这个例子commit是我找到答案的地方。


6
投票

更新(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}"
}

这工作就像一个魅力


4
投票

你可以尝试使用这个插件

new YouTubeToHtml5();
<script src="https://cdn.jsdelivr.net/gh/thelevicole/[email protected]/dist/YouTubeToHtml5.js"></script>
<video data-yt2html5="https://www.youtube.com/watch?v=ScMzIvxBSi4" controls></video>


2
投票

这就是我现在获取 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();
}

0
投票

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

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


0
投票

到目前为止,对于需要来自

get_video_info
API 的数据的 Python 项目,我找到的最佳解决方案似乎是使用
InnerTube
项目中的
pytube
 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}
    

0
投票
Dhruv Gohil 迅速回答:

private func process(inputString: String) -> [String: Any]? { do { let regex = try NSRegularExpression(pattern: "ytInitialPlayerResponse\\s*=\\s*(\\{.+?\\})\\s*;", options: []) if let match = regex.firstMatch(in: inputString, options: [], range: NSRange(location: 0, length: inputString.utf16.count)), let range = Range(match.range(at: 1), in: inputString) { let jsonString = String(inputString[range]) let jsonData = jsonString.data(using: .utf8)! let json = try JSONSerialization.jsonObject(with: jsonData) as? [String: Any] // json is now a dictionary print("\n\n\(jsonString)\n\n") return json } } catch { os_trace("pile parsing: got error \(error)", .error) } return nil }
    

-4
投票
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'));
我像这样使用它,但有时它有效,有时不起作用,即当它返回信息时有时它不返回信息。
你能修复里面的东西吗,非常感谢。

© www.soinside.com 2019 - 2024. All rights reserved.