Skip to main content

斯拉克

套接字模式(默认)

快速设置(初学者)

  1. 创建一个 Slack 应用并启用套接字模式
  2. 创建一个应用令牌 (xapp-...) 和机器人令牌 (xoxb-...)。
  3. 为 OpenClaw 设置令牌并启动网关。
最小配置:
{
  channels: {
    slack: {
      enabled: true,
      appToken: "xapp-...",
      botToken: "xoxb-..."
    }
  }
}

设置

  1. https://api.slack.com/apps. 中从头开始创建一个 Slack 应用。
  2. 启用套接字模式,然后转到基本信息应用级令牌 → 使用范围 connections:write 生成令牌和范围。复制应用令牌 (xapp-...)。
  3. 转到OAuth 和权限 → 添加机器人令牌范围(使用下方清单)。单击安装到工作区。复制机器人用户 OAuth 令牌 (xoxb-...)。
  4. 可选:转到OAuth 和权限 → 添加用户令牌范围(参见下方只读列表)。重新安装应用并复制用户 OAuth 令牌 (xoxp-...)。
  5. 转到事件订阅 → 启用事件并订阅:
  • message.*(包括编辑/删除/线程广播)
    • app_mention
    • reaction_added, reaction_removed
    • member_joined_channel, member_left_channel
    • channel_rename
    • pin_added, pin_removed
  1. 邀请机器人进入您希望它读取的频道。
  2. 转到斜杠命令→ 如果您使用channels.slack.slashCommand,则创建/openclaw。如果您启用原生命令,则为每个内置命令添加一个斜杠命令(名称与/help相同)。Slack的原生命令默认关闭,除非您设置channels.slack.commands.native: true(全局commands.native设为"auto",这会使Slack保持关闭状态)。
  3. 转到应用主页→ 启用消息选项卡,以便用户可以向机器人发送私信。
使用下方清单以确保范围和事件保持同步。 多账户支持:使用 channels.slack.accounts,并配合每账户令牌以及可选的 name。共享模式请参见 gateway/configuration __HEADING_0__OpenClaw 配置(最小) 通过环境变量设置令牌(推荐):
  • SLACK_APP_TOKEN=xapp-...
  • SLACK_BOT_TOKEN=xoxb-...
或通过配置:
{
  channels: {
    slack: {
      enabled: true,
      appToken: "xapp-...",
      botToken: "xoxb-..."
    }
  }
}

用户令牌(可选)

OpenClaw 可以使用 Slack 用户令牌 (xoxp-...) 执行读操作(获取历史记录、置顶消息、添加反应、使用表情符号、获取成员信息)。默认情况下,此模式仅用于读取:如果存在用户令牌,读操作会优先使用用户令牌;写操作仍使用机器人令牌,除非您明确选择启用。即使启用了 userTokenReadOnly: false,只要机器人令牌可用,写操作仍会优先使用机器人令牌。 用户令牌在配置文件中进行配置(不支持环境变量)。对于多账户,设置 channels.slack.accounts.<id>.userToken 包含机器人、应用和用户令牌的示例:
{
  channels: {
    slack: {
      enabled: true,
      appToken: "xapp-...",
      botToken: "xoxb-...",
      userToken: "xoxp-..."
    }
  }
}
显式设置 userTokenReadOnly 的示例(允许用户令牌执行写操作):
{
  channels: {
    slack: {
      enabled: true,
      appToken: "xapp-...",
      botToken: "xoxb-...",
      userToken: "xoxp-...",
      userTokenReadOnly: false
    }
  }
}

令牌使用

  • 读操作(历史记录、反应列表、置顶列表、表情符号列表、成员信息、搜索)在已配置时优先使用用户令牌,否则使用机器人令牌。
  • 写操作(发送/编辑/删除消息、添加/移除反应、置顶/取消置顶、文件上传)默认使用机器人令牌。如果 userTokenReadOnly: false 已启用且没有可用的机器人令牌,OpenClaw 将回退到用户令牌。

历史背景

  • channels.slack.historyLimit(或 channels.slack.accounts.*.historyLimit)控制最近多少条频道/群组消息会被纳入提示中。
  • 默认回退到 messages.groupChat.historyLimit。设置 0 可禁用此功能(默认值为 50)。
