node.js - 在 node.js 中检索特定用户的最后 3200 条推文

标签 node.js twitter

我是 javascript 和 node.js 的新手,这是我的第一篇文章,所以请多多包涵。

我正在使用 ntwitter 获取特定用户之前的所有推文。

我的问题是,如果用户有超过 200 条推文,我需要创建一个循环,但我不确定我是否做对了。

这是获取 200 条最新推文的异步函数:

exports.getUserTimeline = function(user, callback) {

  twit.getUserTimeline({ screen_name: user, count: 200 }, function(err, data) {
    if (err) { 
      return callback(err);
    }
    callback(err, data);  
  });
}

我找到了一个使用递归函数来执行此操作的解决方案,但它非常丑陋..我该如何改进它?

exports.getUserHistory = function(user, callback) {
  recursiveSearch(user, callback);
  function recursiveSearch(user, callback, lastId, data) {
    var data = data || []
      , args = {screen_name: user, count: 200};

    if(typeof lastId != "undefined") args.max_id = lastId;

    twit.getUserTimeline(args, function(err, subdata) {
      if (err) { 
        console.log('Twitter search failed!');
        return callback(err);
      }
      if (data.length !== 0) subdata.shift();
      data = data.concat(subdata);
      var lastId = parseInt(data[data.length-1].id_str);
      if (subdata.length !== 0) {
        recursiveSearch(user, callback, lastId, data);
      } else {
        callback(err, data);
      }
    });
  }
}

非常感谢!


更新:这是 hunterloftis 建议的改进(重构)函数,有两个修改:

  1. 不应在第一次迭代时指定属性 max_id
  2. 必须处理用户存在但未发布推文的情况

代码:

function getUserHistory(user, done) {
  var data = [];
  search();

  function search(lastId) {
    var args = {
      screen_name: user,
      count: 200,
      include_rts: 1
    };
    if(lastId) args.max_id = lastId;

    twit.getUserTimeline(args, onTimeline);

    function onTimeline(err, chunk) {
      if (err) {
        console.log('Twitter search failed!');
        return done(err);
      }

      if (!chunk.length) {
        console.log('User has not tweeted yet');
        return done(err);
      }

      //Get rid of the first element of each iteration (not the first time)
      if (data.length) chunk.shift();

      data = data.concat(chunk);
      var thisId = parseInt(data[data.length - 1].id_str);

      if (chunk.length) return search(thisId);
      console.log(data.length + ' tweets imported');
      return done(undefined, data);
    }
  }
}

在检索推文时,我注意到我的推文计数并不总是与用户的“statuses_count”属性相同。我花了一些时间才弄清楚这个差异对应于删除的推文数量:)

最佳答案

你的递归函数有效吗?对我来说看起来还不错。我可能会将其重构为更像这样的东西:

function getUserHistory(user, done) {
  var data = [];
  search();

  function search(lastId) {
    var args = {
      screen_name: user,
      count: 200,
      max_id: lastId
    };

    twit.getUserTimeline(args, onTimeline);

    function onTimeline(err, chunk) {
      if (err) {
        console.log('Twitter search failed!');
        return done(err);
      }

      if (data.length) chunk.shift(); // What is this for?
      data = data.concat(chunk);
      var thisId = parseInt(data[data.length - 1].id_str);

      if (chunk.length) return search(thisId);
      return done(undefined, data);
    }
  }
}

关于node.js - 在 node.js 中检索特定用户的最后 3200 条推文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14258916/

相关文章:

node.js - 如何使用sequelize中的两列之间获取数据

node.js - Node JS 流 : Understanding data concatenation

c# - 在Linux上的ElectronJS中调用.dll文件

javascript - 向网页添加分享按钮

ios - 使用 Fabric 和 TwitterKit 时应用崩溃

python - 通过 Tweepy 在 Twitter 上更新状态时的回溯

node.js - 使用 Node 的 fs 会导致空对象

node.js - 在快速 route 使用 socket.io

Python Twitter API 如何搜索包含确切短语的推文?

javascript - 如何从推文事件中获取推文 ID