一、背景
我有三个 bot,公仔(公司公众号运营)、作家(个人公众号运营和博客运营)、赫妹(小红书运营),都跑在同一个 Hermes 里,各自一个 profile,进程、session、数据库全隔离,有一些创作思路和规则,我希望他们能互通消息,传达我的想法,而不需要我每次都重复转发。
结合之前已经跑通的 openclaw agent 飞书群互相 @,已验证飞书端是支持的。建立「自媒体实验室」飞书群,实现此 Hermes profile 互相 @。
二、给 bot 开通权限(群聊接收机器人消息)
Hermes 每个 profile 对应一个飞书 bot。飞书默认不允许 bot 收到群聊里其它 bot 发的消息——这是安全默认值,没加这个权限,allow_bots=mentions 白改了。
进飞书开放平台 → 找到对应的 bot app(每个 profile 一个)→ 权限管理 → 搜 im:message.group_at_msg.include_bot → 申请 readonly → 等管理员审批。
踩坑提示:每个 bot 都要单独开一次,三个 bot 都没开权限前,allow_bots 不生效,群里 bot 互发消息会直接掉进黑洞。
每个 bot 都要单独开一次,三个 bot 都开通后才能形成 bot↔bot 的完整闭环。
三、拿到群聊 id
开工前先把群 id 拿到,后面步骤都要用。
打开 PC 端飞书 → 进群 → 点群名 → 右上角"···" → 群设置 → 页面最下面"会话 ID"旁边的 oc_xxx 串就是 chat_id。
注:手机端飞书(鸿蒙 / iOS / Android)实测没找到稳定的入口,建议优先用 PC 端。
我这次拿到的是 oc_ad**83**85**ce**46**07**2f**24**(自媒体实验室)。
四、安装 lark-cli
把这句话发给要任何一个 profile:
帮我安装飞书 CLI:https://open.feishu.cn/document/no_class/mcp-archive/feishu-cli-installation-guide.md
其它需要使用 lark-cli 的 profile 发送这句:
查看如何使用本机安装的 lark-cli:https://open.larkoffice.com/document/mcp_open_tools/feishu-cli-let-ai-actually-do-your-work-in-feishu.md
profile 会按官方文档自动装完。lark-cli 的功能主要用到两个,查询群聊中 bot 的 open_id、profile 主动发送消息到群聊中。
五、身份识别,拿 bot 的 open_id
每个 bot 在群里都有 open_id,飞书用它识别 sender:
lark-cli api GET /open-apis/im/v1/chats/oc_ad**83**85**ce**46**07**2f**24**/members/bots \
--params '{"member_id_type":"open_id"}'
查出来我们家三个 bot 的 id:
| Bot | open_id |
|---|---|
| 公仔 | ou_03**63**cd**f0**78**4f**c8**b7** |
| 作家 | ou_76**6d**ee**c1**aa**42**1c**51** |
| 赫妹 | ou_9d**1b**07**48**26**5b**fd**a5** |
收消息时看 sender 字段前缀:user: 是真用户,bot: 是 bot。
六、消息接收,每个 profile 放行 bot 消息
Hermes 的飞书 adapter 默认会把 bot 发的消息挡掉。每个 profile 改一行 + 重启:
hermes config set platforms.feishu.allow_bots "mentions" --force
pkill -KILL -f "profile <profile_name> gateway run"
# setsid nohup 重启 gateway
allow_bots 三个值:none 拒收(默认),mentions bot @ 才收(推荐),all 全收(易刷屏)。
七、消息回复与主动发送消息到群聊,at 标签是核心
发送路径有两条,看你场景:
方式 A:正常回复(不需要 lark-cli)
在群里跟 bot 对话时,bot 自己回复里直接用 at 标签就行。at 标签必须带 user_id 结构化字段,飞书只认这个,裸 @名字 会被当纯文本处理:
<at user_id="ou_76**6d**ee**c1**aa**42**1c**51**">@作家</at> 测试
Hermes 网关会把 <at user_id=...> 转成飞书的 mentions 结构化字段,作家 profile 收到时 mentions 字段能识别。
方式 B:用 lark-cli(主动发消息时才用)
绕过 bot,定时播报、脚本通知、批量发送这种场景,用 lark-cli 直接发:
lark-cli api POST /open-apis/im/v1/messages \
--params '{"receive_id_type":"chat_id"}' \
--data '{
"receive_id": "oc_ad**83**85**ce**46**07**2f**24**",
"msg_type": "text",
"content": "{\"text\":\"<at user_id=\\\"ou_76**6d**ee**c1**aa**42**1c**51**\\\">@作家</at> 联调\"}"
}'
两种方式最终都到同一个 webhook,at 标签的 user_id 才是触发对方识别的关键,跟走哪条路没关系。
示例代码里的 id 是脱敏版。读者复制粘贴后直接运行会返 230001/230002/230006 参数错——oc_xxx 替换为自己的群 chat_id,ou_xxx 替换为 bot 真实 open_id。
八、让 profile 记住使用方法
把三个 bot 的 id、消息判定、at 标签格式、如何 @ 其它 bot 写进 skill(skills/social-media/feishu-bot-chat/),Hermes profile 用久了主动 memory 会满,有用的规则也会被精简或者丢弃。
九、关键细节
- at 标签是渲染前提,不是触发机制,飞书只认 user_id
- 每个 profile 独立改一次 allow_bots,缺一不可
- 重启 gateway 是必选,allow_bots 在 init 时一次性读
- 三个 bot 都要开通
im:message.group_at_msg.include_bot,不开 allow_bots 不生效
文章评论