為什麼從 LINE Bot 轉到 Telegram Bot
在「用 LINE Push Messaging API 推播每日氣象預報」這篇中提到,LINE@ 自從升成 2.0 後,原本開發用的方案沒了,而用 SDK 去發訊息的動作,也一律算進訊息數裡。免費的輕量級方案,一個月訊息量限 500 次,比方一則訊息要推播給 10 人,就算 10 次。不到一周訊息數就要超量,自動推播被擋。
在這種制度下,讓我開始找別的替代方案,就想到保密性很強的 Telegram。
維基百科介紹:
Telegram 是一個跨平台的即時通訊軟體,它的用戶端是自由及開放原始碼軟體,但是它的伺服器是專有軟體。使用者可以相互交換加密與自毀訊息,傳送相片、影片等所有類型檔案。官方提供手機版、電腦版和網頁版等多種平台用戶端;同時官方開放應用程式介面,因此擁有許多第三方的用戶端可供選擇,其中多款內建中文。
總之,它不像 LINE@ 一樣拿訊息數來收費,而且也支援 Node.js,就決定把所有推播功能轉到 Telegram 上。
目前建立的機器人在這,完成了 Google Trend 功能、新聞功能:
建立 Telegram 機器人
要新增一個 Telegram 的機器人很特別,不用寫什麼程式碼或是進到哪個後台新增,而是直接向他們的機器人申請,用機器人去新增機器人,很有機器人的感覺。
這個機器人叫「BotFather」,眾機器人之父啊~
安裝完 Telegram,點了上面 BotFather 後,就會出現跟機器人的對話視窗:
按下「Start」,或在對話中輸入「/start」 ,就會出現所有功能的列表:
直接點選要執行的功能就行了,其實在輸入「/」時,也會看見所有項目:
跟建立機器人有關的是這幾個:
跟建立機器人有關的是這幾個:
- /newbot 新增機器人
- /mybots 列出所有創建的機器人
- /setname 修改機器人的名稱
- /setdescription 修改機器人的描述,這個會出現在對話框的顯示訊息上
- /setabouttext 修改機器人的資訊
- /setuserpic 修改機器人大頭照
- /setcommands 修改機器人 command 選單
- /deletebot 刪除機器人
setcommands 很好用,設定完會就會有像機器人這個 / 開頭的功能列表一樣,預設是一個「/start」。
要新增機器人,就是按 /newbot,接著會是問答式的填寫資料:設定機器人名字、ID。
ID 的最後一定要是「bot」結尾。
名字跟 ID 設定完後,機器人就建好了,這時 BotFather 會傳一段訊息如下:
紅色字的就是這個新機器人的 token,這 token 很重要,所有的 API 都需要,有了 token 就可以用機器人發訊息,所以也不要亂傳出去,當別人有這個 token,同樣也可以用你這隻機器人去發訊息,認 token 不認人的。
*截圖上的 token,在這篇筆記文發佈後就會刪掉。
接收訊息
有了機器人後,機器人最基本的功能有2個:
- 接受訊息
- 發送訊息
接受訊息部份,Telegram 提供 2 種方式,這 2 種方式只能選擇 1 種使用,不能都用:
- getUpdates
- webhook
getUpdates
這方式最簡單,只要輸入網址就可以看到訊息的 JSON,網址如下:
https://api.telegram.org/bot{YOUR_BOT_TOKEN}/getUpdates
把 {YOUR_BOT_TOKEN}
替換成你的 token,像本篇範例就是:
https://api.telegram.org/bot878308903:AAGvPIY5hThgh-0aIlunKYJKK1MN3TGCowQ/getUpdates
輸入網址後就可以看到結果,這邊傳一個測試訊息給機器人,會看到如下:
text
就是傳的訊息,from
就是傳訊息的人,from.id
要記下來,用 API 發訊息時會用到,每一個傳訊息的人,機器人給的 id 都不同,是唯一碼。
用 getUpdates 的方法,好處是使用方便,直接 GET 網址就行。壞處是要一直 GET,才能知道有人傳了訊息來。
webhook
webhook 的優缺點跟 getUpdates 相反,建立方式比較複雜,還必須要是 https,但當有人傳訊時可以立即觸發,不用一直 GET。
因為在寫 LINE Bot 時就是用 webhook,所以本篇也採用 webhook 的方式。
要把機器人的接收訊息方式設成 webhook 很簡單,一樣是輸入一個網址,如下:
https://api.telegram.org/bot{YOUR_BOT_TOKEN}/setWebhook?url={YOUR_WEBHOOK_URL}
替換 {YOUR_BOT_TOKEN}
成你的 token。
替換 {YOUR_WEBHOOK_URL}
為你的 webhook 網址。
Google 一下 telegram setWebhook,就會看見蠻多教學是講怎麼拿到 webhook 的網址。
這篇是直接用 Google Cloud Platform 放 Node.js,GCP 產出的網址本身就是 https,不會有憑證的問題。
如何在 GCP 上放一個 Node.js 的 App,可以參考這篇:
用 Google Cloud Platform(GCP)建 Node.js 網站
Node.js 如下:
用 webhook 的流程是這樣:
Telegram Bot 接到訊息 → Bot POST到 webhook 的網址。
這邊的 webhook 網址就直接用 https://XXX.XXX.XXX/webhook。
所以在設定 webhook 網址時,本篇範例就是:
https://api.telegram.org/bot878308903:AAGvPIY5hThgh-0aIlunKYJKK1MN3TGCowQ/setWebhook?url={YOUR_GCP_URL}/webhook
{YOUR_GCP_URL}
記得替換。
輸入完網址按下 Enter,設定成功就會看見回傳的 JSON:
以下示範的部份有另外將 message 存到 Firebase。
發送訊息後,/webhook 被P OST,訊息存到 Firebase:
接受了訊息,就可以判斷訊息的關鍵字或是格式,讓機器人自動做出不同的回應,這部份會寫在下一篇。
推播訊息
機器人推播訊息,需要接 Telegram Bot API。官方文件上有提供一些 Node.js 的套件:Bot Code Examples
原本一開始是選用 telegram-bot-api 這套,後來發現直接用 POST 就可以使用 Telegram API,就放棄了套件,直接用 POST。
Telegram Bot API 的 methods,說明文件在這:
https://core.telegram.org/bots/api/#available-methods
使用 methods 很簡單,只需要 POST 的 URL 後面加上要用的 methods 名稱就行。規則如下:
https://api.telegram.org/bot{YOUR_BOT_TOKEN}/{API_METHOD}
比方想傳送訊息,是用 sendMessage 這個 method,那只要 POST 這個 URL 就行:
https://api.telegram.org/bot878308903:AAGvPIY5hThgh-0aIlunKYJKK1MN3TGCowQ/sendMessage
data 裡面帶入文件上列的 parameter,範例 code 如下:
TARGET_ID 就是接收訊息那一段的 message.from.id。
接著打開網址,機器人就會發出訊息了:
message 還有其他的參數可以用:
- parse_mode:text裡要不要換成 Markdown 或 HTML 格式。
- disable_web_page_preview:如果訊息有網址,要不要顯示頁面預覽。
- disable_notification:通知要不要轉成靜音。
- reply_to_message_id:這個訊息是要回覆哪一則訊息。
- reply_markup:叫出 keyboard。
parse_mode、reply_markup,這 2 個參數讓訊息的方式變得很有趣。
replay_markup
主要是叫出鍵盤、訊息內選單、回覆格式,這三項功能用的,這部份比較複雜,看了好久才懂,實際的應用會寫在下一篇:
Telegram Bot 學習筆記-3:鍵盤 Keyboard
parse_mode
可以設成 Markdown / HTML。August 比較常用的是 HTML。
他們的 HTML 不是所有的都支援,目前支援的部份如下:
<b>bold</b>, <strong>bold</strong> <i>italic</i>, <em>italic</em> <a href="http://www.example.com/">inline URL</a> <a href="tg://user?id=123456789">inline mention of a user</a> <code>inline fixed-width code</code> <pre>pre-formatted fixed-width code block</pre>
如果出現不是這上面的 HTML,訊息就會發不出去。
這邊也試發一個:
換行的部份用「\n
」。
收到的訊息如下:
關於 Telegram Bot 的接收訊息、推播訊息就寫到這。
本篇參考了 2 篇教學,如下:
Telegram Bot 學習筆記系列
- 用 GCP + Node.js 接收 / 推播訊息
- 用 Google Apps Script 接收 / 推播訊息
- 鍵盤 Keyboard
- 命令列 Commands
- 取得使用者大頭照
- Google 表單提交時收到通知