【问题标题】:How to iterate client.get from Twitter API using node.js and express如何使用 node.js 从 Twitter API 迭代 client.get 并表达
【发布时间】:2017-07-03 03:21:00
【问题描述】:

我正在构建一个应用程序来下载特定数量的推文。我在 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 &lt; data.length),但它没有返回任何内容。我将其更改为if (0 &lt; data.length),但它只返回几条推文。我试过了:

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

...没有成功。

使用 Twitter API 迭代 client.get 以下载 200 多条推文的最佳方法是什么?

【问题讨论】:

  • 我看不到你可以在哪里将standardCount 更新为 200 以外的任何值。
  • @ExplosionPills count client.get(statuses/user_timeline) 中的参数指定要尝试和检索的推文数量,每个不同请求最多 200 个。

标签: javascript node.js loops express twitter


【解决方案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,当前的dataset和一个callback以允许迭代完成后返回您的数据集。

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

它会这样使用:

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

【讨论】:

  • 我已经缩短并删除了 Promise 示例,我会敦促您研究 Promise,因为它们可以防止您从想要获取的大量推文中遇到堆栈溢出,您可以也可以使用nextTick,但这更像是一种技巧而不是解决方案。
  • 感谢。我会检查你的建议。我需要实现你的答案。最好的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-19
  • 2015-03-31
  • 2016-10-16
  • 1970-01-01
  • 2013-05-24
  • 2015-05-31
  • 2014-06-15
相关资源
最近更新 更多