/

telegram-bot API 懶人包

前言

這幾天接觸了 telegram API,用來串一些間單的程式並且將結果發送給自己,一開始用的是 node-telegram-bot-api ,但昨天發現裡頭有些 event 設計似乎不是這麼直覺。

當初會選擇 node-telegram-bot-api 是因為它在 github 上的 star 比較多。後來依照官方的推薦順序,選擇了 telegraf

以下介紹基本常用的功能,以及自己的小筆記 😊

起手式

前置作業

1
2
3
4
5
require('dotenv').config();
const Telegraf = require('telegraf')
const bot = new Telegraf(process.env.BOT_TOKEN)

bot.launch()//沒有這行的話,監聽事件都會聽不到內容。但是還是可以主動發送訊息,這行要加在程式尾端

常用功能

1
2
3
4
5
6
7
8
bot.start((ctx) => ctx.reply('Welcome')) //點擊 start 區塊後的行為

bot.help((ctx) => ctx.reply('Send me a sticker')) //輸入 /help 後的行為

bot.on('sticker', (ctx) => ctx.reply('👍')) //收到貼圖的行為
//也可以將 sticker 換成 text 等等不同事件

bot.hears('hi', (ctx) => ctx.reply('Hey there')) //收到某段文字後的行為

解析收到的訊息

取得用戶資訊

如果 bot 要主動發送訊息給某個用戶,需要知道某個用戶的 userID (group 的話就要知道 groupID)。

我們可以透過解析訊息來得知發送方的資訊(也能透過 http API 介面):

1
2
3
4
5
6
7
8
bot.on('message', ({ from: { username, first_name, last_name, id }, reply }) => {
let name = first_name + last_name
let log = `${name} (${id})`
console.log(log)
//or
console.log(ctx.message.from.id) // user_id
console.log(ctx.message.text) // user_text
})

取得媒體 id

以圖片為例,取得媒體 id。

這邊有一個很重要的觀念, photo 事件也是 message 事件的一種,所以在監聽的時候如果有以下:

1
bot.on('message', () => {})

也存在於程式中,那麼:

1
2
3
4
5
6
bot.on('photo', (ctx) => {
let file_id = ctx['update']['message']['photo'][0]['file_id']
console.log(file_id)
//or
console.log(ctx.message.photo[0].file_id)
})

很可能會被第一個監聽事件,提前搶走,造成沒監聽到事件。

主動發送訊息

1
2
3
4
bot.telegram.sendMessage(process.env.yiyuUID, 'hello, yiyu')

bot.telegram.sendPhoto(process.env.yiyuUID, PHOTO)
// 這邊的 PHOTO 可以是 image-url 或是 file_id (如果這張圖已經在 telegram server 上的話)

小地雷

如上述, message 事件很容易把別人的監聽搶走,因為 message 是小事件的集合。所以當要針對純圖片做處理的時候,可以把 message 換成 text。

1
2
3
bot.on('text', (ctx) => {
ctx.reply('received')
})

用意在於,讓純文字與純圖片各自有自己的監聽範圍,彼此不干擾。

但是如果要處理,圖片 + 文字 這種訊息的話,還是需要監聽 message 較適合。

例外處理

1
2
3
bot.catch((err) => {
console.log('Ooops', err)
})