或許,挺不簡明易懂的,估計需要 30min 才能操作完。
最近寫了個 TG 機器人,可以自動將 TG 的消息轉發為 xLog Shorts。功能實現完已經有半個月了,但是真正向別人介紹如何部署的這篇文章,卻一直拖到現在。心裡還是有很多忐忑的。
具體技術: Cloudlfare Worker + Telegram Bot API + xLog Shorts 。總之免費就是了
Note
如果有什麼問題的話,歡迎提 issue 或者 pr。請儘管反饋,一般 48 小時內會有回覆的
(效果圖)
事前準備#
安裝 Wrangler 並登錄 Cloudflare 帳號#
Cloudflare Workers 是 Cloudflare 提供的一個 Serverless 服務。我們這機器人 (我稱之為奈亞子),這個項目(她的一生)就是部署(活)在這上面的。我之所以選擇 Workers,是因為我本職工作要用到,於是拿來練練手🤣。當然了,也有一些正經理由,比如:
- Cloudflare Workers 免費版一天有 10w 次請求額度,作為個人使用完全夠了
- 免去了自己搭建伺服器的運維成本
- 不需要開代理就能訪問 Telegram API
Wrangler 是 Cloudflare 官方提供的一個命令行工具,用於部署 Cloudflare Workers。安裝 Wrangler 並登錄 Cloudflare 帳號,可以參考 官方文檔。
若沒有 Cloudflare 帳號的同學,可以趁這個機會註冊(鏈接)
沒有 nodejs 的同學也可以去安裝一下(鏈接)
我們在這裡執行如下命令,看我們這就登錄成功了,第一步完成 🎉
npm install -g wrangler
wrangler login
通過 wrangler woami
確認登錄完成
$ wrangler whoami
⛅️ wrangler 3.23.0
-------------------
Getting User settings...
👋 You are logged in with an OAuth Token, associated with the email [email protected]!
┌────────────────────────┬──────────────────────────────────┐
│ Account Name │ Account ID │
├────────────────────────┼──────────────────────────────────┤
│ [email protected]'s Account │ *** │
└────────────────────────┴──────────────────────────────────┘
🔓 Token Permissions: If scopes are missing, you may need to logout and re-login.
Scope (Access)
- 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 的 token#
接下來我們要找 Botfather 申請一個 TG 機器人。TG 機器人的申請,可以參考 官方文檔。
(像下面這樣就可以了,例如此處我的機器人用戶名是 xlog_20240110_bot)
獲取 xLog 的 Token 以及 CharacterId#
此時,我們目光轉向 xLog。此處參考辛寶 Otto 的 token 獲取教程。要拿到下面兩個東西:
- xLog 的 token
- 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
生成配置文件#
我有一個 demo 的配置文件,此處我們將其複製一份(代碼塊中,不以 $
為開頭的行就是命令的輸出結果)
$ 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" # i.e. available in your Worker on 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" # i.e. available in your Worker on env.DB
database_name = "tg"
database_id = "******"
執行如下命令,創建 D1 數據庫的表 (在此之前,一定要先改好 wrangler.toml
中的 database_id)
wrangler d1 execute tg --file=./schema.sql
設置各種密鑰#
然後就要將「事前準備」中的各種密鑰設置到 cloudflare worker 的環境變量中了。這三個分別是機器人的 token,xLog 的 token,xLog 的 characterId。
依次執行如下命令,將這三個密鑰設置到 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
-------------------
Your worker has access to the following bindings:
- D1 Databases:
- DB: tg (******)
- Vars:
- ALLOW_USER_IDS: []
- TELEGRAM_BOT_USERNAME: ""
Total Upload: 708.56 KiB / gzip: 123.29 KiB
Uploaded nyaruko-telegram-bot (2.52 sec)
Published nyaruko-telegram-bot (3.91 sec)
https://your-worker.your-name.workers.dev
Current Deployment 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 - Sync msg to Twitter.
ping - Test if the bot is online.
getchatid - Get the ID of the current chat.
getuserid - Get the ID of the current user.
後續就有命令補全了
配置 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 獨立出來讓別人用, 形式應是如何的,我還沒想好。本來奈亞子是作為我 allinone 的私人管家設計的。 現在看來,有興趣的人可能要先將奈亞子整個部署起來,何嘗不是一種 NTR (bushi)
還有一些需要考慮的內容,不過我現在還沒想好(也不想思考了,我的週末呢???)
- debug 模式
- 能用的賬戶列表,其實 CHARACTER_ID 也可以是一個數組
- 可能會存在區塊鏈錢包沒有額度的情況
一些雜話#
- 寫文檔的時候,儘量可以用代碼塊的情況就不要用圖片了,這樣可以方便複製粘貼
- 我也儘量全程沒有進行一個 cloudflare 的截圖,為的就是全程可以在命令行上操作
參考資料#
- 技術角度折騰 xlog】更順暢的使用體驗 2 深入理解 xlog 的鑒權 - 辛寶 Otto 的 xlog 教程,寫的很詳細,而且還有視頻教程~~
- ChatGPT-Telegram-Bot - 另一個 TG Bot 的項目,一個比我年輕的前輩寫的。
- 官方 wrangler 文檔 - wrangler 文檔感覺要比 twitter 文檔好懂得多了,起碼事例會多很多~~
- Telegram Bot API - Telegram Bot API 文檔
置地題圖