应为飞书和钉钉分别封装独立发送函数,通过统一调度层按目标群类型分发;飞书需处理Webhook格式、token缓存与限频(如sleep 0.5),钉钉需动态适配加签、IP白名单或关键词;每次必须校验平台专属成功字段(code==0或errcode==0),并记录失败详情。

怎么同时往飞书和钉钉多个群发消息?
不能靠一个脚本“通用适配”两个平台——飞书用 bot/v2/hook/ Webhook,钉钉用 robot/send?access_token=,鉴权、字段名、错误码全都不一样。硬写成一个函数只会让逻辑混乱、调试困难、改一处崩三处。
正确做法是:为每个平台单独封装发送函数,再用统一调度层调用。比如:
-
send_to_feishu(webhook_url, payload)只处理飞书格式(msg_type、card结构) -
send_to_dingtalk(webhook_url, payload)只处理钉钉格式(msgtype、at_mobiles、加签逻辑) - 主流程里按目标群类型分发,不混用字段
飞书多群同步要注意 token 失效和限频
飞书 Webhook 本身没 token,但如果你用的是 tenant_access_token(比如读取多维表后再发通知),那它 2 小时过期,且每分钟最多调用 60 次。直接轮询发 10 个群,很容易触发 429 Too Many Requests 或 errcode: 99991001(token 过期)。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 把
tenant_access_token缓存到内存或本地文件,每次发前校验有效期 - 多群发送必须加
time.sleep(0.5),避免瞬时并发超限 - 飞书 Webhook 发送失败时,
response.json()里code不是 HTTP 状态码,而是飞书自定义错误码(如20001表示签名错误)
钉钉多群同步必须区分安全策略
你建的每个钉钉机器人可能用了不同安全设置:有的只设了关键词,有的开了 IP 白名单,有的启用了加签。同一段代码发不同群,如果没动态适配,会卡在 invalid signature 或 ip not in whitelist。
关键点:
- 加签必须对
timestamp+secret做 HmacSHA256,再 base64 编码,拼到 URL 后面 - IP 白名单要求请求来源公网 IP 固定——别在公司内网跑脚本,否则会因出口 IP 变动被拒
- 关键词模式最简单,但 payload 里必须含指定词,比如
"content": "【告警】磁盘使用率超90%"中的【告警】
怎么避免消息重复或漏发?
自动化消息最怕“以为发了,其实没发”。飞书返回 {"code":0,"msg":"success"} 才算真成功;钉钉返回 {"errcode":0,"errmsg":"ok"} 才可靠。HTTP 状态码 200 完全不可信——两个平台都可能返回 200 却带业务错误。
必须做的检查:
- 每次发送后,显式判断
response.json().get("code") == 0(飞书)或response.json().get("errcode") == 0(钉钉) - 失败时记录完整
response.text和时间戳,方便排查是网络抖动还是配置错 - 多群发送建议用列表推导式生成任务,再用
concurrent.futures.ThreadPoolExecutor控制并发数 ≤3,比串行快,又不会触发限频
真正麻烦的不是发消息,而是确认每一条都落到了该去的地方。漏掉一次库存告警,代价远高于多写两行重试逻辑。


















