Telegram Bot tự động - Tạo Bot Telegram đầu tiên
Telegram là một nền tảng nhắn tin khá phổ biến vì nó miễn phí, nhanh, lưu trữ không giới hạn.
Tuy nhiên, có thể bạn chưa biết, Telegram còn hỗ trợ tạo bot, viết code để đọc/gửi tin nhắn tự động. Rất nhiều anh em sử dụng Telegram để quản lý quy trình vì nó có rất nhiều ưu điểm:
- API miễn phí: Không giới hạn tin nhắn hay files ảnh, video, audio... (khác với SMS tốn phí!)
- Dễ cài đặt: Việc tạo bot, cài đặt cho bot trò chuyện chỉ mất 10-15 phút (nhanh và dễ hơn nhiều so với Facebook/Zalo...)
- Real-time: Xử lý tin nhắn và trả lời ngay lập tức, không cần chờ phải hay refresh
- Security cao: End-to-end encryption, an toàn gần như tuyệt đối
- Interactive: Tạo buttons/link để tương tác ngay trong chat
Với n8n, bạn có thể tạo Telegram Bot để đọc/gửi tin nhắn tự động, tích hợp với các hệ thống khác mà không cần viết dòng code nào luôn!

Tạo Bot Telegram với BotFather
Trước khi có thể tích hợp Telegram với n8n, bạn cần tạo một con bot Telegram để gửi/nhận tin nhắn.
Quá trình này cũng khá đơn giản. Bạn sẽ sử dụng BotFather. Đây là "ông trùm" quản lý tất cả bot trên Telegram. Bạn cần "xin phép" nó để tạo con bot của riêng mình!
1. Gặp gỡ BotFather
-
Mở Telegram và tìm @BotFather

-
Bắt đầu cuộc trò chuyện (gõ
/start):
-
Yêu cầu tạo bot mới (gõ
/newbothoặc bấm vào command/newbottrong tin nhắn là được):
2. Điền thông tin cho bot
Bạn sẽ lần lượt trả lời 2 tin nhắn của BotFather để tạo Bot.
-
BotFather sẽ hỏi tên bot (Tên gì cũng được):
👤 BotFather: How are we going to call it? 🧑💻 Bạn gõ: N8N Course Bot (hoặc tên gì tuỳ bạn) -
BotFather sẽ hỏi username (phải kết thúc bằng "bot", nếu không sẽ không tạo được):
👤 BotFather: Now let's choose a username. It must end in `bot`. 🧑💻 Bạn gõ: n8n_course_bot
Xong rồi đây, bạn sẽ nhận được Bot Token và một link của bot đã tạo (Ví dụ <t.me/n8n_course_bot>):
🔑 Use this token to access the HTTP API:
1234567890:ABCdefGHIjkXXXXwxYZ1234567890
🔒 Bot Token này quan trọng như mật khẩu để n8n hoặc các chương trình khác ra lệnh cho bot của bạn. Nhớ giữ kĩ chứ đừng để lộ nhé!
Nếu quên, bạn có thể tìm lại BotFather, sau đó tuỳ chỉnh bot hoặc lấy lại token bằng lệnh /mybot, sau đó bấm vào API token để lấy lại:

3. Kết nối n8n với Telegram Bot
-
Từ trang chủ, bấm dấu
+ở góc trên bên trái ->Credentials -
Tìm
Telegram API
-
Dán
Bot Tokenvừa lấy được vào ôAccess Token:
-
Đặt tên cho credential ở góc trên bên trái, sau đó bấm nút
Save. n8n sẽ thử kết nối với bot của bạn.
Nếu thấy hiện
Connection tested successfullynhư trong hình là ok rồi! n8n đã có thể tích hợp với bot của bạn để bắt đầu nhận tin nhắn, tự động trả lời.
Thử nhận tin nhắn từ Telegram
Từ n8n, bạn có thể tích hợp với Telegram để gửi tin nhắn, hình ảnh, file, và nhiều tính năng khác. Có 2 nhóm tính năng chính:
Triggers: Kích hoạt Workflow khi có tin nhắn mới cho bot hoặc trong channel, hoặc khi người dùng bấm nút chọnActions: Gửi tin nhắn, hình ảnh, file, ...
Trong bài này, ta sẽ thử nhận tin nhắn từ Telegram với Trigger (on message) node.
Trigger (on message) - Kích hoạt Workflow khi có tin nhắn mới
-
Tạo workflow đơn giản. Bấm vào
Add First Step->On app event-> Gõ tìmTelegram-> ChọnTrigger (on message)
-
Bấm
Execute step. n8n sẽ chờ tin nhắn mới từ Telegram để kích hoạt workflow.
-
Từ Telegram, gửi tin nhắn bất kì (hoặc
/startđể test) cho bot của bạn -
Quay lại n8n, bạn sẽ thấy workflow đã được kích hoạt.
- Output sẽ bao gồm các thông tin về tin nhắn đã nhận được (thông tin người gửi, thời gian, tin nhắn, ...)

