Mục tiêu bài học
Sau khi hoàn thành bài học này, học viên sẽ có khả năng:- Hiểu được cơ chế hoạt động của Telegram Bot API.
- Tạo và cấu hình một Telegram Bot hoàn chỉnh.
- Lấy được
chat_idcủa cá nhân, nhóm, hoặc kênh. - Xây dựng API Route trong Next.js để gửi thông báo an toàn.
- Tích hợp gửi thông báo từ form liên hệ, đơn hàng, hoặc sự kiện hệ thống.
- Xử lý lỗi, định dạng tin nhắn (Markdown/HTML), và gửi kèm hình ảnh, file.
Video tại:
https://youtu.be/ete4eUzs6-U
https://youtu.be/k1Q5x6It1Zg
1. Tổng quan về Telegram Bot
1.1. Tại sao chọn Telegram để gửi thông báo?
Telegram là một trong những kênh thông báo phổ biến nhất cho ứng dụng web vì những lý do sau:- Miễn phí hoàn toàn: Không giới hạn số tin nhắn gửi đi (trong giới hạn rate limit hợp lý).
- Tốc độ nhanh: Tin nhắn đến gần như ngay lập tức trên cả mobile và desktop.
- API đơn giản: Chỉ cần một HTTP request là có thể gửi tin nhắn.
- Đa nền tảng: Người nhận có thể xem trên điện thoại, máy tính, web.
- Hỗ trợ định dạng phong phú: Markdown, HTML, hình ảnh, file, video, location.
1.2. Các trường hợp sử dụng phổ biến
Trong thực tế, Telegram Bot thường được dùng để:- Thông báo khi có khách hàng mới gửi form liên hệ trên website.
- Cảnh báo khi có đơn hàng mới trên hệ thống e-commerce.
- Thông báo lỗi (error monitoring) cho dev team.
- Gửi báo cáo doanh thu hằng ngày, hằng tuần.
- Cảnh báo bảo mật (đăng nhập bất thường, password reset).
- Thông báo deployment thành công/thất bại.
2. Tạo Telegram Bot
2.1. Sử dụng BotFather để tạo Bot
BotFather là bot chính thức của Telegram dùng để quản lý các bot khác. Các bước thực hiện:- Mở Telegram, tìm kiếm
@BotFather(có dấu tick xanh). - Bắt đầu cuộc trò chuyện và gõ lệnh
/newbot. - Nhập tên hiển thị của bot (ví dụ:
Softech Notification Bot). - Nhập username cho bot, bắt buộc kết thúc bằng
bot(ví dụ:softech_notify_bot). - BotFather sẽ trả về một Token có dạng:
⚠️ Cảnh báo bảo mật: Token này giống như mật khẩu. Bất kỳ ai có token đều có thể điều khiển bot của bạn. Tuyệt đối không commit token vào Git, không paste lên forum, không hardcode vào code frontend.
2.2. Các lệnh hữu ích của BotFather
Một số lệnh thường dùng để tùy chỉnh bot:/mybots— Liệt kê tất cả bot bạn đã tạo./setname— Đổi tên hiển thị./setdescription— Đặt mô tả cho bot./setuserpic— Đổi avatar cho bot./token— Lấy lại token (nếu quên)./revoke— Thu hồi token cũ và tạo token mới (dùng khi token bị lộ).
3. Lấy Chat ID
Để gửi tin nhắn, bot cần biết gửi đến đâu. Đó chính làchat_id. Có ba loại chat_id phổ biến:
- Chat cá nhân: ID là số dương (ví dụ:
123456789). - Nhóm (group): ID là số âm (ví dụ:
-987654321). - Kênh (channel): ID là số âm với tiền tố
-100(ví dụ:-1001234567890).
3.1. Lấy chat_id cá nhân
Cách 1: Dùng bot@userinfobot
- Tìm
@userinfobottrên Telegram. - Bấm Start, bot sẽ trả về thông tin của bạn bao gồm
Id.
getUpdates
- Mở Telegram, gửi tin nhắn bất kỳ cho bot vừa tạo (ví dụ gõ
/start). - Mở trình duyệt, truy cập URL sau (thay
<TOKEN>bằng token thật):
- Tìm trường
"chat":{"id": ...}trong JSON trả về. Đó làchat_id.
3.2. Lấy chat_id của nhóm
- Thêm bot vào nhóm Telegram.
- Gửi một tin nhắn bất kỳ vào nhóm (có nhắc đến bot, ví dụ
/start@your_bot). - Truy cập
https://api.telegram.org/bot<TOKEN>/getUpdates. - Tìm
chat_idâm trong response.
💡 Mẹo: Nếu nhóm là supergroup, ID sẽ bắt đầu bằng -100.
3.3. Lấy chat_id của kênh
- Tạo một kênh Telegram (channel).
- Thêm bot làm admin của kênh (nếu chỉ là member, bot không gửi được tin).
- Đăng một tin nhắn trong kênh.
- Truy cập
getUpdatesđể lấy ID, hoặc dùng bot@username_to_id_bot.
4. Telegram Bot API cơ bản
4.1. Cấu trúc URL
Tất cả các API của Telegram Bot có dạng:4.2. Phương thức sendMessage
Đây là phương thức quan trọng nhất, dùng để gửi tin nhắn văn bản.
Các tham số chính:
chat_id(bắt buộc): ID của người/nhóm/kênh nhận tin.text(bắt buộc): Nội dung tin nhắn (tối đa 4096 ký tự).parse_mode(tùy chọn): Định dạng tin nhắn —Markdown,MarkdownV2, hoặcHTML.disable_web_page_preview(tùy chọn): Tắt preview link.disable_notification(tùy chọn): Gửi tin nhắn im lặng (không có thông báo âm thanh).
5. Tích hợp vào Next.js
Phần này hướng dẫn bạn kết nối website với Telegram để tự động gửi thông báo khi có người liên hệ. Mỗi bước đều có hướng dẫn chi tiết — không cần biết lập trình vẫn làm được.5.1. Tạo dự án Next.js mới
Bước 1 — Mở Terminal (Command Prompt trên Windows) Nhấn phímCtrl + ~ (phím cách + phím `) trên bàn phím để mở cửa sổ Terminal ngay trong VS Code.
Bước 2 — Gõ lệnh tạo dự án
Copy đoạn bên dưới, paste vào Terminal, rồi nhấn Enter:
Would you like to use TypeScript?→ gõYesrồi EnterWould you like to use ESLint?→ gõYesrồi EnterWould you like to use Tailwind CSS?→ gõYesrồi EnterWould you like to usesrc/directory?→ gõNorồi EnterWould you like to use App Router?→ gõYesrồi EnterWould you like to customize the default import alias?→ gõNorồi Enter
Success là xong.
Bước 4 — Mở dự án
5.2. Lưu trữ Token và Chat ID an toàn
Ý tưởng đằng sau
Token Telegram giống như chìa khóa để mở cửa nhà bạn. Nếu ai đó có chìa khóa đó, họ có thể gửi tin nhắn từ bot của bạn. Vì vậy, bạn cất chìa khóa trong một nơi đặc biệt gọi là biến môi trường — nơi mà chỉ máy chủ mới đọc được, không ai khác nhìn thấy.Cách làm từng bước
Bước 1 — Tạo file cấu hình bí mật Trong VS Code, nhìn sang khung bên trái (gọi là Explorer). Bạn sẽ thấy các thư mục nhưapp, public, src.
Nhấn chuột phải vào vùng trắng trong Explorer → chọn New File → đặt tên file là .env.local
Lưu ý: Tên file bắt đầu bằng dấu chấm (.). Đây là file ẩn trên máy, nên bạn sẽ không thấy nó trong Finder/Explorer thông thường.
Bước 2 — Viết nội dung vào file
Mở file .env.local vừa tạo, paste đoạn sau:
Thay_Token_Cua_Ban_Vao_Day bằng token mà BotFather gửi cho bạn (dạng 7891234567:AAEh...).
Thay Thay_Chat_ID_Cua_Ban_Vao_Day bằng chat ID mà bạn lấy được ở phần 3.
Bước 3 — Kiểm tra file .gitignore
Mở file .gitignore ở thư mục gốc. Tìm xem có dòng .env*.local chưa. Nếu chưa có, thêm vào một dòng mới:
.env.local không bao giờ bị đẩy lên GitHub — tức là không ai nhìn thấy token của bạn.
5.3. Tạo “cỗ máy” gửi tin nhắn tự động
Ý tưởng đằng sau
Bạn sẽ tạo một hàm — tưởng tượng như một “cỗ máy” có nhiệm vụ: nhận tin nhắn → đóng gói đúng định dạng → gửi đến Telegram. Mỗi lần cần gửi thông báo, chỉ cần bảo máy “làm việc” thôi.Cách làm từng bước
Bước 1 — Tạo thư mụclib
Trong Explorer (khung bên trái), nhấn chuột phải vào vùng trắng → New Folder → đặt tên là lib.
Bước 2 — Tạo file telegram.ts
Nhấn chuột phải vào thư mục lib vừa tạo → New File → đặt tên là telegram.ts.
Bước 3 — Nhờ AI viết code
Mở Claude Code (trong Terminal: gõ claude), hoặc dùng ChatGPT/Claude web. Copy prompt bên dưới, paste vào, nhấn Enter:
Prompt để tạo fileSau khi AI viết xong → copy toàn bộ code → paste vào filelib/telegram.ts:
lib/telegram.ts → lưu file.
5.4. Tạo “cổng” để website gửi thông báo
Ý tưởng đằng sau
Khi khách điền form liên hệ trên website, website cần một cổng để gửi thông tin đó đến Telegram. File này chính là “cổng” đó.Cách làm từng bước
Bước 1 — Tạo thư mụcapi bên trong app
Trong Explorer, mở thư mục app. Nhấn chuột phải vào app → New Folder → đặt tên là api.
Nhấn chuột phải vào api vừa tạo → New Folder → đặt tên là notify.
Bước 2 — Tạo file route.ts
Nhấn chuột phải vào thư mục notify → New File → đặt tên là route.ts.
Bước 3 — Nhờ AI viết code
Prompt để tạo fileSau khi AI viết xong → copy → paste vàoapp/api/notify/route.ts:
app/api/notify/route.ts → lưu.
| Phần code | Nghĩa tiếng Việt |
|---|---|
POST | Cổng này chỉ nhận dữ liệu gửi vào (không cho ai đọc ra) |
request.json() | Đọc thông tin khách gửi lên (tên, email, lời nhắn) |
if (!name || !email) | Kiểm tra khách đã điền đủ thông tin chưa. Chưa đủ thì báo lỗi |
escapeHtml(...) | Xóa các ký tự đặc biệt nguy hiểm mà khách có thể gửi vào |
sendTelegramMessage({ text }) | Gọi cỗ máy ở bước 5.3 để gửi tin nhắn đi |
NextResponse.json | Trả kết quả về cho website: thành công hay thất bại |
5.5. Tạo trang form liên hệ trên website
Ý tưởng đằng sau
Bây giờ bạn cần tạo giao diện — cái form mà khách hàng nhìn thấy và điền thông tin.Cách làm từng bước
Bước 1 — Tạo thư mụccontact bên trong app
Trong Explorer, mở thư mục app. Nhấn chuột phải vào app → New Folder → đặt tên là contact.
Bước 2 — Tạo file page.tsx
Nhấn chuột phải vào thư mục contact → New File → đặt tên là page.tsx.
Bước 3 — Nhờ AI viết code
Mở Claude Code (trong Terminal: gõ claude), hoặc dùng ChatGPT/Claude web. Copy prompt bên dưới, paste vào, nhấn Enter:
Prompt để tạo fileGiải thích đơn giản:app/contact/page.tsx:
| Phần code | Nghĩa tiếng Việt |
|---|---|
'use client' | Đánh dấu đây là giao diện tương tác với người dùng |
useState | Lưu trữ thông tin form và trạng thái gửi |
fetch('/api/notify', ...) | Gửi dữ liệu qua “cổng” ở bước 5.4 |
disabled={loading} | Khóa nút gửi khi đang xử lý, tránh gửi 2 lần |
bg-green-100 | Nếu gửi thành công → khung xanh lá |
bg-red-100 | Nếu gửi thất bại → khung đỏ |
http://localhost:3000/contact. Điền thông tin và bấm Gửi liên hệ. Kiểm tra Telegram — bạn sẽ thấy tin nhắn hiện lên ngay.
6. Cách nhanh hơn: Gửi thông báo không cần API Route (Server Actions)
Ý tưởng đằng sau
Ở phần 5, bạn tạo một “cổng” riêng (API Route) để gửi dữ liệu. Cách này dùng được, nhưng Server Actions còn đơn giản hơn — không cần tạo cổng, code gọn hơn nhiều.Khi nào dùng cách nào? Nếu bạn chỉ gửi từ form trên website → dùng Server Actions (phần này). Nếu bạn muốn ứng dụng khác (app mobile, phần mềm bên ngoài) gọi được → dùng API Route (phần 5).
6.1. Tạo Server Action
Bước 1 — Tạo thư mụcactions bên trong app
Nhấn chuột phải vào thư mục app → New Folder → đặt tên là actions.
Bước 2 — Tạo file notify.ts
Nhấn chuột phải vào actions → New File → đặt tên là notify.ts.
Bước 3 — Nhờ AI viết code
Mở Claude Code (trong Terminal: gõ claude), hoặc dùng ChatGPT/Claude web. Copy prompt bên dưới, paste vào, nhấn Enter:
Prompt để tạo fileGiải thích đơn giản:app/actions/notify.ts:
| Phần code | Nghĩa tiếng Việt |
|---|---|
'use server' | Đánh dấu đây là hàm chạy ở server, không phải trình duyệt |
formData.get('name') | Lấy giá trị từ ô nhập “Họ tên” trên form |
return { success: false } | Trả về kết quả thất bại kèm thông báo lỗi |
6.2. Cập nhật trang form liên hệ
Bước 1 — Mở lại fileapp/contact/page.tsx
Thay toàn bộ nội dung bằng prompt bên dưới:
Prompt để cập nhậtSo sánh nhanh:app/contact/page.tsx:
| API Route (phần 5) | Server Action (phần 6) | |
|---|---|---|
| Số file cần tạo | 2 file (route + page) | 1 file (chỉ page) |
| Cách gửi dữ liệu | Dùng fetch gửi JSON | Gửi trực tiếp FormData |
| Dùng cho ứng dụng bên ngoài được không? | ✅ Có | ❌ Không |
| Độ phức tạp | Cao hơn | Đơn giản hơn |
7. Trang trí tin nhắn đẹp hơn
7.1. Tin nhắn với định dạng HTML
Ý tưởng đằng sau
Tin nhắn thuần văn bản trông đơn điệu. Telegram cho phép bạn tô điểm tin nhắn bằng các thẻ đặc biệt — giống như dùng bold, italic trong Word.Cách làm từng bước
Bước 1 — Mở filelib/telegram.ts
Bước 2 — Thêm hàm gửi tin có định dạng
Copy prompt bên dưới, paste vào cuối file lib/telegram.ts:
Prompt để thêm vàoBước 3 — Sử dụng hàm với các thẻ định dạng Bước 2 — Nhờ AI viết đoạn gọi hàmlib/telegram.ts:
Prompt để gọi hàmBảng tra cứu các thẻ HTML:sendFormattedMessage:
| Thẻ | Tác dụng | Ví dụ |
|---|---|---|
<b>...</b> | Chữ đậm | <b>Xin chào</b> → Xin chào |
<i>...</i> | Chữ nghiêng | <i>Khẩn cấp</i> → Khẩn cấp |
<u>...</u> | Chữ gạch chân | <u>Đã xác nhận</u> → Đã xác nhận |
<s>...</s> | Chữ gạch ngang | <s>1.500.000đ</s> → |
<code>...</code> | Chữ giống code | Giá trị số |
<a href="link">text</a> | Tạo đường link | Nút bấm trong tin nhắn |
7.2. Gửi tin nhắn kèm nút bấm
Ý tưởng đằng sau
Bạn có thể thêm nút bấm ngay trong tin nhắn Telegram. Người nhận bấm nút → mở trang web, hoặc gửi phản hồi lại cho bot.Cách làm từng bước
Bước 1 — Thêm hàm gửi kèm nút bấm Paste prompt bên dưới vào cuối filelib/telegram.ts:
Prompt để thêm vàoBước 2 — Cách sắp xếp nút Nút được sắp xếp theo hàng. Mỗi hàng là một mảnglib/telegram.ts:
[].
| Số hàng | Cách viết | Kết quả |
|---|---|---|
| 1 hàng, 2 nút | [[A, B]] | [A] [B] |
| 2 hàng, 1 nút mỗi hàng | [[A], [B]] | [A] và [B] |
| 1 hàng, 3 nút | [[A, B, C]] | [A] [B] [C] |
Prompt để gọi hàmsendMessageWithButtons:
Núturl→ Mở link trong trình duyệt khi bấm. Nútcallback_data→ Gửi phản hồi về cho bot (cần lập trình thêm phần xử lý phản hồi).
8. Gửi hình ảnh và file đính kèm
8.1. Gửi hình ảnh
Ý tưởng đằng sau
Thay vì mô tả sản phẩm bằng chữ, bạn có thể gửi kèm hình ảnh trực tiếp trong tin nhắn. Telegram hỗ trợ gửi ảnh từ một đường link URL.Cách làm từng bước
Bước 1 — Thêm hàm gửi ảnh vàolib/telegram.ts
Prompt để thêm vàoBước 2 — Nhờ AI viết đoạn gọi hàmlib/telegram.ts:
Prompt để gọi hàmsendPhoto:
Lưu ý: Link ảnh phải là link công khai (public URL). Ảnh từ Google Drive, Dropbox (link chia sẻ) sẽ không gửi được.
8.2. Gửi file tài liệu (PDF, Excel, Word)
Cách làm từng bước
Bước 1 — Thêm hàm gửi file vàolib/telegram.ts
Prompt để thêm vàoBước 2 — Nhờ AI viết đoạn gọi hàmlib/telegram.ts:
Prompt để gọi hàmsendDocument:
9. Xử lý lỗi thường gặp
9.1. Các lỗi phổ biến và cách khắc phục
| Mã lỗi | Nghĩa | Nguyên nhân thường gặp | Cách xử lý |
|---|---|---|---|
| 400 Bad Request | Sai cú pháp | chat_id không đúng định dạng, hoặc thiếu tham số bắt buộc | Kiểm tra lại chat_id trong file .env.local |
| 401 Unauthorized | Không xác thực được | Token bị sai, hoặc bị BotFather thu hồi | Vào BotFather, dùng lệnh /token để lấy lại token mới |
| 403 Forbidden | Không có quyền | Bot bị user chặn, hoặc bot chưa được thêm vào nhóm | Thêm bot vào nhóm với quyền admin |
| 429 Too Many Requests | Gửi quá nhanh | Gửi hơn 1 tin nhắn/giây đến cùng một chat | Chờ 1-2 giây giữa mỗi lần gửi |
9.2. Giới hạn tốc độ gửi (Rate Limit)
Telegram giới hạn số lần gửi để tránh spam:| Tình huống | Giới hạn |
|---|---|
| Gửi đến nhiều người khác nhau | Tối đa 30 tin/giây |
| Gửi đến cùng một người | Tối đa 1 tin/giây |
| Gửi đến cùng một nhóm | Tối đa 20 tin/phút |
Thực tế: Với website thông thường, bạn sẽ không bao giờ vượt quá giới hạn này. Chỉ cần lưu ý khi gửi nhiều tin nhắn liên tiếp trong vòng lặp.
9.3. Gửi lại tự động khi thất bại
Ý tưởng đằng sau
Đôi khi mạng chậm hoặc Telegram tạm thời quá tải, tin nhắn gửi thất bại. Thay vì bỏ lỡ, bạn nên thử gửi lại — lần đầu chờ 1 giây, lần sau 2 giây, lần sau nữa 4 giây.Cách làm từng bước
Bước 1 — Thêm hàm retry vàolib/telegram.ts
Prompt để thêm vàoBước 2 — Nhờ AI cập nhật filelib/telegram.ts:
Prompt để thay thế lời gọi hàm:Giải thích đơn giản:
| Lần thử | Thời gian chờ |
|---|---|
| Thử 1 | Thất bại → chờ 1 giây |
| Thử 2 | Thất bại → chờ 2 giây |
| Thử 3 | Thất bại → chờ 4 giây |
| Thử 4 | Vẫn lỗi → báo lỗi cho khách |
10. Bài tập thực hành
Bài tập 1: Form đăng ký nhận bản tin
Mục tiêu: Tạo trang/subscribe để khách đăng ký nhận email bản tin.
Các bước thực hiện:
- Tạo thư mục
app/subscribevà filepage.tsxbên trong - Copy prompt bên dưới vào Claude Code/ChatGPT để tạo file:
Prompt để tạoapp/subscribe/page.tsx:
- Chạy
npm run dev→ mởhttp://localhost:3000/subscribe→ điền email và bấm Đăng ký - Kiểm tra Telegram — bạn sẽ nhận được tin nhắn thông báo
Bài tập 2: Thông báo đơn hàng với nút bấm
Mục tiêu: Tạo trang/checkout giả lập đặt hàng, gửi thông báo kèm nút bấm.
Hướng dẫn:
- Tạo thư mục
app/checkoutvà filepage.tsx - Copy prompt bên dưới để tạo file:
Prompt để tạoapp/checkout/page.tsx:
- Chạy
npm run dev→ mởhttp://localhost:3000/checkout - Bấm Đặt hàng ngay → kiểm tra Telegram
Bài tập 3: Gửi ảnh sản phẩm qua Telegram
Mục tiêu: Thêm hình ảnh vào thông báo đơn hàng. Hướng dẫn:- Mở file
lib/telegram.ts, thêm hàmsendPhoto(xem phần 8.1) - Tạo thư mục
app/productvà filepage.tsxbằng prompt:
Prompt để tạoapp/product/page.tsx:
- Chạy thử và kiểm tra kết quả
Bài tập 4 (nâng cao): Tự động thử lại khi gửi thất bại
Mục tiêu: Cập nhật Server Action để tự động thử lại khi Telegram không phản hồi. Hướng dẫn:- Mở file
app/actions/notify.ts - Thêm
sendWithRetrytừ phần 9.3 vàolib/telegram.ts - Trong file
notify.ts, thaysendTelegramMessagebằngsendWithRetrybằng prompt:
Prompt để cập nhậtapp/actions/notify.ts:
11. Tổng kết
Những điểm cần nhớ
- Token Telegram phải được bảo mật, không bao giờ đặt ở client-side.
- Luôn validate và escape input của user trước khi gửi.
- Sử dụng API Route hoặc Server Action — đừng gọi Telegram API trực tiếp từ browser.
- Hiểu rõ rate limit để tránh bot bị Telegram block tạm thời.
- HTML parse mode dễ dùng hơn Markdown vì ít ký tự cần escape.
Tài liệu tham khảo
- Tài liệu chính thức Telegram Bot API: https://core.telegram.org/bots/api
- Hướng dẫn tạo bot với BotFather: https://core.telegram.org/bots/tutorial
- Next.js App Router & Server Actions: https://nextjs.org/docs/app
- Telegram Bot API formatting options: https://core.telegram.org/bots/api#formatting-options
Hướng phát triển tiếp theo
Sau khi đã thành thạo bài học này, học viên có thể tìm hiểu sâu hơn về:- Webhook: Nhận tin nhắn 2 chiều thay vì chỉ gửi ra.
- Telegraf.js: Framework xây dựng bot Telegram phức tạp với Node.js.
- Inline Mode: Cho phép user gọi bot từ bất kỳ chat nào với cú pháp
@your_bot query. - Payments API: Tích hợp thanh toán trực tiếp trong Telegram.
- Mini Apps: Xây dựng web app chạy bên trong Telegram.
Bài giảng được biên soạn cho khóa học tại Softech Aptech Đà Nẵng.