banner
niracler

niracler

长门大明神会梦到外星羊么?
github
email
steam_profiles
douban
nintendo switch
tg_channel
twitter_id

簡單易懂的 Telegram to xLog Shorts 機器人部署方案 - v1.0

或許,挺不簡明易懂的,估計需要 30min 才能操作完。

最近寫了個 TG 機器人,可以自動將 TG 的消息轉發為 xLog Shorts。功能實現完已經有半個月了,但是真正向別人介紹如何部署的這篇文章,卻一直拖到現在。心裡還是有很多忐忑的。

具體技術: Cloudlfare Worker + Telegram Bot API + xLog Shorts 。總之免費就是了

Note

如果有什麼問題的話,歡迎提 issue 或者 pr。請儘管反饋,一般 48 小時內會有回覆的

(效果圖)
image

事前準備#

安裝 Wrangler 並登錄 Cloudflare 帳號#

Cloudflare Workers 是 Cloudflare 提供的一個 Serverless 服務。我們這機器人 (我稱之為奈亞子),這個項目(她的一生)就是部署(活)在這上面的。我之所以選擇 Workers,是因為我本職工作要用到,於是拿來練練手🤣。當然了,也有一些正經理由,比如:

  1. Cloudflare Workers 免費版一天有 10w 次請求額度,作為個人使用完全夠了
  2. 免去了自己搭建伺服器的運維成本
  3. 不需要開代理就能訪問 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)

image

獲取 xLog 的 Token 以及 CharacterId#

此時,我們目光轉向 xLog。此處參考辛寶 Ottotoken 獲取教程。要拿到下面兩個東西:

  1. xLog 的 token
  2. 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

(示意圖,有更簡單的方式的話,請務必跟我說一下啊~~)
image

開始部署#

咳咳,終於到了部署的時候了,話不多說,直接開始吧

克隆並進入項目目錄#

嗯,就是這樣,很簡單的一步。在終端運行如下命令,克隆 -> 進入項目目錄 -> 安裝依賴。(為了保證這個教程的可用性,我克隆時指定了具體的 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 會被牆,需要使用命令行代理,不知道如何處理的同學可以聯繫我。

也可以,跟奈亞子聊兩句

image

奈亞子的命令註冊 (可選)#

為了方便使用,我們可以將奈亞子的命令註冊一下。在 tg 上:

  1. 找到 Botfather
  2. 輸入 /setcommands,然後選擇你的機器人
  3. 輸入以下內容:
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 的內容。

(找了一張史前的圖文消息轉發給奈亞子做測試)
image

後記#

感覺這個教程寫了好久呢,寫到我連代碼都重構了。我感覺我沒有做什麼,但是又花了很多時間。我很容易就是那種會閉門造車的人,所以這個項目的代碼質量可能不是很好。如果有什麼問題的話,歡迎提 issue 或者 pr。請儘管反饋,一般 48 小時內會有回覆的

關於技術選型為什麼是長這樣#

肯定不是因為我只會寫 typescript 啦(逃

  1. Cloudflare 是免費的啊,而且又不需要開代理就能訪問 Telegram API。
  2. crossbell 的 SDK 是 typescript 的,若用其他語言的話,就需要手拼 ipfs 的上傳邏輯了。(也肯定不是為了更方便抄辛寶的代碼啦)

路漫漫其修遠兮#

怎麼說呢,奈亞子還有其他功能的詳情可以看。

如何將 sync xlog 獨立出來讓別人用, 形式應是如何的,我還沒想好。本來奈亞子是作為我 allinone 的私人管家設計的。 現在看來,有興趣的人可能要先將奈亞子整個部署起來,何嘗不是一種 NTR (bushi)

還有一些需要考慮的內容,不過我現在還沒想好(也不想思考了,我的週末呢???)

  • debug 模式
  • 能用的賬戶列表,其實 CHARACTER_ID 也可以是一個數組
  • 可能會存在區塊鏈錢包沒有額度的情況

一些雜話#

  • 寫文檔的時候,儘量可以用代碼塊的情況就不要用圖片了,這樣可以方便複製粘貼
  • 我也儘量全程沒有進行一個 cloudflare 的截圖,為的就是全程可以在命令行上操作

參考資料#

置地題圖

乾杯

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。