如何使用node.js和express来从Twitter API迭代client.get
我正在构build一个应用程序来下载特定数量的推文。 我在server.js中使用node.js
和express()
。
我创build了一个app.get('/api/tweets'...)
来保存来自Twitter API的数据。 如果我返回200条推文,我的代码运行良好。 但是,如果我想要300多个, res.send(data)
只返回一些。
我使用python编写的代码创build了我的代码,该代码返回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)
没有成功
迭代client.get
使用Twitter API下载超过200条推文的最佳方法是什么?
听起来就像你想要一个recursion函数来获取你的数据集:
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) }) }
在这里,我们定义了一个方法:获取params
的方法,包括params
对象,你想获得的推文的number
, offsetId
是否存在,当前dataset
和callback
,以便在迭代完成后返回数据集。
每次迭代完成后,我们从给定的数字中减去最大值200
,直到达到0
并且除非发生错误,否则调用callback
。
它会像这样使用:
obtainTweets({ user: 'some_user' }, 600, null, null, (error, data) => { console.log(error, data) })