Telegram(Bot API)
狀態:透過 grammY 的機器人 DM + 群組已準備好上線使用。預設為長輪詢模式;webhook 模式為選用。
快速設定
步驟 1:在 BotFather 中建立機器人 token
開啟 Telegram 與 **@BotFather** 交談(確認 handle 確實為 `@BotFather`)。
執行 `/newbot`,按照提示操作,並儲存 token。
步驟 2:設定 token 和 DM 政策
{
channels: {
telegram: {
enabled: true,
botToken: "123:abc",
dmPolicy: "pairing",
groups: { "*": { requireMention: true } },
},
},
}
環境變數備援:`TELEGRAM_BOT_TOKEN=...`(僅預設帳號)。
Telegram **不**使用 `openclaw channels login telegram`;在設定檔/環境變數中設定 token,然後啟動閘道。
步驟 3:啟動閘道並核准首次 DM
openclaw gateway
openclaw pairing list telegram
openclaw pairing approve telegram <CODE>
配對碼在 1 小時後過期。
步驟 4:將機器人加入群組
將機器人加入你的群組,然後設定 `channels.telegram.groups` 和 `groupPolicy` 以符合你的存取模型。
注意: Token 解析順序具有帳號感知。實務上設定值優先於環境變數備援,而
TELEGRAM_BOT_TOKEN只會套用到預設帳號。
Telegram 端設定
隱私模式與群組可見性
Telegram 機器人預設為**隱私模式**,這會限制它能接收到的群組訊息。
如果機器人需要看到所有群組訊息,可以:
- 透過 `/setprivacy` 停用隱私模式,或
- 將機器人設為群組管理員。
切換隱私模式後,請在每個群組中移除並重新加入機器人,讓 Telegram 套用變更。
群組權限
管理員身分在 Telegram 群組設定中控制。
管理員機器人會接收所有群組訊息,這對於需要持續運行的群組行為很有用。
實用的 BotFather 設定
- `/setjoingroups` 允許/拒絕群組邀請
- `/setprivacy` 控制群組可見性行為
存取控制與啟用
DM 政策
`channels.telegram.dmPolicy` 控制私訊存取:
- `pairing`(預設)
- `allowlist`(需要在 `allowFrom` 中至少有一個發送者 ID)
- `open`(需要 `allowFrom` 包含 `"*"`)
- `disabled`
`channels.telegram.allowFrom` 接受數字 Telegram 使用者 ID。接受 `telegram:` / `tg:` 前綴並會自動標準化。
`dmPolicy: "allowlist"` 搭配空的 `allowFrom` 會阻擋所有 DM,設定驗證會拒絕此組合。
初始設定精靈接受 `@username` 輸入並將其解析為數字 ID。
如果你升級後設定中包含 `@username` 許可清單項目,請執行 `openclaw doctor --fix` 進行解析(盡力而為;需要 Telegram 機器人 token)。
如果你之前依賴配對儲存的許可清單檔案,`openclaw doctor --fix` 可以在許可清單流程中將項目恢復到 `channels.telegram.allowFrom`(例如 `dmPolicy: "allowlist"` 還沒有明確 ID 時)。
對於單一擁有者的機器人,建議使用 `dmPolicy: "allowlist"` 搭配明確的數字 `allowFrom` ID,讓存取政策持久保存在設定中(而非依賴先前的配對核准)。
### 查詢你的 Telegram 使用者 ID
較安全的方式(不需要第三方機器人):
1. 傳送 DM 給你的機器人。
2. 執行 `openclaw logs --follow`。
3. 讀取 `from.id`。
官方 Bot API 方式:
curl "https://api.telegram.org/bot<bot_token>/getUpdates"
第三方方式(隱私性較低):`@userinfobot` 或 `@getidsbot`。
群組政策與許可清單
兩個控制項共同作用:
1. **允許哪些群組**(`channels.telegram.groups`)
- 未設定 `groups`:
- 使用 `groupPolicy: "open"` 時:任何群組都能通過群組 ID 檢查
- 使用 `groupPolicy: "allowlist"`(預設)時:群組會被阻擋,直到你加入 `groups` 項目(或 `"*"`)
- 已設定 `groups`:作為許可清單(明確 ID 或 `"*"`)
2. **允許群組中的哪些發送者**(`channels.telegram.groupPolicy`)
- `open`
- `allowlist`(預設)
- `disabled`
`groupAllowFrom` 用於群組發送者過濾。如果未設定,Telegram 會回退到 `allowFrom`。
`groupAllowFrom` 項目應為數字 Telegram 使用者 ID(`telegram:` / `tg:` 前綴會被標準化)。
不要將 Telegram 群組或超級群組的聊天 ID 放入 `groupAllowFrom`。負數聊天 ID 應放在 `channels.telegram.groups` 下。
非數字項目在發送者授權時會被忽略。
安全邊界(`2026.2.25+`):群組發送者授權**不**繼承 DM 配對儲存核准。
配對僅限 DM。對於群組,請設定 `groupAllowFrom` 或按群組/按主題的 `allowFrom`。
執行時注意:如果 `channels.telegram` 完全不存在,執行時會預設為封閉式 `groupPolicy="allowlist"`,除非明確設定了 `channels.defaults.groupPolicy`。
範例:允許特定群組中的任何成員:
{
channels: {
telegram: {
groups: {
"-1001234567890": {
groupPolicy: "open",
requireMention: false,
},
},
},
},
}
範例:僅允許特定群組中的特定使用者:
{
channels: {
telegram: {
groups: {
"-1001234567890": {
requireMention: true,
allowFrom: ["8734062810", "745123456"],
},
},
},
},
}
> **警告:**
常見錯誤:
groupAllowFrom不是 Telegram 群組許可清單。- 將 `-1001234567890` 之類的負數 Telegram 群組或超級群組聊天 ID 放在 `channels.telegram.groups` 下。 - 將 `8734062810` 之類的 Telegram 使用者 ID 放在 `groupAllowFrom` 下,用於限制允許群組中的哪些人可以觸發機器人。 - 只有當你希望允許群組中的任何成員都能與機器人對話時,才使用 `groupAllowFrom: ["*"]`。
提及行為
群組回覆預設需要提及。
提及來源可以是:
- 原生 `@botusername` 提及,或
- 提及模式設定:
- `agents.list[].groupChat.mentionPatterns`
- `messages.groupChat.mentionPatterns`
工作階段層級指令切換:
- `/activation always`
- `/activation mention`
這些只更新工作階段狀態。如需持久化請使用設定。
持久化設定範例:
{
channels: {
telegram: {
groups: {
"*": { requireMention: false },
},
},
},
}
取得群組聊天 ID:
- 轉傳群組訊息給 `@userinfobot` / `@getidsbot`
- 或從 `openclaw logs --follow` 讀取 `chat.id`
- 或檢查 Bot API `getUpdates`
執行時行為
- Telegram 由閘道程序擁有。
- 路由是確定性的:Telegram 收到的訊息回覆到 Telegram(模型不會選擇頻道)。
- 收到的訊息會標準化為共用的頻道信封,包含回覆中繼資料和媒體佔位符。
- 群組工作階段依群組 ID 隔離。論壇主題會附加
:topic:<threadId>以保持主題隔離。 - DM 訊息可以攜帶
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` 會自動對應
純文字回覆:
- DM:OpenClaw 保持同一則預覽訊息並在最終時就地編輯(不會發送第二則訊息)
- 群組/主題:OpenClaw 保持同一則預覽訊息並在最終時就地編輯(不會發送第二則訊息)
複合回覆(例如媒體內容)時,OpenClaw 會退回正常的最終送達,然後清除預覽訊息。
預覽串流與區塊串流是分開的。當為 Telegram 明確啟用區塊串流時,OpenClaw 會跳過預覽串流以避免重複串流。
如果原生草稿傳輸不可用/被拒絕,OpenClaw 會自動退回到 `sendMessage` + `editMessageText`。
Telegram 專用推理串流:
- `/reasoning stream` 在生成過程中將推理內容傳送到即時預覽
- 最終答案不包含推理文字
格式化與 HTML 備援
傳出文字使用 Telegram `parse_mode: "HTML"`。
- 類 Markdown 文字會轉換為 Telegram 安全的 HTML。
- 原始模型 HTML 會被跳脫以減少 Telegram 解析失敗。
- 如果 Telegram 拒絕解析後的 HTML,OpenClaw 會以純文字重試。
連結預覽預設啟用,可透過 `channels.telegram.linkPreview: false` 停用。
原生指令與自訂指令
Telegram 指令選單在啟動時透過 `setMyCommands` 註冊。
原生指令預設:
- `commands.native: "auto"` 為 Telegram 啟用原生指令
新增自訂指令選單項目:
{
channels: {
telegram: {
customCommands: [
{ command: "backup", description: "Git backup" },
{ command: "generate", description: "Create an image" },
],
},
},
}
規則:
- 名稱會被標準化(去除開頭 `/`、轉為小寫)
- 有效模式:`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` 外掛後:
1. `/pair` 產生設定碼
2. 在 iOS 應用程式中貼上碼
3. `/pair approve` 核准最新的待處理請求
詳情:[配對](/docs/channels/pairing#pair-via-telegram-recommended-for-ios)。
行內按鈕
設定行內鍵盤範圍:
{
channels: {
telegram: {
capabilities: {
inlineButtons: "allowlist",
},
},
},
}
按帳號覆寫:
{
channels: {
telegram: {
accounts: {
main: {
capabilities: {
inlineButtons: "allowlist",
},
},
},
},
},
}
範圍:
- `off`
- `dm`
- `group`
- `all`
- `allowlist`(預設)
舊版 `capabilities: ["inlineButtons"]` 對應到 `inlineButtons: "all"`。
訊息動作範例:
{
action: "send",
channel: "telegram",
to: "123456789",
message: "Choose an option:",
buttons: [
[
{ text: "Yes", callback_data: "yes" },
{ text: "No", callback_data: "no" },
],
[{ text: "Cancel", callback_data: "cancel" }],
],
}
回呼點擊會以文字傳遞給代理:
`callback_data: <value>`
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.sendMessage`
- `channels.telegram.actions.deleteMessage`
- `channels.telegram.actions.reactions`
- `channels.telegram.actions.sticker`(預設:停用)
注意:`edit` 和 `topic-create` 目前預設啟用,沒有獨立的 `channels.telegram.actions.*` 開關。
執行時傳送使用啟動/重新載入時的設定/密鑰快照,因此動作路徑不會在每次傳送時重新解析 SecretRef。
反應移除語義:[/tools/reactions](/docs/tools/reactions)
回覆討論串標記
Telegram 支援在生成輸出中使用明確的回覆討論串標記:
- `[[reply_to_current]]` 回覆觸發訊息
- `[[reply_to:<id>]]` 回覆特定的 Telegram 訊息 ID
`channels.telegram.replyToMode` 控制處理方式:
- `off`(預設)
- `first`
- `all`
注意:`off` 停用隱式回覆討論串。明確的 `[[reply_to_*]]` 標記仍然有效。
論壇主題與討論串行為
論壇超級群組:
- 主題工作階段鍵附加 `: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` 僅限主題使用,不從群組預設繼承。
**按主題的代理路由**:每個主題可以透過在主題設定中設定 `agentId` 來路由到不同的代理。這讓每個主題擁有自己的隔離工作空間、記憶和工作階段。範例:
```json5
{
channels: {
telegram: {
groups: {
"-1001234567890": {
topics: {
"1": { agentId: "main" }, // 一般主題 → main 代理
"3": { agentId: "zu" }, // 開發主題 → zu 代理
"5": { agentId: "coder" } // 程式碼審查 → coder 代理
}
}
}
}
}
}
```
每個主題會有自己的工作階段鍵:`agent:zu:telegram:group:-1001234567890:topic:3`
**持久 ACP 主題綁定**:論壇主題可以透過頂層具型別的 ACP 綁定來固定 ACP harness 工作階段:
- `bindings[]` 搭配 `type: "acp"` 和 `match.channel: "telegram"`
範例:
```json5
{
agents: {
list: [
{
id: "codex",
runtime: {
type: "acp",
acp: {
agent: "codex",
backend: "acpx",
mode: "persistent",
cwd: "/workspace/openclaw",
},
},
},
],
},
bindings: [
{
type: "acp",
agentId: "codex",
match: {
channel: "telegram",
accountId: "default",
peer: { kind: "group", id: "-1001234567890:topic:42" },
},
},
],
channels: {
telegram: {
groups: {
"-1001234567890": {
topics: {
"42": {
requireMention: false,
},
},
},
},
},
},
}
```
目前僅適用於群組和超級群組中的論壇主題。
**從聊天中綁定討論串的 ACP 生成**:
- `/acp spawn <agent> --thread here|auto` 可以將當前 Telegram 主題綁定到新的 ACP 工作階段。
- 後續的主題訊息會直接路由到已綁定的 ACP 工作階段(不需要 `/acp steer`)。
- 成功綁定後 OpenClaw 會在主題中釘選生成確認訊息。
- 需要 `channels.telegram.threadBindings.spawnAcpSessions=true`。
範本上下文包含:
- `MessageThreadId`
- `IsForum`
DM 討論串行為:
- 帶有 `message_thread_id` 的私人聊天保持 DM 路由,但使用支援討論串的工作階段鍵/回覆目標。
音訊、視訊與貼圖
### 音訊訊息
Telegram 區分語音備忘錄與音訊檔案。
- 預設:音訊檔案行為
- 在代理回覆中使用 `[[audio_as_voice]]` 標記以強制傳送語音備忘錄
訊息動作範例:
{
action: "send",
channel: "telegram",
to: "123456789",
media: "https://example.com/voice.ogg",
asVoice: true,
}
### 視訊訊息
Telegram 區分視訊檔案與視訊備忘錄。
訊息動作範例:
{
action: "send",
channel: "telegram",
to: "123456789",
media: "https://example.com/video.mp4",
asVideoNote: true,
}
視訊備忘錄不支援說明文字;提供的訊息文字會單獨傳送。
### 貼圖
收到貼圖的處理:
- 靜態 WEBP:下載並處理(佔位符 `<media:sticker>`)
- 動畫 TGS:跳過
- 視訊 WEBM:跳過
貼圖上下文欄位:
- `Sticker.emoji`
- `Sticker.setName`
- `Sticker.fileId`
- `Sticker.fileUniqueId`
- `Sticker.cachedDescription`
貼圖快取檔案:
- `~/.openclaw/telegram/sticker-cache.json`
貼圖在首次描述後(可能時)會被快取,以減少重複的視覺辨識呼叫。
啟用貼圖動作:
{
channels: {
telegram: {
actions: {
sticker: true,
},
},
},
}
傳送貼圖動作:
{
action: "sticker",
channel: "telegram",
to: "123456789",
fileId: "CAACAgIAAxkBAAI...",
}
搜尋已快取的貼圖:
{
action: "sticker-search",
channel: "telegram",
query: "cat waving",
limit: 5,
}
反應通知
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` 表示只有使用者對機器人傳送的訊息的反應(透過已傳送訊息快取盡力偵測)。
- 反應事件仍然遵守 Telegram 存取控制(`dmPolicy`、`allowFrom`、`groupPolicy`、`groupAllowFrom`);未授權的發送者會被丟棄。
- Telegram 不在反應更新中提供討論串 ID。
- 非論壇群組路由到群組聊天工作階段
- 論壇群組路由到群組一般主題工作階段(`:topic:1`),而非確切的來源主題
輪詢/webhook 的 `allowed_updates` 會自動包含 `message_reaction`。
確認反應
`ackReaction` 在 OpenClaw 處理收到的訊息時傳送一個確認表情符號。
解析順序:
- `channels.telegram.accounts.<accountId>.ackReaction`
- `channels.telegram.ackReaction`
- `messages.ackReaction`
- 代理身分表情符號備援(`agents.list[].identity.emoji`,否則 "👀")
注意事項:
- Telegram 期望 unicode 表情符號(例如 "👀")。
- 使用 `""` 可停用特定頻道或帳號的反應。
從 Telegram 事件和指令寫入設定
頻道設定寫入預設啟用(`configWrites !== false`)。
Telegram 觸發的寫入包括:
- 群組遷移事件(`migrate_to_chat_id`)更新 `channels.telegram.groups`
- `/config set` 和 `/config unset`(需要啟用指令)
停用:
{
channels: {
telegram: {
configWrites: false,
},
},
}
長輪詢與 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`)
Webhook 模式的預設本地監聽綁定到 `127.0.0.1:8787`。
如果你的公開端點不同,請在前方放置反向代理並將 `webhookUrl` 指向公開 URL。
當你刻意需要外部存取時,設定 `webhookHost`(例如 `0.0.0.0`)。
限制、重試與 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` 為停用。
- DM 歷史控制:
- `channels.telegram.dmHistoryLimit`
- `channels.telegram.dms["<user_id>"].historyLimit`
- `channels.telegram.retry` 設定套用於 Telegram 傳送輔助工具(CLI/工具/動作),處理可恢復的對外 API 錯誤。
CLI 傳送目標可以是數字聊天 ID 或使用者名稱:
openclaw message send --channel telegram --target 123456789 --message "hi"
openclaw message send --channel telegram --target @name --message "hi"
Telegram 投票使用 `openclaw message poll` 並支援論壇主題:
openclaw message poll --channel telegram --target 123456789 \
--poll-question "Ship it?" --poll-option "Yes" --poll-option "No"
openclaw message poll --channel telegram --target -1001234567890:topic:42 \
--poll-question "Pick a time" --poll-option "10am" --poll-option "2pm" \
--poll-duration-seconds 300 --poll-public
Telegram 專用投票旗標:
- `--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 支援在核准者 DM 中進行執行核准,並可選擇在來源聊天或主題中張貼核准提示。
設定路徑:
- `channels.telegram.execApprovals.enabled`
- `channels.telegram.execApprovals.approvers`
- `channels.telegram.execApprovals.target`(`dm` | `channel` | `both`,預設:`dm`)
- `agentFilter`、`sessionFilter`
核准者必須是數字 Telegram 使用者 ID。當 `enabled` 為 false 或 `approvers` 為空時,Telegram 不會作為執行核准用戶端。核准請求會退回到其他已設定的核准路由或執行核准備援政策。
送達規則:
- `target: "dm"` 僅傳送核准提示到已設定的核准者 DM
- `target: "channel"` 將提示傳回來源 Telegram 聊天/主題
- `target: "both"` 同時傳送到核准者 DM 和來源聊天/主題
只有已設定的核准者可以核准或拒絕。非核准者無法使用 `/approve`,也無法使用 Telegram 核准按鈕。
頻道送達會在聊天中顯示指令文字,因此只在受信任的群組/主題中啟用 `channel` 或 `both`。當提示落在論壇主題中時,OpenClaw 會在核准提示和核准後的後續訊息中保留主題。
行內核准按鈕也依賴 `channels.telegram.capabilities.inlineButtons` 允許目標介面(`dm`、`group` 或 `all`)。
相關文件:[執行核准](/docs/tools/exec-approvals)
疑難排解
機器人不回覆非提及的群組訊息
- 如果 `requireMention=false`,Telegram 隱私模式必須允許完整可見性。
- BotFather:`/setprivacy` -> Disable
- 然後在群組中移除並重新加入機器人
- `openclaw channels status` 會在設定預期接收非提及群組訊息時發出警告。
- `openclaw channels status --probe` 可以檢查明確的數字群組 ID;萬用字元 `"*"` 無法進行成員資格探測。
- 快速工作階段測試:`/activation always`。
機器人完全看不到群組訊息
- 當 `channels.telegram.groups` 存在時,群組必須在清單中(或包含 `"*"`)
- 確認機器人是群組成員
- 檢視日誌:`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 呼叫:
channels:
telegram:
proxy: socks5://<user>:<password>@proxy-host:1080
- Node 22+ 預設為 `autoSelectFamily=true`(WSL2 除外)和 `dnsResultOrder=ipv4first`。
- 如果你的主機是 WSL2 或使用純 IPv4 行為效果更好,可以強制選擇地址族群:
channels:
telegram:
network:
autoSelectFamily: false
- 環境變數覆寫(暫時):
- `OPENCLAW_TELEGRAM_DISABLE_AUTO_SELECT_FAMILY=1`
- `OPENCLAW_TELEGRAM_ENABLE_AUTO_SELECT_FAMILY=1`
- `OPENCLAW_TELEGRAM_DNS_RESULT_ORDER=ipv4first`
- 驗證 DNS 回應:
dig +short api.telegram.org A
dig +short api.telegram.org AAAA
更多協助:頻道疑難排解。
Telegram 設定參考指引
主要參考:
-
channels.telegram.enabled:啟用/停用頻道啟動。 -
channels.telegram.botToken:機器人 token(BotFather)。 -
channels.telegram.tokenFile:從一般檔案路徑讀取 token。符號連結會被拒絕。 -
channels.telegram.dmPolicy:pairing | allowlist | open | disabled(預設:pairing)。 -
channels.telegram.allowFrom:DM 許可清單(數字 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。非數字項目在認證時會被忽略。群組認證不使用 DM 配對儲存備援(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:提及閘門預設值。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:將此主題路由到特定代理(覆寫群組層級和綁定路由)。
-
channels.telegram.groups.<id>.topics.<threadId>.groupPolicy:按主題覆寫 groupPolicy(open | allowlist | disabled)。 -
channels.telegram.groups.<id>.topics.<threadId>.requireMention:按主題的提及閘門覆寫。 -
頂層
bindings[]搭配type: "acp"和match.peer.id中的規範主題 IDchatId:topic:topicId:持久 ACP 主題綁定欄位(參見 ACP 代理)。 -
channels.telegram.direct.<id>.topics.<threadId>.agentId:將 DM 主題路由到特定代理(與論壇主題行為相同)。 -
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:轉傳核准提示的選用代理 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 呼叫的代理 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— 控制代理的反應能力(未設定時預設: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