おそらく、あまり簡潔ではなく、理解しにくいかもしれませんが、操作を完了するのに 30 分はかかると思います。
最近、TG ボットを作成しました。TG のメッセージを自動的に xLog Shorts に転送することができます。機能はすでに半月前に実装されましたが、他の人にデプロイ方法を紹介するこの記事は、今までずっと先延ばしにしていました。心の中にはまだ多くの不安があります。
具体的な技術:Cloudflare Worker + Telegram Bot API + xLog Shorts。とにかく無料です。
Note
何か問題があれば、issue や pr を提案してください。フィードバックをお待ちしています。通常、48 時間以内に返信があります。
(効果図)
事前準備#
Wrangler をインストールし、Cloudflare アカウントにログイン#
Cloudflare Workers は Cloudflare が提供するサーバーレスサービスです。このボット(私は彼女を奈亚子と呼んでいます)は、このプロジェクト(彼女の人生)はこの上にデプロイされています。Workers を選んだ理由は、私の本業で必要だからで、練習も兼ねて使っています🤣。もちろん、いくつかの正当な理由もあります。例えば:
- Cloudflare Workers の無料版は 1 日に 10 万回のリクエストが可能で、個人使用には十分です。
- 自分でサーバーを構築する運用コストを省けます。
- プロキシを立てなくても Telegram API にアクセスできます。
Wrangler は Cloudflare が公式に提供するコマンドラインツールで、Cloudflare Workers をデプロイするために使用します。Wrangler をインストールし、Cloudflare アカウントにログインするには、公式文書を参照してください。
Cloudflare アカウントを持っていない方は、この機会に登録できます(リンク)
nodejs を持っていない方も、インストールしてください(リンク)
ここで次のコマンドを実行して、ログインが成功したことを確認します。第一歩が完了しました🎉
npm install -g wrangler
wrangler login
wrangler woami
を使ってログインが完了したことを確認します。
$ wrangler whoami
⛅️ wrangler 3.23.0
-------------------
ユーザー設定を取得中...
👋 OAuthトークンでログインしています。メールアドレス[email protected]に関連付けられています!
┌────────────────────────┬──────────────────────────────────┐
│ アカウント名 │ アカウントID │
├────────────────────────┼──────────────────────────────────┤
│ [email protected]のアカウント │ *** │
└────────────────────────┴──────────────────────────────────┘
🔓 トークンの権限: スコープが不足している場合は、ログアウトして再ログインする必要があります。
スコープ (アクセス)
- account (read)
- user (read)
- workers (write)
- workers_kv (write)
- workers_routes (write)
- workers_scripts (write)
- workers_tail (read)
- d1 (write)
- pages (write)
- zone (read)
- ssl_certs (write)
- constellation (write)
- ai (read)
- offline_access
Telegram Bot API のトークンを取得#
次に、Botfatherを探して TG ボットを申請します。TG ボットの申請については、公式文書を参照してください。
(以下のようにすれば大丈夫です。例えば、私のボットのユーザー名は xlog_20240110_bot です。)
xLog のトークンと CharacterId を取得#
ここで、xLog に目を向けます。ここでは辛宝 Ottoのtoken 取得チュートリアルを参照してください。以下の 2 つを取得します:
- xLog のトークン
- xLog の characterId
xSettings のページで、現在の character を開き、ブラウザのコンソールに以下のコードを入力すれば取得できます。
JSON.parse(localStorage.getItem('connect-kit:account')).state.wallet.siwe.token
JSON.parse(localStorage.getItem('connect-kit:account')).state.wallet.characterId
(示意図。もっと簡単な方法があれば、ぜひ教えてください~~)
デプロイを開始#
さて、ついにデプロイの時が来ました。多くを語らず、直接始めましょう。
プロジェクトディレクトリをクローンして移動#
はい、これがとても簡単なステップです。ターミナルで次のコマンドを実行して、クローン -> プロジェクトディレクトリに移動 -> 依存関係をインストールします。(このチュートリアルの有用性を保証するために、クローン時に具体的な v0.2.3 バージョンを指定しました。)
git clone https://github.com/niracler/nyaruko-telegram-bot -b "v0.2.3"
cd nyaruko-telegram-bot
npm install
設定ファイルを生成#
デモの設定ファイルがありますので、ここでコピーします(コードブロック内で、$
で始まらない行はコマンドの出力結果です)。
$ cp wrangler.demo.toml wrangler.toml
$ cat wrangler.toml
name = "nyaruko-telegram-bot"
main = "src/index.ts"
compatibility_date = "2023-11-21"
compatibility_flags = [ "nodejs_compat" ]
[vars]
ALLOW_USER_IDS = [ ]
TELEGRAM_BOT_USERNAME = ''
[[d1_databases]]
binding = "DB" # つまり、あなたのWorkerでenv.DBとして利用可能
database_name = "tg"
database_id = "..."
テンプレートはここにありますので、まず D1 データベースを作成し、その後この設定ファイルを記入します。
D1 データベースを作成#
media_group の情報は D1 データベースに保存されるため、D1 データベースを作成する必要があります。
注意⚠️:奈亚子がデプロイされる前の複数の画像のメッセージは、D1 データベースに対応する media_group_id が見つからないため、xLog に同期できません。後で過去のメッセージを同期するスクリプトを作成することを検討します。
次のコマンドを実行して D1 データベースを作成します。
wrangler d1 create tg
次に、返された D1 データベースの名前をwrangler.toml
に記入し、私の設定ファイルの database_id をあなたの D1 データベース ID に変更します。コマンドの出力から得た database_id を上記のwrangler.toml
に記入します。
[[d1_databases]]
binding = "DB" # つまり、あなたのWorkerでenv.DBとして利用可能
database_name = "tg"
database_id = "******"
次のコマンドを実行して、D1 データベースのテーブルを作成します(その前に、必ずwrangler.toml
の database_id を正しく変更してください)。
wrangler d1 execute tg --file=./schema.sql
各種キーを設定#
次に、「事前準備」での各種キーを Cloudflare Worker の環境変数に設定します。この 3 つはボットのトークン、xLog のトークン、xLog の characterId です。
次のコマンドを順に実行して、これら 3 つのキーを Cloudflare Worker の環境変数に設定します(注意、XLOG_TOKEN には余分な引用符を付けないでください)。
wrangler secret put TELEGRAM_BOT_SECRET
wrangler secret put XLOG_TOKEN
wrangler secret put XLOG_CHARACTER_ID
Cloudflare Worker にデプロイ#
さて、奈亚子を Cloudflare Worker にデプロイしてみましょう。(次のコマンドを実行します。コードブロック内で、$
で始まらない行はコマンドの出力結果です。)
$ wrangler deploy
⛅️ wrangler 3.23.0
-------------------
あなたのWorkerは以下のバインディングにアクセスできます:
- D1データベース:
- DB: tg (******)
- 変数:
- ALLOW_USER_IDS: []
- TELEGRAM_BOT_USERNAME: ""
合計アップロード:708.56 KiB / gzip:123.29 KiB
nyaruko-telegram-botをアップロードしました(2.52秒)
nyaruko-telegram-botを公開しました(3.91秒)
https://your-worker.your-name.workers.dev
現在のデプロイID:******
奈亚子の Webhook を設定#
奈亚子の Webhook をあなたの Cloudflare Workers アドレス(上記のコマンド出力にあるもの)に設定します。奈亚子は Webhook を通じてメッセージを受信する必要があります。
次のコマンドを実行します(必ずコマンド内のhttps://your-worker.your-name.workers.dev/
とTELEGRAM_BOT_SECRET
を自分のものに置き換えてください)。
curl -F "url=https://your-worker.your-name.workers.dev/" https://api.telegram.org/bot<TELEGRAM_BOT_SECRET>/setWebhook
次に、Webhook が正常に設定されたか確認します。次のコマンドを実行します(必ずコマンド内のTELEGRAM_BOT_SECRET
を自分のものに置き換えてください)。
$ curl https://api.telegram.org/bot<TELEGRAM_BOT_SECRET>/getWebhookInfo
{"ok":true,"result":{"url":"https://nyaruko-telegram-bot.***.workers.dev/","has_custom_certificate":false,"pending_update_count":0,"max_connections":40,"ip_address":"******"}}
PS. ここで api.telegram.org はブロックされる可能性があるため、コマンドラインプロキシを使用する必要があります。どう処理するかわからない方は、私に連絡してください。
また、奈亚子と少し話すこともできます。
奈亚子のコマンド登録(オプション)#
使いやすくするために、奈亚子のコマンドを登録できます。tg 上で:
- Botfatherを見つける
/setcommands
と入力し、あなたのボットを選択- 次の内容を入力:
sync_xlog - Twitterにメッセージを同期します。
ping - ボットがオンラインかテストします。
getchatid - 現在のチャットのIDを取得します。
getuserid - 現在のユーザーのIDを取得します。
これで、コマンド補完が利用できるようになります。
ALLOW_USER_IDS を設定して奈亚子にあなたが彼女の主人であることを知らせる(逃)#
はい、誰もが奈亚子を使ってあなたの tg メッセージを転送できるわけではありません。だから、自分の tg id をwrangler.toml
の ALLOW_USER_IDS に記入する必要があります。こうすることで、奈亚子はあなたが彼女の主人であることを知ります。(これは上記の getuserid コマンドの出力結果です。)
[vars]
ALLOW_USER_IDS = [ "******" ]
その後、再度wrangler deploy
を実行します。
完了と祝福#
さて、完成しました。今、tg でメッセージを xLog に送信するテストを行うことができます。奈亚子は最初の文を Short のタイトルとして、後の文を Short の内容として扱います。
(史前の画像メッセージを奈亚子に転送してテストしました)
後記#
このチュートリアルを書くのにかなりの時間がかかりました。書いているうちにコードもリファクタリングしました。何もしていないように感じますが、実際には多くの時間を費やしました。私は簡単に閉じこもって自分のことをやるタイプなので、このプロジェクトのコード品質はあまり良くないかもしれません。何か問題があれば、issue や pr を提案してください。フィードバックをお待ちしています。通常、48 時間以内に返信があります。
技術選定についての理由#
決して私が typescript しか書けないからではありません(逃)。
- Cloudflare は無料で、プロキシを立てずに Telegram API にアクセスできます。
- crossbell の SDK は typescript で、他の言語を使うと ipfs のアップロードロジックを手動で作成する必要があります。(もちろん、辛宝のコードを簡単にコピーするためではありません。)
道は遠く険しい#
どう言えばいいのか、奈亚子には他の機能の詳細もありますのでご覧ください。
sync xlog を他の人が使えるように独立させるには、どのような形式が良いのか、まだ考えていません。本来、奈亚子は私のオールインワンのプライベートアシスタントとして設計されていました。今のところ、興味のある人はまず奈亚子全体をデプロイする必要があるかもしれません。これは一種の NTR(バス)。
考慮すべき内容はまだいくつかありますが、今はまだ考えたくありません(週末はどこに行ったの???)。
- デバッグモード
- 使用可能なアカウントリスト。実際には CHARACTER_ID も配列にできます。
- ブロックチェーンウォレットに残高がない場合があるかもしれません。
雑談#
- ドキュメントを書くときは、できるだけコードブロックを使用し、画像を使わないようにしましょう。これにより、コピー&ペーストが便利になります。
- 私はできるだけ Cloudflare のスクリーンショットを撮らず、全てコマンドラインで操作できるようにしました。
参考資料#
- 技術的な観点から xlog をいじる】よりスムーズな使用体験 2 xlog の認証を深く理解する - 辛宝 Otto の xlog チュートリアルで、非常に詳細に書かれており、動画チュートリアルもあります~~
- ChatGPT-Telegram-Bot - 別の TG ボットプロジェクトで、私よりも若い先輩が書いたものです。
- 公式 wrangler 文書 - wrangler 文書は Twitter の文書よりも理解しやすいと感じます。少なくとも例が多いです~~
- Telegram Bot API - Telegram Bot API 文書
置地題图