Telegram getUpdates và setWebhook bị xung đột: runbook chuyển đổi an toàn
Telegram Bot API có một quy tắc quan trọng: cùng một bot không nên nhận updates bằng cả polling getUpdates và push setWebhook cùng lúc. Nếu sau khi deploy, tin nhắn không vào hệ thống, hãy kiểm tra receiver nào đang hoạt động trước. Sau đó bạn mới quyết định xóa webhook để quay lại polling, hoặc dừng polling worker trước khi đặt webhook. Với đội ở Việt Nam đang dùng cả WhatsApp, Zalo và Telegram, hãy tách rõ bài toán Bot API với bài toán inbox đa kênh.
Điểm chính
getUpdatesvàsetWebhooklà hai chế độ nhận updates chính thức của Telegram Bot API, không phải hai lớp chạy song song.- Gọi
getWebhookInfotrước khi thay đổi; nó cho biết webhook URL có còn được đặt hay không. - Nếu quay lại polling, gọi
deleteWebhookvà quyết định cẩn thận vềdrop_pending_updates. - Nếu bạn vẫn đang chọn kiến trúc nhận tin, đọc Telegram Bot API webhook vs unified inbound webhook trước.
- Nếu vấn đề nằm ở credential, bắt đầu với Telegram API ID/API hash vs bot token.
Ranh giới từ tài liệu chính thức
Tài liệu Bot API của Telegram mô tả hai cách nhận updates: getUpdates là long polling từ ứng dụng của bạn đến Telegram; webhook là Telegram gửi HTTPS request đến URL của bạn. Cùng tài liệu đó nói rằng bạn không thể nhận updates bằng getUpdates khi outgoing webhook còn được cấu hình; để quay lại polling, dùng deleteWebhook.
| Dấu hiệu | Trạng thái có thể | Kiểm tra đầu tiên |
|---|---|---|
| Polling không trả về tin nhắn | Webhook URL vẫn tồn tại | getWebhookInfo |
| Webhook endpoint không có request | Polling worker cũ còn chạy, hoặc webhook đặt chưa đúng | Dừng worker rồi kiểm tra |
| Queue nội bộ bị trùng hoặc mất | Nhiều instance xử lý cùng một luồng | Chọn một owner |
| Tin nhắn test cũ xuất hiện sau chuyển đổi | Pending updates được giữ lại | Quyết định xử lý hay xóa |
Bước 1: kiểm tra receiver hiện tại
Đặt BOT_TOKEN trong environment variable và không ghi vào log:
curl "https://api.telegram.org/bot$BOT_TOKEN/getWebhookInfo"
Nếu url trong response không rỗng, webhook vẫn được cấu hình. Nếu url rỗng, Bot API webhook không bật và getUpdates có thể là đường nhận hiện tại.
Bước 2: chuyển từ webhook về getUpdates
Trước tiên xóa webhook:
curl -X POST "https://api.telegram.org/bot$BOT_TOKEN/deleteWebhook" \
-d "drop_pending_updates=false"
Với tin nhắn hỗ trợ khách hàng, thường nên để false và cho một polling worker xử lý idempotent. Chỉ dùng true khi backlog là traffic test hoặc đội sản phẩm đã quyết định cắt sạch.
Sau đó chỉ chạy một polling worker và cập nhật offset sau mỗi response của getUpdates:
curl "https://api.telegram.org/bot$BOT_TOKEN/getUpdates?timeout=30"
Bước 3: chuyển từ getUpdates sang setWebhook
Dừng polling worker trước. Sau đó đặt URL do production service của bạn quản lý:
curl -X POST "https://api.telegram.org/bot$BOT_TOKEN/setWebhook" \
-d "url=https://support.example.com/telegram/bot-webhook"
Endpoint nên phản hồi nhanh: lưu Telegram update trước, rồi để CRM, AI routing hoặc phân công nhân viên chạy bất đồng bộ. Nguyên tắc store-first này giống webhook-first inbound integration checklist, dù Telegram Update và UnifyPort event schema khác nhau.
Khi nào dùng unified inbound webhook
Runbook này xử lý việc nhận updates cho Telegram bot. Nó không biến bot thành inbox của tài khoản Telegram thông thường, và không tự chuẩn hóa WhatsApp, LINE, TikTok, Zalo hoặc X.
Nếu đội của bạn cần một event layer chung cho hỗ trợ đa kênh, hãy tạo webhook trong UnifyPort. Tài liệu sâu là Create webhook endpoint: đặt HTTPS url, status: "active", subscribe message.received hoặc ["*"], và dùng signing_secret khi cần kiểm tra X-Device-Signature.
{
"id": "evt_b1a7c3e5f8",
"type": "message.received",
"provider": "telegram",
"account_id": "acc_8c21d0",
"occurred_at": "2026-06-08T12:37:00Z",
"data": {
"conversation": { "id": "5005", "type": "user" },
"sender": { "id": "4004", "type": "user", "name": "Jordan Lee" },
"message": { "id": "3003", "direction": "inbound", "sent_at": "2026-06-08T12:37:00Z", "text": "Can you check my order?" },
"event": { "kind": "message_received" }
}
}
Dùng Bot API chính thức khi người dùng nên nói chuyện với bot identity và bạn cần Telegram Update. Dùng unofficial interface của UnifyPort khi mục tiêu là inbound intake từ tài khoản đã kết nối hoặc queue đa nền tảng.
FAQ
Có thể dùng getUpdates và setWebhook cùng lúc không?
Không. Telegram mô tả chúng là hai cách nhận updates loại trừ nhau cho Bot API bot. Xóa webhook trước khi polling, hoặc dừng polling trước khi đặt webhook.
Có nên đặt drop_pending_updates=true không?
Chỉ khi pending updates có thể bỏ. Với tin nhắn hỗ trợ production, hãy giữ lại và xử lý idempotent.
Đây có phải kết nối tài khoản Telegram thông thường không?
Không. Bot API dùng bot token. Khi kết nối tài khoản Telegram qua UnifyPort, bạn nhận event chuẩn hóa message.received.
Sources checked on 2026-09-09
- Telegram Bot API
getUpdates: https://core.telegram.org/bots/api#getupdates - Telegram Bot API
setWebhook: https://core.telegram.org/bots/api#setwebhook - Telegram Bot API
deleteWebhook: https://core.telegram.org/bots/api#deletewebhook - Telegram webhook guide: https://core.telegram.org/bots/webhooks
- UnifyPort Create webhook endpoint
Biến tích hợp nhắn tin thành một pipeline sản phẩm ổn định.
Bắt đầu bằng cách gửi qua một API, rồi đưa mọi tin nhắn inbound trở lại hệ thống kinh doanh bằng sự kiện chuẩn.