今天在 GitHub Trending 上看到一个有意思的项目:SlackCLI,一个用 TypeScript 和 Bun 构建、面向开发者与 AI Agent 的 Slack 命令行工具。它把日常在 Slack 网页端才能完成的工作——收发消息、读会话、管理 Canvas——直接搬到了终端里。
一、项目概述
SlackCLI 是一个非官方、开源的 Slack 命令行交互工具,并非 Slack 官方出品,但它覆盖了大多数高频自动化场景。项目定位非常清晰:让 AI 代理、自动化脚本和开发者能直接从终端访问 Slack 能力。
核心特性包括:
- 🔐 双认证支持:既支持标准的 Slack App Token(xoxb/xoxp),也支持从浏览器会话提取的 Token(xoxd/xoxc)。
- 🎯 一键提取浏览器 Token:可自动解析从浏览器复制出的 cURL 命令,省去手动抠 Token 的麻烦。
- 🏢 多工作区管理:可同时维护多个 Slack 工作区,按名称或 ID 切换。
- 💬 会话与消息管理:列出频道、读取消息、发送消息、回复线程、编辑消息、添加表情回应。
- 📄 Canvas 支持:以 Markdown 形式列出与读取 Slack Canvas 文档。
- 🚀 轻量高速:基于 Bun 运行时,启动与执行速度都很快,并内置自更新机制。
- 🎨 友好输出:彩色、结构化的终端展示。
二、技术原理
架构设计
从 package.json 可以看出,项目采用 TypeScript + ESM 编写,运行时强依赖 Bun(engines.bun >=1.0.0),并用 commander 做命令路由,依赖 @slack/web-api(^7.15.2,即官方 Slack SDK)完成真正的 API 调用。
{
"name": "slackcli",
"version": "0.7.1",
"type": "module",
"dependencies": {
"@slack/web-api": "^7.15.2",
"commander": "^12.1.0",
"chalk": "^5.3.0",
"ora": "^8.1.1"
}
}
源码结构清晰地按职责拆分:
src/
├── index.ts # CLI 入口
├── commands/ # 命令实现
│ ├── auth.ts # 认证
│ ├── conversations.ts # 会话
│ ├── messages.ts # 消息
│ ├── update.ts # 更新
├── lib/ # 核心库
│ ├── auth.ts # 令牌管理
│ ├── workspaces.ts # 多工作区
│ ├── slack-client.ts # API 封装
│ ├── formatter.ts # 输出格式化
│ └── updater.ts # 自更新
└── types/index.ts # 类型定义
双认证的设计取舍
SlackCLI 同时支持两类令牌,原因在于使用场景不同:
- 标准 App Token(xoxb/xoxp):适合生产环境,需要创建 Slack App 并配置 OAuth Scope,权限可控、稳定,但不支持草稿(draft)消息等功能。
- 浏览器会话 Token(xoxd/xoxc):无需创建 App,从浏览器 Cookie/请求体中提取,上手快,支持更多网页端能力(如
messages draft草稿消息),但会随浏览器会话过期。
配置统一存放在 ~/.config/slackcli/ 下,其中 workspaces.json 记录各工作区的凭据,便于多工作区切换。
构建与分发
scripts/build.ts 借助 Bun 的编译能力,可一次性产出 Linux/macOS/Windows 多平台二进制:
bun run build:all # 同时构建 linux / macos / windows
这一设计让工具可以脱离 Node/Bun 环境单独运行,配合 Homebrew Tap 分发,安装成本极低。
三、安装与快速开始
环境要求
- Bun v1.0+(仅源码开发需要)
- TypeScript 5.x+
- 或从 Release 直接下载预编译二进制,无需任何运行时
安装方式
Homebrew(推荐 macOS / Linux):
brew tap shaharia-lab/tap
brew install slackcli
brew upgrade slackcli # 升级
预编译二进制(以 macOS Apple Silicon 为例):
curl -L https://github.com/shaharia-lab/slackcli/releases/latest/download/slackcli-macos-arm64 -o slackcli
chmod +x slackcli
mkdir -p ~/.local/bin && mv slackcli ~/.local/bin/
从源码构建:
git clone https://github.com/shaharia-lab/slackcli.git
cd slackcli
bun install
bun run build
最简认证示例
最省事的方式是复制浏览器里的 Slack API 请求为 cURL,让 SlackCLI 自动解析:
slackcli auth parse-curl --login
# 粘贴 cURL 命令,按两次回车即可自动写入多工作区凭据
若使用标准 App Token:
slackcli auth login --token=xoxb-YOUR-TOKEN --workspace-name="My Team"
四、使用方法与实战
基础用法:列举与读取会话
slackcli conversations list # 列出所有会话
slackcli conversations list --types=public_channel
slackcli conversations read C1234567890 # 读取频道最近消息
slackcli conversations read C1234567890 --limit=50 --json
进阶用法:发送、回复与回应
# 发送频道消息
slackcli messages send --recipient-id=C1234567890 --message="Hello team!"
# 回复线程
slackcli messages send --recipient-id=C1234567890 \
--thread-ts=1234567890.123456 --message="Great idea!"
# 带文件发送
slackcli messages send --recipient-id=C1234567890 \
--message="Here is the file" --file=./report.pdf
# 添加表情回应
slackcli messages react --channel-id=C1234567890 \
--timestamp=1234567890.123456 --emoji=fire
多工作区切换
slackcli auth list # 列出已认证工作区
slackcli auth set-default T1234567 # 设置默认
slackcli conversations list --workspace="My Team" # 按名称指定
实战场景:AI Agent 自动播报
由于 conversations read --json 会返回含 ts / thread_ts 的结构化数据,配合标准 Token 的 files:write 权限,Agent 可以稳定地把构建产物、报表推送到指定频道,是典型的 CI/自动化集成模式。
五、常见问题与解决方案
Q:浏览器 Token 认证失败?
A:浏览器 Token 会随浏览器会话失效,重新执行 slackcli auth extract-tokens 提取新鲜 Token 即可;同时确认 workspace URL 格式为 https://yourteam.slack.com。
Q:发送/读取提示权限错误?
A:检查机器人或用户是否已被加入对应频道;确认 OAuth Scope 覆盖所需权限(如发文件需 files:write);浏览器 Token 需保证在网页端有访问权限。
Q:编辑消息不生效? A:只能编辑由当前认证用户/App 发布的消息,临时消息(ephemeral)无法编辑。
Q:通过 Homebrew 安装后更新失败?
A:用 brew upgrade slackcli 而非 slackcli update;若 slackcli update 仍失败,确保对二进制路径有写权限,或改用用户目录 ~/.local/bin 安装。
六、总结
SlackCLI 把一个高频但分散的协作场景收敛到了一条命令里:双认证降低接入门槛,多工作区与结构化 JSON 输出让它天然适合自动化,Bun 带来的轻量与自更新则保证了长期可用性。如果你经常需要在脚本或 Agent 中操作 Slack,它值得一试——但请记住它是非官方工具,生产环境建议优先使用标准 App Token 并妥善管理权限。
- 项目地址:https://github.com/shaharia-lab/slackcli
- 许可协议:MIT