Telegram (Bot API)
狀態:已可正式用於 Bot 私訊與群組(透過 grammY)。預設模式為長輪詢;Webhook 模式為選填。配對
Telegram 的預設私訊政策為配對模式。
頻道疑難排解
跨頻道診斷與修復流程。
Gateway 設定
完整頻道設定模式與範例。
快速設定
在 BotFather 中建立 Bot Token
開啟 Telegram,與 @BotFather 對話(確認帳號名稱完全正確為
@BotFather)。執行 /newbot,依照提示操作,並儲存 Token。設定 Token 與私訊政策
TELEGRAM_BOT_TOKEN=...(僅限預設帳號)。
Telegram 不使用 openclaw channels login telegram;請在設定/環境變數中設定 Token,然後啟動 Gateway。Token 解析順序具備帳號感知能力。實際上,設定值優先於環境變數備援,且
TELEGRAM_BOT_TOKEN 僅適用於預設帳號。Telegram 端設定
隱私模式與群組可見性
隱私模式與群組可見性
Telegram Bot 預設啟用隱私模式,限制了能接收的群組訊息範圍。若 Bot 必須看到所有群組訊息,可以:
- 透過
/setprivacy停用隱私模式,或 - 將 Bot 設為群組管理員。
群組權限
群組權限
管理員狀態在 Telegram 群組設定中控制。管理員 Bot 可接收所有群組訊息,適合需要持續在線的群組行為。
BotFather 實用切換
BotFather 實用切換
/setjoingroups允許/禁止加入群組/setprivacy控制群組可見性行為
存取控制與啟動
- 私訊政策
- 群組政策與白名單
- Mention 行為
channels.telegram.dmPolicy 控制直接訊息存取:pairing(預設)allowlist(需要allowFrom中至少有一個發送者 ID)open(需要allowFrom包含"*")disabled
channels.telegram.allowFrom 接受數字 Telegram 用戶 ID。接受 telegram: / tg: 前綴並進行正規化。
dmPolicy: "allowlist" 搭配空的 allowFrom 會封鎖所有私訊,設定驗證會拒絕此組合。
引導精靈接受 @username 輸入並解析為數字 ID。
若升級後你的設定中包含 @username 白名單項目,請執行 openclaw doctor --fix 解析(盡力而為;需要 Telegram Bot Token)。
若你之前依賴配對儲存白名單檔案,openclaw doctor --fix 可以在白名單流程中(例如 dmPolicy: "allowlist" 尚無明確 ID 時)將項目恢復至 channels.telegram.allowFrom。對於單一擁有者 Bot,建議使用 dmPolicy: "allowlist" 搭配明確的數字 allowFrom ID,讓存取政策在設定中持久存在(而非依賴過去的配對核准)。尋找你的 Telegram 用戶 ID
較安全的方式(不需要第三方 Bot):- 私訊你的 Bot。
- 執行
openclaw logs --follow。 - 讀取
from.id。
@userinfobot 或 @getidsbot。執行時行為
- Telegram 由 Gateway 程序管理。
- 路由是確定性的:Telegram 收入訊息回覆至 Telegram(模型不選擇頻道)。
- 收入訊息正規化為共享頻道信封,包含回覆中繼資料和媒體佔位符。
- 群組工作階段以群組 ID 隔離。論壇話題附加
:topic:<threadId>以保持話題隔離。 - 私訊可帶有
message_thread_id;OpenClaw 以具討論串感知的工作階段金鑰路由,並保留討論串 ID 用於回覆。 - 長輪詢使用 grammY runner,按聊天/討論串排序。整體 runner sink 並行量使用
agents.defaults.maxConcurrent。 - Telegram Bot API 不支援已讀回條(
sendReadReceipts不適用)。
功能參考
即時串流預覽(訊息編輯)
即時串流預覽(訊息編輯)
OpenClaw 可以即時串流部分回覆:
- 直接聊天:預覽訊息 +
editMessageText - 群組/話題:預覽訊息 +
editMessageText
channels.telegram.streaming為off | partial | block | progress(預設:partial)progress在 Telegram 上映射為partial(跨頻道命名相容)- 舊版
channels.telegram.streamMode和布林streaming值會自動映射
- 私訊:OpenClaw 保留相同的預覽訊息,並就地執行最終編輯(不傳送第二則訊息)
- 群組/話題:OpenClaw 保留相同的預覽訊息,並就地執行最終編輯(不傳送第二則訊息)
sendMessage + editMessageText。Telegram 限定的推理串流:/reasoning stream在產生過程中將推理傳送至即時預覽- 最終答案不含推理文字傳送
格式化與 HTML 備援
格式化與 HTML 備援
輸出文字使用 Telegram
parse_mode: "HTML"。- 類 Markdown 文字渲染為 Telegram 安全的 HTML。
- 原始模型 HTML 會被跳脫以減少 Telegram 解析失敗。
- 若 Telegram 拒絕已解析的 HTML,OpenClaw 退回至純文字重試。
channels.telegram.linkPreview: false 停用。原生指令與自訂指令
原生指令與自訂指令
Telegram 指令選單在啟動時透過 規則:裝置配對指令(
安裝
setMyCommands 進行註冊。原生指令預設:commands.native: "auto"對 Telegram 啟用原生指令
- 名稱會被正規化(去掉開頭的
/,轉小寫) - 有效模式:
a-z、0-9、_,長度1..32 - 自訂指令無法覆寫原生指令
- 衝突/重複項目會被跳過並記錄
- 自訂指令僅為選單項目;它們不會自動實作行為
- 插件/技能指令即使未顯示在 Telegram 選單中,輸入仍可運作
setMyCommands failed加上BOT_COMMANDS_TOO_MUCH:削減後 Telegram 選單仍溢出;請減少插件/技能/自訂指令,或停用channels.telegram.commands.native。setMyCommands failed加上網路/fetch 錯誤:通常表示對api.telegram.org的輸出 DNS/HTTPS 被封鎖。
裝置配對指令(device-pair 插件)
安裝 device-pair 插件後:/pair產生設定碼- 將碼貼入 iOS 應用程式
/pair approve核准最新的等待請求
內聯按鈕
內聯按鈕
Agent 與自動化的 Telegram 訊息操作
Agent 與自動化的 Telegram 訊息操作
Telegram 工具操作包括:
sendMessage(to、content,選填mediaUrl、replyToMessageId、messageThreadId)react(chatId、messageId、emoji)deleteMessage(chatId、messageId)editMessage(chatId、messageId、content)createForumTopic(chatId、name,選填iconColor、iconCustomEmojiId)
send、react、delete、edit、sticker、sticker-search、topic-create)。閘門控制:channels.telegram.actions.sendMessagechannels.telegram.actions.deleteMessagechannels.telegram.actions.reactionschannels.telegram.actions.sticker(預設:停用)
edit 和 topic-create 目前預設啟用,沒有獨立的 channels.telegram.actions.* 切換開關。
執行時傳送使用當前設定/密鑰快照(啟動/重載),因此操作路徑不會每次傳送都重新解析 SecretRef。反應移除語意:/tools/reactions回覆串標籤
回覆串標籤
Telegram 支援生成輸出中的明確回覆串標籤:
[[reply_to_current]]回覆觸發訊息[[reply_to:<id>]]回覆特定 Telegram 訊息 ID
channels.telegram.replyToMode 控制處理方式:off(預設)firstall
off 停用隱式回覆串。明確的 [[reply_to_*]] 標籤仍然有效。論壇話題與討論串行為
論壇話題與討論串行為
論壇超級群組:每個話題擁有自己的工作階段金鑰:目前範圍限於群組和超級群組中的論壇話題。從聊天發起討論串綁定 ACP:
- 話題工作階段金鑰附加
:topic:<threadId> - 回覆和輸入針對話題討論串
- 話題設定路徑:
channels.telegram.groups.<chatId>.topics.<threadId>
threadId=1)特殊處理:- 訊息傳送省略
message_thread_id(Telegram 拒絕sendMessage(...thread_id=1)) - 輸入操作仍包含
message_thread_id
requireMention、allowFrom、skills、systemPrompt、enabled、groupPolicy)。
agentId 僅限話題,不繼承群組預設值。每話題 Agent 路由:每個話題可透過在話題設定中設定 agentId 路由至不同的 Agent。這讓每個話題擁有自己獨立的工作區、記憶和工作階段。範例:agent:zu:telegram:group:-1001234567890:topic:3持久性 ACP 話題綁定:論壇話題可透過頂層類型化 ACP binding 固定 ACP 工作階段:bindings[]包含type: "acp"且match.channel: "telegram"
/acp spawn <agent> --thread here|auto可將當前 Telegram 話題綁定至新的 ACP 工作階段。- 後續話題訊息直接路由至已綁定的 ACP 工作階段(不需要
/acp steer)。 - 成功綁定後,OpenClaw 在話題中釘選確認訊息。
- 需要
channels.telegram.threadBindings.spawnAcpSessions=true。
MessageThreadIdIsForum
- 帶有
message_thread_id的私訊保持私訊路由,但使用具討論串感知的工作階段金鑰/回覆目標。
音訊、影片與貼圖
音訊、影片與貼圖
音訊訊息
Telegram 區分語音備忘錄和音訊檔案。- 預設:音訊檔案行為
- 在 Agent 回覆中加上
[[audio_as_voice]]標籤可強制以語音備忘錄形式傳送
影片訊息
Telegram 區分影片檔案和影片備忘錄。訊息操作範例:貼圖
收入貼圖處理:- 靜態 WEBP:下載並處理(佔位符
<media:sticker>) - 動態 TGS:跳過
- 影片 WEBM:跳過
Sticker.emojiSticker.setNameSticker.fileIdSticker.fileUniqueIdSticker.cachedDescription
~/.openclaw/telegram/sticker-cache.json
反應通知
反應通知
Telegram 反應以
message_reaction 更新形式到達(與訊息載荷分開)。啟用後,OpenClaw 會排入以下系統事件:Telegram reaction added: 👍 by Alice (@alice) on msg 42
channels.telegram.reactionNotifications:off | own | all(預設:own)channels.telegram.reactionLevel:off | ack | minimal | extensive(預設:minimal)
own表示用戶對 Bot 發送訊息的反應(透過已傳送訊息快取盡力而為)。- 反應事件仍遵循 Telegram 存取控制(
dmPolicy、allowFrom、groupPolicy、groupAllowFrom);未授權的發送者會被丟棄。 - Telegram 在反應更新中不提供討論串 ID。
- 非論壇群組路由至群組聊天工作階段
- 論壇群組路由至群組一般話題工作階段(
:topic:1),而非確切的原始話題
allowed_updates 自動包含 message_reaction。確認反應
確認反應
ackReaction 在 OpenClaw 處理收入訊息時傳送確認 emoji。解析順序:channels.telegram.accounts.<accountId>.ackReactionchannels.telegram.ackReactionmessages.ackReaction- Agent 身份 emoji 備援(
agents.list[].identity.emoji,否則使用 ”👀”)
- Telegram 使用 unicode emoji(例如 ”👀”)。
- 使用
""停用特定頻道或帳號的反應。
來自 Telegram 事件和指令的設定寫入
來自 Telegram 事件和指令的設定寫入
頻道設定寫入預設啟用(
configWrites !== false)。Telegram 觸發的寫入包括:- 群組遷移事件(
migrate_to_chat_id)以更新channels.telegram.groups /config set和/config unset(需要指令啟用)
長輪詢與 Webhook
長輪詢與 Webhook
預設:長輪詢。Webhook 模式:
- 設定
channels.telegram.webhookUrl - 設定
channels.telegram.webhookSecret(設定 Webhook URL 時必要) - 選填
channels.telegram.webhookPath(預設/telegram-webhook) - 選填
channels.telegram.webhookHost(預設127.0.0.1) - 選填
channels.telegram.webhookPort(預設8787)
127.0.0.1:8787。若你的公開端點不同,請在前方放置反向 Proxy,並將 webhookUrl 指向公開 URL。
當你明確需要外部存取時,設定 webhookHost(例如 0.0.0.0)。限制、重試與 CLI 目標
限制、重試與 CLI 目標
channels.telegram.textChunkLimit預設為 4000。channels.telegram.chunkMode="newline"在長度分割前優先以空行(段落邊界)分割。channels.telegram.mediaMaxMb(預設 100)限制收入和輸出 Telegram 媒體大小。channels.telegram.timeoutSeconds覆寫 Telegram API 客戶端超時(未設定時使用 grammY 預設值)。- 群組情境記錄使用
channels.telegram.historyLimit或messages.groupChat.historyLimit(預設 50);0停用。 - 私訊記錄控制:
channels.telegram.dmHistoryLimitchannels.telegram.dms["<user_id>"].historyLimit
channels.telegram.retry設定適用於 Telegram 傳送輔助函式(CLI/工具/操作)對可恢復輸出 API 錯誤的重試。
openclaw message poll,並支援論壇話題:--poll-duration-seconds(5-600)--poll-anonymous--poll-public--thread-id用於論壇話題(或使用:topic:目標)
channels.telegram.actions.sendMessage=false停用輸出 Telegram 訊息,包括投票channels.telegram.actions.poll=false停用 Telegram 投票建立,同時保留一般傳送啟用
Telegram 中的執行核准
Telegram 中的執行核准
Telegram 支援在核准者私訊中執行核准,也可選擇性地在原始聊天或話題中張貼核准提示。設定路徑:
channels.telegram.execApprovals.enabledchannels.telegram.execApprovals.approverschannels.telegram.execApprovals.target(dm|channel|both,預設:dm)agentFilter、sessionFilter
enabled 為 false 或 approvers 為空時,Telegram 不作為執行核准客戶端。核准請求會備援至其他已設定的核准路由或執行核准備援政策。傳送規則:target: "dm"僅將核准提示傳送至已設定的核准者私訊target: "channel"將提示傳回原始 Telegram 聊天/話題target: "both"傳送至核准者私訊和原始聊天/話題
/approve,也無法使用 Telegram 核准按鈕。頻道傳送會在聊天中顯示指令文字,因此請只在受信任的群組/話題啟用 channel 或 both。提示出現在論壇話題時,OpenClaw 會為核准提示和核准後的後續追蹤保留話題。內聯核准按鈕也依賴 channels.telegram.capabilities.inlineButtons 允許目標介面(dm、group 或 all)。相關文件:執行核准疑難排解
Bot 沒有回應非 mention 的群組訊息
Bot 沒有回應非 mention 的群組訊息
- 若
requireMention=false,Telegram 隱私模式必須允許完整可見性。- BotFather:
/setprivacy-> Disable - 然後從群組中移除並重新加入 Bot
- BotFather:
- 當設定期望未 mention 的群組訊息時,
openclaw channels status會發出警告。 openclaw channels status --probe可以檢查明確的數字群組 ID;萬用字元"*"無法進行成員探測。- 快速工作階段測試:
/activation always。
Bot 完全看不到群組訊息
Bot 完全看不到群組訊息
- 當
channels.telegram.groups存在時,群組必須被列出(或包含"*") - 確認 Bot 是群組成員
- 檢視日誌:
openclaw logs --follow查看略過原因
指令部分有效或完全無效
指令部分有效或完全無效
- 授權你的發送者身份(配對和/或數字
allowFrom) - 即使群組政策為
open,指令授權仍然適用 setMyCommands failed加上BOT_COMMANDS_TOO_MUCH:原生選單項目太多;減少插件/技能/自訂指令,或停用原生選單setMyCommands failed加上網路/fetch 錯誤:通常表示對api.telegram.org的 DNS/HTTPS 可達性問題
輪詢或網路不穩定
輪詢或網路不穩定
- Node 22+ 加上自訂 fetch/proxy 如果 AbortSignal 類型不匹配,可能觸發立即中止行為。
- 某些主機將
api.telegram.org優先解析為 IPv6;損壞的 IPv6 出口可能導致間歇性 Telegram API 失敗。 - 若日誌包含
TypeError: fetch failed或Network request for 'getUpdates' failed!,OpenClaw 現在會將這些作為可恢復的網路錯誤重試。 - 在直接出口/TLS 不穩定的 VPS 主機上,透過
channels.telegram.proxy路由 Telegram API 呼叫:
- Node 22+ 預設
autoSelectFamily=true(WSL2 除外)和dnsResultOrder=ipv4first。 - 若你的主機是 WSL2 或明確使用純 IPv4 效果更好,強制 IP 系列選擇:
- 環境覆寫(臨時):
OPENCLAW_TELEGRAM_DISABLE_AUTO_SELECT_FAMILY=1OPENCLAW_TELEGRAM_ENABLE_AUTO_SELECT_FAMILY=1OPENCLAW_TELEGRAM_DNS_RESULT_ORDER=ipv4first
- 驗證 DNS 答案:
Telegram 設定參考指引
主要參考:-
channels.telegram.enabled:啟用/停用頻道啟動。 -
channels.telegram.botToken:Bot Token(BotFather 提供)。 -
channels.telegram.tokenFile:從一般檔案路徑讀取 Token。不接受符號連結。 -
channels.telegram.dmPolicy:pairing | allowlist | open | disabled(預設:pairing)。 -
channels.telegram.allowFrom:私訊白名單(數字 Telegram 用戶 ID)。allowlist需要至少一個發送者 ID。open需要"*"。openclaw doctor --fix可將舊版@username項目解析為 ID,並可在白名單遷移流程中從配對儲存檔案恢復白名單項目。 -
channels.telegram.actions.poll:啟用或停用 Telegram 投票建立(預設:啟用;仍需要sendMessage)。 -
channels.telegram.defaultTo:CLI--deliver在未提供明確--reply-to時使用的預設 Telegram 目標。 -
channels.telegram.groupPolicy:open | allowlist | disabled(預設:allowlist)。 -
channels.telegram.groupAllowFrom:群組發送者白名單(數字 Telegram 用戶 ID)。openclaw doctor --fix可將舊版@username項目解析為 ID。非數字項目在授權時被忽略。群組授權不使用私訊配對儲存備援(2026.2.25+)。 -
多帳號優先順序:
- 設定兩個或以上帳號 ID 時,設定
channels.telegram.defaultAccount(或包含channels.telegram.accounts.default)以明確指定預設路由。 - 若兩者都未設定,OpenClaw 備援至第一個正規化的帳號 ID,
openclaw doctor會發出警告。 channels.telegram.accounts.default.allowFrom和channels.telegram.accounts.default.groupAllowFrom僅適用於default帳號。- 具名帳號在帳號層級未設定值時,繼承
channels.telegram.allowFrom和channels.telegram.groupAllowFrom。 - 具名帳號不繼承
channels.telegram.accounts.default.allowFrom/groupAllowFrom。
- 設定兩個或以上帳號 ID 時,設定
-
channels.telegram.groups:每群組預設 + 白名單(使用"*"設定全域預設)。channels.telegram.groups.<id>.groupPolicy:每群組的 groupPolicy 覆寫(open | allowlist | disabled)。channels.telegram.groups.<id>.requireMention:Mention 閘門預設。channels.telegram.groups.<id>.skills:技能篩選(省略 = 所有技能,空白 = 無)。channels.telegram.groups.<id>.allowFrom:每群組發送者白名單覆寫。channels.telegram.groups.<id>.systemPrompt:群組的額外系統提示。channels.telegram.groups.<id>.enabled:為false時停用群組。channels.telegram.groups.<id>.topics.<threadId>.*:每話題覆寫(群組欄位 + 話題限定的agentId)。channels.telegram.groups.<id>.topics.<threadId>.agentId:將此話題路由至特定 Agent(覆寫群組層級和 binding 路由)。
-
channels.telegram.groups.<id>.topics.<threadId>.groupPolicy:每話題的 groupPolicy 覆寫(open | allowlist | disabled)。 -
channels.telegram.groups.<id>.topics.<threadId>.requireMention:每話題 mention 閘門覆寫。 -
頂層
bindings[]包含type: "acp"和match.peer.id中的標準話題 idchatId:topic:topicId:持久性 ACP 話題 binding 欄位(請參閱 ACP Agents)。 -
channels.telegram.direct.<id>.topics.<threadId>.agentId:將私訊話題路由至特定 Agent(行為與論壇話題相同)。 -
channels.telegram.execApprovals.enabled:為此帳號啟用 Telegram 作為基於聊天的執行核准客戶端。 -
channels.telegram.execApprovals.approvers:允許核准或拒絕執行請求的 Telegram 用戶 ID。啟用執行核准時必要。 -
channels.telegram.execApprovals.target:dm | channel | both(預設:dm)。channel和both在有話題時保留原始 Telegram 話題。 -
channels.telegram.execApprovals.agentFilter:轉發核准提示的選填 Agent ID 篩選。 -
channels.telegram.execApprovals.sessionFilter:轉發核准提示的選填工作階段金鑰篩選(子字串或正則)。 -
channels.telegram.accounts.<account>.execApprovals:Telegram 執行核准路由和核准者授權的每帳號覆寫。 -
channels.telegram.capabilities.inlineButtons:off | dm | group | all | allowlist(預設:allowlist)。 -
channels.telegram.accounts.<account>.capabilities.inlineButtons:每帳號覆寫。 -
channels.telegram.commands.nativeSkills:啟用/停用 Telegram 原生技能指令。 -
channels.telegram.replyToMode:off | first | all(預設:off)。 -
channels.telegram.textChunkLimit:輸出區塊大小(字元數)。 -
channels.telegram.chunkMode:length(預設)或newline,在長度分割前先在空行(段落邊界)分割。 -
channels.telegram.linkPreview:切換輸出訊息的連結預覽(預設:true)。 -
channels.telegram.streaming:off | partial | block | progress(即時串流預覽;預設:partial;progress映射至partial;block為舊版預覽模式相容性)。Telegram 預覽串流使用就地編輯的單一預覽訊息。 -
channels.telegram.mediaMaxMb:收入/輸出 Telegram 媒體上限(MB,預設:100)。 -
channels.telegram.retry:Telegram 傳送輔助函式(CLI/工具/操作)對可恢復輸出 API 錯誤的重試政策(attempts、minDelayMs、maxDelayMs、jitter)。 -
channels.telegram.network.autoSelectFamily:覆寫 Node autoSelectFamily(true=啟用,false=停用)。Node 22+ 預設啟用,WSL2 預設停用。 -
channels.telegram.network.dnsResultOrder:覆寫 DNS 結果順序(ipv4first或verbatim)。Node 22+ 預設為ipv4first。 -
channels.telegram.proxy:Bot API 呼叫的 Proxy URL(SOCKS/HTTP)。 -
channels.telegram.webhookUrl:啟用 Webhook 模式(需要channels.telegram.webhookSecret)。 -
channels.telegram.webhookSecret:Webhook 密鑰(設定 webhookUrl 時必要)。 -
channels.telegram.webhookPath:本地 Webhook 路徑(預設/telegram-webhook)。 -
channels.telegram.webhookHost:本地 Webhook 綁定主機(預設127.0.0.1)。 -
channels.telegram.webhookPort:本地 Webhook 綁定端口(預設8787)。 -
channels.telegram.actions.reactions:閘門控制 Telegram 工具反應。 -
channels.telegram.actions.sendMessage:閘門控制 Telegram 工具訊息傳送。 -
channels.telegram.actions.deleteMessage:閘門控制 Telegram 工具訊息刪除。 -
channels.telegram.actions.sticker:閘門控制 Telegram 貼圖操作——傳送和搜尋(預設:false)。 -
channels.telegram.reactionNotifications:off | own | all— 控制哪些反應觸發系統事件(未設定時預設:own)。 -
channels.telegram.reactionLevel:off | ack | minimal | extensive— 控制 Agent 的反應能力(未設定時預設:minimal)。 - 設定參考 - Telegram
- 啟動/驗證:
enabled、botToken、tokenFile、accounts.*(tokenFile必須指向一般檔案;不接受符號連結) - 存取控制:
dmPolicy、allowFrom、groupPolicy、groupAllowFrom、groups、groups.*.topics.*、頂層bindings[](type: "acp") - 執行核准:
execApprovals、accounts.*.execApprovals - 指令/選單:
commands.native、commands.nativeSkills、customCommands - 討論串/回覆:
replyToMode - 串流:
streaming(預覽)、blockStreaming - 格式化/傳送:
textChunkLimit、chunkMode、linkPreview、responsePrefix - 媒體/網路:
mediaMaxMb、timeoutSeconds、retry、network.autoSelectFamily、proxy - Webhook:
webhookUrl、webhookSecret、webhookPath、webhookHost - 操作/能力:
capabilities.inlineButtons、actions.sendMessage|editMessage|deleteMessage|reactions|sticker - 反應:
reactionNotifications、reactionLevel - 寫入/記錄:
configWrites、historyLimit、dmHistoryLimit、dms.*.historyLimit