Telegram 接入
OpenClaw 通过 grammY 框架支持 Telegram Bot API,覆盖私聊和群组场景,默认使用长轮询,也支持 Webhook。
快速开始
- 在 Telegram 中找到 @BotFather,运行
/newbot创建机器人并复制 Token。 - 配置 Token(环境变量或配置文件,配置文件优先)。
- 启动 Gateway。
- 私信机器人,默认触发配对码流程,审批后即可对话。
# 环境变量方式
export TELEGRAM_BOT_TOKEN="123:abc"
# 或配置文件 ~/.openclaw/openclaw.json
{
channels: {
telegram: {
enabled: true,
botToken: "123:abc",
dmPolicy: "pairing"
}
}
}隐私模式与群组权限
Telegram 机器人默认开启隐私模式,只能收到 @提及和命令消息。如果需要机器人看到所有群组消息:
- 方法一:在 @BotFather 中
/setprivacy→ Disable - 方法二:将机器人设为群组管理员(管理员始终可见所有消息)
切换隐私模式后,需要把机器人移出群组再重新添加才能生效。
私聊访问控制
通过 channels.telegram.dmPolicy 控制谁可以私聊机器人:
| 策略 | 行为 |
|---|---|
| pairing | 默认。未知用户收到配对码,管理员审批后可对话 |
| allowlist | 仅 allowFrom 中的用户可对话 |
| open | 任何人可对话(需设 allowFrom: ["*"]) |
| disabled | 禁止所有私聊 |
# 查看/审批配对码
openclaw pairing list telegram
openclaw pairing approve telegram <CODE>allowFrom 支持数字用户 ID(推荐)或 @username。获取用户 ID 最安全的方式: 启动 Gateway 后私信机器人,然后 openclaw logs --follow 查看 from.id。
群组配置
两个维度控制群组行为:
1. 群组允许列表
- 未配置
groups:允许所有群组 - 配置了
groups:只允许列出的群组或"*"
2. 发送者过滤
groupPolicy: "open"— 允许群组中所有人groupPolicy: "allowlist"— 仅groupAllowFrom中的用户(默认)groupPolicy: "disabled"— 禁用群组
{
channels: {
telegram: {
groups: {
"-1001234567890": { requireMention: false }, // 此群无需@
"*": { requireMention: true } // 其他群需要@
},
groupPolicy: "allowlist",
groupAllowFrom: ["123456789"]
}
}
}论坛话题继承父群组配置,也可在 groups.<id>.topics.<threadId> 下单独覆盖。
流式传输(草稿)
Telegram 支持在私聊中流式显示机器人的回复草稿(需要在 @BotFather 中启用论坛话题模式)。
| streamMode | 行为 |
|---|---|
| partial | 默认。实时更新草稿气泡 |
| block | 按较大块更新草稿 |
| off | 禁用草稿流式传输 |
草稿流式仅限私信;群组和频道不支持。
命令与内联按钮
OpenClaw 启动时自动向 Telegram 注册原生命令(/status、/reset、/model 等)。也可添加自定义命令:
{
channels: {
telegram: {
customCommands: [
{ command: "backup", description: "Git 备份" },
{ command: "generate", description: "生成图片" }
]
}
}
}自定义命令仅注册菜单条目,不会自动实现逻辑。命令名只能包含 a-z、0-9、_。
Telegram 还支持内联按钮(capabilities.inlineButtons),可选作用域:off、dm、group、all、allowlist(默认)。
表情反应
Telegram 反应作为独立事件到达,OpenClaw 将其转换为系统通知注入会话上下文。
| 配置项 | 选项 |
|---|---|
| reactionNotifications | off | own(默认) | all |
| reactionLevel | off | ack(默认) | minimal | extensive |
长轮询 vs Webhook
默认使用长轮询,无需公网 URL。如需 Webhook 模式:
{
channels: {
telegram: {
webhookUrl: "https://yourdomain.com/telegram-webhook",
webhookSecret: "your-secret"
}
}
}本地监听器绑定 0.0.0.0:8787,默认路径 POST /telegram-webhook。
限制
- 出站文本按
textChunkLimit分块(默认 4000 字符) - 可设
chunkMode: "newline"按段落边界分割 - 媒体受
mediaMaxMb限制(默认 5 MB) - API 请求超时
timeoutSeconds(默认 500 秒) - 群组历史上下文
historyLimit(默认 50 条)
常见问题
机器人不响应群组中的非提及消息
- 确认已在 @BotFather 中
/setprivacy→ Disable - 从群组中移除并重新添加机器人
- 快速测试:在群组中发送
/activation always
setMyCommands failed
通常是到 api.telegram.org 的出站 HTTPS/DNS 被阻止。
启动后静默停止响应
可能是 IPv6 解析问题。检查 dig +short api.telegram.org AAAA, 必要时在 /etc/hosts 中添加 IPv4 记录或优先 IPv4 解析。
命令不工作
确保用户已通过配对或在 allowFrom 中。即使群组 groupPolicy: "open",命令也需要授权。
注意事项
- Token 泄露后立即在 @BotFather 中撤销并更新配置
- 生产环境务必使用
pairing或allowlist策略 - 多账户通过
channels.telegram.accounts配置 - 出站 API 调用支持指数退避重试(
channels.telegram.retry)