- Output sẽ bao gồm các thông tin về tin nhắn đã nhận được (thông tin người gửi, thời gian, tin nhắn, ...)
⚠️ Nếu bạn chạy n8n bằng Docker ở máy cá nhân (
http://localhost:5678), bấmExecute stepmà bị báo lỗiBad Request: bad webhook: An HTTPS URL must be provided for webhookthì đừng hoảng nha! Bot và token của bạn không sai đâu. Xem cách xử lý ở phần Chạy Telegram Trigger trên n8n cài ở máy cá nhân bên dưới nhé.
Output của node Trigger (on message)
Đây là output của node Trigger (on message).
[
{
"update_id": 744628102,
"message": {
"message_id": 780,
"from": {
"id": 622132332,
"is_bot": false,
"first_name": "Harry",
"last_name": "Pham",
"username": "codedao",
"language_code": "en"
},
"chat": {
"id": 622132332,
"first_name": "Harry",
"last_name": "Pham",
"username": "codedao",
"type": "private"
},
"date": 1764600952,
"text": "/start",
"entities": [
{
"offset": 0,
"length": 6,
"type": "bot_command"
}
]
}
}
]
Đây là một số trường quan trọng mà các bạn cần lưu ý.
| Trường | Ý nghĩa | Giá trị mẫu |
|---|---|---|
message.message_id |
ID của tin nhắn trong cuộc trò chuyện (dùng để edit/xoá) | 780 |
message.from.id |
ID của người gửi tin nhắn | 622132332 |
message.from.username |
Username Telegram của người gửi | codedao |
message.chat.id |
Chat ID - quan trọng nhất, dùng để reply hoặc gửi tin | 622132332 |
message.chat.type |
Loại chat: private, group, supergroup, hoặc channel |
private |
message.date |
Thời gian gửi tin nhắn | 1764600952 |
message.text |
Nội dung tin nhắn | /start |
message.entities |
Các thành phần đặc biệt trong tin nhắn (commands, links, mentions...) |
Mỗi cuộc trò chuyện giữa người dùng và bot được tính là 1 chat. Để gửi tin nhắn, bạn cần biết Chat ID để bot biết gửi tin nhắn vào cuộc trò chuyện nào!
- Nếu bạn invite bot vào 1 group, ta sẽ có
Chat IDđể gửi vào group đó. - Nếu bạn dùng
Telegramđể gửi tin nhắn tới account Telegram cá nhân, hãy lưu Chat ID này lại để dùng nó trong tất cả workflow gửi tin nhắn. (Chat ID này lộ cũng không quá nguy hiểm, vì phải có token mới gửi được tin nhắn)
Chạy Telegram Trigger trên n8n cài ở máy cá nhân
Phần này dành cho các bạn cài n8n bằng Docker theo bài cài đặt, và đang vào n8n qua http://localhost:5678.
Nếu bạn dùng n8n Cloud hoặc platform.hocn8n.ai thì có thể bỏ qua phần này nhé, mọi thứ đã được cấu hình sẵn rồi!
Lỗi An HTTPS URL must be provided for webhook
Dù credential đã báo Connection tested successfully, khi bấm Execute step ở node Telegram Trigger, bạn có thể gặp lỗi sau:
Problem running workflow
Bad request - please check your parameters
Bad Request: bad webhook: An HTTPS URL must be provided for webhook

Đừng lo, bot và token của bạn không có vấn đề gì cả. Lỗi này nằm ở cách Telegram gửi tin nhắn về n8n.
Vì sao lại bị lỗi?
Để hiểu lỗi này, ta cần biết n8n và Telegram nói chuyện với nhau theo 2 chiều khác nhau:
- Chiều n8n → Telegram (test credential, gửi tin nhắn): n8n chủ động gọi lên
api.telegram. Máy nào có internet cũng gọi được, nên test credential mới thành công. - Chiều Telegram → n8n (Trigger): Khi bấm
Execute step, n8n đưa cho Telegram một địa chỉ (gọi là webhook), để khi có tin nhắn mới, Telegram sẽ gửi dữ liệu vào địa chỉ đó.
Telegram yêu cầu địa chỉ webhook này phải là HTTPS (port 443, 80, 88 hoặc 8443) và phải truy cập được từ internet.
Trong khi đó, n8n ở máy bạn chỉ đưa được cho Telegram địa chỉ kiểu http://localhost:5678/webhook-test/.... Địa chỉ này không thoả mãn cả hai điều kiện: là http chứ không phải https, còn localhost thì chỉ có máy bạn hiểu.
Giống như bạn ghi địa chỉ giao hàng là "nhà tôi" vậy. Shipper không biết giao đi đâu, nên Telegram từ chối và trả về lỗi trên.
Do vậy, muốn dùng Telegram Trigger với n8n ở máy cá nhân, ta cần 2 thứ:
- Một đường hầm (tunnel) để máy bạn có một địa chỉ HTTPS công khai. Request gửi tới địa chỉ đó sẽ được chuyển tiếp về
localhost:5678 - Báo cho n8n biết địa chỉ công khai này, để n8n đưa đúng địa chỉ cho Telegram
Cách 1: Dùng n8n Cloud hoặc platform.hocn8n.ai (nhanh nhất)
Nếu bạn chỉ cần học và làm bài tập, cách đơn giản nhất là test Telegram Trigger trên n8n Cloud hoặc platform.hocn8n.ai. Hai nơi này đã có sẵn domain HTTPS, không cần cấu hình gì thêm.
Cách 2: Mở tunnel bằng Cloudflare (miễn phí, không cần tài khoản)
Nếu vẫn muốn chạy ở máy mình, bạn có thể dùng tính năng Quick Tunnel của Cloudflare: chỉ cần chạy 1 lệnh là có ngay một địa chỉ dạng https://xxx.trycloudflare.com trỏ về máy bạn.
Cách này không cần đăng ký tài khoản, không cần mua domain. Máy bạn đã có Docker từ bài cài đặt rồi, nên cũng không phải cài thêm gì cả!
Bước 1: Mở tunnel (Terminal 1)
Mở Terminal (macOS/Linux) hoặc PowerShell (Windows) và chạy lệnh sau:
docker run --rm cloudflare/cloudflared:latest tunnel --no-autoupdate --url http://host.docker.internal:5678
(host.docker.internal là cách container cloudflared gọi tới máy thật của bạn, nơi n8n đang mở port 5678)
Đợi vài giây, bạn sẽ thấy một khung như thế này trong log:
Your quick Tunnel has been created! Visit it at (it may take some time to be reachable):
https://random-words-here.trycloudflare.com
Log in ra khá dài, khung này nằm ở gần đầu nên bạn cuộn lên một chút là thấy:

Copy lại địa chỉ https://...trycloudflare.com này. Nhớ để nguyên Terminal 1 chạy nhé, tắt nó là tunnel sẽ mất luôn.
Trên Linux, nếu báo không tìm thấy
host.docker.internal, bạn thêm--add-host=host.docker.internal:host-gatewayngay saudocker runlà được.
Bước 2: Chạy lại n8n với địa chỉ công khai (Terminal 2)
Nếu n8n đang chạy thì tắt đi (Ctrl + C), mở một Terminal mới rồi chạy lại n8n với vài biến môi trường mới.
Nhớ thay https://random-words-here.trycloudflare.com/ bằng địa chỉ bạn vừa copy, và giữ dấu / ở cuối nhé:
docker run -it --rm \
--name n8n \
-p 5678:5678 \
-e N8N_WEBHOOK_URL=https://random-words-here.trycloudflare.com/ \
-e WEBHOOK_URL=https://random-words-here.trycloudflare.com/ \
-e N8N_PROXY_HOPS=1 \
-v n8n_data:/home/node/.n8n \
docker.n8n.io/n8nio/n8n
So với lệnh ở bài cài đặt, ta chỉ thêm đúng 3 dòng -e:
N8N_WEBHOOK_URL: Địa chỉ công khai mà n8n sẽ đưa cho TelegramWEBHOOK_URL: Tên cũ của biến trên. Từ n8n 2.35 trở đi thì dùngN8N_WEBHOOK_URL, nhưng ta khai báo cả hai cho chắc, bản nào cũng chạy được. (Nếu thấy log cảnh báoWEBHOOK_URL is deprecatedthì bỏ qua, không ảnh hưởng gì đâu)N8N_PROXY_HOPS=1: Báo cho n8n biết request đi qua 1 lớp trung gian (chính là tunnel), để n8n đọc đúng thông tin request
Chạy xong, bạn nhìn xuống cuối log của n8n. Nếu dòng Editor is now accessible via: đã hiện địa chỉ https://...trycloudflare.com thay vì http://localhost:5678 là n8n đã nhận địa chỉ mới:

Trên Windows PowerShell, bạn đổi dấu
\ở cuối mỗi dòng thành dấu backtick`, hoặc gõ cả lệnh trên một dòng nhé.
Bước 3: Kiểm tra và chạy lại Trigger
-
Vẫn vào n8n qua
http://localhost:5678như bình thường. (Địa chỉ tunnel chỉ để Telegram gọi vào thôi) -
Mở node
Telegram Trigger, bấm mở mụcWebhook URLs. Nếu URL đã bắt đầu bằnghttps://...trycloudflare.com/webhook-test/...là n8n đã nhận cấu hình mới
-
Bấm
Execute steprồi gửi tin nhắn cho bot. Lần này không còn báo lỗi nữa, node sẽ chuyển sang trạng thái chờ tin nhắn. Gửi xong, quay lại n8n là thấy tin nhắn hiện ngay ở phầnOUTPUT
Nếu workflow chạy như phần hướng dẫn ở trên là ok rồi!
Một số lưu ý khi dùng Quick Tunnel
- Địa chỉ đổi sau mỗi lần chạy lại tunnel: Mỗi lần chạy lại lệnh ở Bước 1, bạn sẽ nhận một địa chỉ
trycloudflare.commới. Khi đó, phải làm lại Bước 2 với địa chỉ mới, rồiExecute steplại (hoặc publish lại workflow) để n8n gửi địa chỉ mới cho Telegram. - Chỉ nên dùng để học và test: Tắt máy, máy ngủ hay tắt terminal là bot sẽ ngừng nhận tin nhắn. Muốn bot chạy thật 24/7, bạn nên dùng n8n Cloud hoặc cài n8n lên VPS có domain riêng.
- n8n của bạn đang public ra internet: Ai có địa chỉ tunnel cũng vào được trang đăng nhập n8n của bạn. Nhớ đặt mật khẩu mạnh, đừng chia sẻ địa chỉ này lung tung, và học xong thì tắt tunnel đi nhé.
- Muốn địa chỉ cố định? Bạn có thể dùng Cloudflare Tunnel với domain riêng (cần tài khoản Cloudflare), hoặc ngrok (cần đăng ký tài khoản, gói free có 1 domain cố định). Cách cấu hình n8n y hệt, chỉ cần thay địa chỉ trong
N8N_WEBHOOK_URLvàWEBHOOK_URLlà được.
Làm rồi mà vẫn chưa chạy?
Nếu vẫn chưa được, bạn kiểm tra thử mấy điểm sau.
1. Mỗi bot chỉ có 1 webhook tại một thời điểm
Bạn còn nhớ dòng cảnh báo màu vàng trong node không? "Due to Telegram API limitations, you can use just one Telegram trigger for each bot at a time".
Nghĩa là bot chỉ nhớ địa chỉ webhook được đăng ký sau cùng. Nếu cùng 1 bot được dùng ở nhiều nơi, chúng sẽ ghi đè webhook của nhau:
- Cùng bot đó đang được dùng trên platform.hocn8n.ai hoặc một máy n8n khác
- Có 2 workflow cùng dùng Telegram Trigger với 1 bot
- Bạn vừa
Execute stepđể test (đăng ký URL/webhook-test/...) trong khi workflow đó đã publish chạy thật (URL/webhook/...)
Cách đơn giản nhất là mỗi môi trường dùng 1 bot riêng: 1 bot để test ở máy, 1 bot để chạy thật. Tạo bot mới với BotFather chỉ mất vài phút thôi mà!
2. Xem Telegram đang giữ webhook nào
Mở trình duyệt, vào địa chỉ sau (thay <TOKEN> bằng Bot Token của bạn):
https://api.telegram.org/bot<TOKEN>/getWebhookInfo
Kết quả trả về sẽ có mấy trường quan trọng:
| Trường | Ý nghĩa |
|---|---|
url |
Địa chỉ webhook Telegram đang dùng. Nếu không phải địa chỉ tunnel hiện tại thì Execute step lại |
last_error_message |
Lỗi gần nhất khi Telegram gọi webhook (ví dụ tunnel đã tắt, hoặc n8n chưa chạy) |
pending_update_count |
Số tin nhắn đang chờ Telegram gửi đi |
🔒 Link này có chứa Bot Token, đừng chụp màn hình gửi lên group nhé. Ai có token là điều khiển được bot của bạn đó!
3. Tunnel có tới được n8n không?
Mở địa chỉ https://...trycloudflare.com trên trình duyệt. Nếu thấy trang đăng nhập n8n hiện ra (hoặc trang Set up owner account nếu bạn mới cài lần đầu) là tunnel đã thông:

Nếu báo lỗi 502 hoặc không vào được, bạn kiểm tra xem n8n ở Terminal 2 còn chạy không, và lệnh ở Bước 1 đã đúng port 5678 chưa.
Tạm kết
Sau bài học này, bạn đã biết cách tạo, cấu hình Telegram Bot và thử đọc tin nhắn được gửi tới.
Ở bài tiếp theo, chúng ta sẽ học thêm về cách gửi lại tin nhắn, tạo workflow cơ bản và một số điểm cần lưu ý khi dùng Telegram Node.
