通过GET请求获取YouTube播放列表的所有视频ID

时间:2018-06-20 13:26:23

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

我正在尝试加载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?

1 个答案:

答案 0 :(得分:1)

Youtube API只能返回50 results per page

  

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

     

注意:此参数支持与   myRating参数,但不支持结合使用   与id参数。可接受的值为1到50(含)。的   默认值为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上进行测试: