แก้ปัญหา Telegram getUpdates กับ setWebhook ชนกัน: Runbook สำหรับสลับอย่างปลอดภัย
กฎหลักของ Telegram Bot API คือบอตเดียวกันไม่ควรรับ updates ด้วย getUpdates แบบ polling และ setWebhook แบบ push พร้อมกัน ถ้าหลัง deploy แล้วข้อความไม่เข้า ให้ตรวจให้ชัดก่อนว่า receiver ไหนยังทำงานอยู่ จากนั้นค่อยเลือกว่าจะลบ webhook เพื่อกลับไป polling หรือหยุด polling worker ก่อนตั้ง webhook ใหม่ สำหรับทีมในไทยที่ใช้ LINE เป็นช่องทางหลักและมี Telegram เสริม ควรแยกปัญหา Bot API ออกจากโจทย์ inbox หลายแพลตฟอร์มให้ชัด
สรุปสำคัญ
getUpdatesและsetWebhookเป็นสองโหมดรับ updates ของ Telegram Bot API ไม่ใช่สองชั้นที่เปิดพร้อมกัน- เริ่มด้วย
getWebhookInfoเพื่อดูว่ายังมี webhook URL ตั้งอยู่หรือไม่ - ถ้าจะกลับไป polling ให้เรียก
deleteWebhookและตัดสินใจว่าdrop_pending_updatesทิ้งได้จริงหรือไม่ - ถ้ายังเลือกสถาปัตยกรรมรับข้อความอยู่ อ่าน Telegram Bot API webhook vs unified inbound webhook ก่อน
- ถ้าสับสนเรื่อง credential ให้อ่าน Telegram API ID/API hash vs bot token ก่อน
ขอบเขตจากเอกสารทางการ
เอกสาร Bot API ของ Telegram อธิบายการรับ updates สองแบบ: getUpdates คือแอปของคุณ long-poll ไปที่ Telegram ส่วน webhook คือ Telegram ส่ง HTTPS request มาที่ URL ของคุณ หน้าเดียวกันระบุด้วยว่าเมื่อมี outgoing webhook อยู่ คุณจะรับ updates ด้วย getUpdates ไม่ได้ และถ้าจะสลับกลับไป polling ให้ใช้ deleteWebhook
| อาการ | สถานะที่เป็นไปได้ | ตรวจอะไรก่อน |
|---|---|---|
| polling ไม่ได้ข้อความ | webhook URL ยังตั้งอยู่ | getWebhookInfo |
| webhook endpoint ไม่มี request | polling worker เก่ายังรันอยู่ หรือ webhook ตั้งไม่ครบ | หยุด worker แล้วตรวจ |
| queue ภายในซ้ำหรือขาด | หลาย instance แย่งงานเดียวกัน | กำหนด owner เดียว |
| หลังสลับมีข้อความทดสอบเก่าเข้ามา | pending updates ถูกเก็บไว้ | เลือกว่าจะ process หรือ drop |
ขั้นตอนที่ 1: ตรวจ receiver ปัจจุบัน
ให้เก็บ BOT_TOKEN เป็น environment variable และอย่าเขียนลง log:
curl "https://api.telegram.org/bot$BOT_TOKEN/getWebhookInfo"
ถ้า url ใน response ไม่ว่าง แปลว่า webhook ยังถูกตั้งไว้ ถ้า url ว่าง แปลว่า Bot API webhook ไม่ทำงาน และ getUpdates สามารถเป็นทางรับ updates ได้
ขั้นตอนที่ 2: สลับจาก webhook กลับไป getUpdates
ลบ webhook ก่อน:
curl -X POST "https://api.telegram.org/bot$BOT_TOKEN/deleteWebhook" \
-d "drop_pending_updates=false"
สำหรับข้อความ support จริง โดยปกติควรใช้ false แล้วให้ polling worker ตัวเดียวจัดการแบบ idempotent ใช้ true เฉพาะเมื่อ backlog เป็นข้อมูลทดสอบ หรือทีมตัดสินใจเริ่มใหม่แบบ clean cut เท่านั้น
จากนั้น start polling worker แค่ตัวเดียว และเลื่อน offset หลัง response ของ getUpdates ทุกครั้ง:
curl "https://api.telegram.org/bot$BOT_TOKEN/getUpdates?timeout=30"
ขั้นตอนที่ 3: สลับจาก getUpdates ไป setWebhook
หยุด polling worker ก่อน แล้วตั้ง URL ที่ service production เป็นเจ้าของ:
curl -X POST "https://api.telegram.org/bot$BOT_TOKEN/setWebhook" \
-d "url=https://support.example.com/telegram/bot-webhook"
endpoint ควรตอบกลับเร็ว เก็บ Telegram update ก่อน แล้วค่อยให้ CRM, AI routing หรือการมอบหมายเจ้าหน้าที่ทำงานภายหลัง แนวคิด store-first นี้เหมือนใน webhook-first inbound integration checklist แม้ว่า Telegram Update กับ UnifyPort event schema จะไม่เหมือนกัน
เมื่อไรควรใช้ unified inbound webhook
Runbook นี้แก้ปัญหาการรับ updates ของ Telegram bot เท่านั้น ไม่ได้เปลี่ยน bot ให้เป็น inbox ของบัญชี Telegram ปกติ และไม่ได้รวม schema ของ WhatsApp, LINE, TikTok, Zalo หรือ X ให้อัตโนมัติ
ถ้าทีมต้องการ queue เดียวสำหรับ LINE, Telegram และช่องทางอื่น ให้สร้าง UnifyPort webhook แทน เอกสารลึกคือ Create webhook endpoint ตั้ง HTTPS url, status: "active", subscribe message.received หรือ ["*"] และใส่ signing_secret หากต้องการตรวจ 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" }
}
}
ใช้ Bot API ทางการเมื่อผู้ใช้ควรคุยกับ bot identity และคุณต้องการ Telegram Update object ใช้ UnifyPort unofficial interface เมื่อโจทย์คือ inbound intake จากบัญชีที่เชื่อมต่อหรือ queue หลายแพลตฟอร์ม
FAQ
ใช้ getUpdates กับ setWebhook พร้อมกันได้ไหม?
ไม่ได้ Telegram ระบุว่าเป็นวิธีรับ updates ที่ใช้แทนกันสำหรับ Bot API bot ให้ลบ webhook ก่อน polling หรือหยุด polling ก่อนตั้ง webhook
ควรตั้ง drop_pending_updates เป็น true ไหม?
ตั้งเป็น true เฉพาะเมื่อ pending updates ทิ้งได้ สำหรับข้อความลูกค้าจริงควรเก็บและ process แบบ idempotent
นี่คือการเชื่อมบัญชี Telegram ปกติหรือไม่?
ไม่ใช่ Bot API ใช้ bot token ส่วน UnifyPort เชื่อมบัญชี Telegram แล้วส่ง event มาตรฐาน 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
เปลี่ยนการเชื่อมต่อข้อความให้เป็น pipeline ผลิตภัณฑ์ที่เสถียร
เริ่มจากการส่งผ่าน API เดียว แล้วส่งข้อความขาเข้าทั้งหมดกลับสู่ระบบธุรกิจของคุณด้วย event มาตรฐาน