关于 slack-cli
slack-cli 是通过 `slack` 命令行工具和 Slack API 操作工作区的技能,涵盖消息、频道与用户查询、文件、提醒等操作。
主要功能
- 01发送和管理消息
- 02读取历史记录并搜索消息
- 03列出频道和用户
- 04上传文件并管理提醒
- 05调用 Slack API 执行操作
适用场景
- 01搜索工作区内的消息
- 02向频道上传文件
- 03在终端管理提醒或在线状态
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ michaelliv/ dotskills --skill slack-cli安装后在 Claude Code 中输入/slack-cli确认已加载。
附带文件references/INSTALLATION.md
详细介绍
Slack CLI
使用 slack-cli 和直接调用 Slack API,通过命令行与 Slack 工作区交互。
假设已安装并配置好
slack-cli。 如果找不到slack命令或返回not_inited,请参阅 references/INSTALLATION.md 了解设置说明。
适用场景
- 用户想发送、更新或删除 Slack 消息
- 用户想读取频道历史记录或搜索消息
- 用户想列出频道、用户或会话
- 用户想将文件上传到 Slack
- 用户想管理提醒、暂停通知或在线状态
- 用户想自动化 Slack 工作流
设置
如果 slack 不可用或尚未配置,请参阅 references/INSTALLATION.md 查看完整设置说明。
令牌存储在 slack 二进制文件的 etcdir 变量所配置的路径中(在 macOS 上通常为 /opt/homebrew/etc/slack-cli/.slack)。你也可以使用 SLACK_CLI_TOKEN 环境变量。
使用 psst 管理凭据
将 Slack 令牌存储在全局 psst 保管库中:
psst --global set SLACK_CLI_TOKEN --tag slack
对于内置命令,通过 psst 注入令牌:
psst --global SLACK_CLI_TOKEN -- slack chat send 'Hello!' '#channel'
对于直接 API 调用,使用内联 psst get:
curl -s -H "Authorization: Bearer $(psst --global get SLACK_CLI_TOKEN)" "https://slack.com/api/..."
内置命令
slack CLI 原生支持以下命令:
聊天
# Send a message
slack chat send 'Hello world!' '#channel'
# Send with rich formatting
slack chat send --text 'text' --channel '#channel' --color good --title 'Title' --pretext 'Pretext'
# Pipe content as a message
echo "some output" | slack chat send --channel '#channel'
# Update a message (requires timestamp and channel)
slack chat update 'Updated text' 1405894322.002768 '#channel'
# Delete a message
slack chat delete 1405894322.002768 '#channel'
# Chain: send, capture ts+channel, then update
slack chat send 'hello' '#general' --filter '.ts + "\n" + .channel' | \
xargs -n2 slack chat update 'goodbye'
文件
# Upload a file
slack file upload README.md '#channel'
# Upload with metadata
slack file upload README.md '#channel' --comment 'See attached' --title 'README'
# Create a Slack post from markdown
slack file upload --file post.md --filetype post --title 'Post Title' --channels '#channel'
# List files
slack file list
slack file list --filter '[.files[] | {id, name, size}]'
# File info / delete
slack file info F2147483862
slack file delete F2147483862
提醒
# Add a reminder
slack reminder add 'lunch' $(date -v +30M "+%s")
# List / complete / delete
slack reminder list
slack reminder complete Rm7MGABKT6
slack reminder delete Rm7MGABKT6
暂停通知(勿扰)
slack snooze start 60 # Start snooze for 60 minutes
slack snooze info # Check your snooze status
slack snooze end # End snooze
在线状态
slack presence active
slack presence away
全局选项
所有命令均支持:
--filter|-f <jq-filter>— 对 JSON 响应应用 jq 筛选器--compact|-cp— 输出紧凑的 JSON--monochrome|-m— jq 输出不使用颜色--trace|-x— 启用 bash 跟踪以进行调试
已知限制
- 通过内置 CLI 发送私信不可靠。
slack chat send 'msg' '@user'经常因channel_not_found而失败。请改用下方的直接 API 调用方式。 - 通过
chat:write发送的消息会显示为 Slack App 发出,而不是由你的用户发出。这是 Slack API 的限制——即使使用用户令牌,也会使用应用身份。
直接调用 API
slack CLI 未涵盖所有 Slack API 方法。对于内置命令之外的操作,请使用 curl 直接调用 Slack API。从 CLI 的配置文件中读取令牌。
发送私信
内置的 slack chat send 不擅长处理私信。请直接调用 API:
# Step 1: Open (or find) the DM channel with a user
DM_CHANNEL=$(curl -s -X POST \
-H "Authorization: Bearer $(psst --global get SLACK_CLI_TOKEN)" \
-H "Content-Type: application/json" \
-d '{"users":"USER_ID"}' \
"https://slack.com/api/conversations.open" | jq -r '.channel.id')
# Step 2: Send the message
curl -s -X POST \
-H "Authorization: Bearer $(psst --global get SLACK_CLI_TOKEN)" \
-H "Content-Type: application/json" \
-d "{\"channel\":\"${DM_CHANNEL}\",\"text\":\"Hello!\"}" \
"https://slack.com/api/chat.postMessage"
需要
im:write权限范围。 如果没有该权限范围,conversations.open将失败。如果你没有im:write,可以通过查找现有私信频道来解决:DM_CHANNEL=$(curl -s \ -H "Authorization: Bearer $(psst --global get SLACK_CLI_TOKEN)" \ "https://slack.com/api/conversations.list?types=im&limit=200" | \ jq -r '.channels[] | select(.user == "USER_ID") | .id')
列出频道
curl -s -H "Authorization: Bearer $(psst --global get SLACK_CLI_TOKEN)" \
"https://slack.com/api/conversations.list?types=public_channel,private_channel&limit=200" | \
jq '[.channels[] | {name, id, is_private}]'
读取频道历史记录
# Get recent messages from a channel (use channel ID)
curl -s -H "Authorization: Bearer $(psst --global get SLACK_CLI_TOKEN)" \
"https://slack.com/api/conversations.history?channel=CHANNEL_ID&limit=20" | \
jq '[.messages[] | {user, text, ts}]'
# Get messages from last 7 days
OLDEST=$(date -v -7d +%s)
curl -s -H "Authorization: Bearer $(psst --global get SLACK_CLI_TOKEN)" \
"https://slack.com/api/conversations.history?channel=CHANNEL_ID&oldest=${OLDEST}&limit=100" | \
jq '[.messages[] | {user, text, ts}]'
# Get messages within a specific date range (oldest and latest are unix timestamps)
curl -s -H "Authorization: Bearer $(psst --global get SLACK_CLI_TOKEN)" \
"https://slack.com/api/conversations.history?channel=CHANNEL_ID&oldest=${START_TS}&latest=${END_TS}&limit=100" | \
jq '[.messages[] | {user, text, ts}]'
列出用户
curl -s -H "Authorization: Bearer $(psst --global get SLACK_CLI_TOKEN)" \
"https://slack.com/api/users.list" | \
jq '[.members[] | {name, id, real_name}]'
# Resolve multiple user IDs (no batch endpoint — fetch all and filter)
curl -s -H "Authorization: Bearer $(psst --global get SLACK_CLI_TOKEN)" \
"https://slack.com/api/users.list" | \
jq '[.members[] | select(.id == "U1234" or .id == "U5678") | {id, name: .real_name}]'
工作区信息
# Use auth.test (not team.info — team.info requires a scope we don't have)
curl -s -H "Authorization: Bearer $(psst --global get SLACK_CLI_TOKEN)" \
"https://slack.com/api/auth.test" | \
jq '{team, team_id, url}'
搜索消息
curl -s -H "Authorization: Bearer $(psst --global get SLACK_CLI_TOKEN)" \
"https://slack.com/api/search.messages?query=keyword&count=10" | \
jq '[.messages.matches[] | {channel: .channel.name, text, ts}]'
添加回应
# Add a reaction
curl -s -X POST \
-H "Authorization: Bearer $(psst --global get SLACK_CLI_TOKEN)" \
-H "Content-Type: application/json" \
-d '{"channel":"CHANNEL_ID","timestamp":"1234567890.123456","name":"thumbsup"}' \
"https://slack.com/api/reactions.add"
# Get reactions on a message
curl -s -H "Authorization: Bearer $(psst --global get SLACK_CLI_TOKEN)" \
"https://slack.com/api/reactions.get?channel=CHANNEL_ID×tamp=1234567890.123456"
线程回复
# Get replies in a thread (use the parent message ts)
curl -s -H "Authorization: Bearer $(psst --global get SLACK_CLI_TOKEN)" \
"https://slack.com/api/conversations.replies?channel=CHANNEL_ID&ts=1234567890.123456" | \
jq '[.messages[] | {user, text, ts}]'
在帖子线程中发布消息
curl -s -X POST \
-H "Authorization: Bearer $(psst --global get SLACK_CLI_TOKEN)" \
-H "Content-Type: application/json" \
-d '{"channel":"CHANNEL_ID","text":"reply text","thread_ts":"1234567890.123456"}' \
"https://slack.com/api/chat.postMessage"
提示
- 内置命令的频道参数接受
#name格式,但直接调用 API 时必须使用频道 ID(例如CHANNEL_ID) - 在任何内置命令中使用
--filter,通过 jq 提取特定字段 - 使用
--filter '.ts + "\n" + .channel'将命令串联起来,以便依次发送、更新和删除 - 直接调用 API 时,务必为 URL 加引号,以避免 shell 通配符展开
- 分页:大多数列表端点都支持
cursor和limit参数——请检查响应中的response_metadata.next_cursor - 按名称查找用户 ID:
curl -s -H "Authorization: Bearer $(psst --global get SLACK_CLI_TOKEN)" "https://slack.com/api/users.list" | jq -r '.members[] | select(.real_name | test("Name"; "i")) | {name, id, real_name}' - 消息永久链接:
https://<workspace>.slack.com/archives/<channel_id>/p<ts_without_dot>— 移除消息时间戳中的点(例如,时间戳1769935497.539749会变为p1769935497539749)