1. 先把 Slack 接入这件事说清楚
OpenClaw 接入 Slack 频道,本质上是让一个 Slack App 把消息事件推给 OpenClaw,再由 OpenClaw 里的 Agent 决定怎么回。听起来像绕口令,拆开看就三件事:Slack 那边要有一个 App、要有能证明身份的令牌、OpenClaw 这边要有一份config.toml告诉它用哪种方式收事件。第一次搭 Slack 机器人的人最容易卡在“令牌到底填哪”和“Socket 还是 HTTP”这两个点上,这篇就把这两件事一次讲透。
Slack 的接入模式其实只有两种。Socket 模式是 OpenClaw 主动向 Slack 建立一条长连接,事件从这条连接推过来,你不需要公网地址,本地开发机就能跑;HTTP 模式是反过来,Slack 把事件 POST 到你暴露出来的 webhook 路径,你需要一个能被 Slack 访问到的地址,并且要校验签名。选哪个不取决于哪个更高级,而取决于你的部署环境:本地调试、内网机器、没有固定域名,优先 Socket;已经有公网入口、要接多个账号、要走统一网关,那就 HTTP。
令牌这块也有讲究。Socket 模式需要两个令牌:机器人令牌xoxb-...和应用级令牌xapp-...,后者要带connections:write权限,否则长连接建不起来。HTTP 模式需要机器人令牌加签名密钥signingSecret,因为 Slack 每次请求都会带签名,OpenClaw 要用这个密钥验签,防止有人伪造事件打进来。很多人第一次配的时候只填了xoxb,结果 Socket 模式一直连不上,就是漏了xapp。
下面按“先备好令牌 → 写配置 → 验证连通 → 排错”的顺序走一遍,每一步都给可复制的片段。你不需要一次全懂,跟着填完能跑起来,再回头看每个字段的含义会更顺。
2. TaoToken 前置:把模型侧先接通
OpenClaw 本身是接入层,真正干活的是背后的模型。在调 Slack 之前,建议先把模型侧跑通,否则 Slack 消息进来了、Agent 却因为拿不到模型而报错,你会分不清是 Slack 配错了还是模型没通。我习惯用 TaoToken 来做这一层,它的接口和常见 SDK 兼容,改个 base_url 和 key 就能用,省去自己维护多套凭证的麻烦。
先去控制台拿一个 API Key,地址是 https://taotoken.net/api-keys ,登录后在密钥管理里新建一个,复制出来形如sk-...的字符串。这个 key 只显示一次,建议直接存进环境变量,别写死在代码里。想先确认模型能不能正常对话,可以打开模型对话页面 https://taotoken.net/model-chat 直接发一句“你好”,能返回就说明 key 和网络都没问题。
如果你后面打算长期跑编码类或 Agent 类任务,可以看一下 Coding Plan https://taotoken.net/coding-plan ,它更适合高频调用场景。接入文档在 https://taotoken.net/doc ,里面有各语言的调用示例,遇到参数不确定的时候翻一下比猜快。把模型侧跑通之后,再回来配 Slack,整条链路就只剩“事件进来 → Agent 处理 → 回复出去”这一段要调。
3. 可复制配置:config.toml 骨架与令牌字段
OpenClaw 的 Slack 配置都挂在channels.slack下面。先给一份 Socket 模式的最小骨架,这是本地开发最省事的写法:
[channels.slack] enabled = true mode = "socket" appToken = "xapp-你的应用级令牌" botToken = "xoxb-你的机器人令牌"mode = "socket"表示走长连接,appToken对应 Slack App 配置里 “Socket Mode” 打开后生成的那个xapp-令牌,botToken是安装到工作区后拿到的xoxb-令牌。两个都填,缺一不可。如果你只想用环境变量兜底,OpenClaw 支持SLACK_APP_TOKEN和SLACK_BOT_TOKEN,但要注意环境变量只对默认账号生效,多账号场景还是得写进配置文件。
HTTP 模式的骨架长这样:
[channels.slack] enabled = true mode = "http" botToken = "xoxb-你的机器人令牌" signingSecret = "你的签名密钥" webhookPath = "/slack/events"signingSecret在 Slack App 的 “Basic Information” 页面能找到,webhookPath是 Slack 把事件推过来的路径,默认/slack/events。如果你要接多个 Slack 账号,每个账号必须用不同的webhookPath,否则注册会冲突。多账号写法是把配置挪到accounts下面:
[channels.slack] enabled = true mode = "http" [channels.slack.accounts.ops] botToken = "xoxb-账号A的令牌" signingSecret = "账号A的签名密钥" webhookPath = "/slack/events/ops" [channels.slack.accounts.support] botToken = "xoxb-账号B的令牌" signingSecret = "账号B的签名密钥" webhookPath = "/slack/events/support"令牌的覆盖关系要记牢:配置文件里的令牌会覆盖环境变量,环境变量只对默认账号生效。另外userToken(xoxp-...)只能写在配置文件里,没有环境变量兜底,而且默认是只读行为,也就是userTokenReadOnly = true。只有当你把它设成false且机器人令牌不可用时,才允许用用户令牌做写入操作,这个开关别乱动。
Slack App 那边还需要订阅一批机器人事件,否则消息进来了 OpenClaw 也收不到。至少要勾上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。私聊(DM)还要在 App 首页的“消息”标签页里打开,不然用户私聊机器人不会有反应。
4. 验证请求:连通性检查与成功结果
配置写完别急着发消息,先跑连通性检查。OpenClaw 提供了几个诊断命令,最常用的是这个:
openclaw channels status --probe--probe会实际去探测 Slack 连接,Socket 模式下它会尝试建立长连接并确认令牌有效。如果输出里 Slack 那一行显示已连接、令牌校验通过,说明配置没问题。想持续看日志就开一个窗口跑:
openclaw logs --follow然后在 Slack 里 @ 一下你的机器人,日志里应该能看到事件进来的记录。如果什么都没打印,多半是事件订阅没勾全,或者机器人没被拉进那个频道。
还有一个万能命令是openclaw doctor,它会把配置、令牌、权限、事件订阅一起体检一遍,报错信息比单看日志更直白。HTTP 模式下,你还可以用 curl 手动打一下 webhook 路径,确认服务在监听:
curl -i -X POST http://127.0.0.1:3000/slack/events \ -H "Content-Type: application/json" \ -d '{"type":"url_verification","challenge":"test123"}'如果返回里带challenge字段,说明路径通了、验签逻辑也在跑。注意 Slack 官方的 URL 验证请求会带签名头,手动 curl 不带签名可能被拒,这里只是确认服务活着,真正的验证还是以 Slack 后台的 “Verified” 状态为准。
成功的结果长这样:Slack 里 @ 机器人,几秒内收到回复;openclaw logs --follow里能看到事件解析、Agent 调用、回复发送三段日志;openclaw channels status --probe显示 Slack 已连接。三个都对上,最小接入就算完成了。
5. 本篇常见错排查
Socket 模式连不上,日志报令牌无效。九成是漏了appToken,或者xapp令牌没带connections:write权限。回 Slack App 的 “Socket Mode” 页面确认已开启,并重新生成一次应用级令牌。
HTTP 模式 Slack 后台一直显示未验证。检查webhookPath是否和 Slack 里填的请求 URL 完全一致,包括结尾有没有斜杠。事件订阅、交互性、斜杠命令三处的 URL 要指向同一个路径,少配一处就会验证失败。
消息进来了但机器人不回复。先看频道策略。默认groupPolicy是allowlist,频道不在白名单里会被忽略。频道白名单写在channels.slack.channels下面,建议用稳定的频道 ID 而不是名字。另外频道消息默认需要 @ 提及才触发,如果你希望不 @ 也回复,得调整requireMention。
私聊没反应。检查channels.slack.dm.enabled是否为true,以及dmPolicy的设置。默认是pairing,需要先配对批准,用openclaw pairing list slack看有没有待批准的请求,再用openclaw pairing approve slack <用户ID>放行。如果设成allowlist,还要确认allowFrom里有对应用户。
多账号下某个账号收不到消息。命名账号不会继承channels.slack.accounts.default.allowFrom,只会在自己没设allowFrom时继承顶层的channels.slack.allowFrom。每个账号的webhookPath也必须唯一,重复了会注册冲突。
频道名匹配不生效。默认路由以 ID 为准,想直接用频道名或用户名匹配,需要打开channels.slack.dangerouslyAllowNameMatching = true。这个开关有风险,非必要别开,开了之后名字解析失败会导致路由异常。
6. 接下来怎么走
最小接入跑通之后,下一步通常是调回复行为。比如回复线程的控制在channels.slack.replyToMode,默认off,设成first或all才会在线程里回复;文本分块用textChunkLimit,默认 4000,超长消息会被切开;流式预览用channels.slack.streaming,默认partial,想要更细的进度显示可以调成progress。
如果你打算把 Slack 接到长期运行的编码或 Agent 任务上,建议顺手把 Coding Plan 配上,地址是 https://taotoken.net/coding-plan ,高频调用下比按次计费更划算。接入过程中遇到令牌或路径报错,先翻接入文档 https://taotoken.net/doc ,大部分字段含义和示例都在里面。密钥管理统一在 https://taotoken.net/api-keys ,需要新建或轮换 key 的时候从这儿进。
最后提醒一句:signingSecret、xapp、xoxb这些都属于敏感凭证,别提交到公开仓库,也别贴到聊天记录里。用环境变量或密钥管理工具存,轮换的时候记得同步更新 OpenClaw 配置并重启服务。把这条链路跑顺之后,Slack 就只是 OpenClaw 的一个入口,后面接更多频道也是同样的套路。