关于 slackctl
slackctl 是用于自动化 Slack 操作的命令行工具,提供消息、频道、文件、搜索、Canvas 和用户命令,并以 JSON 输出。它支持从本地应用导入凭据及选择多个工作区。
主要功能
- 01读取、发送、编辑消息及添加表情回应
- 02管理频道与成员
- 03上传、下载和查看文件
- 04搜索消息和文件
- 05从本地应用导入凭据
- 06JSON 输出与工作区选择
适用场景
- 01获取消息及其回复串
- 02查看未读或稍后处理的消息
- 03发送频道更新或私信
- 04搜索 Slack 文件并导出 Canvas 内容
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ cluas/ slackctl --skill slackctl安装后在 Claude Code 中输入/slackctl确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/commands.mdoutput.mdtargets.md详细介绍
使用 slackctl 自动化 Slack
slackctl 是一个位于 $PATH 中的单二进制文件 CLI。直接调用即可(例如 slackctl user get @alice)。
安装
slackctl 是一个静态二进制文件,没有运行时依赖,适用于 macOS、Linux 和 Windows(amd64 + arm64)。
如果在 $PATH 中找不到 slackctl,请为当前操作系统安装:
- macOS / Linux(推荐)— Homebrew:
brew tap cluas/tap
brew install slackctl
- Windows(推荐)— Scoop:
scoop bucket add cluas https://github.com/cluas/scoop-bucket
scoop install slackctl
- 任何已安装 Go 的操作系统:
go install github.com/cluas/slackctl/cmd/slackctl@latest
- 手动安装(任何操作系统):从 发布页面 下载适用于你的操作系统和架构的压缩包,解压后将
slackctl(Windows 上为slackctl.exe)放入PATH。
重要:Bash 命令格式规则
Claude Code 的权限检查器采用安全启发式规则,会强制弹出手动批准提示。避免使用以下模式,以便命令自动获准。
- 命令字符串中不得出现
#。 使用不带#的频道名(例如general,而不是#general)。 - 不得出现
''(连续的单引号)或""(连续的双引号)。 这会触发“可能存在混淆”检查。 - 只能使用
| jq进行筛选,不得使用 python3 或其他命令。 仅包含单引号表达式的jq命令是安全的(内部不得出现"):- 正确:
slackctl search messages "query" | jq '.messages[] | .ts'
- 正确:
- 不得使用
||或&&链式连接命令。 将多个 slackctl 命令分别作为独立的 Bash 工具调用运行。 - 不得进行文件重定向(
>、>>)。 直接处理 JSON 输出,不要写入文件。
快速开始(身份验证)
自动检测身份验证适用于 macOS、Linux 和 Windows。它会直接从本地应用读取凭据(不使用浏览器自动化),依次尝试 Slack Desktop、Chrome 和 Firefox。Cookie 解密按平台处理:macOS 使用 Keychain,Linux 使用 Secret Service(secret-tool),Windows 使用 DPAPI。
各来源的平台支持情况:
来源(auth import-*) | macOS | Linux | Windows |
|---|---|---|---|
import-desktop(Slack Desktop) | ✅ | ✅ | ✅ |
import-chrome | ✅ | ✅ | ✅ |
import-brave | ✅ | ✅ | ✅ |
import-firefox | ✅ | ✅ | ✅ |
注意:在 Linux 上,Chrome、Brave 和 Slack 的 Cookie 解密会通过 secret-tool 从桌面密钥环读取密钥(安装 libsecret-tools / libsecret),如果未配置密钥环,则回退到默认密码 peanuts。Firefox 的 cookies.sqlite 在所有平台上都是明文。
如果没有可用凭据,请运行以下任一项:
- 导入 Slack Desktop 凭据(macOS/Linux/Windows):
slackctl auth import-desktop
slackctl auth test
- Firefox 备用方式(macOS/Linux/Windows):
slackctl auth import-firefox
slackctl auth test
- Chrome 备用方式(macOS/Linux/Windows):
slackctl auth import-chrome
slackctl auth test
- 或设置环境变量:
export SLACK_TOKEN="xoxc-..."
export SLACK_COOKIE_D="xoxd-..."
export SLACK_WORKSPACE_URL="https://myteam.slack.com"
slackctl auth test
- 或手动添加:
slackctl auth add --workspace-url https://myteam.slack.com --xoxc xoxc-... --xoxd xoxd-...
slackctl auth test
检查已配置的工作区:
slackctl auth whoami
标准工作流(给定 Slack 消息 URL)
- 获取单条消息:
slackctl message get "https://workspace.slack.com/archives/C123/p1700000000000000"
- 如果需要完整线程:
slackctl message list "https://workspace.slack.com/archives/C123/p1700000000000000" --thread-ts 1700000000.000000
浏览最近的频道消息
slackctl message list "general" --limit 20
slackctl message list "C0123ABC" --limit 10
slackctl --attachments message list "general" --limit 20
默认情况下,--attachments 处于关闭状态。如果消息正文位于附件而非 text 中,请传入此参数。
获取未读消息
列出所有有未读消息的频道:
slackctl message unread --limit 20
同时获取未读消息的实际内容:
slackctl message unread --fetch --max-per-channel 5
注意:对于 Enterprise Grid,获取未读数量时请使用 --workspace 和企业 URL:
slackctl message unread --workspace longbridge-group --fetch
获取稍后查看的消息(Later)
列出用户已保存的消息(Slack 的“Later”列表):
slackctl message saved --limit 20
同时获取已保存消息的实际内容:
slackctl message saved --fetch
按状态筛选(saved = 进行中,也可以是 completed、archived;默认显示全部):
slackctl message saved --filter saved --fetch
对于 Enterprise Grid,需要时会自动使用企业工作区。
发送、编辑、删除或添加表情回应
slackctl message send "general" "here is the report"
slackctl message send U01AAAA "hello via DM"
slackctl message send "general" "threaded reply" --thread-ts 1700000000.000000
slackctl message edit "general" 1700000000.000000 "updated text"
slackctl message delete "general" 1700000000.000000
slackctl message react add "general" 1700000000.000000 "eyes"
slackctl message react remove "general" 1700000000.000000 "eyes"
向用户 ID 发送消息会自动打开私信。
列出频道 + 创建频道/邀请
slackctl channel list
slackctl channel list --limit 50
slackctl channel new "incident-war-room"
slackctl channel new "incident-leads" --private
slackctl channel invite "incident-war-room" "U01AAAA,U02BBBB"
文件(上传、下载、列出、查看信息、删除)
将文件上传到频道或线程:
slackctl file upload ./report.pdf "general" --title "Weekly Report" --message "Here is this week's report"
slackctl file upload ./screenshot.png "general" --thread-ts 1700000000.000000
slackctl file upload ./photo.jpg U01AAAA --message "Check this out"
从 stdin 上传(管道):
cat output.log | slackctl file upload - "general" --filename "build.log" --title "Build Log"
下载文件:
slackctl file download F0123ABCDEF --output ./downloaded.png
slackctl file download F0123ABCDEF --url-only
列出、检查、删除文件:
slackctl file list --channel "general" --limit 10
slackctl file list --types images --limit 20
slackctl file info F0123ABCDEF
slackctl file delete F0123ABCDEF
搜索(消息 + 文件)
slackctl search messages "deploy failed" --limit 10
slackctl search files "report" --limit 5
标记为已读
slackctl channel mark "general" 1700000000.000000
Canvas
获取 Slack 画布并转换为 Markdown:
slackctl canvas get "https://workspace.slack.com/docs/T123/F456"
slackctl canvas get F0123ABCDEF
用户
slackctl user list --limit 100
slackctl user get "@alice"
slackctl user get U01AAAA
多工作区
如果你有多个工作区,请传入 --workspace 以消除歧义:
slackctl message list "general" --workspace "myteam" --limit 10
slackctl auth set-default https://myteam.slack.com
所有输出均为 JSON
所有命令都会将 JSON 输出到 stdout。使用 | jq 进行筛选:
slackctl user get U01AAAA | jq '.email'
slackctl message list "general" --limit 5 | jq '.[].text'
参考资料
- references/commands.md:完整的命令映射和所有标志
- references/targets.md:URL 与频道的定位规则
- references/output.md:JSON 输出结构