协作办公
需要向 Slack 频道发送公告、指标报告、博客分享…
适用于需要把格式化消息或通知发送到 Slack 频道的场景。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
需要向 Slack 频道发送公告、指标报特定
解决思路
- 按顺序 source ~/.claude/.env.global 2>/dev/null、source .env 2>/dev/null、source .env.local 2>/dev/null,然后检查 $SLACK_WEBHOOK_URL 与 $SLACK_BOT_TOKEN 是否存在;若都不存在则按 Setup Guide 配置。
- Option A Incoming Webhook:访问 https://api.slack.com/apps,点击 Create New App > From scratch,命名应用并选择 workspace。
- 在左侧栏点击 Incoming Webhooks 并开启;点击 Add New Webhook to Workspace;选择目标频道并 Allow。
- 复制以 https://hooks.slack.com/services/... 开头的 Webhook URL,并执行 echo 'SLACK_WEBHOOK_URL=...' >> .env。
- 记住 Webhook 限制:每个 webhook 只对应一个频道,不能读取消息、列出频道或程序化回复线程,除非已知之前 API 响应中的 thread_ts。
- Option B Bot Token:访问 https://api.slack.com/apps,Create New App > From scratch,命名应用并选择 workspace。
- 在 OAuth & Permissions 的 Bot Token Scopes 添加 chat:write、chat:write.public、channels:read;可选添加 files:write 上传文件、reactions:write 添加 emoji reaction。
- 点击 Install to Workspace 授权,复制以 xoxb- 开头的 Bot User OAuth Token,并执行 echo 'SLACK_BOT_TOKEN=...' >> .env。
- 在目标频道输入 /invite @YourBotName 邀请 bot;可选执行 echo 'SLACK_DEFAULT_CHANNEL=#marketing' >> .env 设置默认频道。
- Method 1 Webhook 简单文本:用 curl -s -X POST "$SLACK_WEBHOOK_URL" -H "Content-Type: application/json" -d '{"text":"Hello from the marketing bot!"}' 发送。
- Webhook 覆盖用户名和图标:在 JSON 中追加 username 和 icon_emoji,例如 "username":"Marketing Bot" 与 "icon_emoji":":mega:"。
- Webhook 发送 Block Kit:在 JSON 中使用 blocks 数组,包含 header、section、divider、带 button accessory 的 section 等块。
- Method 2 Web API 基础:所有请求发往 https://slack.com/api/,并带 header Authorization: Bearer ${SLACK_BOT_TOKEN}。
- 用 chat.postMessage 发消息到频道:JSON 中设置 channel(如 #marketing)、text,以及 blocks(如 header 与 section)。
- 捕获 postMessage 响应的 ts:RESPONSE=$(curl ... chat.postMessage ...),再用 MESSAGE_TS=$(echo "$RESPONSE" | python3 -c "import json,sys; print(json.load(sys.stdin).get('ts',''))") 保存。
- 线程回复:再次用 chat.postMessage,设置 channel、thread_ts 为 ${MESSAGE_TS}、text;若要同时广播到频道则加 "reply_broadcast": true。
- 更新消息:用 chat.update,设置 channel、ts 为 ${MESSAGE_TS}、text 和 blocks。
- 删除消息:用 chat.delete,设置 channel 与 ts 为 ${MESSAGE_TS}。
- 列出公开频道:用 conversations.list?types=public_channel&limit=100,带 Authorization header,再用 python3 解析并打印 #name、成员数、ID。
- 上传文件:用 files.uploadV2,-F file=@report.pdf、-F filename=weekly-report.pdf、-F channel_id=C0123456789、-F initial_comment=...。
- 添加 emoji reaction:用 reactions.add,JSON 设置 channel、timestamp 为 ${MESSAGE_TS}、name 为 white_check_mark。
- Block Kit 的 header 块:使用 plain_text 大标题,不支持 mrkdwn。
- section 块:支持 mrkdwn 主内容,可包含 text,也可用 fields 做两列布局。
- section 块可带 accessory:button(url 或 action_id)或 image(image_url、alt_text)。
- divider 块:用 {"type":"divider"} 插入水平分隔线。
- image 块:设置 image_url、alt_text,可选 title(plain_text)。
- context 块:用 elements 放小号 muted 文本/图片,支持 mrkdwn,适合元数据、时间戳。
- actions 块:用 elements 放按钮、选择器、日期选择器等交互元素;每个 actions 最多 25 个元素。
- rich_text 块:用于高级格式化文本,如列表、引用、代码块。
- 按钮样式:"primary" 绿色、"danger" 红色、省略为默认灰色;有 action_id 无 url 的按钮需在 Slack App 的 Interactivity & Shortcuts 配置 Request URL 接收 payload,有 url 的按钮直接打开无需后端。
- Block Kit 限制:每条消息 50 个 blocks;每个 text block 3000 字符;header 150 字符;每个 section 10 个 fields;每个 actions 25 个 elements;每个 context 10 个 elements。
- 用 https://app.slack.com/block-kit-builder 可视化设计和预览 Block Kit 消息。
- Slack mrkdwn 格式:加粗 *text*、斜体 _text_、删除线 ~text~、行内代码 `text`、代码块 ```text```、引用 >text、链接 <https://url|display text>、用户提及 <@U0123456>、频道提及 <#C0123456>、emoji :emoji_name:、无序列表以 - 或 * 开头、有序列表以 1. 开头、JSON 字符串中用换行符。
- mrkdwn 与标准 Markdown 差异:加粗用单星号 *bold* 而非 **bold**;斜体用下划线 _italic_ 而非单星号;链接用 <url|text> 而非 [text](url);没有 header,改用 header block;图片不能内联,改用 image block 或 accessory。
- Template 1 产品公告:header 标题、section 描述 What/Why/How、image 截图、divider、actions 按钮 Read Announcement/Watch Demo、context 发布团队与线程回复提示。
- Template 2 周指标报告:header 日期、section 简介、divider、多个 section 用 fields 展示 Website Traffic/Conversion/Email 指标、divider、section Key Takeaways、actions Full Dashboard、context 自动生成说明。
- Template 3 博客分享:header、section 用 <url|标题> 和 image accessory、context 作者/阅读时间/标签、divider、section 社交扩增文案、actions 按钮 Read/Twitter/LinkedIn。
- Template 4 团队更新/standup:header、section Completed Last Week、section In Progress、section This Week's Priorities、section Blockers、divider、context 线程回复提示。
- Template 5 事故/紧急通知:header 告警、section Issue/Impact/Status/Owner、section Details、section Next Steps、actions Status Page。
- Workflow 1 发营销公告:收集标题、正文、链接、图片 URL、目标频道;选择模板或自定义 Block Kit payload;构建 JSON 并用 mrkdwn 格式化;预览完整 JSON 并描述渲染效果;确认后发送;用 curl 执行并报告响应,Web API 时捕获 ts 供线程使用。
- Workflow 2 发周指标:收集指标或从分析工具拉取;用 section fields 做两列指标布局;加入周环比与箭头 emoji;添加 2-3 条 key insights;加 dashboard 链接按钮;发送主报告,再以线程回复发详细拆分。
- Workflow 3 分享博客:获取博客 URL 或抓取最新文章;用 WebFetch 提取标题、描述、作者和 OG image;用 Template 3 构建分享消息并含社交扩增片段;加预填 Twitter 和 LinkedIn 的 intent URL 按钮;发到团队营销频道。
- Workflow 4 社区运营:新成员加入时发欢迎消息与规则资源;每周发热门讨论或新资源汇总;用 RSVP 按钮发 webinars/AMAs/meetups 活动公告;用 actions 按钮做投票和快速反馈;回复现有线程做更新或答疑。
- 动态内容用 shell 变量:设置 TITLE、DESCRIPTION、LINK、IMAGE_URL、CHANNEL,再用 python3 -c 构建 JSON payload 并传给 curl。
- 复杂消息先写文件:cat > /tmp/slack-message.json << 'PAYLOAD' 写入 channel、text、blocks,执行 curl -s -X POST https://slack.com/api/chat.postMessage -H "Authorization: Bearer ${SLACK_BOT_TOKEN}" -H "Content-Type: application/json" -d @/tmp/slack-message.json。
- 定时消息:用 date 生成 Unix timestamp(Linux 用 date -d "2026-02-12 09:00:00" +%s,macOS 用 date -j -f ...),再调用 chat.scheduleMessage 设置 channel、post_at、text、blocks。
- 列出定时消息:调用 chat.scheduledMessages.list,用 python3 读取 scheduled_messages 并格式化 post_at。
- 删除定时消息:调用 chat.deleteScheduledMessage,设置 channel 和 scheduled_message_id。
- 多渠道发布:定义 CHANNELS=("#marketing" "#general" "#product") 和 MESSAGE JSON,循环为每个 channel 设置 msg['channel'],调用 chat.postMessage,并解析 response 的 ok、ts 或 error。
- 错误处理:invalid_auth 重新生成 bot token;channel_not_found 邀请 bot 或改用 channel ID;not_in_channel 邀请 bot 或使用 chat:write.public;too_many_attachments 拆分消息;msg_too_long 缩短或拆分;rate_limited 等 Retry-After 秒数;missing_scope 添加 scope 并重装应用。
- 验证 API 响应:把 curl 响应存到变量或 mktemp 文件,用 python3 检查 ok,成功打印 ts/channel,失败打印 error 与 response_metadata.messages 细节。
- Tips:始终在 blocks 旁带 text 字段作为通知、无障碍阅读器和不支持 Block Kit 客户端的 fallback。
- Tips:生产工作流优先 chat.postMessage(Web API)而不是 webhook,因为可取得 ts 用于线程、更新、删除。
- Tips:长报告用线程:父消息发摘要,详细内容用 threaded replies 发,保持频道整洁。
- Tips:在 plain_text 字段使用 :emoji: 代码并设置 "emoji": true,以在 header 和按钮标签中渲染 emoji。
- Tips:mrkdwn 特殊字符转义:& 转 &,< 转 <,> 转 >。
- Tips:Slack 速率限制约每频道每秒 1 条消息;批量发布时在请求间加 1 秒延迟。
- Tips:发布指标时用 section fields 做两列布局,不要在 mrkdwn 中尝试表格,Slack 不支持表格。
- Tips:发布前始终向用户展示完整消息 payload 并请求确认。
适用边界 · 注意事项
- 没有 Slack 工作区、Incoming Webhook URL 或 Bot Token 时无法使用。
- 只支持 Slack,不适用于其他即时通讯平台。
- 需要交互按钮回调时,必须额外配置 Slack App 的 Interactivity & Shortcuts Request URL,否则按钮只能用 url 跳转。