Telegram Bot 學習筆記 – 1:用 GCP + Node.js 接收 / 推播訊息

Telegram bot學習筆記-1:用GCP + node.js接收/推播訊息
Telegram bot學習筆記-1:用GCP + node.js接收/推播訊息

為什麼從 LINE Bot 轉到 Telegram Bot

在「用 LINE Push Messaging API 推播每日氣象預報」這篇中提到,LINE@ 自從升成 2.0 後,原本開發用的方案沒了,而用 SDK 去發訊息的動作,也一律算進訊息數裡。免費的輕量級方案,一個月訊息量限 500 次,比方一則訊息要推播給 10 人,就算 10 次。不到一周訊息數就要超量,自動推播被擋。

在這種制度下,讓我開始找別的替代方案,就想到保密性很強的 Telegram。

維基百科介紹:

Telegram 是一個跨平台的即時通訊軟體,它的用戶端是自由及開放原始碼軟體,但是它的伺服器是專有軟體。使用者可以相互交換加密與自毀訊息,傳送相片、影片等所有類型檔案。官方提供手機版、電腦版和網頁版等多種平台用戶端;同時官方開放應用程式介面,因此擁有許多第三方的用戶端可供選擇,其中多款內建中文。

總之,它不像 LINE@ 一樣拿訊息數來收費,而且也支援 Node.js,就決定把所有推播功能轉到 Telegram 上。

目前建立的機器人在這,完成了 Google Trend 功能、新聞功能:

https://t.me/lifetifulBot


建立 Telegram 機器人

要新增一個 Telegram 的機器人很特別,不用寫什麼程式碼或是進到哪個後台新增,而是直接向他們的機器人申請,用機器人去新增機器人,很有機器人的感覺。

這個機器人叫「BotFather」,眾機器人之父啊~

https://t.me/BotFather

安裝完 Telegram,點了上面 BotFather 後,就會出現跟機器人的對話視窗:

BotFather的對話窗
BotFather的 對話窗

按下「Start」,或在對話中輸入「/start」 ,就會出現所有功能的列表:

BotFather的所有功能
BotFather 的所有功能

直接點選要執行的功能就行了,其實在輸入「/」時,也會看見所有項目:

輸入 / 會出現項目
輸入 / 會出現項目

跟建立機器人有關的是這幾個:

跟建立機器人有關的是這幾個:

  • /newbot 新增機器人
  • /mybots 列出所有創建的機器人
  • /setname 修改機器人的名稱
  • /setdescription 修改機器人的描述,這個會出現在對話框的顯示訊息上
  • /setabouttext 修改機器人的資訊
  • /setuserpic 修改機器人大頭照
  • /setcommands 修改機器人 command 選單
  • /deletebot 刪除機器人

setcommands 很好用,設定完會就會有像機器人這個 / 開頭的功能列表一樣,預設是一個「/start」。

要新增機器人,就是按 /newbot,接著會是問答式的填寫資料:設定機器人名字、ID。

ID 的最後一定要是「bot」結尾。

名字跟 ID 設定完後,機器人就建好了,這時 BotFather 會傳一段訊息如下:

拿到機器人的token
拿到機器人的 token

紅色字的就是這個新機器人的 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

輸入網址後就可以看到結果,這邊傳一個測試訊息給機器人,會看到如下:

用getUpdates方式接受訊息
用 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:

webhook 設定成功
webhook 設定成功

以下示範的部份有另外將 message 存到 Firebase。

發送訊息後,/webhook 被P OST,訊息存到 Firebase:

webhook觸發存訊息到firebase
webhook 觸發存訊息到 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」。

收到的訊息如下:

發出html格式訊息
發出 HTML 格式訊息

關於 Telegram Bot 的接收訊息、推播訊息就寫到這。

本篇參考了 2 篇教學,如下:


Telegram Bot 學習筆記系列

  1. 用 GCP + Node.js 接收 / 推播訊息
  2. 用 Google Apps Script 接收 / 推播訊息
  3. 鍵盤 Keyboard
  4. 命令列 Commands
  5. 取得使用者大頭照
  6. Google 表單提交時收到通知
Summary
Telegram Bot 學習筆記 - 1:用GCP + Node.js 接收 / 推播訊息
Article Name
Telegram Bot 學習筆記 - 1:用GCP + Node.js 接收 / 推播訊息
Description
本篇大綱:為什麼從line bot轉到telegram bot?建立Telegram機器人、接收訊息、推播訊息、replay_markup、parse_mode。LINE@自從升成2.0後,原本開發用的方案沒了,在這種制度下,讓我開始找別的替代方案,就想到保密性很強的Telegram。
Augustus
Let's Write
Let's Write
https://letswrite.tw/wp-content/uploads/2020/08/logo_512.jpg
訂閱
通知
guest

0 Comments
Inline Feedbacks
看所有留言