Telegram Bot 可以做哪些事
其實在這次開發前只做過一兩次極簡陋的 bot,code base 不到 50 行只負責定期拉資料送推播的那種。但如果只是要做監聽來推播,你可能甚至不用寫任何一行 code
服務整合/監聽/推播
透過像是 Integromat、IFTTT 的服務,整合其他線上服務、應用來監控事件並發送即時通知,例如每當 google 表單有新的資料時就透過 bot 送通知到 Telegram
與 IoT 設備整合
但時常你想要監控的東西可能沒那麼簡單能透過線上服務來完成,就只好親自進廚房煮義大利麵,沒事我是說寫 code
像是你的門上剛好黏了個微動開關旁邊還擺了台 webduino,空間裡不巧還有一台裝了 PiCam 的 RPi,那有個 bot 來監控空間內狀況也是合情合理
Captcha
用來過濾非真人使用者的互動型 bot,如:
@shieldy_bot
@Customize_Captcha_Bot
投票
(但現在有原生投票功能了
爬蟲
從特定網站擷取特定資訊回來
狼人殺
其他功能
在開始開發你的 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_mode
、 disable_web_page_preview
等參數來設定訊息形式,或是透過 reply_to_message_id
回覆特定訊息,詳細欄位說明請參考官方文件
一樣的除了可以送文字訊息外也能送其他各式形式的訊息像是使用 bot.sendPhoto
來傳送圖片
或是 bot.sendDocument
bot.sendPoll
bot.sendSticker
等等,更多類型與欄位細節一樣參考官方文件
編輯/刪除訊息
使用 bot.editMessageText、bot.deleteMessage 即可達到編輯或刪除指定訊息的功能
更多互動
讓 bot 學會接收、傳送訊息後,就能跟使用者做一問一答的互動,但如果你的機器人功能複雜一點,這樣子的互動方式可能沒辦法滿足或將會降低了使用者體驗,此時你可以試試 reply keyboard
或 inline 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
上述的這些功能都是使用在與 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 做出一個簡單的股市機器人