Telegram(Bot API)
状态:通过 grammY 实现机器人私聊和群组的生产就绪。默认模式为长轮询;Webhook 模式为可选。快速设置
配置令牌和私聊策略
TELEGRAM_BOT_TOKEN=...(仅适用于默认账户)。
Telegram 不支持使用 openclaw channels login telegram;请在配置文件或环境变量中配置令牌后启动网关。令牌解析顺序会根据账户不同而不同。实际使用中,配置文件中的值优先于环境变量回退,且
TELEGRAM_BOT_TOKEN 只适用于默认账户。Telegram 端设置
隐私模式与群组可见性
隐私模式与群组可见性
Telegram 机器人默认启用隐私模式,限制它们接收的群组消息范围。若机器人需查看所有群消息,可以:
- 通过
/setprivacy关闭隐私模式,或 - 将机器人设置为群组管理员。
群组权限
群组权限
管理员身份由 Telegram 群组设置控制。成为管理员的机器人可收到所有群消息,适合需要持续监听的群场景。
BotFather 相关快捷切换
BotFather 相关快捷切换
/setjoingroups控制是否允许加入群组/setprivacy控制群组消息可见行为
访问控制与激活
- 私聊策略
- 群组策略及白名单
- @提及行为
channels.telegram.dmPolicy 决定私聊访问策略:pairing(默认)allowlist(需要allowFrom至少包含一个发送者 ID)open(需要allowFrom包含"*")disabled
channels.telegram.allowFrom 只接受数字格式的 Telegram 用户 ID,支持并规范 telegram: / tg: 前缀。
dmPolicy: "allowlist" 且 allowFrom 为空时将阻止所有私聊,且配置验证会拒绝此项。
入门向导支持输入 @用户名,并可解析为数字 ID。
若升级后配置包含 @用户名 的白名单条目,执行 openclaw doctor --fix 可尝试解析(需要 Telegram 机器人令牌,非保证成功)。
若之前依赖配对存储的白名单文件,openclaw doctor --fix 可在白名单流中恢复条目至 channels.telegram.allowFrom。推荐一位所有者的机器人配置中使用显式数字 allowFrom 的 dmPolicy: "allowlist",保障访问策略在配置中持久。查询你的 Telegram 用户 ID
更安全(无第三方机器人):- 给机器人发送私聊消息。
- 执行
openclaw logs --follow。 - 查找
from.id。
@userinfobot 或 @getidsbot。运行时行为
- Telegram 由网关进程拥有。
- 路由是确定性的:Telegram 入站消息回复回 Telegram(模型不选择频道)。
- 入站消息会被规范化为共享频道信封,包含回复元数据和媒体占位符。
- 群组会话按群组 ID 隔离。论坛主题通过追加
:topic:<threadId>维持主题隔离。 - 私聊消息可能携带
message_thread_id;OpenClaw 使用线程感知的会话键路由,并保留线程 ID 用于回复。 - 长轮询使用 grammY 运行器,支持每聊/线程顺序执行。整体运行器汇聚并发使用
agents.defaults.maxConcurrent。 - Telegram Bot API 不支持已读回执(
sendReadReceipts无效)。
功能参考
实时预览(原生草稿 + 消息编辑)
实时预览(原生草稿 + 消息编辑)
OpenClaw 可实时流式输出部分回复:
- 个人聊天:通过 Telegram 原生草稿流
sendMessageDraft - 群组/主题:预览消息 +
editMessageText
channels.telegram.streaming支持off | partial | block | progress(默认:partial)progress映射到 Telegram 上的partial(兼容跨频道命名)- 旧版的
channels.telegram.streamMode和 booleanstreaming值会自动映射
sendMessageDraft。仅纯文本回复:- 私聊:OpenClaw 在原地更新草稿(无额外预览消息)
- 群组/主题:OpenClaw 保持同一预览消息,最终文本直接编辑更新(无第二条消息)
sendMessage + editMessageText。Telegram 特有的推理流:/reasoning stream在生成过程中将推理发送至实时预览- 最终答案不包含推理文本
格式化及 HTML 兼容回退
格式化及 HTML 兼容回退
出站文本使用 Telegram 的
parse_mode: "HTML"。- 类 Markdown 文本渲染为 Telegram 可解析的 HTML。
- 原始模型 HTML 会转义,减少解析失败。
- 若 Telegram 拒绝 HTML,OpenClaw 会重试为纯文本。
channels.telegram.linkPreview: false 关闭。原生命令与自定义命令
原生命令与自定义命令
Telegram 命令菜单在启动时通过 规则:设备配对命令(
安装
setMyCommands 注册。原生命令默认:commands.native: "auto"为 Telegram 启用原生命令
- 名称归一化(去除前导
/,转小写) - 合法模式:
a-z,0-9,_,长度1..32 - 自定义命令不能覆盖原生命令
- 冲突/重复项被跳过并记录日志
- 自定义命令仅用于菜单展示,不自动实现行为
- 插件/技能命令即使未列在菜单中,也可直接输入使用
setMyCommands failed通常因出站 DNS/HTTPS 访问api.telegram.org被阻止。
设备配对命令(device-pair 插件)
安装 device-pair 插件后:/pair生成配对码- 在 iOS 应用粘贴配对码
/pair approve批准最新待处理请求
内联按钮
内联按钮
面向代理和自动化的 Telegram 消息操作
面向代理和自动化的 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 默认启用,暂无独立开关。反应移除语义见:反应工具。回复线程标签
回复线程标签
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
agentId 外继承群组设置(requireMention, allowFrom, skills, systemPrompt, enabled, groupPolicy)。
agentId 仅主题层级特有,不继承群组默认。每主题代理路由:每个主题可配置不同代理的 agentId,实现独立工作区、记忆和会话。示例:agent:zu:telegram:group:-1001234567890:topic:3持久 ACP 主题绑定:论坛主题可通过顶层类型绑定将 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的私聊保持 DM 路由,但使用线程感知的会话键和回复目标。
音频、视频及贴纸
音频、视频及贴纸
语音消息
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:1),而非具体发起主题
allowed_updates 会自动包含 message_reaction。确认反应
确认反应
ackReaction 用于 OpenClaw 处理入站消息时发送确认表情。解析优先级:channels.telegram.accounts.<accountId>.ackReactionchannels.telegram.ackReactionmessages.ackReaction- 代理身份表情备用 (
agents.list[].identity.emoji,否则默认 ”👀”)
- Telegram 期望 Unicode 表情(例如 ”👀”)。
- 设为空字符串
""可禁用该频道或账户的确认反应。
来自 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(设置 webhookUrl 时必需) - 可选
channels.telegram.webhookPath(默认/telegram-webhook) - 可选
channels.telegram.webhookHost(默认127.0.0.1) - 可选
channels.telegram.webhookPort(默认8787)
127.0.0.1:8787。若公网端点不同,需前置反向代理,并将 webhookUrl 指向公网地址。
有意暴露外部入口时,设置如 0.0.0.0 的 webhookHost。限制、重试及 CLI 目标
限制、重试及 CLI 目标
channels.telegram.textChunkLimit默认 4000 字符。channels.telegram.chunkMode="newline"优先按段落(空行)拆分,再按长度。channels.telegram.mediaMaxMb(默认 5MB)限制入站媒体下载/处理大小。channels.telegram.timeoutSeconds可覆盖 Telegram API 客户端超时(未设置则用 grammY 默认)。- 群聊上下文历史使用
channels.telegram.historyLimit或messages.groupChat.historyLimit(默认 50);设为0禁用。 - 私聊历史控制:
channels.telegram.dmHistoryLimitchannels.telegram.dms["<user_id>"].historyLimit
- Telegram 发送助手(CLI/工具/动作)的重试策略由
channels.telegram.retry配置,适用于可恢复的出站 API 错误。
--poll-duration-seconds(5-600 秒)--poll-anonymous--poll-public- 论坛主题使用
--thread-id或在目标中使用:topic:语法
channels.telegram.actions.sendMessage=false禁止所有出站 Telegram 消息,包括投票channels.telegram.actions.poll=false禁止创建 Telegram 投票,但允许普通发送
故障排除
机器人对未提及的群消息无响应
机器人对未提及的群消息无响应
- 若
requireMention=false,需关闭 Telegram 隐私模式全开放。- BotFather:执行
/setprivacy→ 禁用 - 然后从群组移除并重新添加机器人
- BotFather:执行
openclaw channels status会提醒配置期望收取未提及群消息时的风险。openclaw channels status --probe可检测明确的数字群组 ID;通配符"*"无法检测成员资格。- 快速会话测试:执行
/activation always。
机器人完全看不到群消息
机器人完全看不到群消息
- 当配置了
channels.telegram.groups,必须包含该群组或"*" - 确认机器人为群成员
- 查看日志:
openclaw logs --follow查找跳过原因
命令部分或全部失效
命令部分或全部失效
- 授权发送者身份(配对及/或数字
allowFrom) - 即使群组策略为
open,命令仍须授权 setMyCommands failed通常是 DNS/HTTPS 访问api.telegram.org被阻止导致
轮询或网络不稳定
轮询或网络不稳定
- Node 22+ 和定制 fetch/proxy 可能因 AbortSignal 类型不匹配导致立即中断。
- 一些主机优先解析
api.telegram.org为 IPv6,若 IPv6 出口不稳定,会导致 Telegram API 间歇故障。 - 日志出现
TypeError: fetch failed或Network request for 'getUpdates' failed!时,OpenClaw 现会重试视为可恢复网络错误。 - VPS 主机若出口不稳定,可使用代理配置转发 Telegram API 请求:
- Node 22+ 默认
autoSelectFamily=true(WSL2 除外),dnsResultOrder=ipv4first。 - 若使用 WSL2 或明确更适合 IPv4,仅需关闭自动选择:
- 环境变量临时覆盖:
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:BotFather 机器人令牌。 -
channels.telegram.tokenFile:从文件读取令牌。 -
channels.telegram.dmPolicy:pairing | allowlist | open | disabled(默认 pairing)。 -
channels.telegram.allowFrom:私聊白名单(数字 Telegram 用户 ID)。allowlist需至少一个发送者 ID;open需含"*"。openclaw doctor --fix可解析遗留的@用户名,并在白名单迁移时从配对存储恢复条目。 -
channels.telegram.actions.poll:启用或禁用 Telegram 投票创建(默认启用,仍需启用发送权限)。 -
channels.telegram.defaultTo:CLI--deliver未显式指定--reply-to时的默认 Telegram 目标。 -
channels.telegram.groupPolicy:open | allowlist | disabled(默认允许列表)。 -
channels.telegram.groupAllowFrom:群组发送者白名单(数字 Telegram 用户 ID)。openclaw doctor --fix可解析遗留@用户名。非数字条目授权时忽略。群授权不使用私聊配对存储回退(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仅应用于默认账户。- 命名账户若无账户级允许列表,继承顶层
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:主题级覆盖的群组策略。channels.telegram.groups.<id>.topics.<threadId>.requireMention:主题级提及门控覆盖。- 顶层
bindings[],包含type: "acp"与标准主题 IDchatId:topic:topicId在match.peer.id中:持久 ACP 主题绑定字段(详见ACP 代理)。 channels.telegram.direct.<id>.topics.<threadId>.agentId:将私聊主题路由到特定代理(行为同论坛主题)。
-
channels.telegram.capabilities.inlineButtons:off | dm | group | all | allowlist(默认允许列表)。 -
channels.telegram.accounts.<account>.capabilities.inlineButtons:账户级覆盖。 -
channels.telegram.commands.nativeSkills:启用/禁用 Telegram 原生技能命令。 -
channels.telegram.replyToMode:off | first | all(默认关闭)。 -
channels.telegram.textChunkLimit:出站分块大小(字符数)。 -
channels.telegram.chunkMode:length(默认)或newline(优先按空白行分块)。 -
channels.telegram.linkPreview:切换出站消息链接预览(默认开启)。 -
channels.telegram.streaming:off | partial | block | progress(实时预览;默认partial,progress映射为partial,block为兼容旧版)。 -
channels.telegram.mediaMaxMb:入站媒体下载/处理上限(MB)。 -
channels.telegram.retry:Telegram 发送助手(CLI/工具/动作)遇到可恢复 API 错误时的重试策略(重试次数、最小延迟、最大延迟、随机抖动)。 -
channels.telegram.network.autoSelectFamily:覆盖 Node 网络族自动选择(true 启用,false 禁用)。Node 22+ 默认启用,WSL2 默认禁用。 -
channels.telegram.network.dnsResultOrder:覆盖 DNS 结果排序 (ipv4first或verbatim)。Node 22+ 默认ipv4first。 -
channels.telegram.proxy:Bot API 请求代理地址(SOCKS/HTTP)。 -
channels.telegram.webhookUrl:开启 webhook 模式(需配置webhookSecret)。 -
channels.telegram.webhookSecret:webhook secret(配置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 贴纸操作权限 — 发送和搜索(默认关闭)。 -
channels.telegram.reactionNotifications:off | own | all— 控制哪些反应触发系统事件(默认:own)。 -
channels.telegram.reactionLevel:off | ack | minimal | extensive— 控制代理的反应能力(默认:minimal)。 - 配置参考 - Telegram
- 启动/认证:
enabled,botToken,tokenFile,accounts.* - 访问控制:
dmPolicy,allowFrom,groupPolicy,groupAllowFrom,groups,groups.*.topics.*, 顶层bindings[](type: "acp") - 命令菜单:
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