Slack
Socket 模式(默认)
快速设置(新手)
- 创建 Slack 应用并启用 Socket Mode。
- 创建 App Token(
xapp-...)与 Bot Token(xoxb-...)。 - 为 OpenClaw 设置 token 并启动 gateway。
设置
- 在 https://api.slack.com/apps 创建 Slack 应用(From scratch)。
- Socket Mode → 开启。然后在 Basic Information → App-Level Tokens → Generate Token and Scopes,添加 scope
connections:write。复制 App Token(xapp-...)。 - OAuth & Permissions → 添加 bot token scopes(使用下方 manifest)。点击 Install to Workspace。复制 Bot User OAuth Token(
xoxb-...)。 - 可选:OAuth & Permissions → 添加 User Token Scopes(见下方只读列表)。重新安装应用并复制 User OAuth Token(
xoxp-...)。 - Event Subscriptions → 启用事件并订阅:
message.*(包含编辑/删除/线程广播)app_mentionreaction_added、reaction_removedmember_joined_channel、member_left_channelchannel_renamepin_added、pin_removed
- 邀请 bot 进入你希望它读取的频道。
- Slash Commands → 若使用
channels.slack.slashCommand,创建/openclaw。若启用原生命令,请为每个内置命令添加一个 slash command(与/help列表同名)。Slack 的原生命令默认关闭,除非设置channels.slack.commands.native: true(全局commands.native为"auto",Slack 保持关闭)。 - App Home → 启用 Messages Tab,便于用户 DM bot。
channels.slack.accounts 配置各账号 token 与可选 name。参见 gateway/configuration 的通用模式。
OpenClaw 配置(最小)
通过环境变量设置 token(推荐):SLACK_APP_TOKEN=xapp-...SLACK_BOT_TOKEN=xoxb-...
User token(可选)
OpenClaw 可使用 Slack user token(xoxp-...)进行读取操作(历史、pins、reactions、emoji、成员信息)。默认保持只读:存在 user token 时优先用于读;写仍使用 bot token,除非你显式允许。即使设置了 userTokenReadOnly: false,只要 bot token 可用,写操作仍优先使用 bot token。
User token 需在配置文件中设置(无环境变量支持)。多账号时设置 channels.slack.accounts.<id>.userToken。
同时配置 bot + app + user token 示例:
Token 使用方式
- 读操作(历史、reactions 列表、pins 列表、emoji 列表、成员信息、搜索)优先使用 user token;否则使用 bot token。
- 写操作(发送/编辑/删除消息、添加/移除 reactions、pin/unpin、文件上传)默认使用 bot token。若
userTokenReadOnly: false且没有 bot token,OpenClaw 才会回退到 user token。
历史上下文
channels.slack.historyLimit(或channels.slack.accounts.*.historyLimit)控制将多少最近频道/群聊消息包装进提示。- 回退到
messages.groupChat.historyLimit。设为0关闭(默认 50)。
HTTP 模式(Events API)
当 gateway 可通过 HTTPS 被 Slack 访问(常用于服务器部署)时使用 HTTP webhook 模式。 HTTP 模式使用 Events API + Interactivity + Slash Commands,共用一个请求 URL。设置
- 创建 Slack 应用并禁用 Socket Mode(若只用 HTTP)。
- Basic Information → 复制 Signing Secret。
- OAuth & Permissions → 安装应用并复制 Bot User OAuth Token(
xoxb-...)。 - Event Subscriptions → 启用事件并将 Request URL 设置为你的 gateway webhook 路径(默认
/slack/events)。 - Interactivity & Shortcuts → 启用并设置同样的 Request URL。
- Slash Commands → 为命令设置同样的 Request URL。
https://gateway-host/slack/events
OpenClaw 配置(最小)
channels.slack.accounts.<id>.mode = "http" 并为每个账号提供唯一
webhookPath,以便各 Slack 应用指向不同 URL。
Manifest(可选)
使用此 Slack app manifest 快速创建应用(可调整名称/命令)。若计划配置 user token,请包含 user scopes。slash_commands 条目(与 /help 列表一致)。可用 channels.slack.commands.native 覆盖。
Scopes(当前 vs 可选)
Slack Conversations API 是按类型授权的:你只需要实际触达的会话类型 scopes(channels、groups、im、mpim)。概览见: https://docs.slack.dev/apis/web-api/using-the-conversations-api/Bot token scopes(必需)
chat:write(通过chat.postMessage发送/更新/删除消息) https://docs.slack.dev/reference/methods/chat.postMessageim:write(通过conversations.open打开 DM) https://docs.slack.dev/reference/methods/conversations.openchannels:history、groups:history、im:history、mpim:historyhttps://docs.slack.dev/reference/methods/conversations.historychannels:read、groups:read、im:read、mpim:readhttps://docs.slack.dev/reference/methods/conversations.infousers:read(用户查询) https://docs.slack.dev/reference/methods/users.inforeactions:read、reactions:write(reactions.get/reactions.add) https://docs.slack.dev/reference/methods/reactions.get https://docs.slack.dev/reference/methods/reactions.addpins:read、pins:write(pins.list/pins.add/pins.remove) https://docs.slack.dev/reference/scopes/pins.read https://docs.slack.dev/reference/scopes/pins.writeemoji:read(emoji.list) https://docs.slack.dev/reference/scopes/emoji.readfiles:write(通过files.uploadV2上传) https://docs.slack.dev/messaging/working-with-files/#upload
User token scopes(可选,默认只读)
若配置channels.slack.userToken,在 User Token Scopes 中添加:
channels:history、groups:history、im:history、mpim:historychannels:read、groups:read、im:read、mpim:readusers:readreactions:readpins:reademoji:readsearch:read
当前不需要(但可能未来需要)
mpim:write(仅当我们加入通过conversations.open打开群 DM 时)groups:write(仅当我们加入私有频道管理:创建/重命名/邀请/归档)chat:write.public(仅当我们要向 bot 未加入的频道发消息) https://docs.slack.dev/reference/scopes/chat.write.publicusers:read.email(仅当需要users.info的 email 字段) https://docs.slack.dev/changelog/2017-04-narrowing-email-accessfiles:read(仅当我们开始列出/读取文件元数据)
配置
Slack 使用 Socket Mode(无 HTTP webhook 服务器)。需要提供两个 token:SLACK_BOT_TOKENSLACK_APP_TOKEN
messages.ackReaction + messages.ackReactionScope 全局控制。
使用 messages.removeAckAfterReply 在 bot 回复后清除 ack reaction。
限制
- 出站文本按
channels.slack.textChunkLimit分块(默认 4000)。 - 可选按段落分块:设置
channels.slack.chunkMode="newline",先按空行分段再分块。 - 媒体上传上限为
channels.slack.mediaMaxMb(默认 20)。
回复线程
默认情况下,OpenClaw 在主频道回复。使用channels.slack.replyToMode 控制自动线程:
| 模式 | 行为 |
|---|---|
off | 默认。 主频道回复。只有触发消息在已有线程中时才在线程回复。 |
first | 首条回复在线程中,后续回复回主频道。适合保留上下文又避免线程过多。 |
all | 所有回复都在同一线程中。对话更集中,但可见性可能降低。 |
slack sendMessage)均生效。
按聊天类型线程
通过channels.slack.replyToModeByChatType 可为不同聊天类型配置不同线程行为:
direct:1:1 私聊(Slackim)group:群 DM / MPIM(Slackmpim)channel:标准频道(公开/私有)
replyToModeByChatType.<chatType>replyToMode- Provider 默认(
off)
channels.slack.dm.replyToMode 仍可作为 direct 的回退,当未设置 chat-type 覆盖时生效。
示例:
仅线程私聊:
手动线程标签
如需精细控制,可在 agent 输出中使用以下标签:[[reply_to_current]]— 回复触发消息(开始/继续线程)。[[reply_to:<id>]]— 回复指定消息 id。
会话 + 路由
- 私聊共享
main会话(与 WhatsApp/Telegram 类似)。 - 频道映射为
agent:<agentId>:slack:channel:<channelId>会话。 - Slash 命令使用
agent:<agentId>:slack:slash:<userId>会话(前缀可通过channels.slack.slashCommand.sessionPrefix配置)。 - 若 Slack 未提供
channel_type,OpenClaw 会根据频道 ID 前缀(D、C、G)推断,默认channel以保持会话 key 稳定。 - 原生命令注册使用
commands.native(全局默认"auto"→ Slack 关闭),可通过channels.slack.commands.native覆盖。文本命令需独立/...消息,可用commands.text: false关闭。Slack slash commands 由 Slack 应用管理,不会自动移除。可用commands.useAccessGroups: false跳过命令的 access-group 检查。 - 完整命令列表与配置见 Slash commands
DM 安全(配对)
- 默认:
channels.slack.dm.policy="pairing"— 未知私聊发送者会收到配对码(1 小时过期)。 - 批准命令:
openclaw pairing approve slack <code>。 - 允许任何人:
channels.slack.dm.policy="open"且channels.slack.dm.allowFrom=["*"]。 channels.slack.dm.allowFrom支持用户 ID、@handle 或邮箱(启动时在 token 允许时解析)。向导接受用户名并在 token 允许时解析为 id。
群策略
channels.slack.groupPolicy控制频道处理(open|disabled|allowlist)。allowlist需要在channels.slack.channels中列出频道。- 若你只设置
SLACK_BOT_TOKEN/SLACK_APP_TOKEN而未创建channels.slack配置块, 运行时会将groupPolicy默认为open。添加channels.slack.groupPolicy、channels.defaults.groupPolicy或频道 allowlist 以锁定。 - 配置向导接受
#channel名称并在可能时解析为 ID(公开 + 私有);若存在多个匹配,优先当前活跃频道。 - 启动时,OpenClaw 会将 allowlist 中的频道/用户名称解析为 ID(token 允许时)并记录映射;无法解析的条目保留原样。
- 若要禁止所有频道,设置
channels.slack.groupPolicy: "disabled"(或保持空 allowlist)。
channels.slack.channels.<id> 或 channels.slack.channels.<name>):
allow:当groupPolicy="allowlist"时允许/拒绝频道。requireMention:频道提及门控。tools:可选频道级工具策略覆盖(allow/deny/alsoAllow)。toolsBySender:频道内发送者工具策略覆盖(key 为发送者 id/@handle/email;支持"*"通配)。allowBots:允许 bot 发送的消息(默认:false)。users:可选频道用户 allowlist。skills:技能过滤(省略=所有技能,空=无技能)。systemPrompt:频道额外系统提示(与主题/目的合并)。enabled:设为false禁用频道。
投递目标
用于 cron/CLI 发送:user:<id>用于私聊channel:<id>用于频道
工具动作
Slack 工具动作可通过channels.slack.actions.* 门控:
| 动作组 | 默认 | 说明 |
|---|---|---|
| reactions | enabled | React + list reactions |
| messages | enabled | 读/发/编辑/删除 |
| pins | enabled | 置顶/取消置顶/列表 |
| memberInfo | enabled | 成员信息 |
| emojiList | enabled | 自定义 emoji 列表 |
安全说明
- 写操作默认使用 bot token,确保改动限定在应用 bot 权限/身份下。
- 设置
userTokenReadOnly: false会在 bot token 不可用时使用 user token 写入,这意味着操作以安装者权限执行。请将 user token 视为高权限,并严格收紧 action gates 与 allowlist。 - 若启用 user-token 写入,请确保 user token 包含所需写权限(
chat:write、reactions:write、pins:write、files:write),否则写操作会失败。
备注
- 提及门控通过
channels.slack.channels控制(将requireMention设为true);agents.list[].groupChat.mentionPatterns(或messages.groupChat.mentionPatterns)也会被视为提及。 - 多 agent 覆盖:在
agents.list[].groupChat.mentionPatterns中设置每个 agent 的模式。 - Reaction 通知遵循
channels.slack.reactionNotifications(allowlist模式使用reactionAllowlist)。 - Bot 发送的消息默认忽略;可通过
channels.slack.allowBots或channels.slack.channels.<id>.allowBots启用。 - 警告:若允许回复其他 bot(
channels.slack.allowBots=true或channels.slack.channels.<id>.allowBots=true),请通过requireMention、channels.slack.channels.<id>.usersallowlist,和/或AGENTS.md、SOUL.md的 guardrails 防止 bot-to-bot 循环。 - Slack 工具中 reaction 移除语义见 /tools/reactions。
- 附件在允许且未超限时会下载到媒体存储。