结论:slack用webclient才能发带按钮的结构化消息,钉钉加签必须手动计算timestamp和sign——漏算或格式错即400。

直接说结论:用 requests.post 调 Slack Webhook 或钉钉自定义机器人 Webhook 是最快路径,但 Slack 推荐用 slack_sdk.WebClient,钉钉加签必须手动算 sign 参数——不处理这两点,90% 的失败都发生在这儿。
Slack 用 WebClient 还是 Webhook?
Webhook 只能发基础文本或简单 Markdown,不支持区块(blocks)、按钮、展开折叠;slack_sdk.WebClient 才能真正做「任务状态卡片」。比如 CI 构建完成,你想显示「✅ 成功|分支:main|耗时:42s|日志链接」并带「重试」按钮,Webhook 做不到,必须用 WebClient。
- 初始化要传
token(Bot User OAuth Token),不是 Incoming Webhook URL -
chat_postMessage方法的blocks字段是核心,每块用字典描述,例如:{"type": "section", "text": {"type": "mrkdwn", "text": "✅ 构建成功"}} - 发送前务必用
conversations_list查一次channel_id,别硬写频道名——名字改了或权限变了就 404 - 未认证请求限流极严(60次/小时),
token必须带chat:writescope
钉钉加签参数怎么算才不报 400?
启用了加签后,Webhook URL 不再直接可用,必须在 query string 里拼 timestamp 和 sign,漏一个或时间戳误差超 1 秒,就返回 {"errcode":400,"errmsg":"invalid timestamp"}。
-
timestamp必须是毫秒级整数字符串,用str(round(time.time() * 1000)),不是int(time.time() * 1000) -
string_to_sign格式固定:f"{timestamp}\n{secret}",中间是换行符\n,不是空格或逗号 -
sign要 base64 编码再 URL encode,用urllib.parse.quote_plus(base64.b64encode(hmac_code)),不能只用base64.b64encode - 最终 URL 示例:
https://oapi.dingtalk.com/robot/send?access_token=xxx×tamp=1719839520000&sign=xxxx
任务状态推送该用什么消息类型?
纯文本适合告警初筛,但任务执行详情必须结构化。Slack 用 blocks,钉钉用 msgtype="markdown" 或 "actionCard",别堆 "text"。
- Slack:
blocks中每个 section 放一个字段,用fields控制两列布局,避免长文本换行错乱 - 钉钉 Markdown 消息中,
##标题会自动加粗,但链接必须写全https://,[点击查看详情](url)缺协议就失效 - 钉钉
actionCard的btns数组最多 3 个按钮,actionURL必须可公网访问,内网地址会被钉钉服务端拒绝 - 所有消息里的时间字段,统一用 UTC 格式(如
2026-07-01T13:22:00Z),别依赖本地时区
真正难的不是发出去,而是让接收方一眼看懂「谁、在哪儿、干了啥、结果如何、下一步该做什么」——这要求你把任务元数据(ID、环境、触发人)和执行上下文(日志片段、错误堆栈、耗时)一起塞进消息体,而不是只扔一句「任务完成」。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