__HEADING_0__HTTP模式(事件API) 当您的网关可通过 HTTPS 被 Slack 访问时(通常适用于服务器部署),请使用 HTTP Webhook 模式。HTTP 模式利用事件 API、交互性以及斜杠命令,并共享请求 URL。

设置

  1. 创建一个 Slack 应用并禁用套接字模式(如果您只使用 HTTP,则可选)。
  2. 转到基本信息,然后复制签名密钥
  3. 转到OAuth 和权限,安装应用,并复制机器人用户 OAuth 令牌 (xoxb-...)。
  4. 转到事件订阅,启用事件并将请求 URL 设置为您网关的 Webhook 路径(默认 /slack/events)。
  5. 转到交互性和快捷方式,启用并设置相同的请求 URL
  6. 转到斜杠命令,为您的命令设置相同的请求 URL
示例请求 URL: https://gateway-host/slack/events __HEADING_0__OpenClaw 配置(最小)
{
  channels: {
    slack: {
      enabled: true,
      mode: "http",
      botToken: "xoxb-...",
      signingSecret: "your-signing-secret",
      webhookPath: "/slack/events"
    }
  }
}
多账户 HTTP 模式:设置 channels.slack.accounts.<id>.mode = "http" 并为每个账户提供唯一的 webhookPath,以便每个 Slack 应用都能指向自己的 URL。

清单(可选)

使用此 Slack 应用清单可快速创建应用(如需可调整名称或命令)。如果您计划配置用户令牌,请务必包含用户范围。
{
  "display_information": {
    "name": "OpenClaw",
    "description": "Slack connector for OpenClaw"
  },
  "features": {
    "bot_user": {
      "display_name": "OpenClaw",
      "always_online": false
    },
    "app_home": {
      "messages_tab_enabled": true,
      "messages_tab_read_only_enabled": false
    },
    "slash_commands": [
      {
        "command": "/openclaw",
        "description": "Send a message to OpenClaw",
        "should_escape": false
      }
    ]
  },
  "oauth_config": {
    "scopes": {
      "bot": [
        "chat:write",
        "channels:history",
        "channels:read",
        "groups:history",
        "groups:read",
        "groups:write",
        "im:history",
        "im:read",
        "im:write",
        "mpim:history",
        "mpim:read",
        "mpim:write",
        "users:read",
        "app_mentions:read",
        "reactions:read",
        "reactions:write",
        "pins:read",
        "pins:write",
        "emoji:read",
        "commands",
        "files:read",
        "files:write"
      ],
      "user": [
        "channels:history",
        "channels:read",
        "groups:history",
        "groups:read",
        "im:history",
        "im:read",
        "mpim:history",
        "mpim:read",
        "users:read",
        "reactions:read",
        "pins:read",
        "emoji:read",
        "search:read"
      ]
    }
  },
  "settings": {
    "socket_mode_enabled": true,
    "event_subscriptions": {
      "bot_events": [
        "app_mention",
        "message.channels",
        "message.groups",
        "message.im",
        "message.mpim",
        "reaction_added",
        "reaction_removed",
        "member_joined_channel",
        "member_left_channel",
        "channel_rename",
        "pin_added",
        "pin_removed"
      ]
    }
  }
}
如果您启用原生命令,请为每个您希望公开的命令添加一个 slash_commands 条目(与 /help 列表匹配)。使用 channels.slack.commands.native 进行覆盖。

范围(当前 vs 可选)

Slack 的 Conversations API 按类型划分范围:您只需为实际接触的对话类型获取范围,例如频道、群组、私信和多用户私信。有关概述,请参见 https://docs.slack.dev/apis/web-api/using-the-conversations-api/。。

机器人令牌范围(必需)

用户令牌范围(可选,默认只读)

如果您配置 channels.slack.userToken,请在“用户令牌范围”下添加这些范围。
  • channels:historygroups:historyim:historympim:history
  • channels:readgroups:readim:readmpim:read
  • users:read
  • reactions:read
  • pins:read
  • emoji:read
  • search:read

当前不需要(但未来可能需要)

配置

