Eri*_*hao 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=1url 来修复它。

  • 现在这条路也失败了。 (11认同)
  • @EricZhao,我认为它也停止使用新解决方案。 (6认同)
  • 我添加了 `&html5=1&c=TVHTML5&cver=6.20180913` (来自主帖中的 URL),看起来它解决了问题 (4认同)
  • 新方法今天也失效了。@EricZhao 你找到了这个兄弟的解决方案吗? (2认同)

Ami*_*nin 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

我们需要睁大眼睛。看起来谷歌中的某个人不喜欢 YouTube 启用此功能的事实。

  • 没有任何解决方案? (17认同)
  • 确实不工作。现在所有这些 URL 都返回“410-gone”。需要尽快找到新技巧 (6认同)
  • 谷歌不喜欢他们无法完全控制一切。你认为他们为什么不再坚持“不作恶”的座右铭?这与他们的目标不再兼容。←_← (4认同)

Sim*_*n C 11

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

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

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


小智 7

我想我找到了 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}'
Run Code Online (Sandbox Code Playgroud)

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;

}
Run Code Online (Sandbox Code Playgroud)

  • 但钥匙从哪里来呢?难道,钥匙短期内就会被封锁? (3认同)

小智 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}"
}
Run Code Online (Sandbox Code Playgroud)

这工作就像一个魅力


小智 5

你可以尝试使用这个插件

new YouTubeToHtml5();
Run Code Online (Sandbox Code Playgroud)
<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>
Run Code Online (Sandbox Code Playgroud)