channels.discord.activities 且能够解析到客户端密钥时,OpenClaw 才会注册 Activity HTTP 路由、show_widget 智能体工具和启动按钮处理程序。已弃用的 discord_widget 别名将在一个发布版本内继续可用。
前置条件
- 一个现有的 OpenClaw Discord Bot
- 一个可访问 OpenClaw Gateway 网关的公共 HTTPS 主机名
- 为 Bot 的 Discord 应用配置 Activities 和 OAuth2 的权限
设置
1
通过 HTTPS 公开 Gateway 网关
启动隧道或反向代理,并在添加 Activities 配置后验证
https://openclaw.example.com/discord/activity/ 能够访问 Gateway 网关。请将示例主机名替换为你自己的主机名。2
在 Discord 中启用 Activities
在 Discord Developer Portal 中打开现有的 Bot 应用。打开 Activities,启用 Activities,然后创建 URL 映射:
- 前缀:
ROOT(/) - 目标:
openclaw.example.com/discord/activity
/discord/activity,末尾不带斜杠。3
复制 OAuth2 客户端密钥
在 Developer Portal 中打开 OAuth2。Discord 要求至少配置一个重定向 URI,因此如果应用尚未配置,请添加一个本地占位地址,例如 loopback 地址;Embedded App SDK 会处理 Activity 返回流程。复制或重置应用客户端密钥。请将其视为凭据:不要将其粘贴到聊天、日志或已提交的配置文件中。
4
配置 OpenClaw
将以下配置块添加到需要提供小组件的 Discord 账户中:设置
DISCORD_CLIENT_SECRET 后,可以从该配置块中省略 clientSecret。该配置块本身必须保留,以明确选择启用此功能。常规 Discord 访问设置仍然相互独立。例如,allowFrom 仍控制谁可以向智能体发送私信;它不控制谁可以打开已发布到频道中的小组件。5
重启并测试
重启 Gateway 网关。在 Discord 对话中,让智能体显示一个交互式小组件。智能体会调用
show_widget;点击已发布消息中的 Open widget。安全模型
- 在返回小组件元数据之前,OAuth 会识别 Discord 用户。
- Discord 的 Get Activity Instance API 必须确认 OAuth 用户存在于当前 Activity 实例中。实例频道必须与发布小组件的频道一致。
- Discord 允许进入该频道的所有人都可以打开其中的小组件。如需缩小受众范围,请使用 Discord 频道权限。OpenClaw 的命令和私信允许列表不会授予或移除对已发布频道内容的访问权限。
- OAuth 会话在 15 分钟后过期。小组件文档能力在 60 秒后过期,并且只能使用一次。
- 小组件在七天后过期,每个 Discord 插件实例最多保留 64 个小组件。
- 小组件 HTML 由你的智能体编写,应将其视为可信内容。不要嵌入你不希望因小组件缺陷而泄露的秘密。
- 小组件可以在其自己的嵌套框架内导航。
sandbox="allow-scripts"iframe 会阻止顶层导航、弹出窗口和同源访问,其内容安全策略会阻止网络连接和外部资源。这些控制属于纵深防御措施,并不能构成防范小组件编写智能体的安全边界。 - 禁用 Activities 时,完全不会注册
/discord/activity。
故障排查
Activity 显示“Gateway offline”
- 确认隧道正在运行,并路由到 Gateway 网关实际绑定的端口
- 确认 Developer Portal 中的目标包含
/discord/activity - 更改 Discord 或 OpenClaw 配置后重启 Gateway 网关
- 检查 Gateway 网关日志中有关缺少 Activities 客户端密钥的单行警告
Discord 打开空白页面或报告 blocked:csp
- 验证 URL 映射使用
ROOT,且未添加第二个/discord/activity路径段 - 确认外壳、
shell.js和 SDK 模块都通过 Discord 代理返回 - 检查 Gateway 网关日志中
/discord/activity/下的请求