← 所有文章
教學

Telegram getUpdates 與 setWebhook 衝突:安全切換 Runbook

Telegram Bot API 的接收規則很清楚:同一個 bot 不能同時使用 getUpdates 輪詢與 setWebhook 推送。若部署後收不到訊息,先確認目前是哪個接收端有效,再決定刪除 webhook 後恢復輪詢,或停止輪詢 worker 後設定 webhook。Telegram 官方也說 pending updates 只會暫時保存,因此切換客服入口時要有步驟。

重點摘要

官方文件的邊界

Telegram 官方 Bot API 文件把 updates 接收分成兩種:getUpdates 是你的程式長輪詢 Telegram;webhook 則是 Telegram 對你的 HTTPS URL 發送請求。同一頁也說明,只要 outgoing webhook 已設定,就不能用 getUpdates 接收 updates;要切回輪詢時,使用 deleteWebhook

狀況可能狀態先做什麼
輪詢沒有拿到訊息webhook URL 還在呼叫 getWebhookInfo
webhook 沒有收到請求舊輪詢 worker 還在,或 webhook 未正確設定停 worker,再檢查
內部流程重複或漏掉多個服務實例同時處理先指定唯一 owner
切換後出現大量測試訊息舊 pending updates 被保留選擇處理或丟棄

步驟 1:檢查目前接收端

在受控環境中執行,BOT_TOKEN 放在環境變數,不要寫進記錄:

curl "https://api.telegram.org/bot$BOT_TOKEN/getWebhookInfo"

如果回應中的 url 非空,代表 webhook 仍然存在。若 url 是空的,Bot API webhook 沒有啟用,getUpdates 可以作為接收方式。

步驟 2:從 webhook 切回 getUpdates

先移除 webhook:

curl -X POST "https://api.telegram.org/bot$BOT_TOKEN/deleteWebhook" \
  -d "drop_pending_updates=false"

客服訊息通常不該丟棄,請保留 false 並讓單一輪詢 worker 幂等處理。只有 backlog 是測試流量或已明確決定重新開始時,才設定為 true

接著啟動一個輪詢 worker,並在每次 getUpdates 回應後推進 offset

curl "https://api.telegram.org/bot$BOT_TOKEN/getUpdates?timeout=30"

步驟 3:從 getUpdates 切到 setWebhook

先停止輪詢 worker,再設定正式 webhook:

curl -X POST "https://api.telegram.org/bot$BOT_TOKEN/setWebhook" \
  -d "url=https://support.example.com/telegram/bot-webhook"

接收端應先快速回應、存下 update,再讓 CRM、AI 分流或客服指派非同步執行。這與 webhook-first inbound integration checklist 的「先儲存再路由」原則一致,只是 Telegram Bot API update 和 UnifyPort event schema 不同。

何時改用統一入站 webhook

這份 runbook 解決的是 Telegram bot 的接收模式切換。它不會把 bot 變成一般帳號收件匣,也不會自動統一 WhatsApp、LINE、TikTok、Zalo 或 X。

若你的團隊需要跨平台客服隊列,請建立 UnifyPort webhook。深度文件是 Create webhook endpoint:設定 HTTPS urlstatus: "active",訂閱 message.received["*"],需要驗證時設定 signing_secret

{
  "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 身分、bot command 或 Telegram 的 Update 物件,官方 Bot API 是正確選擇。若重點是現有 Telegram 帳號或多平台入站訊息,UnifyPort 的非官方接口較適合。

FAQ

getUpdates 和 setWebhook 可以同時用嗎?

不可以。Telegram 官方將它們視為互斥的 bot update 接收方式。輪詢前先刪 webhook;設定 webhook 前先停輪詢。

drop_pending_updates 何時設為 true?

只有待處理 updates 可以丟棄時才設為 true。正式客服訊息應保留並幂等處理。

這等於連接 Telegram 一般帳號嗎?

不是。Bot API 使用 bot token。UnifyPort 連接 Telegram 帳號後,會送出標準化的 message.received event。

Sources checked on 2026-09-09

UnifyPort API

讓訊息接入變成一條穩定的產品管線。

先用統一 API 跑通傳送,再用標準事件把所有入站訊息接回業務系統。