私は 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 によって提案された、2 つの変更を加えた改良 (リファクタリング) 関数です。
- プロパティ max_id は最初の反復で指定しないでください
- ユーザーは存在するが、ツイートが投稿されていない場合を処理する必要があります
コード:
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」プロパティと常に同じではないことに気付きました。この差が削除されたツイートの数に対応することを理解するのに少し時間がかかりました:)