いいね、リツイートしてくれた方を勝手にランキング👑Twitter APIを使い倒す!

スポンサーリンク

Twitterで「いいね」や「リツイート」されると嬉しいですよね!
感謝の意を込め、勝手にランキング化し、ユーザー名をご紹介させていただいています!

本記事では、集計方法、ツイートまでを作っていきたいと思います。
同じようにランキング化してみたい方は参考にしてみてください。

スポンサーリンク

ランキング化の経緯

まず、どうしてランキング化するまでに至ったかの経緯を説明します。

本記事執筆時点(2022年6月5日)でフォロワーさんの人数は1150人を超えています。
私のツイートをいいねやリツイートしていただいており、なかなか感謝をお伝えする暇がありませんでした。

積極的に「いいね」や「リツイート」をしていただいている方を取り上げさせていただき、ご紹介することで私のフォロワーさんの目にも止まり、そこから何かが生まれるかも、と思っています。

現に、コメントからお互い知らない方でもコミュニケーションが生まれていますしね!

スポンサーリンク

ランキング化のメリット

筆者の場合

  1. プログラミングスキル(Javascript)の向上
  2. TwitterAPIの理解の深化
  3. FirebaseのDatabaseの理解の深化
  4. ランキング化することによって、「いいね」や「リツイート」をしてみたい方が増える(ことを期待している)。
    →私のことを認知していただける
    →フォロワーが増える

フォロワーさんの場合

  1. 1100人を超える人の目に止まる
  2. プロフィールへのアクセスが増える
  3. コミュケーションが増える
スポンサーリンク

集計方法

集計方法は主に、以下の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の知識が深まれば、もっと面白いことができるのではないかと考えています。
また何か思いついたら、試してみてご紹介できればなと思います。

ランキングのツイートを確認してみたい方はこちらをフォローしてみてください。
よろしくお願いします。