Twitterで「いいね」や「リツイート」されると嬉しいですよね!
感謝の意を込め、勝手にランキング化し、ユーザー名をご紹介させていただいています!
本記事では、集計方法、ツイートまでを作っていきたいと思います。
同じようにランキング化してみたい方は参考にしてみてください。
ランキング化の経緯
まず、どうしてランキング化するまでに至ったかの経緯を説明します。
本記事執筆時点(2022年6月5日)でフォロワーさんの人数は1150人を超えています。
私のツイートをいいねやリツイートしていただいており、なかなか感謝をお伝えする暇がありませんでした。
積極的に「いいね」や「リツイート」をしていただいている方を取り上げさせていただき、ご紹介することで私のフォロワーさんの目にも止まり、そこから何かが生まれるかも、と思っています。
現に、コメントからお互い知らない方でもコミュニケーションが生まれていますしね!
ランキング化のメリット
筆者の場合
- プログラミングスキル(Javascript)の向上
- TwitterAPIの理解の深化
- FirebaseのDatabaseの理解の深化
- ランキング化することによって、「いいね」や「リツイート」をしてみたい方が増える(ことを期待している)。
→私のことを認知していただける
→フォロワーが増える
フォロワーさんの場合
- 1100人を超える人の目に止まる
- プロフィールへのアクセスが増える
- コミュケーションが増える
集計方法
集計方法は主に、以下の2点。
- 2日前のツイートのいいねとリツイートを集計
- 6時間毎に集計しデータベースに保存
詳しく説明していきます。
2日前のツイートのいいねとリツイートを集計
なぜ2日前のツイートなのかというと、当日のツイートの集計だとタイミングとして早過ぎるからです。
当日を越してもいいねやリツイートがあることを見越し、2日前であればある程度落ち着いているため、2日前としています。
3日前でも4日前でも問題ありませんが、とりあえず2日前にしています。
6時間毎に集計しデータベースに保存
なぜ6時間毎に集計し、わざわざデータベースに保存しているかというと、TwitterAPIの仕様とFirebaseの仕様が影響しています。
TwitterAPIでは、いいねの集計に以下を使用します。
GET /2/tweets/:id/liking_users
こちらは、15分で75リクエストをすることができますが、75リクエストを超えた場合、15分後に実施することになります。
詳細は公式サイトを参照ください。
集計、ツイートはFirebaseのFunctionsという機能を使用していますが、1回の実行は9分以内で行う必要があります。
9分を超えるとタイムアウトが発生し、処理が終了してしまいます。
ツイート数が多くなればなるほどリクエスト数が増えてしまい、9分以内で実行できなくなってしまいました。
結果として、6時間毎に集計しデータベースに保存するという手法を取っています。
集計
Firebaseの設定やTwitterAPIの登録方法はこちらを参考にしてみてください。
いいねした人取得
以下、実装例です。
// リアクターIDマップ.
let reactorIdMap = {};
async function getLikesUsers(tweetId) {
let paginationToken = null;
while(1) {
let options = {max_results: 100};
if (paginationToken != null) {
options.pagination_token = paginationToken;
}
const result = await client.v2.tweetLikedBy(
tweetId,
options,
);
// 取得したいいねした人を設定.
for (let i = 0; i < result.meta.result_count; i++) {
// リアクターIDリストに追加.
if (result.data[i].username in reactorIdMap) {
reactorIdMap[result.data[i].username] = reactorIdMap[result.data[i].username] + 1;
} else {
reactorIdMap[result.data[i].username] = 0;
}
}
// 次ページチェック.
if (result.meta.next_token != null) {
paginationToken = result.meta.next_token;
} else {
// 次ページがなければ取得終了.
break;
}
}
}
リツイートして人を取得
以下、実装例です。
async function getRetweetUsers(tweetId) {
let paginationToken = null;
while(1) {
let options = {max_results: 100};
if (paginationToken != null) {
options.pagination_token = paginationToken;
}
const result = await client.v2.tweetRetweetedBy(
tweetId,
options
);
// 取得したRTした人を設定.
for (let i = 0; i < result.meta.result_count; i++) {
// リアクターIDリストに追加.
if (result.data[i].username in reactorIdMap) {
reactorIdMap[result.data[i].username] = reactorIdMap[result.data[i].username] + 1;
} else {
reactorIdMap[result.data[i].username] = 0;
}
}
// 次ページチェック.
if (result.meta.next_token != null) {
paginationToken = result.meta.next_token;
} else {
// 次ページがなければ取得終了.
break;
}
}
}
データベースに保存
取得したユーザ名をデータベースに保存します。
私の場合、データベースに「ReactorRanking/」というパスを作り、日付(yyyy-MM-ddThh)をキーとし、reactorIdMapを入れています。
一例ですが、以下のように保存されています。
ツイート
3日に1回、ランキングのツイートをしています。
集計は2日前までですので、5日前から2日前までの3日間分になっています。
例えば、6月4日のランキングは5月31日、6月1日、6月2日の3日間分のランキングになっています。
※ちょっとラグが発生してしまいますがご容赦を。
まとめ
本記事では、「いいね」、「リツイート」をしてくれる人を集計し、勝手にランキング化してツイートしてみました。
TwitterAPIの知識が深まれば、もっと面白いことができるのではないかと考えています。
また何か思いついたら、試してみてご紹介できればなと思います。
ランキングのツイートを確認してみたい方はこちらをフォローしてみてください。
よろしくお願いします。