【问题标题】:Node.js Twitter API cursorsNode.js Twitter API 游标
【发布时间】:2015-03-16 12:43:03
【问题描述】:

我正在使用npm-twit 来获取特定帐户的关注者。

Twitter API 从单个 GET 请求返回多达 5000 个结果。

如果我查询的用户有超过 5000 个关注者,则数据会返回“next_cursor”值。

要获得接下来的 5000 个结果,我需要重新运行 GET 函数,将“next_cursor”值作为参数传递给它。我只是不知道该怎么做。

我在考虑一个while循环,但我无法重置全局变量,我认为是因为范围:

var cursor = -1

while ( cursor != 0 ) { 

  T.get('followers/ids', { screen_name: 'twitter' },  function (err, data, response) {

  // Do stuff here to write data to a file

  cursor = data["next_cursor"];

  })

}

显然我不是一个 JS 天才,所以任何帮助将不胜感激。

【问题讨论】:

    标签: javascript node.js twitter


    【解决方案1】:

    您遇到的问题是由于 Node.js 是异步

    T.get('followers/ids', { screen_name: 'twitter' },  function getData(err, data, response) {
    
      // Do stuff here to write data to a file
    
      if(data['next_cursor'] > 0) T.get('followers/ids', { screen_name: 'twitter', next_cursor: data['next_cursor'] }, getData);
    
      })
    
    }
    

    请注意:

    1. 我为内部回调函数命名。这样我们就可以从内部递归调用它。
    2. 循环被递归回调替换。
    3. 如果有 next_cursor 数据,那么我们调用T.get 使用相同的函数getData

    请注意,Do stuff here 代码将被执行多次(与下一个光标一样多)。因为是递归回调,所以顺序是有保证的。


    如果你不喜欢递归回调的想法,你可以通过以下方式避免它:

    1. 如果可能,事先找出所有 next_cursor,并使用 for 循环生成请求。
    2. 或者,使用 Async 之类的异步辅助模块(尽管出于学习目的,我会避免使用模块,除非您已经精通该概念)。

    【讨论】:

    • 非常感谢您的帮助。这对我来说很有意义(当然也有效)。我曾调查过 Async,但觉得我可能按照你的建议走得太远了。
    【解决方案2】:

    为此苦苦挣扎.. 一切似乎都正常,但 data['next_cursor'] 没有改变,永远!

    代码应该是这样的:

    T.get('followers/ids', { screen_name: 'twitter' },  function getData(err, data, response) {
    
      // Do stuff here to write data to a file
    
      if(data['next_cursor'] > 0) T.get('followers/ids', { screen_name: 'twitter', cursor: data['next_cursor'] }, getData);
    
      })
    
    }
    

    Twit 的参数不是“next_cursor”,它只是“cursor”;)

    【讨论】:

      【解决方案3】:

      考虑使用 5K+ 帐户进行测试。

          const T = new Twit(tokens)
      
          function getFollowers (screenName, followers = [], cur = -1) {
            return new Promise((resolve, reject) => {
              T.get('followers/ids', { screen_name: screenName, cursor: cur, count: 5000 }, (err, data, response) => {
                if (err) {
                  cur = -1
                  reject(err)
                } else {
                  cur = data.next_cursor
                  followers.push(data.ids)
                  if (cur > 0) {
                    return resolve(getFollowers(screenName, followers, cur))
                  } else {
                    return resolve([].concat(...followers))
                  }
                }
              })
            })
          }
      
          async function getXaqron () {
            let result = await getFollowers('xaqron')
            return result
          }
      
       console.log(getXaqron().catch((err) => {
        console.log(err) // Rate limit exceeded
      }))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-06-10
        • 2016-04-18
        • 2013-04-05
        • 2012-09-02
        • 1970-01-01
        • 2021-03-05
        • 2014-10-19
        • 2014-07-03
        相关资源
        最近更新 更多