通过 grammY,可用于生产环境中的 bot 私信和群组。默认模式是长轮询;webhook 模式可选。Documentation Index
Fetch the complete documentation index at: https://docs.openclaw.ai/llms.txt
Use this file to discover all available pages before exploring further.
配对
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用于群组可见性行为
访问控制和激活
- 私信策略
- 群组策略和允许列表
- 提及行为
channels.telegram.dmPolicy 控制直接消息访问:pairing(默认)allowlist(要求allowFrom中至少有一个发送者 ID)open(要求allowFrom包含"*")disabled
dmPolicy: "open" 搭配 allowFrom: ["*"] 会允许任何找到或猜到 bot 用户名的 Telegram 账号向 bot 发送命令。仅应将其用于工具受到严格限制、刻意公开的 bot;单所有者 bot 应使用带数字用户 ID 的 allowlist。channels.telegram.allowFrom 接受数字 Telegram 用户 ID。telegram: / tg: 前缀会被接受并规范化。
在多账号配置中,限制性的顶层 channels.telegram.allowFrom 会被视为安全边界:账号级 allowFrom: ["*"] 条目不会使该账号公开,除非合并后的有效账号允许列表仍包含显式通配符。
dmPolicy: "allowlist" 搭配空的 allowFrom 会阻止所有私信,并会被配置验证拒绝。
设置流程只会请求数字用户 ID。
如果你已升级且配置中包含 @username 允许列表条目,请运行 openclaw doctor --fix 来解析它们(尽力而为;需要 Telegram bot token)。
如果你之前依赖配对存储允许列表文件,openclaw doctor --fix 可以在允许列表流程中将条目恢复到 channels.telegram.allowFrom(例如当 dmPolicy: "allowlist" 尚无显式 ID 时)。对于单所有者 bot,建议使用 dmPolicy: "allowlist" 并配置显式数字 allowFrom ID,以便在配置中持久保存访问策略(而不是依赖之前的配对批准)。常见误解:私信配对批准并不意味着“此发送者在所有地方都已授权”。
配对授予私信访问权限。如果尚不存在命令所有者,第一次批准的配对也会设置 commands.ownerAllowFrom,使仅所有者命令和 exec 批准拥有显式操作员账号。
群组发送者授权仍来自显式配置允许列表。
如果你想要“我授权一次后,私信和群组命令都可用”,请将你的数字 Telegram 用户 ID 放入 channels.telegram.allowFrom;对于仅所有者命令,请确保 commands.ownerAllowFrom 包含 telegram:<your user id>。查找你的 Telegram 用户 ID
更安全(无第三方 bot):- 给你的 bot 发送私信。
- 运行
openclaw logs --follow。 - 读取
from.id。
@userinfobot 或 @getidsbot。运行时行为
- Telegram 由 gateway 进程拥有。
- 路由是确定性的:Telegram 入站消息会回复到 Telegram(模型不会选择渠道)。
- 入站消息会规范化为共享渠道信封,包含回复元数据和媒体占位符。
- 群组会话按群组 ID 隔离。论坛话题会追加
:topic:<threadId>以保持话题隔离。 - 私信消息可以携带
message_thread_id;OpenClaw 会保留线程 ID 用于回复,但默认保持私信使用扁平会话。当你有意需要私信话题会话隔离时,请配置channels.telegram.dm.threadReplies: "inbound"、channels.telegram.direct.<chatId>.threadReplies: "inbound"、requireTopic: true,或匹配的话题配置。 - 长轮询使用 grammY runner,并按每聊天/每线程排序。整体 runner sink 并发使用
agents.defaults.maxConcurrent。 - 每个 gateway 进程内部都会保护长轮询,因此同一时间只有一个活跃 poller 可以使用一个 bot token。如果你仍然看到
getUpdates409 冲突,很可能是另一个 OpenClaw gateway、脚本或外部 poller 正在使用同一个 token。 - 默认情况下,长轮询看门狗重启会在 120 秒没有完成
getUpdates存活检查后触发。只有当你的部署在长时间运行的工作期间仍看到误判的轮询停滞重启时,才增加channels.telegram.pollingStallThresholdMs。该值以毫秒为单位,允许范围为30000到600000;支持按账号覆盖。 - Telegram Bot API 不支持已读回执(
sendReadReceipts不适用)。
功能参考
实时流式预览(消息编辑)
实时流式预览(消息编辑)
OpenClaw 可以实时流式传输部分回复:若要保持工具进度可见但隐藏命令/exec 文本,请设置:对于进度草稿模式,将同样的命令文本策略放在 仅在你需要只交付最终内容时使用 对于纯文本回复:
- 直接聊天:预览消息 +
editMessageText - 群组/话题:预览消息 +
editMessageText
channels.telegram.streaming为off | partial | block | progress(默认:partial)progress会保留一个可编辑的 Status 草稿,并使用工具进度更新它,直到最终送达streaming.preview.toolProgress控制工具/进度更新是否复用同一条已编辑预览消息(默认:预览流式传输启用时为true)streaming.preview.commandText控制这些工具进度行中的命令/exec 详情:raw(默认,保留已发布行为)或status(仅工具标签)- 会检测旧版
channels.telegram.streamMode和布尔型streaming值;运行openclaw doctor --fix将它们迁移到channels.telegram.streaming.mode
v2026.4.22 及之后版本中已发布的 OpenClaw 行为。若要保留答案文本的已编辑预览,但隐藏工具进度行,请设置:streaming.progress 下:streaming.mode: "off":Telegram 预览编辑会被禁用,通用工具/进度杂讯会被抑制,而不是作为独立 Status 消息发送。审批提示、媒体载荷和错误仍会通过正常最终交付路径发送。当你只想保留回答预览编辑,同时隐藏工具进度 Status 行时,使用 streaming.preview.toolProgress: false。Telegram 选中引用回复是例外。当
replyToMode 为 "first"、"all" 或 "batched",且入站消息包含选中的引用文本时,OpenClaw 会通过 Telegram 的原生引用回复路径发送最终回答,而不是编辑回答预览,因此 streaming.preview.toolProgress 无法显示该轮的简短 Status 行。不含选中引用文本的当前消息回复仍会保留预览流式传输。当工具进度可见性比原生引用回复更重要时,设置 replyToMode: "off",或设置 streaming.preview.toolProgress: false 以确认这种取舍。- 简短私信/群组/topic 预览:OpenClaw 会保留同一条预览消息,并在原位置执行最终编辑,除非预览出现后发送过一条可见的非预览消息
- 预览之后跟随可见的非预览输出:OpenClaw 会将完成后的回复作为新的最终消息发送,并清理较旧的预览,因此最终回答会出现在中间输出之后
- 超过约一分钟的预览:OpenClaw 会将完成后的回复作为新的最终消息发送,然后清理预览,因此 Telegram 的可见时间戳会反映完成时间,而不是预览创建时间
/reasoning stream会在生成期间将推理发送到实时预览- 最终交付后会删除推理预览;当推理应保持可见时,使用
/reasoning on - 最终回答发送时不包含推理文本
Formatting and HTML fallback
Formatting and HTML fallback
出站文本使用 Telegram
parse_mode: "HTML"。- 类 Markdown 文本会渲染为 Telegram 安全的 HTML。
- 原始模型 HTML 会被转义,以减少 Telegram 解析失败。
- 如果 Telegram 拒绝解析后的 HTML,OpenClaw 会以纯文本重试。
channels.telegram.linkPreview: false 禁用。Native commands and custom commands
Native commands and custom commands
Telegram 命令菜单注册会在启动时通过 规则:设备配对命令(
安装
setMyCommands 处理。原生命令默认值:commands.native: "auto"会为 Telegram 启用原生命令
- 名称会规范化(去掉前导
/,转为小写) - 有效模式:
a-z、0-9、_,长度1..32 - 自定义命令不能覆盖原生命令
- 冲突/重复项会被跳过并记录日志
- 自定义命令只是菜单条目;它们不会自动实现行为
- 插件/skill 命令即使未显示在 Telegram 菜单中,键入时仍可工作
setMyCommands failed带BOT_COMMANDS_TOO_MUCH表示 Telegram 菜单在裁剪后仍溢出;减少插件/skill/自定义命令,或禁用channels.telegram.commands.native。- 当直接的 Bot API curl 命令可用,但
deleteWebhook、deleteMyCommands或setMyCommands因404: Not Found失败时,可能表示channels.telegram.apiRoot被设置为了完整的/bot<TOKEN>端点。apiRoot必须只是 Bot API 根路径,openclaw doctor --fix会移除意外尾随的/bot<TOKEN>。 getMe returned 401表示 Telegram 拒绝了配置的 bot 令牌。使用当前 BotFather 令牌更新botToken、tokenFile或TELEGRAM_BOT_TOKEN;OpenClaw 会在轮询前停止,因此这不会被报告为 webhook 清理失败。setMyCommands failed带网络/fetch 错误通常表示到api.telegram.org的出站 DNS/HTTPS 被阻止。
设备配对命令(device-pair 插件)
安装 device-pair 插件后:/pair生成设置代码- 在 iOS 应用中粘贴代码
/pair pending列出待处理请求(包括角色/作用域)- 批准请求:
/pair approve <requestId>用于显式批准/pair approve用于只有一个待处理请求的情况/pair approve latest用于最新请求
scopes: [];任何交接的 operator 令牌仍被限制在 operator.approvals、operator.read、operator.talk.secrets 和 operator.write。引导作用域检查带有角色前缀,因此该 operator 允许列表只满足 operator 请求;非 operator 角色仍需要其自身角色前缀下的作用域。如果设备使用变更后的认证详细信息重试(例如角色/作用域/公钥),之前的待处理请求会被取代,新的请求会使用不同的 requestId。批准前请重新运行 /pair pending。更多详情:配对。Inline buttons
Inline buttons
Telegram message actions for agents and automation
Telegram message actions for agents and automation
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/reactionsReply threading tags
Reply threading tags
Forum topics and thread behavior
Forum topics and thread behavior
论坛超级群组:然后每个 topic 都有自己的会话键:
- topic 会话键会追加
:topic:<threadId> - 回复和正在输入目标指向 topic 线程
- topic 配置路径:
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 仅限 topic,不会从群组默认值继承。按 topic 的智能体路由:每个 topic 都可以通过在 topic 配置中设置 agentId 路由到不同的智能体。这会让每个 topic 拥有各自隔离的工作区、记忆和会话。示例:agent:zu:telegram:group:-1001234567890:topic:3持久 ACP topic 绑定:论坛 topic 可以通过顶层类型化 ACP 绑定固定 ACP harness 会话(bindings[],包含 type: "acp" 和 match.channel: "telegram"、peer.kind: "group",以及类似 -1001234567890:topic:42 的 topic 限定 id)。当前范围限定为群组/超级群组中的论坛 topic。参见 ACP Agents。从聊天创建线程绑定 ACP:/acp spawn <agent> --thread here|auto 会将当前 topic 绑定到新的 ACP 会话;后续消息会直接路由到那里。OpenClaw 会将创建确认固定在 topic 内。需要 channels.telegram.threadBindings.spawnSessions 保持启用(默认:true)。模板上下文会暴露 MessageThreadId 和 IsForum。带有 message_thread_id 的私信聊天默认在扁平会话上保留私信路由和回复元数据;只有在配置了 threadReplies: "inbound"、threadReplies: "always"、requireTopic: true 或匹配的 topic 配置时,才会使用线程感知的会话键。使用顶层 channels.telegram.dm.threadReplies 设置账户默认值,或使用 direct.<chatId>.threadReplies 设置单个私信。音频、视频和贴纸
音频、视频和贴纸
音频消息
Telegram 会区分语音便签和音频文件。- 默认:音频文件行为
- 在智能体回复中添加标签
[[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表示仅用户对机器人发送消息的回应(通过已发送消息缓存尽力实现)。- 回应事件仍遵循 Telegram 访问控制(
dmPolicy、allowFrom、groupPolicy、groupAllowFrom);未授权发送者会被丢弃。 - Telegram 不会在回应更新中提供线程 ID。
- 非论坛群组路由到群组聊天会话
- 论坛群组路由到群组通用 topic 会话(
:topic:1),而不是确切的来源 topic
allowed_updates 会自动包含 message_reaction。ACK 回应
ACK 回应
ackReaction 会在 OpenClaw 处理入站消息时发送一个确认 emoji。解析顺序:channels.telegram.accounts.<accountId>.ackReactionchannels.telegram.ackReactionmessages.ackReaction- 智能体身份 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;可选设置 webhookPath、webhookHost、webhookPort(默认值为 /telegram-webhook、127.0.0.1、8787)。本地监听器绑定到 127.0.0.1:8787。对于公网入口,可以在本地端口前放置反向代理,或有意设置 webhookHost: "0.0.0.0"。webhook 模式会先验证请求守卫、Telegram secret token 和 JSON 正文,然后才向 Telegram 返回 200。
随后 OpenClaw 会通过与长轮询相同的每聊天/每 topic 机器人通道异步处理该更新,因此较慢的智能体轮次不会阻塞 Telegram 的投递 ACK。限制、重试和 CLI 目标
限制、重试和 CLI 目标
channels.telegram.textChunkLimit默认值为 4000。channels.telegram.chunkMode="newline"在按长度拆分前会优先选择段落边界(空行)。channels.telegram.mediaMaxMb(默认 100)限制入站和出站 Telegram 媒体大小。channels.telegram.mediaGroupFlushMs(默认 500)控制 Telegram 相册/媒体组在 OpenClaw 将其作为一条入站消息分发前的缓冲时长。如果相册部分到达较晚,请增大该值;如果要降低相册回复延迟,请减小该值。channels.telegram.timeoutSeconds覆盖 Telegram API 客户端超时(如果未设置,则使用 grammY 默认值)。机器人客户端会将配置值限制在低于 60 秒出站文本/typing 请求守卫的范围内,避免 grammY 在 OpenClaw 的传输守卫和回退运行前中止可见回复投递。长轮询仍使用 45 秒的getUpdates请求守卫,因此空闲轮询不会被无限期遗弃。channels.telegram.pollingStallThresholdMs默认值为120000;仅在误报轮询停滞重启时,在30000到600000之间调节。- 群组上下文历史使用
channels.telegram.historyLimit或messages.groupChat.historyLimit(默认 50);0表示禁用。 - 回复/引用/转发的补充上下文目前按接收内容传递。
- Telegram 允许列表主要用于控制谁可以触发智能体,而不是完整的补充上下文删减边界。
- 私信历史控制:
channels.telegram.dmHistoryLimitchannels.telegram.dms["<user_id>"].historyLimit
channels.telegram.retry配置适用于 Telegram 发送辅助函数(CLI/工具/操作),用于可恢复的出站 API 错误。入站最终回复投递也会对 Telegram 预连接失败使用有界安全发送重试,但不会重试可能造成可见消息重复的模糊发送后网络信封。
openclaw message poll,并支持论坛 topic:--poll-duration-seconds(5-600)--poll-anonymous--poll-public- 用于论坛 topic 的
--thread-id(或使用:topic:目标)
- 当
channels.telegram.capabilities.inlineButtons允许时,将--presentation与buttons块配合用于内联键盘 - 当机器人可以在该聊天中置顶时,使用
--pin或--delivery '{"pin":true}'请求置顶投递 - 使用
--force-document将出站图片和 GIF 作为文档发送,而不是压缩照片或动画媒体上传
channels.telegram.actions.sendMessage=false会禁用出站 Telegram 消息,包括投票channels.telegram.actions.poll=false会禁用 Telegram 投票创建,同时保留常规发送启用
Telegram 中的 exec 批准
Telegram 中的 exec 批准
Telegram 支持在批准者私信中进行 exec 批准,也可以选择在来源聊天或 topic 中发布提示。批准者必须是数字 Telegram 用户 ID。配置路径:
channels.telegram.execApprovals.enabled(当至少一个批准者可解析时自动启用)channels.telegram.execApprovals.approvers(回退到commands.ownerAllowFrom中的数字 owner ID)channels.telegram.execApprovals.target:dm(默认)|channel|bothagentFilter、sessionFilter
channels.telegram.allowFrom、groupAllowFrom 和 defaultTo 控制谁可以与机器人对话,以及机器人把普通回复发送到哪里。它们不会让某人成为 exec 批准者。当尚无命令 owner 时,第一个已批准的私信配对会引导初始化 commands.ownerAllowFrom,因此单 owner 设置仍可工作,而无需在 execApprovals.approvers 下重复 ID。渠道投递会在聊天中显示命令文本;仅在受信任的群组/topic 中启用 channel 或 both。当提示落在论坛 topic 中时,OpenClaw 会为批准提示和后续消息保留该 topic。exec 批准默认在 30 分钟后过期。内联批准按钮还要求 channels.telegram.capabilities.inlineButtons 允许目标表面(dm、group 或 all)。以 plugin: 为前缀的批准 ID 会通过插件批准解析;其他 ID 会先通过 exec 批准解析。请参阅 exec 批准。错误回复控制
当智能体遇到投递或提供商错误时,Telegram 可以回复错误文本,也可以抑制错误回复。两个配置键控制此行为:| 键 | 值 | 默认值 | 描述 |
|---|---|---|---|
channels.telegram.errorPolicy | reply, silent | reply | reply 会向聊天发送一条友好的错误消息。silent 会完全抑制错误回复。 |
channels.telegram.errorCooldownMs | number (ms) | 60000 | 向同一聊天发送错误回复的最小间隔时间。防止中断期间出现错误垃圾消息。 |
故障排除
机器人不响应未提及它的群组消息
机器人不响应未提及它的群组消息
- 如果
requireMention=false,Telegram 隐私模式必须允许完整可见性。- BotFather:
/setprivacy-> Disable - 然后将机器人从群组中移除并重新添加
- BotFather:
- 当配置预期接收未提及机器人的群组消息时,
openclaw channels status会发出警告。 openclaw channels status --probe可以检查显式数字群组 ID;通配符"*"无法进行成员探测。- 快速会话测试:
/activation always。
机器人完全看不到群组消息
机器人完全看不到群组消息
- 当
channels.telegram.groups存在时,群组必须被列出(或包含"*") - 验证机器人在群组中的成员身份
- 查看日志:
openclaw logs --follow以了解跳过原因
命令部分可用或完全不可用
命令部分可用或完全不可用
- 授权你的发送者身份(配对和/或数字
allowFrom) - 即使群组策略为
open,命令授权仍然适用 setMyCommands failed携带BOT_COMMANDS_TOO_MUCH表示原生命令菜单条目过多;减少插件/skill/自定义命令,或禁用原生菜单deleteMyCommands/setMyCommands启动调用和sendChatAction输入状态调用都有边界限制,并会在请求超时时通过 Telegram 的传输回退重试一次。持续的网络/抓取错误通常表示到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 现在会将这些作为可恢复的网络错误重试。 - 在轮询启动期间,OpenClaw 会为 grammY 复用启动时成功的
getMe探测,因此运行器在第一次getUpdates之前不需要第二次getMe。 - 如果
deleteWebhook在轮询启动期间因瞬时网络错误失败,OpenClaw 会继续进入长轮询,而不是再发起一次预轮询控制平面调用。仍处于活动状态的 webhook 会表现为getUpdates冲突;随后 OpenClaw 会重建 Telegram 传输并重试 webhook 清理。 - 如果 Telegram 套接字按较短的固定周期回收,请检查是否存在过低的
channels.telegram.timeoutSeconds;机器人客户端会将低于出站和getUpdates请求保护值的配置值钳制到保护值以上,但旧版本在该值低于这些保护值时可能会中止每次轮询或回复。 - 如果日志包含
Polling stall detected,OpenClaw 默认会在 120 秒没有完成长轮询存活信号后重启轮询并重建 Telegram 传输。 - 当运行中的轮询账户在启动宽限期后未完成
getUpdates、运行中的 webhook 账户在启动宽限期后未完成setWebhook,或最近一次成功的轮询传输活动已过期时,openclaw channels status --probe和openclaw doctor会发出警告。 - 仅当长时间运行的
getUpdates调用健康、但你的主机仍报告误报的轮询停滞重启时,才增大channels.telegram.pollingStallThresholdMs。持续停滞通常指向主机与api.telegram.org之间的代理、DNS、IPv6 或 TLS 出站问题。 - Telegram 也会遵循 Bot API 传输的进程代理环境,包括
HTTP_PROXY、HTTPS_PROXY、ALL_PROXY及其小写变体。NO_PROXY/no_proxy仍可绕过api.telegram.org。 - 如果服务环境中通过
OPENCLAW_PROXY_URL配置了 OpenClaw 托管代理,并且不存在标准代理环境,Telegram 也会将该 URL 用于 Bot API 传输。 - 在直接出站/TLS 不稳定的 VPS 主机上,通过
channels.telegram.proxy路由 Telegram API 调用:
- Node 22+ 默认使用
autoSelectFamily=true(WSL2 除外)。Telegram DNS 结果顺序依次遵循OPENCLAW_TELEGRAM_DNS_RESULT_ORDER、channels.telegram.network.dnsResultOrder、进程默认值(例如NODE_OPTIONS=--dns-result-order=ipv4first);如果都不适用,Node 22+ 会回退到ipv4first。 - 如果你的主机是 WSL2,或明确在仅 IPv4 行为下工作得更好,请强制选择地址族:
- 默认已允许 Telegram 媒体下载使用 RFC 2544 基准测试范围应答(
198.18.0.0/15)。如果可信的 fake-IP 或透明代理在媒体下载期间将api.telegram.org重写为其他私有/内部/特殊用途地址,你可以选择启用仅限 Telegram 的绕过:
- 同一选择启用项也可按账户配置在
channels.telegram.accounts.<accountId>.network.dangerouslyAllowPrivateNetwork。 - 如果你的代理将 Telegram 媒体主机解析为
198.18.x.x,请先保持 危险标志关闭。Telegram 媒体默认已允许 RFC 2544 基准测试范围。
- 环境覆盖(临时):
OPENCLAW_TELEGRAM_DISABLE_AUTO_SELECT_FAMILY=1OPENCLAW_TELEGRAM_ENABLE_AUTO_SELECT_FAMILY=1OPENCLAW_TELEGRAM_DNS_RESULT_ORDER=ipv4first
- 验证 DNS 应答:
配置参考
主要参考:配置参考 - Telegram。高信号 Telegram 字段
高信号 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、dm.threadReplies、direct.*.threadReplies - 流式传输:
streaming(预览)、streaming.preview.toolProgress、blockStreaming - 格式/投递:
textChunkLimit、chunkMode、linkPreview、responsePrefix - 媒体/网络:
mediaMaxMb、mediaGroupFlushMs、timeoutSeconds、pollingStallThresholdMs、retry、network.autoSelectFamily、network.dangerouslyAllowPrivateNetwork、proxy - 自定义 API 根:
apiRoot(仅 Bot API 根;不要包含/bot<TOKEN>) - webhook:
webhookUrl、webhookSecret、webhookPath、webhookHost - 操作/能力:
capabilities.inlineButtons、actions.sendMessage|editMessage|deleteMessage|reactions|sticker - 表情回应:
reactionNotifications、reactionLevel - 错误:
errorPolicy、errorCooldownMs - 写入/历史记录:
configWrites、historyLimit、dmHistoryLimit、dms.*.historyLimit
多账户优先级:当配置了两个或更多账户 ID 时,设置
channels.telegram.defaultAccount(或包含 channels.telegram.accounts.default)以明确默认路由。否则 OpenClaw 会回退到第一个规范化账户 ID,且 openclaw doctor 会发出警告。命名账户会继承 channels.telegram.allowFrom / groupAllowFrom,但不会继承 accounts.default.* 值。相关
配对
将 Telegram 用户配对到 Gateway 网关。
群组
群组和话题允许列表行为。
渠道路由
将入站消息路由到智能体。
安全
威胁模型和加固。
多智能体路由
将群组和话题映射到智能体。
故障排除
跨渠道诊断。