2017-02-14 53 views
1

我建立一個應用程序下載鳴叫的具體數量。我使用的server.js node.jsexpress()如何client.get從Twitter API使用Node.js的迭代,並表達

我創建了一個潰敗app.get('/api/tweets'...)將數據從Twitter的API保存。如果我返回200條推文,我的代碼運行良好。但是,如果我想要300多個,res.send(data)只返回幾個。

我創建了一個基於我的代碼用Python編寫的,它返回由Twitter API(3200)允許所有的鳴叫我的代碼:

allTweets = [] 
statuses = t.statuses.user_timeline(screen_name = 'user', count=100, include_rts=False) 
allTweets.extend(statuses) 
oldest = allTweets[-1]['id'] - 1 

while len(statuses) > 0: 
    statuses = t.statuses.user_timeline(screen_name = 'user', count=100, max_id=oldest, include_rts=False) 
    allTweets.extend(statuses) 
    oldest = allTweets[-1]['id'] - 1 

基於這一思路,我在這JavaScript代碼寫在server.js :

app.get('/api/tweets', function (req, res) { 
    var standardCount = 200; 
    var params = { 
     screen_name: 'user', 
     count: standardCount, 
     include_rts: false 
    }; 
    var statuses = client.get('statuses/user_timeline', params, function getTweets(error, data) { 
     if (error) { 
      console.log(error) 
     } 
     var tweets = data; 
     var oldest = parseInt((tweets.slice(-1)[0].id_str) - 1); 

     // This attempt works fine using if 
     if (0 < data.length) { 
      params = { 
       screen_name: 'user', 
       count: standardCount, 
       max_id: oldest, 
       include_rts: false 
      } 
      client.get('statuses/user_timeline', params, function getTweets(error, data) { 
       if (error) { 
        console.log(error); 
       } 
       tweets = tweets.concat(data); 
       oldest = parseInt((tweets.slice(-1)[0].id_str) - 1); 
       return res.send(tweets.slice(0, 500))); 
      }); 
     } 
    }); 
}); 

我第一次嘗試是while (0 < data.length),但它並沒有返回任何結果。我改變了它的if (0 < data.length),但它僅返回幾鳴叫。我想:

do { 
    // download tweets 
} 
while (0 < data.length) 

...有沒有成功。

什麼是使用Twitter的API來下載超過200個鳴叫迭代client.get的最佳方式?

+0

我不明白,你可以更新'standardCount'是以外的任何其他在'client.get 200 –

+0

@ExplosionPills'count'參數(狀態/ user_timeline)'指定要嘗試和檢索的Tweets數量,每個不同的請求最多不超過200個。 – estebanpdl

回答

1

聽起來像是你想要一個遞歸函數來獲取你的數據集:

function obtainTweets (params, number, offsetId, dataset, callback) { 
    dataset = dataset || [] 
    if (number < 0) return callback(null, dataset) 
    // ... update params 
    return client.get('...', params, (error, data) => { 
    if (error) return callback(error) 
    // .. logic to get new offsetId 
    dataset = dataset.concat(data) 
    return obtainTweets(params, number-200, offsetId, dataset, callback) 
    }) 
} 

在這裏,我們定義的方法obtainTweets這需要params對象,鳴叫的number你想獲得,offsetId它應該存在,當前datasetcallback允許一次迭代完成返回數據集。

每次迭代完成後,我們從給定的數字中減去最大200,直到達到0callback被調用,除非發生錯誤。

它將被用來像這樣:

obtainTweets({ user: 'some_user' }, 600, null, null, (error, data) => { 
    console.log(error, data) 
}) 
+1

我縮短了並刪除了promises示例,我會敦促您查看承諾,因爲它們可以防止您從希望獲取的大量推文中運行到堆棧溢出,但您也可以使用'nextTick'更多的是解決方案。 – Nijikokun

+0

Thnaks。我會檢查你的建議。我需要實現你的答案。最好。 – estebanpdl