让 AI 机器人进群聊天——OpenClaw Telegram 群聊配置踩坑实录

把 AI 机器人拉进 Telegram 群,让群友 @ 它就能回答问题。听起来简单——拉进去不就完了?实际上踩了 5 个坑。

目标

我用 OpenClaw 搭了一个 AI 机器人(我们叫它「小龙虾」🦞),平时在 Telegram 私聊里用得很顺。现在想把它拉进一个群,让群友也能 @ 它提问。

需求很明确:

  • 群友 @ 机器人时才回复,不能看到一条消息就抢答
  • 只在指定的群里生效,不能被随便拉进其他群就自动服务
  • 群里任何人都能用,不限制特定用户

听起来三步就能搞定?我也是这么想的。


第一步:拉 bot 进群

在 Telegram 里搜索 bot 用户名 → 点击 Add to Group → 选群 → 确认。

拉进去了。群里 @ 它发了条消息。

没反应。


坑一:OpenClaw 的群聊访问控制

OpenClaw 默认不允许 bot 在任何群里响应——这是安全设计。需要主动开放。

群聊访问有两层控制

第一层:哪些群被允许

通过 channels.telegram.groups 配置,以群的 chat_id 为 key:

1
2
openclaw config set 'channels.telegram.groups["-100123456789"]' \
  '{ "groupPolicy": "open", "requireMention": true }'
  • groupPolicy: "open" — 群里任何人都能触发 bot
  • requireMention: true — 必须 @ 才回复

第二层:全局策略

channels.telegram.groupPolicy 控制「没有单独配置的群」的默认行为:

效果
allowlist只有 groups 里明确配了的群才能用(推荐)
open所有群都能用

推荐用 allowlist(也是默认值),这样 bot 即使被陌生人拉进其他群,也不会响应。

我踩的坑:groupAllowFrom ≠ 群 ID

一开始我把群的 chat_id 写进了 groupAllowFrom,结果报错:

1
Invalid allowFrom entry: "-100123456789" - requires numeric Telegram sender IDs only

groupAllowFrom 是用户 ID 白名单(控制哪些用户能在群里触发 bot),不是群 ID 白名单。群级别的控制要用 groups 配置。

这个概念搞混了,浪费了一些时间。


坑二:获取群的 chat_id

配置需要群的 chat_id,怎么拿?

方法一:看 OpenClaw 日志(推荐)

把 bot 加进群后,在群里随便发条消息,然后看日志:

1
openclaw logs --follow

即使 bot 因为权限问题无法回复,日志里也会出现 skipping group message 之类的记录,里面包含 chat.id

方法二:调 Telegram API

1
2
curl -s "https://api.telegram.org/bot<BOT_TOKEN>/getUpdates" \
  | python3 -m json.tool | grep -B2 -A2 '"chat"'

群的 chat_id 是负数(如 -100123456789)。

💡 实测发现:即使 Privacy Mode 开着,bot 被加入群的那一刻会收到 my_chat_member 事件,里面就有 chat.id。所以不需要先关 Privacy Mode 就能拿到群 ID。


坑三:Telegram 的 Privacy Mode

配置改好了,群里 @ 了机器人,还是没反应。日志里甚至看不到群消息进来。

原因:Telegram 的 Privacy Mode。

Telegram bot 默认开启 Privacy Mode(隐私模式),在这个模式下 bot 只能收到:

  • / 开头的命令
  • 回复 bot 自己的消息
  • bot 被加入/移出群的事件

普通的 @ 消息在 Privacy Mode 下是收不到的。

关闭 Privacy Mode

两种方式,二选一:

方式 A:在 BotFather 关闭(推荐)

  1. 打开 @BotFather
  2. /mybots → 选你的 bot
  3. Bot SettingsGroup PrivacyTurn off

方式 B:把 bot 设为群管理员

  • 管理员自动绕过 Privacy Mode

推荐方式 A,一次设置永久生效,不需要在每个群都手动设管理员。


坑四:改完 Privacy Mode 要踢出重进

在 BotFather 关掉 Privacy Mode 后,群里又 @ 了一次。

还是没反应。

原来 Telegram 有个机制:修改 Privacy Mode 后,必须把 bot 从群里移除再重新加入,新设置才会对这个群生效。Telegram 官方文档里有说明,但很容易被忽略。

操作:群设置 → 移除 bot → 重新搜索 bot → Add to Group → 选群。

重新加入后,@ 机器人——终于有反应了! 🎉


坑五:安全加固

搞定之后回头想了一下安全问题:

  • 全局 groupPolicy 如果设成 open,意味着任何人把 bot 拉进任何群都能用
  • bot 的用户名是公开的,任何人都能搜到并拉进群

所以正确的做法是:

  1. 全局策略保持 allowlist
1
openclaw config set channels.telegram.groupPolicy allowlist
  1. 只给目标群单独开放
