#️⃣

Cloudflare Workers を使って無料で X(Twitter) のボットを作ってみる

2024/04/08に公開

はじめに

X(Twitter)APIでは、毎月1,500回(30分に1回)まで無料で投稿できます(2024年4月現在)。
参照: X API

ここ最近のプラン変更で無料でできることは減っていますが、今でも個人開発レベルでボットを動かすのであれば十分かなと思います。

ボットの実行環境ですが、今回はCloudflare Workersを使用します。
Cloudflare Workersでは1日100,000リクエストまで無料で使用でき(2024年4月現在)、トリガーにCronも用意されています。
Cron Triggers - Workers

Xに投稿するエントリーポイントを作成して、そちらをCronで呼び出す形でボットを動かします。
今回はサンプルとして、ランダムなひらがなn文字を1時間おきに投稿するボットを作成しました。

用意するもの

  • X(Twitter)アカウント
  • X(Twitter)の各種キー
    • Consumer API Key and Secret
    • Access Token and Secret
  • Cloudflareアカウント
  • wrangler

X(Twitter)APIの各種キーを取得する方法は割愛します。

手順

1. プロジェクトを作成する

wrangler generate x-bot-playground https://github.com/Doarakko/x-bot-playground

2. 投稿するひらがなの文字数を設定する

getRandomHiragana 関数がn文字のランダムなひらがを生成する関数です。
post 関数内で呼び出しているので、引数に生成したい文字数を指定します。

src/index.ts

function getRandomHiragana(len: number): string {
    let result = '';
    for (let i = 0; i < len; i++) {
        const randomCode = Math.floor(Math.random() * (hiraganaEnd - hiraganaStart + 1)) + hiraganaStart;
        result += String.fromCharCode(randomCode);
    }

    return result;
}

async function post(env: Env): Promise<Response> {
    ...
    const text = getRandomHiragana(3);
    return twitter.post(text);
}

3. Cron を設定

デフォルトでは毎時0分に投稿するように設定しています。

wrandler.toml

[triggers]
crons = ["0 * * * *"]

4. デプロイする

wrangler deploy

5. 環境変数を設定する

wrangler secret put TWITTER_CONSUMER_API_KEY
wrangler secret put TWITTER_CONSUMER_API_SECRET
wrangler secret put TWITTER_ACCESS_TOKEN
wrangler secret put TWITTER_ACCESS_TOKEN_SECRET

6. 確認する

Cronの実行時間になったらXのアカウントから投稿されていることを確認します。
Cloudflareのコンソールからログ等を確認することもできます。

Hints

URLにアクセスすると投稿されるようにする

HTTPリクエストを受け取るエントリーポイントはコメントアウトしているので、そこを外します。

src/index.ts

export default {
    async fetch(request: Request, env: Env, ctx: ExecutionContext): Promise<Response> {
        const response = await post(env);
        return new Response(JSON.stringify({ status: response.status, message: response.statusText }), {
            headers: { 'Content-Type': 'application/json' },
        });
    },
};

この状態でデプロイするとエントリーポイントがパブリックな状態になるので、意図せぬアクセスでXに投稿されてしまいます。
X APIのレートリミットも厳しいので、必要な場合以外はコメントアウトしておくことを推奨します。

ローカルで動作確認する

環境変数を設定するファイルをコピーして、中身を自身のものに書き換えます。

cp .dev.vars.example .dev.vars

その後ローカルでWorkerを起動します。

wrangler dev

起動した後に表示されるURLにアクセスするとXに投稿されます。

X(Twitter) APIの認証方法

私が調べた範囲のX(Twitter)のクライアントライブラリはNode.jsに依存しているので、Cloudflare Workers上では動きませんでした。
依存部分を差し替えれば動くとは思いますが、クライアントライブラリを動かせるようにするコストよりも自前で実装するコストの方が低いと判断して使用していません。

実装は以下記事を参考に、V2で動くように少し調整しました。
Sending a message with the Twitter API in a Cloudflare worker

今回は使用するエンドポイントの数も少なかったので大きな問題はなかったですが、X APIをフル活用したものを開発するのであればクライアントライブラリが動くように頑張った方が良いかなとは思います。

画像付き投稿

画像付きの投稿をしたい場合は、POST media/upload
のエンドポイントを使用します。

動くところまで作れていないので、できたらマージする予定です。

https://github.com/Doarakko/x-scheduled-post/pull/4

クライアントライブラリ...

おわりに

ローカルの実行環境の作成からデプロイまでのシンプルさとスピード、改めてCloudflare Workersの開発者体験は最高だなと思いました。
無料枠が大きいのもありがたいです。

今度はCloudflareでWebサービスを作ってみようと思います。

Discussion