我正在构建一个应用程序,以下载特定数量的推文。我在server.js中使用node.js
和express()
。
我创建了一个溃败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)
})