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_id củ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:
  1. Mở Telegram, tìm kiếm @BotFather (có dấu tick xanh).
  2. Bắt đầu cuộc trò chuyện và gõ lệnh /newbot.
  3. Nhập tên hiển thị của bot (ví dụ: Softech Notification Bot).
  4. Nhập username cho bot, bắt buộc kết thúc bằng bot (ví dụ: softech_notify_bot).
  5. 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
  1. Tìm @userinfobot trên Telegram.
  2. Bấm Start, bot sẽ trả về thông tin của bạn bao gồm Id.
Cách 2: Dùng API getUpdates
  1. Mở Telegram, gửi tin nhắn bất kỳ cho bot vừa tạo (ví dụ gõ /start).
  2. Mở trình duyệt, truy cập URL sau (thay <TOKEN> bằng token thật):
  1. Tìm trường "chat":{"id": ...} trong JSON trả về. Đó là chat_id.

3.2. Lấy chat_id của nhóm

  1. Thêm bot vào nhóm Telegram.
  2. Gửi một tin nhắn bất kỳ vào nhóm (có nhắc đến bot, ví dụ /start@your_bot).
  3. Truy cập https://api.telegram.org/bot<TOKEN>/getUpdates.
  4. 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

  1. Tạo một kênh Telegram (channel).
  2. Thêm bot làm admin của kênh (nếu chỉ là member, bot không gửi được tin).
  3. Đăng một tin nhắn trong kênh.
  4. 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ặc HTML.
  • 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).
Test nhanh bằng cURL:

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ím Ctrl + ~ (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:
Bước 3 — Trả lời các câu hỏi trên màn hình Khi Terminal hỏi, gõ đáp án tương ứng:
  • Would you like to use TypeScript? → gõ Yes rồi Enter
  • Would you like to use ESLint? → gõ Yes rồi Enter
  • Would you like to use Tailwind CSS? → gõ Yes rồi Enter
  • Would you like to use src/ directory? → gõ No rồi Enter
  • Would you like to use App Router? → gõ Yes rồi Enter
  • Would you like to customize the default import alias? → gõ No rồi Enter
Chờ khoảng 2-3 phút để máy tải và cài đặt. Khi thấy dòng chữ màu xanh Success là xong. Bước 4 — Mở dự án
Lệnh cuối sẽ mở dự án trong VS Code. Từ giờ bạn làm việc trong cửa sổ VS Code.

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 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:
Việc này đảm bảo file .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ục lib 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 file lib/telegram.ts:
Sau khi AI viết xong → copy toàn bộ code → paste vào file 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ục api bên trong app Trong Explorer, mở thư mục app. Nhấn chuột phải vào appNew 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 notifyNew File → đặt tên là route.ts. Bước 3 — Nhờ AI viết code
Prompt để tạo file app/api/notify/route.ts:
Sau khi AI viết xong → copy → paste vào app/api/notify/route.ts → lưu.

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ục contact bên trong app Trong Explorer, mở thư mục app. Nhấn chuột phải vào appNew 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 contactNew 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 file app/contact/page.tsx:
Giải thích đơn giản: Bước 4 — Chạy thử Quay lại Terminal, gõ:
Mở trình duyệt, truy cập 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ục actions bên trong app Nhấn chuột phải vào thư mục appNew Folder → đặt tên là actions. Bước 2 — Tạo file notify.ts Nhấn chuột phải vào actionsNew 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 file app/actions/notify.ts:
Giải thích đơn giản:

6.2. Cập nhật trang form liên hệ

Bước 1 — Mở lại file app/contact/page.tsx Thay toàn bộ nội dung bằng prompt bên dưới:
Prompt để cập nhật app/contact/page.tsx:
So sánh nhanh:

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ở file lib/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ào lib/telegram.ts:
Bướ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àm
Prompt để gọi hàm sendFormattedMessage:
Bảng tra cứu các thẻ HTML:

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 file lib/telegram.ts:
Prompt để thêm vào lib/telegram.ts:
Bướ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ảng []. Bước 3 — Nhờ AI viết đoạn gọi hàm
Prompt để gọi hàm sendMessageWithButtons:
Nút url → Mở link trong trình duyệt khi bấm. Nút callback_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ào lib/telegram.ts
Prompt để thêm vào lib/telegram.ts:
Bước 2 — Nhờ AI viết đoạn gọi hàm
Prompt để gọi hàm sendPhoto:
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ào lib/telegram.ts
Prompt để thêm vào lib/telegram.ts:
Bước 2 — Nhờ AI viết đoạn gọi hàm
Prompt để gọi hàm sendDocument:

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

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:
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ào lib/telegram.ts
Prompt để thêm vào lib/telegram.ts:
Bước 2 — Nhờ AI cập nhật file
Prompt để thay thế lời gọi hàm:
Giải thích đơn giản:

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:
  1. Tạo thư mục app/subscribe và file page.tsx bên trong
  2. Copy prompt bên dưới vào Claude Code/ChatGPT để tạo file:
Prompt để tạo app/subscribe/page.tsx:
  1. Chạy npm run dev → mở http://localhost:3000/subscribe → điền email và bấm Đăng ký
  2. 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:
  1. Tạo thư mục app/checkout và file page.tsx
  2. Copy prompt bên dưới để tạo file:
Prompt để tạo app/checkout/page.tsx:
  1. Chạy npm run dev → mở http://localhost:3000/checkout
  2. 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:
  1. Mở file lib/telegram.ts, thêm hàm sendPhoto (xem phần 8.1)
  2. Tạo thư mục app/product và file page.tsx bằng prompt:
Prompt để tạo app/product/page.tsx:
  1. 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:
  1. Mở file app/actions/notify.ts
  2. Thêm sendWithRetry từ phần 9.3 vào lib/telegram.ts
  3. Trong file notify.ts, thay sendTelegramMessage bằng sendWithRetry bằng prompt:
Prompt để cập nhật app/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

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.