跳转至

访问控制

谁可以通过 Slack 联系 OpenClaw,以及它可以执行哪些 Slack 操作。

关联的请求者身份

直接的 Socket Mode 事件和通过 Slack 签名密钥验证的 HTTP 请求 URL 会携带经过验证的原生 Slack 用户 ID,包括 team:<team-id>:user:<user-id> 形式。中继事件仍为断言状态,因为 Gateway 认证的是中继对等方,而不是 Slack 发送者。显示名称从不确立身份,由应用控制的消息元数据派生的发送者 ID 仍为断言状态。

对于来自已验证 Slack 发送者的普通消息和应用提及,如果该发送者关联到活跃用户资料,OpenClaw 会在主机生成的、按轮次的会话信息中包含该资料的规范 ID 和当前显示名称。具有 operator.admin 权限的关联资料可以请求“将此会话分配给我”;代理使用该资料 ID 和 sessions 工具的 assign_owner 操作,针对该管理员可见的会话(包括代理生成的会话)执行分配。该轮次携带关联管理员现有的操作员权限,并在每个特权操作前检查原始链接、角色和通道生命周期。取消关联、移除管理员访问权限或重启通道会使该轮次失效;访问恢复后请发送新请求。

该工具仍仅限所有者使用:关联普通成员只会标识请求者,而不会授予分配访问权限。未关联或断言状态的发送者不会获得请求者资料或操作员权限。已配置命令所有者但没有关联管理员资料时,保留其现有命令访问权限。参见 通道身份关联。

操作与门控

Slack 操作由 channels.slack.actions.* 控制。

当前 Slack 工具中可用的操作组:

组 默认
messages enabled
reactions enabled
pins enabled
memberInfo enabled
emojiList enabled

当前 Slack 消息操作包括 send、conversation-open、upload-file、download-file、read、edit、delete、pin、unpin、list-pins、member-info 和 emoji-list。download-file 接受传入文件占位符中显示的 Slack 文件 ID,并为图像返回图像预览,为其他文件类型返回本地文件元数据。

交互式消息操作在目标查找和权限查找过程中保留其调用者权限,并在每次 Slack 请求前重新检查该权限。如果该权限关闭,剩余请求将停止,而已接受的变更保留其结果。

在 Slack 会话中,委托的 member-info 仅读取同一账户上的当前请求者;省略 userId 时会选择该请求者。emoji-list 使用受信任的当前工作区。这两种元数据操作在使用捆绑插件以及经过验证的官方 npm 或 ClawHub 安装时,无需通道目标即可工作。现有操作门控和企业工作区要求仍然适用。

使用 emoji-list 发现工作区自定义表情符号和别名:

{ "action": "emoji-list", "channel": "slack", "limit": 25 }

结果按短代码名称排序。limit 默认为且不能超过 100:

{
  "ok": true,
  "emojis": [
    { "name": "celebrate", "identifier": "celebrate", "aliasOf": "party" },
    { "name": "party", "identifier": "party" }
  ]
}

将条目的 identifier 直接用作 react 表情符号;周围的冒号是可选的。channels.slack.actions.emojiList 独立于 reactions 门控控制发现功能,并且应用需要 emoji:read 范围。

实时策略变更

DM 访问、允许列表、群组策略、提及规则和现有通道策略字段适用于新消息、命令和系统事件,无需重新连接 Slack。根设置和账户覆盖保持其正常优先级。每个被接受的轮次保留一个已解析的策略快照;变更不会重写已在进行中的回复。工作区名称解析每个新快照运行一次,并且从不附加来自旧策略的身份。在旧配置快照下学习到的在线状态目标会在另一次后台唤醒之前退役;新接受的活动会创建新目标。

传输凭据、账户启用、添加或移除账户或通道条目、名称匹配模式、在线状态设置以及原生命令/审批注册仍会重启 Slack 监视器。Gateway 保持运行。

访问控制与路由

`channels.slack.dmPolicy` 控制 DM 访问。`channels.slack.allowFrom` 是规范的 DM 允许列表。

- `pairing`(默认)
- `allowlist`
- `open`(要求 `channels.slack.allowFrom` 包含 `"*"`)
- `disabled`

DM 标志:

- `dm.enabled`(默认 true)
- `channels.slack.allowFrom`
- `dm.allowFrom`(旧版)
- `dm.groupEnabled`(群组 DM 默认 false)
- `dm.groupChannels`(可选 MPIM 允许列表)

Note

dm.groupEnabled 和 dm.groupChannels 仅过滤 Slack 已经传递给应用的群组 DM。它们无法让应用看到其从未加入的群组 DM。请将群组 DM 转换为私有通道并邀请应用,或让应用使用 conversations.open 打开新的 MPDM。参见 群组 DM(MPDM)和机器人。

多账户优先级:

  • 省略的账户 dmPolicy 和 groupPolicy 继承通道根设置。显式账户策略优先;如果两个作用域都未设置,默认值仍分别为 pairing 和 allowlist。
  • 省略时,userTokenReadOnly 也继承通道设置;其默认值仍为 true。
  • channels.slack.accounts.default.allowFrom 仅适用于 default 账户。
  • 当命名账户自身的 allowFrom 未设置时,它们继承 channels.slack.allowFrom。
  • 命名账户不会继承 channels.slack.accounts.default.allowFrom。

