Telegram Bot 研究日記


本文章屬於研究過程中的紀錄,不屬於嚴謹的學習資源。

前言

昨天在配置 Waline 評論系統的時候,我開啟了用 telegram bot 接收通知。然而,都建立了一個 bot 了,當然要幫他配置更多功能,於是我花了整個上午的時間研究,並在此文記錄。

準備工作

首先,我想要實現的功能如下:

  • 回覆訊息
  • 回覆圖片
  • 定時傳送

機器人的開發我採用 node-telegram-bot-api 這個套件。並配合 node-schedule 來達到定時發送訊息的效果。最後透過 PM2 將程式碼部署到後台。

先在 terminal 執行下列指令安裝上述套件

npm i node-telegram-bot-api
npm install node-schedule
npm install pm2 -g

然後建立一個資料夾,在裡面建立名為 index.js 的檔案,並將下列程式碼加入 index.js

const TelegramBot = require('node-telegram-bot-api');
const token = '填入機器人的api token';
const bot = new TelegramBot(token, {polling: true});
const id = '填入你telegram的chat id';
const schedule = require('node-schedule');

token 可以在用來建立 bot 的官方帳號 BotFather 取得,chat id 則可以在 userinfobot 取得。到此為止則完成基礎配置。

發送訊息

注意,以下僅針對我有用到的語法做說明,詳細內容請參閱 node-telegram-bot-api 官方文件。

發送訊息的函數如下

bot.sendMessage(id,"message");

第一個參數是發送對象的 chat id,如果是發送給自己就可以直接用上面宣告的變數 id 。第二個變數則是發送的訊息,可以隨意填入引號之內。
這裡我先在 index.js 加入:

bot.sendMessage(id,"更新成功");

之後每次開始執行的時候都會傳送訊息。
把 terminal 切換到 index.js 所在的資料夾之後,在 terminal 執行下列指令開始運行 js 檔。

node index.js

之後每次執行這個命令即可以開始bot的後端運作,要終止則是按下 ctrl + c

若配置成功的話可以看到機器人傳來訊息。示例圖如下:

在成功讓機器人傳送訊息後,接下來則是要針對回復訊息做配置。讓我先來介紹以下的 block :

bot.on('message', (msg) => {

var keyword = "你好";

if (msg.text.toString().indexOf(Hi) === 0) {
bot.sendMessage(msg.chat.id,"帥哥你好");
}

});

這個 block 會在 bot 收到訊息後觸發,並將訊息相關的參數存入 msg ,上述程式碼用 msg.text 取出用戶傳送的訊息,並用 msg.chat.id 取得用戶的 chat id 。針對收到訊息的分析,主要依靠變數 keyword 和函數 .indexOf() 處理。如下圖,上述程式碼會在傳送的訊息以 “你好” 開頭的時候回復 “帥哥你好” 。

若想要配置更多模式的回復,可以直接在這個 block 添加其他關鍵字變數和 if 敘述。

發送圖片

再來看到以下的程式碼 :

bot.onText(/\/sendpic/, (msg) => {

bot.sendPhoto(msg.chat.id,"https://cdn.jsdelivr.net/gh/sky456757/imgHost/img/20210806133634.png" );

});

這段程式碼有兩個重點,新的 block bot.onText 和傳送圖片的函數 bot.sendPhoto() 。首先,這個新的 block 的運作方式和上面那個不太一樣,它會在你傳送的訊息和 “ / / “ 裡面的文字完全相同的時候觸發。而新的函數和前面的 bot.sendMessage() 差不多,只是第二個參數改成圖片的網址。由於一般的訊息通常不會嚴格要求完全一致,這個 block 主要拿來配置 / 開頭的 command 。 而因為 / 屬於特殊字元,因此要當成一般字元使用的時候要在前面加上 \ 。如下圖,上述程式碼會在輸入 /sendpic 之後發送網址中的圖片。

定時執行

來看以下的程式碼 :

schedule.scheduleJob('0 30 17 * * *', () => {
bot.sendMessage(id,"該吃晚餐囉");
});

這個 block 的參數預設值為 ‘ * * * * * * ‘,由左到右分別代表’ 秒 分 時 日 月 星期 ‘,將 “*” 替換為數字可以控制定時的時間,舉個例子 ‘ 10 * * * * * ‘ 代表 block 會在每一分鐘的第十秒執行,而上述的程式碼則是在每天的 17:30 傳送訊息。示例圖如下:

部署

在完成 index.js 後,再來就是要部署到後台運行,畢竟在終端機運行是很不優雅的。上面安裝的 PM2 套件就是幫我們完成這個工作。

把 terminal 切換到 index.js 所在的資料夾,執行下列命令就可以成功部署文件了

pm2 start index.js --name bot-name

之後文件有更新,需要重新部署時則是運行

pm2 restart bot-name

如果電腦有重新開機,記得要重新 start 喔。

後記

以上就是我研究 telegram bot 的心得,關於各個套件以及 js 語法的鑽研很明顯的還不成熟,不過希望這篇文章能幫助到和我一樣同屬初學者的各位。