我正在构建一个应用程序,以下载特定数量的推文。我在server.js中使用node.jsexpress()

我创建了一个溃败app.get('/api/tweets'...)来保存来自Twitter API的数据。如果我返回200条推文,我的代码效果很好。但是,如果我希望超过300个,res.send(data)仅返回几个。

我基于用python编写的代码创建了代码,该代码返回Twitter API(3,200)允许的所有推文:

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迭代client.get来下载200条以上推文的最佳方法是什么?

最佳答案

听起来好像您想要一个递归函数来获取数据集:

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对象,您想获取的tweets的number,如果存在的offsetId,当前的dataset和一个callback以便返回数据集一旦迭代完成。

每次迭代完成时,我们都会从给定的数字中减去最大值200,直到达到0为止,除非出现错误,否则将调用callback

它的用法如下:

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

07-24 09:44
查看更多