OpenClaw Slack 消息工具实战指南:用 `message` 工具完成 Slack 收发、线程回复与消息操作

OpenClaw Slack 消息工具实战指南:用 `message` 工具完成 Slack 收发、线程回复与消息操作 OpenClaw Slack 消息工具实战指南用message工具完成 Slack 收发、线程回复与消息操作【免费下载链接】openclawThe AI that really does things. Any OS. Any Platform. The lobster way. 项目地址: https://gitcode.com/GitHub_Trending/cl/openclawOpenClaw 通过官方 Slack 频道插件把 Slack 的频道、私信、线程与消息管理能力统一收敛到 Agent 侧的message工具上。本文以 extensions/slack/skills/slack/SKILL.md 为核心骨架结合插件源码与配置实现讲解如何用channel: slack完成消息发送、线程定位、消息编辑/删除/置顶/表情回应、文件收发与多账号路由并给出底层的时间戳规范、动作门控与目标寻址原理。读完本文你将掌握在 OpenClaw 中稳定、安全地驱动 Slack 工作流的完整方案。前置条件安装插件并配置channels.slack使用 Slack 消息能力前需要先安装官方插件并完成账号凭据配置。插件安装根据 extensions/slack/README.md通过 OpenClaw 安装命令openclaw plugins install openclaw/slack安装后插件即可让 Agent 接收 Slack 事件并通过已配置的 Slack 应用进行回复。技能文件元数据中也声明了依赖SKILL 头部metadata.openclaw.requires.config明确要求存在channels.slack配置未配置时该技能不应被启用。配置骨架channels.slack的完整配置结构由 extensions/slack/src/config-schema.ts 中的SlackConfigSchema定义核心字段包括字段取值/默认值说明enabledboolean是否启用该频道modesocket默认/http/relay事件接入方式Socket Mode、HTTP 回调或中继postAsbot默认/user发送身份机器人或用户xoxp user tokenbotTokenSecret机器人令牌xoxb-...appTokenSecretApp 级令牌Socket Mode 需要userTokenSecret用户令牌xoxp-...postAs: user时使用userTokenReadOnlytrue默认用户令牌是否只读设为false时写操作可回退到 user tokensigningSecretSecretHTTP 模式下必填隐式默认账号时用于请求验签webhookPath/slack/events默认HTTP 模式的回调路径defaultAccount字符串多账号时的默认账号 ID配置校验逻辑在superRefine中做了关键约束mode: http且未声明任何命名账号隐式默认账号时必须配置channels.slack.signingSecret命名账号以http模式启用时必须提供signingSecret账号自身或根级mode: relay时强制要求relay.url、relay.authToken与relay.gatewayId三者齐全。令牌既可以在配置中提供也可以来自环境变量。从 extensions/slack/src/accounts.ts 可以看到令牌来源解析支持env/config/none三种状态并读取SLACK_BOT_TOKEN、SLACK_USER_TOKEN、SLACK_APP_TOKEN环境变量。多账号场景使用accounts字段声明命名账号每个账号可独立覆盖令牌、postAs、mode与relay等配置并通过defaultAccount指定默认账号。核心入口message工具与channel: slackSlack 技能的全部操作都经由统一的message工具发起。SKILL 文档开宗明义Use themessagetool withchannel: slack.即在一次工具调用中将channel参数固定为slack其余参数则由工具暴露的 JSON Schema 决定。动作由 Schema 驱动不要臆测SKILL 文档特别强调了一条纪律工具 Schema 中列出了当前 Slack 账号启用的动作未列出的动作不要假设其可用。这意味着动作集合是动态的——它会随账号身份bot 还是 user、令牌可用性与配置门控而变化。底层实现印证了这一点。extensions/slack/src/message-actions.ts 中的listSlackMessageActions根据账号配置与令牌状态动态计算动作集合send始终存在只要至少有一个启用且凭据可用的账号react/reactions由actions.reactions门控默认开启conversation-open/read/edit/delete/download-file/upload-file由actions.messages门控pin/unpin/list-pins由actions.pins门控member-info由actions.memberInfo门控emoji-list由actions.emojiList门控。动作门控的配置入口在 extensions/slack/src/config-schema.ts 的actions字段中可逐账号或根级设置reactions、messages、pins、search、permissions、memberInfo、channelInfo、emojiList等布尔开关。可用动作一览综合 extensions/slack/src/message-tool-api.ts 与 extensions/slack/src/message-actions.tsmessage工具在channel: slack下可能暴露的动作包括动作用途关键参数send发送文本/富文本消息text、threadId、topLevel、replyBroadcast、presentationreact/reactions添加/管理表情回应messageId、emojiedit编辑已有消息messageId、textdelete删除消息messageIdpin/unpin置顶/取消置顶messageIdlist-pins查看置顶消息—read读取会话历史limit、before/afterconversation-open打开群私信userIds、teamIddownload-file下载文件fileIdupload-file上传文件file、threadId、topLevelmember-info查询成员信息目标 IDemoji-list列出工作区表情—参数 Schema 细节从 extensions/slack/src/message-tool-api.ts 的describeSlackMessageTool可以看到工具 Schema 的构造方式messageId别名message_idSlack 消息时间戳/消息 ID例如1777423717.666499供react、reactions、edit、delete、pin、unpin使用。react在当前有入站消息时默认指向该消息。fileId以F开头的 Slack 文件 ID如F0B0LTT8M36仅download-file需要从入站事件event.files[].id读取不是消息时间戳。emoji标准或工作区自定义表情短码如white_check_mark、1或常见 Unicode 字符如✅冒号可省略emoji-list动作可用于发现工作区自定义表情。topLevelSlack 专有开关在线程同频道上下文中设为true可发布到频道根部而非继承当前线程threadId: null效果相同。replyBroadcast线程回复时设为true可将回复同步广播到父频道媒体与upload-file不支持。userIds/teamIdconversation-open专用userIds为 1–8 个成员 ID形如U1234.../W1234...单个打开私信、多个打开或复用群组私信teamId形如T1234...用于 Enterprise 跨工作区场景默认取当前账号的可信工作区。目标寻址稳定 ID 优先SKILL 文档的工作流第一条即要求优先使用来自上下文的稳定 Slack ID。当前会话之外的发送使用channel:id或user:id作为目标。extensions/slack/src/targets.ts 与 target-parsing.ts 实现了目标解析与匹配channel:id指向指定频道C...开头user:id指向指定用户U.../W...开头用于私信目标匹配会同时比对当前频道 ID 与当前消息目标核心解析还会在自动选线程前移除user:前缀见 targets.ts 的注释说明。选择稳定 ID 而非显示名称可以避免因频道/用户改名导致的目标失效也避免名称歧义。线程工作流threadId、messageId与topLevelSKILL 文档对线程行为给出了明确约定默认保持在当前线程内回复除非用户明确要求发布为顶层消息要在另一个线程回复把该线程的 Slack 时间戳传给threadId要对某条消息做消息级操作编辑、删除、置顶、回应把同一条时间戳传给messageId。线程时间戳规范Slack 用ts作为消息与线程的唯一标识。线程的根时间戳形如1777423717.666499点分十位秒级时间戳。extensions/slack/src/thread-ts.ts 给出了校验正则SLACK_THREAD_TS_PATTERN /^\d\.\d$/只有匹配该模式的值才会被当作线程时间戳使用。同时resolveSlackReplyThreadTs在replyToMode off时忽略replyToIdSlack 要求线程操作使用根消息时间戳而非子回复时间戳因此只有在“回复当前消息”或“非显式目标”场景下才允许用当前消息的threadId替换显式目标resolveSlackThreadTsValue按replyToId优先、threadId次之的次序解析。在消息动作层面extensions/slack/src/message-actions.ts 的extractSlackToolSend汇总了threadId、replyTo、threadTs、topLevel的处理topLevel: true或threadTs: null都会抑制线程继承threadSuppressed。时间戳输入的宽容处理extensions/slack/src/actions.ts 中的normalizeSlackReadTimestamp表明read动作的before/after参数既接受 Slack 原生时间戳SLACK_TIMESTAMP_RE /^\d(?:\.\d)?$/也接受带时区的 ISO-8601 日期字符串后者会被转换为 epoch 秒保留最多三位小数。这为基于绝对时间读取历史提供了便利。消息操作与表情回应编辑、删除与置顶edit、delete、pin、unpin等消息级动作都依赖messageId即消息时间戳。SKILL 文档给出的安全准则是对含义不明的消息执行编辑、删除、置顶或回应前先读取会话内容解析出其精确 ID当目标或意图不清晰时对破坏性删除操作要主动确认。这条规则与“读后写”的工程实践一致——先用read动作获取上下文与准确ts再执行写操作避免误删误改。表情的宽容归一化Slack 的reactions.add/remove只接受短码名不接受原始 Unicode 字形。模型经常把emoji参数理解为“任意表情字符”导致回应被静默丢弃。extensions/slack/src/actions.ts 为此维护了一张常见字形到短码的映射表如✅ → white_check_mark、 → thumbsup、 → tada、 → firenormalizeSlackEmojiName会去掉首尾冒号剥离肤色修饰符与变体选择符查表得到短码有肤色修饰符时追加::skin-tone-NN 为 2–6。未知字形原样透传不做回归性破坏而already_reacted/no_reaction这类平台错误会被静默吞掉保证幂等性见 actions.ts。多账号与身份当配置了多个 Slack 账号时SKILL 文档要求显式传入accountId而不是靠猜测。底层账号解析位于 extensions/slack/src/accounts.tslistSlackAccountIds枚举所有已配置账号resolveSlackAccount解析指定账号并合并根级默认值身份identity为bot或user决定使用哪个令牌执行读写user 身份通过 xoxp 用户令牌以授权用户身份操作bot 身份下读操作优先 user token若有、写操作在userTokenReadOnly: false时允许回退到 user token否则固定使用 bot token。这也解释了为什么动作集合会因账号而异listSlackMessageActions只统计启用且凭据可用的账号动作门控对每个账号单独求值任一账号启用即视为可用。富文本回复presentation与 Block KitSlack 技能的另一半是 Block Kit。extensions/slack/skills/block-kit/SKILL.md 规定当回复适合结构化展示决策/确认/下一步操作适合按钮或下拉、状态/对比/报告适合分节标题/表格/图表、重要上下文需要与主结果视觉分离时应主动使用presentation而非等用户要求。调用方式为message工具 action: send 可移植的presentation字段插件负责将其渲染为原生 Block Kit。可支持的块类型包括text、context、divider、buttons、select、chart、table具体以当前工具暴露的 Schema 为准。要点包括结果优先标题、标签与上下文保持精炼交互控件要具备真实的后续语义对话式选择用类型化callback动作外部跳转用url不要给 Slack 控件用通用command动作否则 Slack 会渲染成文本回退而非可点击控件必须提供有用的message文本回退让无富文本环境下语义不丢失可见发送成功之后不要在最终回复中重复同样内容。需要注意边界不要把原生 Slack blocks JSON 直接塞进 OpenClaw 的presentation字段——转换由插件负责。只有开发者在构建 Slack 应用、明确要求原生 Block Kit JSON 时才应阅读 extensions/slack/skills/block-kit/references/official-block-kit.md 与 extensions/slack/skills/block-kit/references/official-common-patterns.md并遵循“活文档 blocks.validate”工作流产出原生 JSON。工程实践建议综合 SKILL 文档与源码实现落地稳定的 Slack 工作流时建议遵循以下准则以 Schema 为唯一事实来源每次调用前检查message工具当前暴露的动作与参数不依赖记忆中的动作清单动作集合会随账号、令牌与配置门控动态变化。ID 优先、读后写优先使用上下文中的稳定channel:id/user:id与消息时间戳对模糊目标先read再写破坏性操作delete在意图不清晰时先确认。线程语义明确化默认继承当前线程跨线程用threadId指向根时间戳需要频道级发布时显式使用topLevel: true线程回复广播用replyBroadcast: true。多账号显式路由配置多个账号时总是传accountId由插件负责账号解析与令牌选择。富文本适度使用结构化场景主动用presentation短答与闲聊保持纯文本并始终提供message文本回退。结语OpenClaw 的 Slack 集成把平台能力收敛为单一message工具配合动态 Schema、线程时间戳规范、动作门控与 Block Kit 渲染为 Agent 提供了稳定且可审计的 Slack 工作流。掌握channel: slack的调用约定、threadId/messageId/accountId的寻址语义以及读后写与确认原则即可在真实 Slack 工作区中安全地驱动消息发送、线程协作与消息生命周期管理。相关技能与实现细节可继续查阅 extensions/slack/skills/slack/SKILL.md、extensions/slack/skills/block-kit/SKILL.md 以及 extensions/slack/src 下的源码与测试。【免费下载链接】openclawThe AI that really does things. Any OS. Any Platform. The lobster way. 项目地址: https://gitcode.com/GitHub_Trending/cl/openclaw创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考