Telegram Bot (1) 懶得自己做的事就交給機器人吧

以 Node.js 為例之簡易 Telegram bot 教學與應用

YY
13 min readOct 6, 2020
Photo by M. B. M. on Unsplash

由於最近心血來潮弄了個跟股市有關的 Telegram bot,就順便記錄、分享如何開發 Telegram bot,那為什麼是 Telegram 呢?因為我沒在用 line 呢

本篇文章會從關於 Telegram Bot 的最基本功能大略介紹起,接著建立一個 bot 並透過 Telegram API 做簡易開發,而下篇則會針對這個股市機器人做功能導覽及開發簡介,如果你迫不及待的話可以先來 repo 按個星星,然後前往下篇文章

Telegram Bot 可以做哪些事

其實在這次開發前只做過一兩次極簡陋的 bot,code base 不到 50 行只負責定期拉資料送推播的那種。但如果只是要做監聽來推播,你可能甚至不用寫任何一行 code

服務整合/監聽/推播

透過像是 IntegromatIFTTT 的服務,整合其他線上服務、應用來監控事件並發送即時通知,例如每當 google 表單有新的資料時就透過 bot 送通知到 Telegram

與 IoT 設備整合

但時常你想要監控的東西可能沒那麼簡單能透過線上服務來完成,就只好親自進廚房煮義大利麵,沒事我是說寫 code

像是你的門上剛好黏了個微動開關旁邊還擺了台 webduino,空間裡不巧還有一台裝了 PiCam 的 RPi,那有個 bot 來監控空間內狀況也是合情合理

Captcha

用來過濾非真人使用者的互動型 bot,如:

@shieldy_bot
@Customize_Captcha_Bot

投票

(但現在有原生投票功能了

@PollBot

爬蟲

從特定網站擷取特定資訊回來

狼人殺

@werewolfbot

其他功能

在開始開發你的 bot 之前

看了上面幾種不同的應用,接著來看看要如何開始打造一個屬於你的 bot,但在這之前有件更重要的事要做

建立一個 bot

首先請去找 @BotFather 跟他對話 /newbot,設定 name username,然後就會拿到 API token,之後開發會用到

設定 commands

一樣是找 @BotFather 然後下 /setcommands,設定後使用者可以快速瀏覽 command 清單並一鍵送出,也可以等你決定好要提供哪些 commands 時在來設定

如何開發 bot

這邊會以 Node.js + node-telegram-bot-api,不為什麼因為我不會其他語言然後這套 API lib 星星比較多

首先先 npm install node-telegram-bot-api 然後有支 index.js 帶入上面拿到的 token 把 bot 生出來一切就搞定了

另外 bot 收訊息的方式可以是 Polling 或 WebHook,但先跳過

接收訊息

簡單的 node index.js 把上面的 code 跑起來,就算是你的 bot 活過來了,但他還沒學會聽話跟回話,所以接著來處理接收使用者的訊息、commands

如上,可以透過 bot.onText 來接收特定的訊息,例如當使用者傳的文字內容符合 /start$ 的 regex 那就會被對應的 callback 接到,callback 中可以拿到這則訊息的資訊跟 regex match 結果,如此就能透過 bot.sendMessage 把對應的訊息送回去

除了一般文字訊息,也可以透過 bot.on 接收其他各式的訊息種類,像是:bot.on('audio', listener) bot.on('sticker', listener) bot.on('location', listener) 等等,詳細請參考這裡

送訊息

在能夠接收特定 command 後就可以做對應處理,然後再透過如上面有用到的 bot.sendMessage 來送出訊息給使用者

另外可以帶入 parse_modedisable_web_page_preview 等參數來設定訊息形式,或是透過 reply_to_message_id回覆特定訊息,詳細欄位說明請參考官方文件

一樣的除了可以送文字訊息外也能送其他各式形式的訊息像是使用 bot.sendPhoto 來傳送圖片

或是 bot.sendDocument bot.sendPoll bot.sendSticker 等等,更多類型與欄位細節一樣參考官方文件

編輯/刪除訊息

使用 bot.editMessageTextbot.deleteMessage 即可達到編輯或刪除指定訊息的功能

更多互動

讓 bot 學會接收、傳送訊息後,就能跟使用者做一問一答的互動,但如果你的機器人功能複雜一點,這樣子的互動方式可能沒辦法滿足或將會降低了使用者體驗,此時你可以試試 reply keyboardinline keyboard

reply keyboard

顧名思義,就是客製化鍵盤,在 sendMessage 時帶上 reply_markup 並設計好鍵盤按鈕的順續,如上圖 keyboard[] 第一層是列,第二層是欄,而當使用者按下按鈕後就會幫使用者送出 text 定義的文字到 channel,更多使用方式請參考文件:

inline keyboard

跟上面的 reply keyboard 相似,可以傳送自訂的按鈕選單給使用者,一樣是在 sendMessage 時帶上 reply_markup 並在 inline_keyboard 中設定每一列要有哪些按鈕以及 text 要顯示的文字、 callback_data 當使用者按下後 bot 會接收到的值

不同的是,inline keyboard 的按鈕按下去並不會送出文字訊息,而是送 callback_query 事件,所以要另外監聽

如上圖,透過 bot.on('callback_query', callback) ,每當使用者按下 inline keyboard 的按鈕就會被 bot 收下,再來處理每個按鈕所對應的動作

此外按鈕被按下後 Telegram 會有 loading 的 UI 狀態,而開發者可以在 callback_query listener 中確定收到訊息後呼叫 bot.answerCallbackQuery(callback_query_id) 來改變 Telegram App 上的 loading 狀態

更多欄位設定:

Inline mode

Image from https://core.telegram.org/bots/inline

上述的這些功能都是使用在與 bot 一對一的聊天室內,而 inline mode 則能直接在各 channel 呼叫 bot 並送出 bot 幫你拉回來的資料,像是在任一 channel 輸入 @gif cat 就可以搜尋貓貓的 gif 並直接送出

而要使用這種 inline mode 功能必須先去找 BotFather 開啟設定,輸入 /mybots > 選擇你的 bot > Bot settings > Inline Mode > Turn on,啟用後方能在各 channel 輸入 @YOUR_BOT_USER_NAME 來觸發

每當使用者在輸入框呼叫你的 bot 時即會以 debounce 的方式送出事件,而你需要在 bot 中來監聽這整事件 aka inline_query 並設定好要顯示給使用者的清單

如圖所示,使用 bot.on('inline_query') 來監聽事件,其中 callback 參數會拿到 query id 與使用者所輸入的內容 query 等等,接著就處理要顯示給使用者的選項 (包含要顯示在 result list 上的內容以及使用者選擇後要送出的內容)

最後再以 bot.answerInlineQuery 送出 result list,裡面就包含了每一項顯示的文字 title 以及被選擇後送出的訊息 input_message_content ,此外在 result list 支援了非常多種的 layout,可以參考官方文件做使用

以上就是關於 Telegram bot 的一些小入門基礎,最後感謝你的閱讀,如果你喜歡這篇文章可以拍 11 下手,不喜歡的話可以拍 1下再分享給 5 個人,也歡迎繼續前往下篇看看如何透過上述這些 API 做出一個簡單的股市機器人

--

--