こんにちは。やよいです。
前回の終わりに、期間を区切っていいねを取得すると書きましたが、一旦ツイッターAPIを叩いて全ツイートのいいね数を取得する部分についてまとめておくことにしました。
今回書いたコードはこちらです。
async function getTweets(user) {
console.log(user);
let params = {
id: user.twitter_id,
count: 200,
include_rts: false,
};
let tweets = await twiClient
.get("statuses/user_timeline", params)
.catch((error) => console.error(error));
let all_tweets = tweets;
let oldest = all_tweets.slice(-1)[0].id;
while (tweets.length > 0) {
params.max_id = oldest;
tweets = await twiClient
.get("statuses/user_timeline", params)
.catch((error) => console.error(error));
all_tweets = all_tweets.concat(tweets);
oldest = all_tweets.slice(-1)[0].id - 300;
}
fs.writeFileSync(
`json/tweets/${user.twitter_id}.json`,
JSON.stringify(all_tweets),
"utf-8"
);
}
全ツイートを取得し、保存するコードです。
リツイートを含まない、1ページあたりのツイート数は200まで
のパラメータでAPIを叩いています。
参考した記事はpythonのものだったので、それをjavascriptに書き換えました。
なぜかall_tweets.slice(-1)[0].id - 1;ではページ送りがされず、無限ループになってしまっていたので、次ページに影響せず、無限ループにならない範囲の数字(300)を指定しました。
200でも無限ループになっていました。なぜでしょうか・・・
とりあえず、取得したツイートすべてをjsonファイルとして保存をしています。
function getLikeAndRT(user) {
let rt = 0;
let likes = 0;
const tweets = JSON.parse(
readFileSync(`json/tweets/${user.twitter_id}.json`, "utf-8")
);
tweets.forEach((tweet) => {
likes += tweet.favorite_count;
rt += tweet.retweet_count;
});
const twitter_obj = {
likes_all: likes,
rt_all: rt,
};
return twitter_obj;
}
そして、こちらでツイッターIDを元に、ツイート内容を保存しているjsonファイルを読みこんでいます。
引数のuserには、DBに保存する際のユーザーIDと、ツイッターのIDが入っています。
各メンバーのツイートファイルから、favorite_countとretweet_countを取り出し、加算しています。
前回に引き続き、これは全ツイートのRTいいね数なので、日付の指定はしていません。
この加算結果をDBに保存すると、このようになります。
これで全ツイートのRTいいね数を取得してDBに保存するところまでできました。
そろそろまとめ作業だけではなく進捗を出していかなければなりませんね・・😇
参考記事