旧版 channels.slack.dm.policy 和 channels.slack.dm.allowFrom 仍会读取以保持兼容。openclaw doctor --fix 在不会改变访问权限的情况下,会将它们迁移到 dmPolicy 和 allowFrom。

在 DM 中配对使用 openclaw pairing approve slack <code>。

`channels.slack.groupPolicy` 控制频道处理:

- `open`
- `allowlist`
- `disabled`

频道允许列表位于 `channels.slack.channels` 下,并且**必须使用稳定的 Slack 频道 ID**(例如 `C12345678`)作为配置键。Enterprise Grid 组织安装要求使用 `team:<team-id>:channel:<channel-id>`,以便策略不会跨越工作区边界。

当被邀请进入一个允许的频道时,OpenClaw 会发布一条简短的介绍,内容基于频道名称、用途或主题,以及可用的最近消息。设置 `channels.slack.joinIntro: false` 可禁用这些介绍;`channels.slack.accounts.<accountId>.joinIntro` 会覆盖频道级设置。介绍默认启用,并且不需要提及,但它们永远不会绕过频道访问策略,也不会在直接消息中运行。

如果没有 `channels.slack` 块,Gateway 不会从 `SLACK_*` 环境变量自动启动 Slack。一旦该块存在,这些变量仍作为默认账户的凭据回退。传入 `--ambient-channels` 可选择仅基于环境变量的自动配置;该路径使用 `groupPolicy="allowlist"` 并记录一条警告,即使已设置 `channels.defaults.groupPolicy`。

名称/ID 解析:

- 频道允许列表条目和 DM 允许列表条目会在启动时以及新的策略快照首次被使用时解析,前提是 token 访问权限允许
- 未解析的频道名称条目会按配置保留,但默认情况下在路由中被忽略
- 入站授权和频道路由默认以 ID 优先;直接匹配用户名/slug 需要 `channels.slack.dangerouslyAllowNameMatching: true`

Warning