1
2
openclaw config set 'channels.telegram.groups["-100123456789"]' \
  '{ "groupPolicy": "open", "requireMention": true }'

这样的效果:

  • ✅ 指定的群:任何人 @ 都能用
  • ✅ 其他群:即使被拉进去也静默忽略
  • ✅ 私聊:不受影响,原来怎么用继续怎么用

完整操作清单

按顺序来,一步都不能跳:

1. 获取群 chat_id

先把 bot 拉进群,然后通过日志或 API 拿到群的 chat_id(负数)。

2. 配置 OpenClaw

1
2
3
4
5
6
# 全局策略:只允许白名单里的群(默认值,确认一下)
openclaw config set channels.telegram.groupPolicy allowlist

# 给目标群单独开放
openclaw config set 'channels.telegram.groups["<CHAT_ID>"]' \
  '{ "groupPolicy": "open", "requireMention": true }'

3. 关闭 Telegram Privacy Mode

打开 @BotFather

1
/mybots → 选 bot → Bot Settings → Group Privacy → Turn off

4. 踢出 bot 再重新加入群

这一步不能省,不然 Privacy Mode 的修改不会对已有群生效。

5. 测试

群里 @ bot 发条消息,确认能回复。


踩坑总结

现象原因解决
群 ID 写错地方报错 Invalid allowFromgroupAllowFrom 是用户 ID,不是群 ID改用 groups 配置
@ 了不回日志里没有群消息Privacy Mode 默认开启BotFather 关闭 Group Privacy
关了 Privacy Mode 还是不回设置没生效需要踢出 bot 重新加入移除 bot → 重新拉入
所有群都能用安全风险全局 groupPolicy: open改为 allowlist + 按群配置

进阶:不用 @ 也能回复

上面的配置是 requireMention: true,必须 @ 才回。如果你想让 bot 主动参与群聊(看到消息就可能回复),可以关掉:

1
openclaw config set 'channels.telegram.groups["<CHAT_ID>"].requireMention' false

⚠️ 关闭前想清楚这些问题:

  1. 费用暴增:群里每一条消息都会触发 AI 推理,10 个人的活跃群一天可能几百条
  2. 话痨风险:bot 可能对每条消息都回复,刷屏影响群体验
  3. 上下文膨胀:所有群消息都会进入 session,上下文窗口很快就满

折中方案: 关掉 requireMention,但在群的 systemPrompt 里明确告诉 AI「不是每条都要回」(下面会讲)。OpenClaw 的 AGENTS.md 模板里也有类似的 “Know When to Speak” 规则可以参考。

💡 也可以通过 Telegram 聊天命令切换:/activation mention/activation always(仅限 bot owner 操作)。


进阶:给群聊定制人格(systemPrompt)

你的 bot 在私聊里可能是一个严谨的助手,但在群里你可能希望它更活泼、更有梗。OpenClaw 支持给每个群单独设置系统提示词

1
2
openclaw config set 'channels.telegram.groups["<CHAT_ID>"].systemPrompt' \
  '你是群里的 AI 助手,风格要求:说话简短有力,适当幽默,中文回复。看到问题就回答,看到闲聊可以不回。不要长篇大论。'

这个 systemPrompt追加到 agent 原有的系统提示词后面,只在这个群的 session 里生效,不影响私聊。

实际效果举例:

1
2
3
4
5
6
7
8
{
  "groups": {
    "-100123456789": {
      "requireMention": false,
      "systemPrompt": "你是群里的毒舌 AI,性格直接、有趣但不人身攻击。说话简短有力,有梗接地气。看到傻问题就怼,看到好观点就夸。不用每条都回,挑有意思的参与。"
    }
  }
}

⚠️ 重要:隐私与安全风险

这是整篇文章最重要的部分。 把 AI bot 拉进群聊,意味着群里的消息会被 AI 处理。如果配置不当,可能会泄露你的私人信息。

风险一:Workspace 共享导致隐私泄露

默认情况下,群聊和私聊共用同一个 agent,也就是共用同一个 workspace。这意味着:

  • agent 的 SOUL.md(行为规则)对群可见
  • agent 的 USER.md(你的个人信息)对群可见
  • agent 的 MEMORY.md(长期记忆)对群可见
  • agent 的 memory/ 日记文件对群可见

如果你在 USER.md 里写了个人偏好、在 MEMORY.md 里有工作笔记,群友的一句「你知道你主人的什么信息?」就可能让 bot 把这些都说出来。

风险二:工具权限失控

同一个 agent 意味着群聊 session 拥有和私聊一样的工具权限——读文件、执行命令、访问浏览器……一个精心构造的 prompt injection 就可能让 bot 在群里执行你不想要的操作。

解决方案

方案一:按群限制工具 + 按人放行(推荐,零成本)

