簡體   English   中英

Node.js Twitter API游標

[英]Node.js Twitter API cursors

我正在使用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的天才,所以任何幫助都會非常感激。

您遇到的問題是由於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數據,那么我們使用相同的函數getData調用T.get

請注意, Do stuff here代碼將被執行多次(與下一個游標一樣多)。 由於它是遞歸回調 - 訂單是有保證的。


如果你不喜歡遞歸回調的想法,你可以通過以下方式避免它:

  1. 如果可能,事先找出所有next_cursor ,並使用for循環生成請求。
  2. 或者,使用異步輔助模塊,如Async (雖然出於學習目的,我會避免使用模塊,除非你已經熟悉這個概念)。

考慮使用一些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
}))

掙扎着這一個..一切似乎都有效,但數據['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”,它只是“光標”;)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM