关于 slack
slack 是一项使用 Slack Web API 的技能,适用于读取已加入频道的内容、搜索公开频道消息及发送经确认的消息。它区分 Bot token 与用户 token,并明确限定各自可执行的操作。
主要功能
- 01读取应用已加入频道的历史和线程
- 02搜索授权用户可见的公开频道消息
- 03列出频道并查询成员
- 04经确认后发送频道消息或线程回复
- 05校验 Slack 响应并遵守速率限制
适用场景
- 01查找公开频道中的部署讨论
- 02查看已加入频道的近期消息
- 03确认工作区和频道后准备发送回复
- 04在已加入的私有频道中筛查近期关键词
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ acedatacloud/ skills --skill slack安装后在 Claude Code 中输入/slack确认已加载。
详细介绍
使用已连接的机器人令牌 $SLACK_TOKEN 调用 Slack Web API,读取已加入频道的内容并发送已确认的消息。单独的用户令牌 $SLACK_USER_TOKEN 仅用于搜索公开频道。仅通过 HTTPS 将任一令牌发送至 https://slack.com/api/。检查每个响应的 JSON ok 字段和 HTTP 状态;调用失败时,报告 Slack 返回的错误值。遇到 HTTP 429 时遵循 Retry-After。
消息由 AceDataCloud 机器人发送,而不是通过用户的 Slack 账号发送。该应用无法上传文件或加入频道。只有在应用已加入的频道中,才能查看机器人的频道和对话历史记录。公开搜索涵盖已授权用户所在工作区的公开频道,包括机器人尚未加入的频道;不涵盖私有频道或私信。机器人令牌不能使用 Slack 的旧版 search.messages 方法,也不能在没有 Slack 事件 action_token 的情况下使用实时搜索。绝不要使用用户令牌发布消息。
搜索公开频道消息
用户发起公开搜索时,使用 Slack 的实时搜索 API。如果 $SLACK_USER_TOKEN 不存在,请说明 Slack 连接需要重新授权才能进行公开搜索,并提供链接
https://studio.acedata.cloud/console/connectors;不要默默改为扫描近期历史记录。明确将 channel_types 限定为 public_channel,并将 content_types 限定为 messages。每页最多请求 20 条结果,仅在需要时使用 next_cursor 翻页,并向用户提供消息永久链接作为来源。不要在当前任务之外保存 Slack 搜索结果。
QUERY="deployment issue"
curl -sS -X POST https://slack.com/api/assistant.search.context \
-H "Authorization: Bearer $SLACK_USER_TOKEN" \
-H "Content-Type: application/json; charset=utf-8" \
-d "$(jq -nc --arg q "$QUERY" \
'{query:$q, channel_types:["public_channel"], content_types:["messages"], limit:20}')" \
| jq '{ok, error, next_cursor, messages: [.results.messages[]? | {content, author_name, channel_name, message_ts, permalink}]}'
如果 Slack 返回错误,请报告该错误,不要把空结果说成搜索成功。搜索结果受已授权用户对公开频道的访问权限以及 Slack 的搜索排序和保留规则限制。
验证已连接的工作区
curl -sS -H "Authorization: Bearer $SLACK_TOKEN" \
https://slack.com/api/auth.test
使用返回的团队和机器人用户信息,检查连接是否指向用户预期的工作区。
列出应用可见的频道
curl -sS -G -H "Authorization: Bearer $SLACK_TOKEN" \
https://slack.com/api/conversations.list \
--data-urlencode "types=public_channel,private_channel" \
--data-urlencode "limit=200"
使用 response_metadata.next_cursor 翻页。根据此响应解析频道名称对应的 ID,不要编造 ID。
读取频道历史记录或线程
curl -sS -G -H "Authorization: Bearer $SLACK_TOKEN" \
https://slack.com/api/conversations.history \
--data-urlencode "channel=C0123456789" \
--data-urlencode "limit=15"
curl -sS -G -H "Authorization: Bearer $SLACK_TOKEN" \
https://slack.com/api/conversations.replies \
--data-urlencode "channel=C0123456789" \
--data-urlencode "ts=1777656720.123456"
只有应用是成员时,才读取私有频道或私信。如果 Slack 返回 not_in_channel 或 channel_not_found,请让用户将应用添加到该对话中。不要尝试自动加入。
在一个已加入的私有频道或私信中查找关键词
对于机器人已加入的私有频道或私信,仅获取该对话的近期历史记录并在本地筛选。这是范围受限的近期历史记录扫描,不是 Slack 的公开搜索。说明时间范围,并说明是否仍有更早的未读消息。对于 Slack Marketplace 之外新安装的商业应用,Slack 可能会将 conversations.history 限制为每分钟一次调用且最多 15 条消息;请遵循 Retry-After,不要同时扫描多个频道。
KEYWORD="deploy"
curl -sS -G -H "Authorization: Bearer $SLACK_TOKEN" \
https://slack.com/api/conversations.history \
--data-urlencode "channel=C0123456789" \
--data-urlencode "limit=15" \
| jq --arg q "$KEYWORD" '{ok, error, has_more, matches: [.messages[]? | select((.text // "") | contains($q)) | {ts, user, text}]}'
如果 Slack 返回错误,请报告错误,不要声称搜索成功。匹配列表为空仅表示已获取的消息中没有匹配项,并不能证明该关键词在频道的完整历史记录中不存在。
解析成员
curl -sS -G -H "Authorization: Bearer $SLACK_TOKEN" \
https://slack.com/api/users.lookupByEmail \
--data-urlencode "[email protected]"
仅使用成员详情来识别已检索内容中的人员。不要发送未经请求的私信,也不要为了联系他人而枚举成员。
发送消息或回复线程
每次发送前,先确认准确的工作区、频道或现有对话,以及最终消息文本。调用 request_action_confirmation,设置 kind: "generic",并展示这三项内容。只有用户确认后才能发送。如果确认工具不可用,则返回草稿。如果这是无人值守的运行任务,只有在已保存的任务明确授权了对应的目标位置和内容时才能发送;否则返回草稿。
机器人必须已是目标频道或对话的成员。如果 Slack 返回 not_in_channel 或 channel_not_found,请用户将应用添加到该处。不要调用 conversations.join。如果 chat.postMessage 请求的结果未知,不要重试;应先检查频道历史记录,以避免重复发送。
curl -sS -X POST https://slack.com/api/chat.postMessage \
-H "Authorization: Bearer $SLACK_TOKEN" \
-H "Content-Type: application/json; charset=utf-8" \
-d "$(jq -nc --arg ch "C0123456789" --arg text "Confirmed message" \
'{channel:$ch, text:$text}')"
回复现有线程时,请在载荷中包含准确的 thread_ts。检查响应中的 ok、channel 和 ts,并报告已发送消息的链接,或频道和时间戳。
如果 auth.test 返回 not_authed 或 invalid_auth,请用户访问 https://studio.acedata.cloud/console/connectors 重新连接 Slack。