1. 先把场景说清楚:为什么 Slack 接入最容易卡在“看起来配完了”
OpenClaw 接入 Slack 这件事,真正让人头疼的不是代码,而是配置链路太长:Slack App 后台要开 Socket Mode、要拿两种 Token、要配 Event Subscriptions、要开 App Home、要加 Bot Scopes,回到本地还要在config.toml里把 Token 填对、把 Gateway 跑起来、把 pairing 授权走完。任何一步漏掉,表现都是“Slack 里 @ 了没反应”,但报错信息又不会直接告诉你缺哪一项。
这篇是 OpenClaw 实战系列的第三篇,假设你已经完成前两步:OpenClaw 本地能跑、Web UI 能正常对话。接下来只做一件事——通过 Socket Mode 把 OpenClaw 接进 Slack,让它在频道里被 @ 时能回消息,私聊也能用。全程不需要公网 IP、不需要反向代理、不需要 Docker,Gateway 始终只在本机运行。
适合谁看:第一次给 OpenClaw 配 Slack 的新手、团队里想先把 Bot 跑通再谈权限的人、以及被xapp-和xoxb-两个 Token 搞混过的同学。照着配完,你会在 Slack 里看到 OpenClaw 真正回话。
2. 前置条件与 TaoToken 侧准备
在动 Slack 后台之前,先把本地和模型侧确认一遍。OpenClaw 的 Gateway 负责接收 Slack 事件、调用模型、把回复写回 Slack,所以模型通道必须先通。
先检查 Gateway 状态:
openclaw gateway status期望输出里能看到running。如果没跑起来,先执行openclaw gateway start,再确认 Web UI 能正常对话。Web UI 不通的情况下配 Slack,等于在一条断掉的链子上找问题。
模型侧我这边用的是 TaoToken 的 API 通道,它兼容 OpenAI 风格的调用方式,OpenClaw 里配置 base URL 和 Key 就能用。如果你还没拿 Key,可以先去控制台创建:
- 控制台入口:https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite
- API Keys 管理:https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite
API 地址统一用https://taotoken.net/api,注意这个地址不带任何查询参数。Key 创建后只显示一次,复制到本地配置文件里,别贴在聊天窗口或截图里。
注意:Slack 的
xoxb-和xapp-是 Slack 平台自己签发的 Token,和模型 API Key 是两套完全独立的东西。前者管“Slack 能不能把消息送到 OpenClaw”,后者管“OpenClaw 能不能调用模型”。两个都缺一不可,但不要混在同一个配置项里。
3. 可复制配置:Slack App 权限清单与 config.toml 骨架
3.1 Slack App 后台要开的项
进入 https://api.slack.com/apps ,Create New App → From scratch,填 App Name 和 Workspace。创建后按下面顺序配:
Socket Mode:左侧 Socket Mode → 打开 Enable Socket Mode。开启时会让你生成一个 App-Level Token,Scope 选connections:write,生成的 Token 以xapp-开头。这个就是 Socket Mode 的握手凭证。
Event Subscriptions:左侧 Event Subscriptions → 打开 Enable Events → 在 Subscribe to bot events 里加两条:
app_mention message.imapp_mention管频道里 @ 机器人,message.im管私聊。加完点右下角 Save Changes,不点保存等于没配。
App Home:左侧 App Home → 勾选 Messages Tab 和 Allow users to send messages。不开这个,私聊入口不会出现。
OAuth & Permissions:左侧 OAuth & Permissions → Bot Token Scopes 加最小可用集:
| Scope | 作用 |
|---|---|
| app_mentions:read | 读取 @ 提及事件 |
| chat:write | 以 Bot 身份发消息 |
| channels:history | 读取公开频道消息 |
| groups:history | 读取私有频道消息 |
| im:history | 读取私聊消息 |
| mpim:history | 读取多人私聊消息 |
加完后点 Install to Workspace 授权,拿到xoxb-开头的 Bot User OAuth Token。
3.2 config.toml 骨架
OpenClaw 的 Slack 配置可以走交互式openclaw configure,也可以直接写配置文件。下面这份骨架你可以对照自己的文件改,字段名以你本地版本为准:
[gateway] host = "127.0.0.1" port = 8787 [channels.slack] enabled = true mode = "socket" bot_token = "xoxb-你的BotToken" app_token = "xapp-你的AppLevelToken" app_name = "OpenClaw" [channels.slack.access] policy = "allowlist" allow_dms = true dm_pairing = true几个关键点:mode = "socket"表示走 Socket Mode,不需要公网回调地址;policy = "allowlist"表示只有被邀请进频道的 Bot 才响应,这是新手最稳的选择;dm_pairing = true保留默认配对机制,陌生人私聊会先拿到配对码,需要你在本地批准。
模型侧配置单独一段,base URL 指向 TaoToken:
[model] provider = "openai-compatible" base_url = "https://taotoken.net/api" api_key = "你的TaoTokenKey" model = "你的模型名"改完配置后重载:
openclaw health这个命令会重新读取配置并做一次健康检查。如果 Token 格式不对或字段缺失,这里通常会给出提示,比等到 Slack 里试错快得多。
4. 验证请求:从 Gateway 连通到 Slack 消息收发
配置写完不代表通了,按下面顺序逐层验证。
第一层,Gateway 是否在跑:
openclaw gateway status第二层,Slack 通道是否被识别。执行openclaw health后,输出里应该能看到 slack 通道处于 enabled 状态。如果显示 disabled 或 missing token,回去检查bot_token和app_token是否都填了、有没有多余空格。
第三层,把 Bot 邀请进频道。在 Slack 频道里输入:
/invite @OpenClaw因为策略是 allowlist,没被邀请的频道 Bot 不会响应。邀请后在频道里 @ 它:
@OpenClaw 你好,做个自我介绍如果一切正常,Slack 里会先出现一条提示,告诉你消息已送达但当前用户未授权,并给出一个 pairing code,类似MANHPUBU。这是默认配对机制在工作,不是报错。
第四层,在运行 OpenClaw 的那台机器上批准配对:
openclaw pairing approve slack MANHPUBU注意 code 区分大小写,必须和 Slack 里显示的一模一样。批准后再 @ 一次,就能收到 OpenClaw 的正常回复了。私聊同理,第一次私聊会走配对流程,批准后即可持续对话。
想单独验证模型通道是否正常,可以打开模型对话页面发一条测试消息:
https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_content=chat&utm_campaign=rewrite
如果模型对话正常但 Slack 没反应,问题基本在 Slack 配置或 Gateway 事件订阅上,不在模型侧。
5. 本篇常见错排查
Q1:Slack 里 @ 了完全没反应。先跑openclaw gateway status确认 Gateway 在运行;再确认 Bot 已被/invite进当前频道;然后回 Slack App 后台看 Event Subscriptions 是否真的点了 Save Changes。这三项占没反应问题的绝大多数。
Q2:提示 invalid_auth 或 token 相关错误。多半是xoxb-和xapp-填反了,或者复制时带了换行和空格。xapp-是 App-Level Token,只在 Socket Mode 握手时用;xoxb-是 Bot Token,用于发消息。两个字段不要互换。
Q3:私聊发消息后只收到配对码,没有回复。这是dm_pairing = true的正常行为。在运行 OpenClaw 的机器上执行openclaw pairing approve slack <code>即可。如果 code 输错会提示找不到,重新复制一次。
Q4:频道里能 @ 但私聊不行。检查 App Home 里的 Messages Tab 和 Allow users to send messages 是否都勾了,以及 Event Subscriptions 里有没有加message.im。缺任何一个,私聊都不会通。
Q5:改了 config.toml 但行为没变。配置不会自动热加载,改完要执行openclaw health重载。如果还不行,重启 Gateway 再试。
Q6:Web UI 和 Slack 能同时用吗。可以。Web UI、Slack、TUI 是并行的入口,消息都走同一个 Gateway,互不冲突。关掉本地终端窗口也不影响 Slack,只要 Gateway 进程还在后台运行。
6. 接下来怎么走:长期编码与 Agent 场景的接入建议
Slack 接通只是第一步。如果你打算把 OpenClaw 长期挂在团队里做编码助手或 Agent 入口,建议把模型通道也固定下来,避免每次换 Key 都改配置。TaoToken 的 Coding Plan 适合这种长期编码场景,接入文档里有 base URL、鉴权和常见客户端的配置示例:
- Coding Plan:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite
- 接入文档:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite
如果你用的是 Claude Code 这类工具链,Anthropic 兼容接入的说明在这里:
https://taotoken.net/claudecode-anthropic?utm_source=taotoken_aicg_blog_end&utm_content=claudecode-anthropic&utm_campaign=rewrite
我自己的做法是:Slack 侧保持 allowlist + pairing 的默认安全策略,模型侧用固定的 API Key 和 base URL,配置写进config.toml后不再频繁改。这样团队里谁被邀请进频道、谁私聊需要批准,都有明确记录;模型调用走同一条通道,排查问题时只需要看 Gateway 日志和 Slack 后台两处。先把这条链路跑稳,再考虑上下文管理、Skills 扩展这些进阶玩法,顺序不会乱。