Slack 仅使用套接字模式(无 HTTP Webhook 服务器)。提供两种令牌:
{
  "slack": {
    "enabled": true,
    "botToken": "xoxb-...",
    "appToken": "xapp-...",
    "groupPolicy": "allowlist",
    "dm": {
      "enabled": true,
      "policy": "pairing",
      "allowFrom": ["U123", "U456", "*"],
      "groupEnabled": false,
      "groupChannels": ["G123"],
      "replyToMode": "all"
    },
    "channels": {
      "C123": { "allow": true, "requireMention": true },
      "#general": {
        "allow": true,
        "requireMention": true,
        "users": ["U123"],
        "skills": ["search", "docs"],
        "systemPrompt": "Keep answers short."
      }
    },
    "reactionNotifications": "own",
    "reactionAllowlist": ["U123"],
    "replyToMode": "off",
    "actions": {
      "reactions": true,
      "messages": true,
      "pins": true,
      "memberInfo": true,
      "emojiList": true
    },
    "slashCommand": {
      "enabled": true,
      "name": "openclaw",
      "sessionPrefix": "slack:slash",
      "ephemeral": true
    },
    "textChunkLimit": 4000,
    "mediaMaxMb": 20
  }
}
令牌也可以通过环境变量提供:
  • SLACK_BOT_TOKEN
  • SLACK_APP_TOKEN
确认反应由 messages.ackReaction + messages.ackReactionScope 全局控制。使用 messages.removeAckAfterReply 可在机器人回复后清除确认反应。

限制

  • 出站文本被分块为 channels.slack.textChunkLimit(默认 4000)。
  • 可选换行分块:设置 channels.slack.chunkMode="newline" 可在长度分块之前按空行(段落边界)进行分割。
  • 媒体上传受 channels.slack.mediaMaxMb 限制(默认 20)。

回复线程化