基于名称的键(#channel-name 或 channel-name)依赖于成功的 Slack 查找来解析稳定的频道 ID。在 groupPolicy: "allowlist" 下,未解析的名称会被拒绝,除非 dangerouslyAllowNameMatching 明确启用直接名称匹配。

优先使用 Slack 频道 ID 作为键,以避免该查找依赖。查找方法:在 Slack 中右键单击频道 → 复制链接 — ID(C...)会出现在 URL 的末尾。

推荐的稳定 ID:

{
  channels: {
    slack: {
      groupPolicy: "allowlist",
      channels: {
        C12345678: { enabled: true, requireMention: true },
      },
    },
  },
}

基于名称的输入(需要在默认匹配策略下成功查找):

{
  channels: {
    slack: {
      groupPolicy: "allowlist",
      channels: {
        "#eng-my-channel": { enabled: true, requireMention: true },
      },
    },
  },
}

频道消息默认受提及门控。

提及来源:

  • 显式应用提及(<@botId>)
  • Slack 用户组提及(<!subteam^S...>),当机器人用户是该用户组的成员时;需要 usergroups:read
  • 提及正则表达式模式(agents.entries.*.groupChat.mentionPatterns,回退为 messages.groupChat.mentionPatterns)
  • 对机器人自身 Slack 消息的回复(implicitMentions.replyToBot)
  • 在机器人参与过的线程中的后续消息(implicitMentions.threadParticipation)

按频道控制(channels.slack.channels.<id>;名称仅通过启动时解析或 dangerouslyAllowNameMatching):

  • requireMention
  • requireMentionInBotThreads
  • ignoreOtherMentions
  • replyToMode(off|first|all|batched;为此频道覆盖账户/聊天类型的回复模式)
  • users(允许列表)
  • allowBots
  • skills
  • systemPrompt
  • tools、toolsBySender
  • toolsBySender 键格式:channel:、id:、e164:、username:、name: 或 "*" 通配符 (旧版无前缀键仍仅映射到 id:)

requireMentionInBotThreads 仅覆盖根消息由本机器人发送的线程中的提及门控。将其设置为 false 可允许在这些线程中不进行提及的回复,同时保持频道其余部分为 requireMention: true。将其设置为 true 可在这些线程中要求提及,即使已启用隐式回复或线程参与提及。已授权的文本命令保留其现有绕过。

将该设置添加到现有允许频道条目中:

{
  channels: {
    slack: {
      channels: {
        C12345678: {
          enabled: true,
          requireMention: true,
          requireMentionInBotThreads: false,
        },
      },
    },
  },
}

该设置按以下顺序解析:频道条目,然后 "*" 条目,然后账户,然后 channels.slack.requireMentionInBotThreads。省略它以保留现有行为,包括 implicitMentions.replyToBot 和 implicitMentions.threadParticipation。Slack 的原生父级作者字段用于识别根消息;当该字段缺失时,OpenClaw 使用可访问的线程历史。未知归属保留正常的提及策略。频道和发送者访问、机器人消息限制以及 ignoreOtherMentions 仍然适用。

将应用邀请到频道,并为公共频道订阅 message.channels,或为私有频道订阅 message.groups,同时使用匹配的历史范围。仅订阅 app_mention 无法传递未提及的后续消息。两个设置清单都包含这些订阅;参见 清单和范围检查表。要验证,请让机器人发布一条新的顶层消息,然后在该消息的线程中回复而不提及它。对由人类创建的根消息的回复会保留其现有隐式提及策略,即使机器人稍后参与。

ignoreOtherMentions(默认 false)会丢弃频道中提到了其他用户或用户组但没有提到此机器人的消息。私信和群组私信(MPIMs)不受影响。该过滤器需要来自 auth.test 的已解析机器人用户 ID;如果该身份不可用(例如仅有用户令牌的身份),门控会失败开放,消息将原样通过。

`allowBots` 默认值为 `true`。机器人发送的消息遵循与其他消息相同的频道访问和提及规则;来自此机器人的消息始终会被忽略。设置 `allowBots: false` 可防止其他机器人触发回合,或设置 `allowBots: "mentions"` 以即使在 `requireMention: false` 的房间中也要求提及。房间设置会覆盖账户设置,而账户设置会覆盖 `channels.slack.allowBots`。更新后,现有的显式 `false` 值仍保持禁用。

机器人发送的房间消息还要求发送该消息的机器人被明确列在该房间的 `users` 允许列表中,或者 `channels.slack.allowFrom` 中至少一个明确的 Slack 所有者 ID 是当前房间成员。通配符和显示名称所有者条目不能满足所有者在场要求。所有者在场检查使用 Slack `conversations.members`;请确保应用具有与房间类型匹配的读取权限范围(公共频道为 `channels:read`,私有频道为 `groups:read`)。如果成员查找失败,OpenClaw 会丢弃该机器人发送的房间消息。

`allowBots` 控制传入回合,而不是上下文可见性。即使 `allowBots: false`,人类请求仍可能包含可访问的机器人发送的房间历史和线程上下文;已配置的 `contextVisibility` 和发送者允许列表规则仍然适用。

被接受的机器人发送的 Slack 消息使用共享的[机器人循环保护](../bot-loop-protection.md)。配置 `channels.defaults.botLoopProtection` 作为默认预算,然后当工作区或频道需要不同限制时,使用 `channels.slack.botLoopProtection` 或 `channels.slack.channels.<id>.botLoopProtection` 进行覆盖。

群组私信(MPDM)与机器人

Slack 群组私信,也称为多人私信或 MPDM,不是应用可以通过被提及而加入的频道。在现有群组私信中输入 @YourBot 不会添加该应用,也不会使该对话对该应用可见。

  • 如果创建群组私信时已包含该应用,Slack 会传递 message.mpim 事件,并且当私信策略允许时,OpenClaw 可以响应。
  • 如果应用在某个其不是成员的现有群组私信中被提及,机器人令牌完全无法看到该对话。诸如 conversations.info、conversations.members 和 conversations.history 的 Slack Web API 调用会因方法和上下文相关的访问或找不到错误而失败,该 MPDM 不会出现在 conversations.list?types=mpim 中,并且不会向 OpenClaw 传递任何事件。
  • OpenClaw 通过已传递的 message.mpim 事件在 MPDM 中唤醒。app_mention 事件不会将应用添加到 DM 或 MPDM 上下文中。
  • dm.groupEnabled 和 dm.groupChannels 仅过滤 Slack 已经传递给应用的 MPDM。它们不能授予成员资格或对应用从未参与的群组私信的可见性。没有任何 OpenClaw 配置设置能让应用看到其从未加入的群组私信。

要将应用引入群组私信,请使用以下 Slack 支持的路径之一:

  1. 将群组私信转换为私有频道,然后请当前成员使用 /invite @YourBot 邀请该应用。基于 API 的邀请必须使用一个令牌调用 conversations.invite,该令牌的执行者已经是成员并且被允许邀请该应用。
  2. 要求应用使用消息工具的 conversation-open 操作,并在 userIds 中指定人类接收者。它会使用已配置的写入身份调用 conversations.open;机器人账户需要 mpim:write。Slack 会自动包含调用账户。
{
  "action": "conversation-open",
  "channel": "slack",
  "userIds": ["U12345678", "U23456789"]
}

提供 1-8 个不同的成员 ID,不包括调用账户。一个接收者会打开一个 1:1 私信(需要 im:write);多个接收者会打开或复用一个具有该确切受众的群组私信。结果包含 channelId 和一个可路由的 target。使用 action: "send" 和该确切 target 发送消息。

使用 accountId 选择已配置的 Slack 账户,使用 teamId 指定明确的工作区。当前工作区仅对同一来源账户继承;分离的 Enterprise 操作需要 teamId。打开操作由 messages 操作门控控制。它不会更改 DM/读取策略、授予历史记录访问权限,或本身发送消息。

本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 cl/openclaw