Chatto机器人开发实战:Bot Accounts、Webhook与最小权限RBAC配置指南
【免费下载链接】chattoA fully-featured team and group chat application that you can easily selfhost.项目地址: https://gitcode.com/gh_mirrors/chatt/chatto
Chatto 是一款功能完整、可自托管的开源团队群聊应用,而Bot Accounts(机器人账号)正是它自动化集成的核心。本文将带你完成 Chatto 机器人开发实战:创建机器人账号、配置最小权限 RBAC、接入入站与出站 Webhook,并了解如何搭建一个能自动回复消息的 AI 机器人。
三种机器人接入方式:Bot 账号、入站 Webhook 与出站 Webhook
在 Chatto 中,机器人本质上是一个"可见的自动化用户账号"(Bot Account)。它和普通成员一起出现在频道与成员列表中,名字后带BOT徽标,但从不通过登录表单登录,而是使用 API 密钥认证。围绕它有三种常见接入方式:
| 方式 | 方向 | 适用场景 |
|---|---|---|
| Bot 账号 + API 密钥 | 双向 | 长期运行的自动回复、AI 机器人 |
| 入站 Webhook(Incoming) | 外部系统 → Chatto | 让 Grafana 告警、CI 构建结果直接发进频道 |
| 出站 Webhook(Outbound) | Chatto → 外部系统 | 被 @提及 或收到私信时,通知你的服务 |
关键设计:机器人默认零权限。它不继承everyone基线角色,也不继承任何命名角色,所有能力都必须通过显式授权获得——这正是"最小权限 RBAC"的起点。
Bot 账号创建步骤:从注册到生成 API 密钥
- 打开服务器管理 → Bots,选择Create Bot;
- 输入用户名和显示名称(机器人与人类使用相同的用户名规则);
- 复制生成的 API 密钥——密钥只展示一次,关闭对话框后无法再次查看;
- 进入机器人详情页的Permissions面板,按服务器、房间组或单个房间维度启用所需权限;
- 在权限矩阵顶部的Joined行勾选房间,将机器人加入目标频道。
管理权限要点:
- 新服务器默认每个成员都拥有
bot.create权限,创建者自动成为机器人所有者,并始终可以管理自己的机器人; - 拥有
bot.manage的管理员可以管理所有机器人,甚至通过Reassign owner转移所有权(权限允许列表与密钥均保留); - 每个机器人最多可持有20 个命名 API 密钥,建议每个集成项目单独建一个密钥,方便独立轮换与吊销。
API 请求中使用 Bearer 格式认证:
Authorization: Bearer cht_BK_…最小权限 RBAC 配置:只给 Bot 需要的权限
消息读取权限怎么选
机器人加入房间≠能读消息,必须显式授予读取权限:
| 权限 | 效果 |
|---|---|
message.read | 读取房间内所有消息(包含下方窄权限) |
message.read-interactions | 仅读取机器人发起的线程、直接 @提及 它的线程,以及包含它的私信 |
消息发送权限怎么选
| 权限 | 效果 |
|---|---|
message.post | 发布根消息与线程回复 |
message.post-in-thread | 在任意可读线程中回复 |
message.post-in-interactions | 仅在与自身相关的线程中回复 |
🎯 推荐组合:让机器人"只在与它对话时回复"的 AI 机器人,授予message.read+message.post-in-interactions即可,这是最安全的最小配置。
理解"所有者权限上限"
Chatto 的 RBAC 采用"显式允许列表 + 动态上限"模型:机器人权限只有在其人类所有者在同一范围也拥有该权限时才生效。如果所有者被收回某项权限,机器人会立即失去对应能力;所有者日后重新获得该权限,已保存的授权会自动恢复。被上限锁住的权限在编辑界面会显示为锁定状态,方便排查"授权了却不生效"的问题。
完整规则参见 FDR-038 机器人账号 与 FDR-001 角色与权限。
入站 Webhook 配置:让 Grafana 等外部系统直接发消息
入站 Webhook 让外部工具无需 API 密钥就能以机器人身份发帖,非常适合部署通知与监控告警:
- 打开机器人详情页 →Integrations → Create Webhook;
- 输入能识别调用方的名称,可选择目标频道(Chatto 会把房间 ID 拼进 URL);
- 复制完整 URL——同样只展示一次。
外部系统发送 Slack 兼容的 JSON 即可发帖:
POST /webhooks/incoming/YOUR_WEBHOOK_CREDENTIAL Content-Type: application/json {"text":"部署完成","room_id":"YOUR_ROOM_ID"}注意事项:
- 每次请求都必须带房间 ID(不是房间名),且机器人必须是该房间成员并持有
message.post; - Webhook 没有幂等键,重试可能产生重复消息;
- URL 本身就是凭据,请配置反向代理时对该路径脱敏。
Grafana 告警零改造接入:Grafana 默认 Webhook 负载的message字段可被 Chatto 直接识别,firing 与 resolved 状态会分别发为独立消息,无需自定义模板。常见响应排查:400 invalid_payload(JSON 字段不完整)、404 channel_not_found(机器人未加入房间或无发帖权限)、401 invalid_token(凭据已失效)。
出站 Webhook 配置:接收 @提及 和私信的机器人
出站 Webhook 在有人直接 @机器人或在包含机器人的私信中发言时,向你的服务发送 HTTP 请求:
- 在Integrations → Outbound webhooks中点击Create webhook,填写名称与目标 URL(要求公网 HTTPS);
- 复制签名密钥(仅展示一次),用于校验请求来源。
请求体结构固定,核心字段如下:
{ "version": 1, "id": "stable-delivery-id", "type": "message.created", "triggers": ["direct_message", "mention"], "message": { "id": "msg-id", "body": "Hello @helper_bot" } }校验 Webhook 签名防止伪造请求
Chatto 会附带三个请求头:Chatto-Webhook-Id(投递 ID)、Chatto-Webhook-Timestamp(Unix 秒)、Chatto-Webhook-Signature(v1=+ HMAC-SHA256 十六进制值)。验证流程:
- 以签名密钥的 UTF-8 原文(不要 Base64 解码)计算
HMAC-SHA256(时间戳 + "." + 请求体原始字节); - 用恒定时间方式比较结果;
- 拒绝过旧的时间戳(例如超过 5 分钟);
- 用投递 ID 去重——重试会携带相同 ID 与新时间戳。
重试策略:传输失败与非 2xx 响应会触发重试,默认24 小时内最多 5 次,间隔从 30 秒指数增长到 30 分钟。投递是尽力而为的,服务重启会丢弃待处理请求,因此接收端务必按投递 ID 做幂等处理。
实战案例:用 Runling 构建 AI 自动回复机器人
仓库内置了一个完整的机器人开发示例 examples/runling-bot/:它通过出站 Webhook 接收消息,调用 AI 模型生成回复,再通过 Chatto API 发回对应线程——根消息会开新线程,线程内消息在原线程回复,机器人消息会被忽略以防止自触发循环。
# 配置模型密钥后,从仓库根目录一键启动 Chatto 与机器人 mise dev # 然后在 general 频道发送 "@test_bot Hello Runling" 即可看到回复如果不想暴露公网 URL,还可以用 packages/chatto-bot-client/ 提供的 SDK 直接通过实时 WebSocket 订阅事件:
const client = createChattoClient({ serverUrl, apiKey }); const bot = await createBotClient(client, { signal }); await client.consumeRealtime({ onEvent: async (event) => { const message = await bot.addressedMessage(event, { signal }); if (message) await bot.reply(message, '你好,我是 Chatto 机器人', signal); }, });SDK 内置了投递去重(createDeliveryTracker)、@提及 / 私信 / 回复识别与线程上下文读取等机器人惯例,大幅减少样板代码。更完整的 AI 对话机器人(含网络搜索、源码调查)可参考 packages/chattobot/。
机器人凭据安全清单
- 🔑 API 密钥与 Webhook URL 等同密码:不进版本库、日志、截图与工单;
- 🔑 密钥永不过期,撤销是唯一失效手段——先建新密钥、迁移集成、再吊销旧密钥;
- 🔑 机器人不能发起私信(这是账号类型硬规则,无法用权限绕过),必须由人类先发起包含机器人的 DM;
- 🔑 机器人无法创建或管理其他机器人,也不能给自己添加密码、邮箱等人类登录方式;
- 🔑 删除所有者账号会级联删除其名下所有机器人,长期运行的机器人请先转移所有权。
延伸阅读:官方文档与源码路径
- 官方机器人指南:bot-accounts.mdx
- BotService API 参考:bots.mdx
- 机器人账号功能设计:FDR-038
- RBAC 权限模型:FDR-001
- 出站 Webhook 架构决策:ADR-097
- 完整权限目录:permission.go
- 机器人开发示例:runling-bot、chattobot
【免费下载链接】chattoA fully-featured team and group chat application that you can easily selfhost.项目地址: https://gitcode.com/gh_mirrors/chatt/chatto
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考