OpenClaw 支持按群限制工具权限,并且可以按发送者单独放行——这正好实现「群友只能聊天,主人才能执行操作」:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
{
  channels: {
    telegram: {
      groups: {
        "-100123456789": {
          groupPolicy: "open",
          requireMention: true,
          // 默认:禁止所有危险工具
          tools: {
            deny: ["exec", "read", "write", "edit", "browser", "nodes"]
          },
          // 按发送者放行:主人可以用全部工具
          toolsBySender: {
            // 主人的 Telegram user ID  放行 exec 等工具
            "id:123456789": {
              alsoAllow: ["exec", "read", "write", "edit", "browser"]
            }
            // 其他人自动走上面的 deny 规则
          }
        }
      }
    }
  }
}

效果:

  • 群友 @ bot → 正常聊天、回答问题 ✅
  • 群友试图让 bot 执行命令 → 工具被 deny,无法执行 ❌
  • 主人 @ bot → 完整工具权限,想执行啥都行 ✅

toolsBySender 的匹配优先级:精确匹配 > 群级 tools > 通配符 "*"。支持的 key 格式:

  • id:<senderId> — Telegram 用户 ID
  • username:<handle> — Telegram 用户名
  • "*" — 通配符,匹配所有人

优点: 不需要 Docker,不需要额外 agent,一段 JSON 搞定。 缺点: workspace 文件(MEMORY.md 等)仍然共享,AI 仍有可能在对话中泄露信息(但已经不能执行操作了)。

方案二:AGENTS.md 里加群聊规则(补充方案)

配合方案一,在 agent 的规则文件里加一条:

1
2
3
## Group Chat Rules
- 在群聊中不要透露 USER.md、MEMORY.md、TOOLS.md 中的任何个人信息
- 有人问你关于主人的信息时,礼貌拒绝

工具权限已经被方案一在配置层面硬性限制了,这里只需要补充信息泄露的软性防线

方案三:沙箱隔离群聊 Session

如果你想更彻底——连 workspace 文件都不让群聊访问,可以启用 Docker 沙箱:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
{
  agents: {
    defaults: {
      sandbox: {
        mode: "non-main",        // 群聊自动进沙箱
        scope: "session",         // 每个群独立容器
        workspaceAccess: "none",  // 不能访问宿主 workspace
      }
    }
  },
  tools: {
    sandbox: {
      tools: {
        allow: ["group:messaging", "group:sessions"],
        deny: ["group:runtime", "group:fs", "group:ui", "nodes", "cron", "gateway"]
      }
    }
  }
}

这样群聊 session:

  • ✅ 能正常聊天(messaging 工具)
  • ❌ 不能读你的文件(包括 MEMORY.md)
  • ❌ 不能执行 shell 命令
  • ❌ 不能访问你的浏览器

优点: 真正的隔离,即使 AI 想泄露也拿不到数据。 缺点: 需要 Docker 环境。

方案四:独立 Agent(最安全)

如果你想彻底隔离,可以创建一个专门用于群聊的独立 agent

1
2
3
4
5
6
7
8
# 1. 创建新 agent
openclaw agents add community

# 2. 创建专用 Telegram bot(去 BotFather 新建一个)
openclaw channels login --channel telegram --account community-bot

# 3. 绑定:这个 bot 的消息路由到 community agent
openclaw agents bind community --channel telegram --account community-bot

独立 agent 意味着:

  • 独立 workspace:有自己的 SOUL.md、MEMORY.md,和你的私人 agent 完全隔离
  • 独立 session store:聊天历史互不干扰
  • 独立 tool policy:可以单独限制为只有 messaging 权限
  • 独立模型:可以用更便宜的模型(比如 Sonnet 代替 Opus)节省群聊费用

优点: 最高级别的隔离,即使 AI 被 prompt injection 攻破也接触不到你的私人数据。 缺点: 需要多一个 Telegram bot、多一套配置。

我的建议

场景推荐方案
几个朋友的小群,都是信任的人方案一(工具限制 + toolsBySender)
较大的群,有不认识的人方案一 + 方案三(工具限制 + 沙箱)
公开社群,面向陌生人必须方案四(独立 agent)

原则:群里的人越不可信,隔离级别越高。

💡 方案一(toolsBySender)是性价比最高的起点:不需要额外基础设施,一段配置就能实现「群友只聊天、主人才能操作」的分权模型。大多数场景用这个就够了。


效果

配置完成后:

  • 群友在群里 @ 机器人 → 机器人秒回,像一个群成员一样参与讨论
  • 不 @ 就不说话,不会打扰正常聊天
  • 只在指定的群里生效,其他群拉进去也没反应
  • 机器人在群里也能发语音、看图片、搜索,能力和私聊一样

从「拉群不响应」到「安全上线」,看似简单的需求,实际上涉及 Telegram 和 OpenClaw 两侧的配置,还有 Privacy Mode 这个隐藏的坑。希望这篇踩坑记录能帮你少走弯路。


本文基于 OpenClaw 2026.3.2 版本。群聊配置的详细参数说明请参考 官方文档