默认情况下,OpenClaw会在主频道中回复。使用 channels.slack.replyToMode 控制自动线程化:
模式行为
off默认。 在主频道中回复。仅当触发消息已在线程中时才进行线程化。
first第一次回复进入线程(在触发消息下方),后续回复回到主频道。有助于在避免线程混乱的同时保持上下文可见。
all所有回复都进入线程。使对话保持集中,但可能会降低可见性。
该模式适用于自动回复和代理工具调用(slack sendMessage)。 按聊天类型线程化 您可以通过将 channels.slack.replyToModeByChatType 设置为每种聊天类型来配置不同的线程化行为:
{
  channels: {
    slack: {
      replyToMode: "off",        // default for channels
      replyToModeByChatType: {
        direct: "all",           // DMs always thread
        group: "first"           // group DMs/MPIM thread first reply
      },
    }
  }
}
支持的聊天类型:
  • direct: 1:1 私信(Slack im
  • group: 群组私信 / MPIM(Slack mpim
  • channel: 标准频道(公共/私人)
优先级:
  1. replyToModeByChatType.<chatType>
  2. replyToMode
  3. 提供方默认(off
旧版 channels.slack.dm.replyToMode 仍作为 direct 的后备方案,当未设置聊天类型覆盖时适用。 示例: 仅对私信进行线程化:
{
  channels: {
    slack: {
      replyToMode: "off",
      replyToModeByChatType: { direct: "all" }
    }
  }
}
对群组私信进行线程化,但将频道保留在根中:
{
  channels: {
    slack: {
      replyToMode: "off",
      replyToModeByChatType: { group: "first" }
    }
  }
}
使频道线程化,将私信保留在根中:
{
  channels: {
    slack: {
      replyToMode: "first",
      replyToModeByChatType: { direct: "off", group: "off" }
    }
  }
}

手动线程化标签

为了更精细地控制,可在代理回复中使用以下标签:
  • [[reply_to_current]] — 回复触发消息(开始/继续线程)。
  • [[reply_to:<id>]] — 回复特定消息 ID。

会话 + 路由

  • 私信共享 main 会话(类似于 WhatsApp/Telegram)。
  • 频道映射到 agent:<agentId>:slack:channel:<channelId> 会话。
  • 斜杠命令使用 agent:<agentId>:slack:slash:<userId> 会话(前缀可通过 channels.slack.slashCommand.sessionPrefix 配置)。
  • 如果 Slack 不提供 channel_type,OpenClaw 会根据频道 ID 前缀推断(D, C, G),并默认使用 channel,以保持会话密钥稳定。
  • 原生命令注册使用 commands.native(全球默认 "auto" → Slack 关闭),并可使用 channels.slack.commands.native 按工作区覆盖。文本命令需要独立的 /... 消息,并可使用 commands.text: false 禁用。Slack 斜杠命令在 Slack 应用中管理,不会自动删除。使用 commands.useAccessGroups: false 可绕过命令的访问组检查。
  • 完整命令列表 + 配置:斜杠命令

私信安全(配对)

  • 默认: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、@句柄或电子邮件(在启动时解析,前提是令牌允许)。向导接受用户名并在设置期间解析为 ID,前提是令牌允许。

组策略

  • channels.slack.groupPolicy 控制频道处理(open|disabled|allowlist)。
  • allowlist 要求频道必须列在 channels.slack.channels 中。
  • 如果您只设置 SLACK_BOT_TOKEN/SLACK_APP_TOKEN,从未创建 channels.slack 部分,
运行时默认 groupPolicyopen。添加 channels.slack.groupPolicychannels.defaults.groupPolicy 或频道白名单以锁定设置。
  • 配置向导接受 #channel 名称,并在可行的情况下将其解析为 ID
(公共 + 私人);如果有多个匹配项,优先选择活跃频道。
  • 在启动时,OpenClaw会将白名单中的频道或用户名称在令牌允许的情况下解析为ID。
并记录映射;未解析的条目将保留为类型。
  • 若要允许不使用任何频道,请设置channels.slack.groupPolicy: "disabled"(或保持白名单为空)。
频道选项(channels.slack.channels.<id>channels.slack.channels.<name>):
  • allow:在 groupPolicy="allowlist" 时允许或拒绝该频道。
  • requireMention:对该频道实施提及限制。
  • tools:可选的每频道工具政策覆盖(allow/deny/alsoAllow)。
  • toolsBySender:可选的每发件人工具政策覆盖(密钥为发件人 ID/@句柄/电子邮件;支持 "*" 通配符)。
  • allowBots:允许在此频道中发布由机器人撰写的消息(默认:否)。
  • users:可选的每频道用户白名单。
  • skills:技能过滤器(omit = 所有技能,empty = 无技能)。
  • systemPrompt:为该频道设置额外的系统提示(与主题/目的结合)。
  • enabled:设置 false 可禁用该频道。

交付目标

与 Cron/CLI 发送一起使用:
  • user:<id> 用于私信
  • channel:<id> 用于频道

工具操作

可通过channels.slack.actions.*限制 Slack 工具的操作:
操作组默认备注
反应已启用反应 + 反应列表
消息已启用读取/发送/编辑/删除
置顶已启用置顶/取消置顶/列表
成员信息已启用成员信息
表情符号列表已启用自定义表情符号列表

安全注意事项

  • 写操作默认使用机器人令牌,因此改变状态的操作始终限定于应用程序的机器人权限和身份。
  • 设置 userTokenReadOnly: false 可允许在无法使用机器人令牌时使用用户令牌进行写操作,这意味着操作将以安装用户的访问权限执行。请将用户令牌视为高度特权,并严格控制操作门控和白名单。
  • 如果您启用用户令牌写操作,请确保用户令牌包含您预期的写范围(chat:write, reactions:write, pins:write, files:write),否则这些操作将失败。

备注

  • 提及限制由 channels.slack.channels 控制(将 requireMention 设置为 true);agents.list[].groupChat.mentionPatterns(或 messages.groupChat.mentionPatterns)也被视为提及。
  • 多代理覆盖:在 agents.list[].groupChat.mentionPatterns 上设置每代理模式。
  • 反应通知遵循 channels.slack.reactionNotifications(使用 reactionAllowlist 时搭配 allowlist 模式)。
  • 默认情况下会忽略机器人撰写的消息;可通过 channels.slack.allowBotschannels.slack.channels.<id>.allowBots 进行启用。
  • 警告:如果您允许回复其他机器人(channels.slack.allowBots=truechannels.slack.channels.<id>.allowBots=true),请通过 requireMention, channels.slack.channels.<id>.users 白名单和/或清除 AGENTS.mdSOUL.md 中的护栏,以防止机器人之间的回复循环。
  • 对于 Slack 工具,反应删除语义请参见 /tools/reactions
  • 在允许且不超过尺寸限制的情况下,附件将下载到媒体存储中。