状态:通过 grammY 支持机器人私信和群组,已可用于生产环境。默认使用长轮询;webhook 可选。
@BotFather,然后复制 token。TELEGRAM_BOT_TOKEN=...channels.telegram.botToken: "..."。最小配置:
{
channels: {
telegram: {
enabled: true,
botToken: "123:abc",
dmPolicy: "pairing",
},
},
}
agent:<agentId>:telegram:group:<chatId>)。@BotFather。/newbot,然后按照提示操作(名称 + 以 bot 结尾的用户名)。可选的 BotFather 设置:
/setjoingroups — 允许/拒绝将机器人添加到群组。/setprivacy — 控制机器人是否可以看到所有群组消息。示例:
{
channels: {
telegram: {
enabled: true,
botToken: "123:abc",
dmPolicy: "pairing",
groups: { "*": { requireMention: true } },
},
},
}
环境变量选项:TELEGRAM_BOT_TOKEN=...(适用于默认账户)。
如果环境变量和配置都设置了,配置优先。
多账户支持:使用 channels.telegram.accounts,每个账户有独立的 token 和可选的 name。参见 gateway/configuration 了解共享模式。
channels.telegram.groups 来控制提及门控和允许列表。/newbot 创建机器人并返回 token(请保密)。Telegram 机器人默认启用隐私模式,这会限制它们接收哪些群组消息。 如果你的机器人必须看到所有群组消息,有两个选项:
/setprivacy 禁用隐私模式或注意: 当你切换隐私模式时,Telegram 要求将机器人从每个群组中移除并重新添加,更改才能生效。
管理员状态在群组内设置(Telegram UI)。管理员机器人始终接收所有群组消息,因此如果需要完全可见性,请使用管理员身份。
agents.list[].groupChat.mentionPatterns / messages.groupChat.mentionPatterns)。agents.list[].groupChat.mentionPatterns 上设置每个智能体的模式。agents.defaults.maxConcurrent 限制。sendReadReceipts 选项。OpenClaw 可以在 Telegram 私信中使用 sendMessageDraft 流式传输部分回复。
要求:
message_thread_id)。channels.telegram.streamMode 未设置为 "off"(默认:"partial","block" 启用分块草稿更新)。草稿流式传输仅限私信;Telegram 在群组或频道中不支持此功能。
parse_mode: "HTML"(Telegram 支持的标签子集)。OpenClaw 在启动时向 Telegram 的机器人菜单注册原生命令(如 /status、/reset、/model)。
你可以通过配置向菜单添加自定义命令:
{
channels: {
telegram: {
customCommands: [
{ command: "backup", description: "Git 备份" },
{ command: "generate", description: "创建图片" },
],
},
},
}
setMyCommands failed 通常意味着到 api.telegram.org 的出站 HTTPS/DNS 被阻止。sendMessage 或 sendChatAction 失败,检查 IPv6 路由和 DNS。更多帮助:渠道故障排除。
注意:
/,转为小写),必须匹配 a-z、0-9、_(1-32 个字符)。commands.native,则只注册自定义命令(如果没有则清空)。channels.telegram.textChunkLimit 分块(默认 4000)。channels.telegram.chunkMode="newline" 在长度分块之前按空行(段落边界)分割。channels.telegram.mediaMaxMb 限制(默认 5)。channels.telegram.timeoutSeconds 后超时(通过 grammY 默认 500)。设置较低的值以避免长时间挂起。channels.telegram.historyLimit(或 channels.telegram.accounts.*.historyLimit),回退到 messages.groupChat.historyLimit。设置 0 禁用(默认 50)。channels.telegram.dmHistoryLimit(用户轮次)限制。每用户覆盖:channels.telegram.dms["<user_id>"].historyLimit。默认情况下,机器人只响应群组中的提及(@botname 或 agents.list[].groupChat.mentionPatterns 中的模式)。要更改此行为:
{
channels: {
telegram: {
groups: {
"-1001234567890": { requireMention: false }, // 在此群组中始终响应
},
},
},
}
重要: 设置 channels.telegram.groups 会创建一个允许列表 - 只有列出的群组(或 "*")会被接受。
论坛话题继承其父群组配置(allowFrom、requireMention、skills、prompts),除非你在 channels.telegram.groups.<groupId>.topics.<topicId> 下添加每话题覆盖。
要允许所有群组并始终响应:
{
channels: {
telegram: {
groups: {
"*": { requireMention: false }, // 所有群组,始终响应
},
},
},
}
要保持所有群组仅提及响应(默认行为):
{
channels: {
telegram: {
groups: {
"*": { requireMention: true }, // 或完全省略 groups
},
},
},
}
在群组中发送:
/activation always - 响应所有消息/activation mention - 需要提及(默认)注意: 命令只更新会话状态。要在重启后保持持久行为,请使用配置。
将群组中的任何消息转发给 Telegram 上的 @userinfobot 或 @getidsbot 以查看聊天 ID(负数,如 -1001234567890)。
提示: 要获取你自己的用户 ID,私信机器人,它会回复你的用户 ID(配对消息),或者在命令启用后使用 /whoami。
隐私注意: @userinfobot 是第三方机器人。如果你更倾向于其他方式,将机器人添加到群组,发送一条消息,然后使用 openclaw logs --follow 读取 chat.id,或使用 Bot API getUpdates。
默认情况下,Telegram 允许写入由渠道事件或 /config set|unset 触发的配置更新。
这发生在以下情况:
migrate_to_chat_id(聊天 ID 更改)。OpenClaw 可以自动迁移 channels.telegram.groups。/config set 或 /config unset(需要 commands.config: true)。禁用方式:
{
channels: { telegram: { configWrites: false } },
}
Telegram 论坛话题在每条消息中包含 message_thread_id。OpenClaw:
:topic:<threadId> 附加到 Telegram 群组会话键,使每个话题隔离。message_thread_id,使响应保持在话题内。1)是特殊的:消息发送省略 message_thread_id(Telegram 会拒绝),但输入指示器仍然包含它。MessageThreadId + IsForum 用于路由/模板。channels.telegram.groups.<chatId>.topics.<threadId> 下设置(skills、允许列表、自动回复、系统提示、禁用)。私聊在某些边缘情况下可能包含 message_thread_id。OpenClaw 保持私信会话键不变,但在存在线程 id 时仍将其用于回复/草稿流式传输。
Telegram 支持带回调按钮的内联键盘。
{
channels: {
telegram: {
capabilities: {
inlineButtons: "allowlist",
},
},
},
}
对于每账户配置:
{
channels: {
telegram: {
accounts: {
main: {
capabilities: {
inlineButtons: "allowlist",
},
},
},
},
},
}
作用域:
off — 禁用内联按钮dm — 仅私信(群组目标被阻止)group — 仅群组(私信目标被阻止)all — 私信 + 群组allowlist — 私信 + 群组,但仅限 allowFrom/groupAllowFrom 允许的发送者(与控制命令规则相同)默认:allowlist。
旧版:capabilities: ["inlineButtons"] = inlineButtons: "all"。
使用带 buttons 参数的消息工具:
{
action: "send",
channel: "telegram",
to: "123456789",
message: "选择一个选项:",
buttons: [
[
{ text: "是", callback_data: "yes" },
{ text: "否", callback_data: "no" },
],
[{ text: "取消", callback_data: "cancel" }],
],
}
当用户点击按钮时,回调数据会以以下格式作为消息发送回智能体:
callback_data: value
Telegram 功能可以在两个级别配置(上面显示的对象形式;旧版字符串数组仍然支持):
channels.telegram.capabilities:应用于所有 Telegram 账户的全局默认功能配置,除非被覆盖。channels.telegram.accounts.<account>.capabilities:每账户功能,覆盖该特定账户的全局默认值。当所有 Telegram 机器人/账户应具有相同行为时使用全局设置。当不同机器人需要不同行为时使用每账户配置(例如,一个账户只处理私信,而另一个允许在群组中使用)。
channels.telegram.dmPolicy = "pairing"。未知发送者收到配对码;在批准之前消息被忽略(配对码 1 小时后过期)。openclaw pairing list telegramopenclaw pairing approve telegram <CODE>channels.telegram.allowFrom 接受数字用户 ID(推荐)或 @username 条目。这不是机器人用户名;使用人类发送者的 ID。向导接受 @username 并在可能时将其解析为数字 ID。更安全(无第三方机器人):
openclaw logs --follow 并查找 from.id。备选(官方 Bot API):
message.from.id:curl "https://api.telegram.org/bot<bot_token>/getUpdates"
第三方(隐私性较低):
@userinfobot 或 @getidsbot 并使用返回的用户 id。两个独立的控制:
1. 允许哪些群组(通过 channels.telegram.groups 的群组允许列表):
groups 配置 = 允许所有群组groups 配置 = 只允许列出的群组或 "*""groups": { "-1001234567890": {}, "*": {} } 允许所有群组2. 允许哪些发送者(通过 channels.telegram.groupPolicy 的发送者过滤):
"open" = 允许群组中的所有发送者发消息"allowlist" = 只有 channels.telegram.groupAllowFrom 中的发送者可以发消息"disabled" = 不接受任何群组消息
默认是 groupPolicy: "allowlist"(除非添加 groupAllowFrom 否则被阻止)。大多数用户需要:groupPolicy: "allowlist" + groupAllowFrom + 在 channels.telegram.groups 中列出特定群组
channels.telegram.webhookUrl 和 channels.telegram.webhookSecret(可选 channels.telegram.webhookPath)。0.0.0.0:8787,默认服务于 POST /telegram-webhook。channels.telegram.webhookUrl 指向公共端点。Telegram 通过标签支持可选的线程回复:
[[reply_to_current]] -- 回复触发消息。[[reply_to:<id>]] -- 回复特定消息 id。通过 channels.telegram.replyToMode 控制:
first(默认)、all、off。Telegram 区分语音备忘录(圆形气泡)和音频文件(元数据卡片)。 OpenClaw 默认使用音频文件以保持向后兼容性。
要在智能体回复中强制使用语音备忘录气泡,在回复中的任何位置包含此标签:
[[audio_as_voice]] — 将音频作为语音备忘录而不是文件发送。该标签会从发送的文本中去除。其他渠道会忽略此标签。
对于消息工具发送,设置 asVoice: true 并配合兼容语音的音频 media URL(当存在 media 时 message 是可选的):
{
action: "send",
channel: "telegram",
to: "123456789",
media: "https://example.com/voice.ogg",
asVoice: true,
}
OpenClaw 支持接收和发送 Telegram 贴纸,并具有智能缓存功能。
当用户发送贴纸时,OpenClaw 根据贴纸类型处理:
<media:sticker> 占位符。接收贴纸时可用的模板上下文字段:
Sticker — 包含以下属性的对象:emoji — 与贴纸关联的表情符号setName — 贴纸集名称fileId — Telegram 文件 ID(用于发送相同贴纸)fileUniqueId — 用于缓存查找的稳定 IDcachedDescription — 可用时的缓存视觉描述贴纸通过 AI 的视觉功能处理以生成描述。由于相同的贴纸经常重复发送,OpenClaw 缓存这些描述以避免冗余的 API 调用。
工作原理:
缓存位置: ~/.openclaw/telegram/sticker-cache.json
缓存条目格式:
{
"fileId": "CAACAgIAAxkBAAI...",
"fileUniqueId": "AgADBAADb6cxG2Y",
"emoji": "👋",
"setName": "CoolCats",
"description": "一只卡通猫热情地挥手",
"cachedAt": "2026-01-15T10:30:00.000Z"
}
优点:
缓存在接收贴纸时自动填充。无需手动缓存管理。
智能体可以使用 sticker 和 sticker-search 动作发送和搜索贴纸。这些默认禁用,必须在配置中启用:
{
channels: {
telegram: {
actions: {
sticker: true,
},
},
},
}
发送贴纸:
{
action: "sticker",
channel: "telegram",
to: "123456789",
fileId: "CAACAgIAAxkBAAI...",
}
参数:
fileId(必需)— 贴纸的 Telegram 文件 ID。从接收贴纸时的 Sticker.fileId 获取,或从 sticker-search 结果获取。replyTo(可选)— 要回复的消息 ID。threadId(可选)— 论坛话题的消息线程 ID。搜索贴纸:
智能体可以按描述、表情符号或集合名称搜索缓存的贴纸:
{
action: "sticker-search",
channel: "telegram",
query: "猫 挥手",
limit: 5,
}
返回缓存中匹配的贴纸:
{
ok: true,
count: 2,
stickers: [
{
fileId: "CAACAgIAAxkBAAI...",
emoji: "👋",
description: "一只卡通猫热情地挥手",
setName: "CoolCats",
},
],
}
搜索在描述文本、表情符号字符和集合名称之间使用模糊匹配。
带线程的示例:
{
action: "sticker",
channel: "telegram",
to: "-1001234567890",
fileId: "CAACAgIAAxkBAAI...",
replyTo: 42,
threadId: 123,
}
Telegram 可以在智能体生成响应时流式传输草稿气泡。
OpenClaw 使用 Bot API sendMessageDraft(不是真实消息),然后将最终回复作为普通消息发送。
要求(Telegram Bot API 9.3+):
message_thread_id(私有话题线程)。配置:
channels.telegram.streamMode: "off" | "partial" | "block"(默认:partial)partial:用最新的流式文本更新草稿气泡。block:以较大块(分块)更新草稿气泡。off:禁用草稿流式传输。streamMode: "block"):channels.telegram.draftChunk: { minChars?, maxChars?, breakPreference? }minChars: 200、maxChars: 800、breakPreference: "paragraph"(限制在 channels.telegram.textChunkLimit 内)。注意:草稿流式传输与分块流式传输(渠道消息)不同。
分块流式传输默认关闭,如果你想要早期 Telegram 消息而不是草稿更新,需要 channels.telegram.blockStreaming: true。
推理流(仅限 Telegram):
/reasoning stream 在回复生成时将推理流式传输到草稿气泡中,然后发送不带推理的最终答案。channels.telegram.streamMode 为 off,推理流被禁用。
更多上下文:流式传输 + 分块。出站 Telegram API 调用在遇到临时网络/429 错误时会以指数退避和抖动进行重试。通过 channels.telegram.retry 配置。参见重试策略。
telegram,使用 sendMessage 动作(to、content,可选 mediaUrl、replyToMessageId、messageThreadId)。telegram,使用 react 动作(chatId、messageId、emoji)。telegram,使用 deleteMessage 动作(chatId、messageId)。channels.telegram.actions.reactions、channels.telegram.actions.sendMessage、channels.telegram.actions.deleteMessage(默认:启用),以及 channels.telegram.actions.sticker(默认:禁用)。反应工作原理:
Telegram 反应作为单独的 message_reaction 事件到达,而不是消息负载中的属性。当用户添加反应时,OpenClaw:
message_reaction 更新"Telegram reaction added: {emoji} by {user} on msg {id}"智能体将反应视为对话历史中的系统通知,而不是消息元数据。
配置:
channels.telegram.reactionNotifications:控制哪些反应触发通知
"off" — 忽略所有反应"own" — 当用户对机器人消息做出反应时通知(尽力而为;内存中)(默认)"all" — 通知所有反应channels.telegram.reactionLevel:控制智能体的反应能力
"off" — 智能体不能对消息做出反应"ack" — 机器人发送确认反应(处理时显示 👀)(默认)"minimal" — 智能体可以少量反应(指导:每 5-10 次交换 1 次)"extensive" — 智能体可以在适当时自由反应论坛群组: 论坛群组中的反应包含 message_thread_id,使用类似 agent:main:telegram:group:{chatId}:topic:{threadId} 的会话键。这确保同一话题中的反应和消息保持在一起。
示例配置:
{
channels: {
telegram: {
reactionNotifications: "all", // 查看所有反应
reactionLevel: "minimal", // 智能体可以少量反应
},
},
}
要求:
allowed_updates 中明确请求 message_reaction(由 OpenClaw 自动配置)allowed_updates 中getUpdates allowed_updates 中123456789)或用户名(@name)作为目标。openclaw message send --channel telegram --target 123456789 --message "hi"。机器人不响应群组中的非提及消息:
channels.telegram.groups.*.requireMention=false,Telegram 的 Bot API 隐私模式必须禁用。/setprivacy → Disable(然后从群组中移除并重新添加机器人)openclaw channels status 在配置期望未提及群组消息时显示警告。openclaw channels status --probe 可以额外检查显式数字群组 ID 的成员资格(它无法审计通配符 "*" 规则)。/activation always(仅会话级别;使用配置以持久化)机器人完全看不到群组消息:
channels.telegram.groups,群组必须被列出或使用 "*"openclaw logs --follow(查找"skipping group message")机器人响应提及但不响应 /activation always:
/activation 命令更新会话状态但不持久化到配置channels.telegram.groups 并设置 requireMention: false像 /status 这样的命令不起作用:
channels.telegram.allowFrom)groupPolicy: "open" 的群组中,命令也需要授权长轮询在 Node 22+ 上立即中止(通常与代理/自定义 fetch 有关):
AbortSignal 实例更严格;外部信号可以立即中止 fetch 调用。机器人启动后静默停止响应(或日志显示 HttpError: Network request ... failed):
api.telegram.org 解析为 IPv6。如果你的服务器没有可用的 IPv6 出口,grammY 可能会卡在仅 IPv6 的请求上。api.telegram.org 使用 IPv4 解析来修复(例如,使用 IPv4 A 记录添加 /etc/hosts 条目,或在你的 OS DNS 堆栈中优先使用 IPv4),然后重启 Gateway 网关。dig +short api.telegram.org A 和 dig +short api.telegram.org AAAA 确认 DNS 返回的内容。完整配置:配置
提供商选项:
channels.telegram.enabled:启用/禁用渠道启动。channels.telegram.botToken:机器人 token(BotFather)。channels.telegram.tokenFile:从文件路径读取 token。channels.telegram.dmPolicy:pairing | allowlist | open | disabled(默认:pairing)。channels.telegram.allowFrom:私信允许列表(id/用户名)。open 需要 "*"。channels.telegram.groupPolicy:open | allowlist | disabled(默认:allowlist)。channels.telegram.groupAllowFrom:群组发送者允许列表(id/用户名)。channels.telegram.groups:每群组默认值 + 允许列表(使用 "*" 作为全局默认值)。channels.telegram.groups.<id>.requireMention:提及门控默认值。channels.telegram.groups.<id>.skills:skill 过滤器(省略 = 所有 skills,空 = 无)。channels.telegram.groups.<id>.allowFrom:每群组发送者允许列表覆盖。channels.telegram.groups.<id>.systemPrompt:群组的额外系统提示。channels.telegram.groups.<id>.enabled:为 false 时禁用群组。channels.telegram.groups.<id>.topics.<threadId>.*:每话题覆盖(与群组相同的字段)。channels.telegram.groups.<id>.topics.<threadId>.requireMention:每话题提及门控覆盖。channels.telegram.capabilities.inlineButtons:off | dm | group | all | allowlist(默认:allowlist)。channels.telegram.accounts.<account>.capabilities.inlineButtons:每账户覆盖。channels.telegram.replyToMode:off | first | all(默认:off)。channels.telegram.textChunkLimit:出站分块大小(字符)。channels.telegram.chunkMode:length(默认)或 newline 在长度分块之前按空行(段落边界)分割。channels.telegram.linkPreview:切换出站消息的链接预览(默认:true)。channels.telegram.streamMode:off | partial | block(草稿流式传输)。channels.telegram.mediaMaxMb:入站/出站媒体上限(MB)。channels.telegram.retry:出站 Telegram API 调用的重试策略(attempts、minDelayMs、maxDelayMs、jitter)。channels.telegram.network.autoSelectFamily:覆盖 Node autoSelectFamily(true=启用,false=禁用)。在 Node 22 上默认禁用以避免 Happy Eyeballs 超时。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.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)。相关全局选项:
agents.list[].groupChat.mentionPatterns(提及门控模式)。messages.groupChat.mentionPatterns(全局回退)。commands.native(默认为 "auto" → Telegram/Discord 开启,Slack 关闭)、commands.text、commands.useAccessGroups(命令行为)。使用 channels.telegram.commands.native 覆盖。messages.responsePrefix、messages.ackReaction、messages.ackReactionScope、messages.removeAckAfterReply。