【问题标题】:Youtube Api, how to parse all vids with a nextPageToken?Youtube Api,如何使用 nextPageToken 解析所有视频?
【发布时间】:2017-09-20 00:16:44
【问题描述】:

我正在使用 Node.JS,以及“请求”库 https://github.com/request/request 我阅读了文档,因为我只能从频道请求 50 个视频,作为 api 服务器的响应,有一个 nextPageToken 密钥,但我不明白如何使这个 nextPageToken 的请求链通过整个链条。

`https://www.googleapis.com/youtube/v3/search?key=${key}&channelId=${channelId}&part=snippet,id&order=date&maxResults=50`;

我草拟了这段代码

request({url:url}, function(err, response, body){
    let data = JSON.parse(body);
    for(let i = 0; i < Math.fround(data.pageInfo.totalResults / maxResults); i++){
        let newUrl = url + '&pageToken=' + data.nextPageToken;
        request({url: newUrl}, function(err, response, body){
            newUrl = url + '&pageToken=' + JSON.parse(body).nextPageToken;
            console.log(JSON.parse(body).nextPageToken);
        })
    }
})

在频道+450视频,没有想到最好的解决方案,取第一个请求的结果,除以请求视频的最大数量,我得到9-10,结果是每个循环10遍,理论上每个请求都应该更新变量newUrl 之后,再次访问服务器以获取新数据和新的nextPageToken。

怎么样?

【问题讨论】:

  • 您不必计算必须发出多少请求。当您收到包含nextPageToken 的响应时,您将其设置为下一个请求的pageToken 的值。然后,您重复此过程(例如在while 循环中),始终使用最新的nextPageToken,直到您收到未设置nextPageToken 的响应。然后你就在搜索结果的末尾。
  • 嗨,我在想我会通过循环做什么,并检查服务器的最后一个回复是否包含nextPageToken的内容,但问题在于我不能执行请求,即将等待响应的查询链,在 Answer 之后会执行新的参数...

标签: javascript json node.js request youtube-api


【解决方案1】:

通常在处理 API 时,使用 for 循环是不公平的,您可能希望更慢地逐步处理您的请求。我下面的示例使用简单的递归,但您甚至可能希望在函数调用自身时添加超时。

let url = 'formatted url'
let videos = [];

function worker = (token, url) {
  
  //use the standard url if there is no token
  if (!token) {
    request({url:url}, function(err, response, body){
      let data = JSON.parse(body);
      //do something with data
      
      //if there is a next page token run worker again.
      if (data.nextPageToken) {
        let token = data.nexPageToken;
        
        return worker(token, url);
      } else {
        console.log('fin');
      }
      
   } else {
     //if there is a token use a new url
     let nurl = 'url + page token';
     
     request({url: url}, function(err, response, body) {
      
      let data = JSON.parse(body);
      //do something with data
      
      //if there is a token run the worker again
      
      if (data.nextPageToken) {
        let token = data.nextPageToken;
        return worker(token, url);
      } else {
        console.log('fin');
      }
      
     })
     
   }
}

worker(null, url);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-29
    • 2018-04-06
    • 1970-01-01
    • 2011-08-25
    • 2013-02-28
    • 2015-07-16
    • 2015-10-20
    • 1970-01-01
    相关资源
    最近更新 更多