【问题标题】:Get all video IDs of a YouTube playlist through GET requests通过 GET 请求获取 YouTube 播放列表的所有视频 ID
【发布时间】:2018-11-29 15:44:16
【问题描述】:

我正在尝试加载 YouTube 播放列表的所有视频 ID 并将它们保存在一个数组中以便以后访问它们。

我是从这个开始的:

$.getJSON( "https://www.googleapis.com/youtube/v3/playlistItems", {
  part : 'snippet', 
  playlistId : inputId,
  key: API_KEY
}, function(data) {
  $.each(data.items, function(i, item) {
    var itemId = item.snippet.resourceId.videoId;
    videoIds.push(itemId);
  }
);

然后我注意到只有输入播放列表的前 5 个视频 ID 保存在我的数组“videoIds”中。显然,YouTube API 使用页面来限制 GET 响应中的项目数量。我没有看到增加每个请求的项目数量的方法。因此,我使用响应键“resultsPerPage”、“totalResults”和“nextPageToken”更新了我的代码。基本上,我现在为播放列表的每一页发送一个 GET 请求:

$.getJSON("https://www.googleapis.com/youtube/v3/playlistItems", {
  part : 'snippet', 
  playlistId : inputId,
  key: API_KEY
}, function(data) {
  resultsPerPage = data.pageInfo.resultsPerPage;
  nextPageToken = data.nextPageToken;
  totalResults = data.pageInfo.totalResults;
  $.each(data.items, function(i, item) {
    var itemId = item.snippet.resourceId.videoId;
    videoIds.push(itemId);
  });

  // if playlist items don't fit on a single page
  if (resultsPerPage < totalResults) {
    for (var i = 0; i < totalResults/resultsPerPage; i++) {
      // send the request again...
      $.getJSON("https://www.googleapis.com/youtube/v3/playlistItems", {
        part: 'snippet', 
        playlistId: inputId,
        // but this time, with a pageToken
        pageToken: nextPageToken,
        key: API_KEY
      }, function(data) {
        // debug logging  
        console.log("old token:" + nextPageToken);
        console.log("new token:" + data.nextPageToken);
        // update the nextPageToken for the next iteration
        nextPageToken = data.nextPageToken;
        $.each(data.items, function(i, item) {
          var itemId = item.snippet.resourceId.videoId;
          videoIds.push(itemId);
        });
      });
    }
  }
});

我的问题:'nextPageToken' 的值永远不会改变。这是我运行代码后控制台的样子:

old token:CAUQAA script.js:62 
new token:CAoQAA script.js:63
old token:CAoQAA script.js:62
new token:CAoQAA script.js:63
old token:CAoQAA script.js:62
new token:CAoQAA script.js:63
old token:CAoQAA script.js:62
new token:CAoQAA script.js:63

为什么 GET 响应中的 nextPageToken 值与我在相关 GET 请求中用于 pageToken 的值相同?有没有更简单的方法来获取播放列表的所有 ID?

【问题讨论】:

标签: javascript jquery youtube-api youtube-data-api youtube-javascript-api


【解决方案1】:

YouTube 数据 API 的 Videos.list API 端点返回最大值 50 items per page

maxResults(无符号整数)

maxResults 参数指定结果集中应返回的最大项目数。

注意:此参数支持与 myRating参数,但不支持结合使用 使用id 参数。可接受的值为 150(含)。这 默认值为5

nextPageToken 的工作方式是这样的:

情况:

您尝试检索包含 200 个视频的列表,但 YouTube 每次分页只能返回 50 个结果。

  1. 第一次请求成功后,YouTube 会为您提供前 50 个视频,因此只剩下 150 个。前 50 个视频列表附带一个 nextPageToken,您可以使用它来检索接下来的 51-100 个。

  2. 因此,您将这个 nextPageToken 值传递给 pageToken 属性并执行另一个请求,这会导致 YouTube 数据 API 为您提供接下来的 51-100 个视频,因此只剩下 100 个。随着这 51-100 个视频的出现,新的 nextPageToken 再次出现,它将用于检索接下来的 101-150 个视频。冲洗并重复。

通过实际演示了解如何执行此操作会更容易,请观看this tutorial

Google API Explorer youtube.search.list 上测试它。

【讨论】:

  • 这就是我认为它应该工作的方式。在我的第二个代码示例中,我正在使用响应的新 nextPageToken,但我没有得到新的令牌。它总是返回第 2 页的令牌,即使该响应的视频 ID 已经是第 2 页的视频。
  • 更清楚一点:没有 pageToken 的第一个请求返回视频 1-5 和 nextPageToken 'CAoQAA'。 pageToken 'CAoQAA' 的第二个请求返回视频 6-10 和与以前相同的 nextPageToken 'CAoQAA'。
  • 你没有使用 "new nextPageTokens" 。检查我的答案。观看来自 youtube 的视频。
猜你喜欢
  • 1970-01-01
  • 2013-09-12
  • 2015-01-06
  • 2015-07-05
  • 2015-10-26
  • 2016-11-19
  • 1970-01-01
  • 2017-07-01
  • 2018-06-24
相关资源
最近更新 更多