钉钉机器人Webhook地址需严格符合格式:以https://oapi.dingtalk.com/robot/send?access_token=xxx形式填写,末尾不得含多余参数或&,URL不可被URL编码、不可含空格/换行/双引号等隐藏字符;Python中须显式设置headers={"Content-Type": "application/json"},使用json=参数而非data=;text消息换行用\n;生产环境须加timeout和重试,并从环境变量读取access_token。

钉钉机器人Webhook地址怎么填才不报400错误
直接填错URL是发不出消息的最常见原因。钉钉要求Webhook必须带access_token参数,且不能被URL编码过——比如复制链接时浏览器自动把%转义了,或手动加了双引号、空格、换行符,都会导致400 Bad Request。
- 检查URL是否形如
https://oapi.dingtalk.com/robot/send?access_token=xxx,末尾**不能有多余参数或&符号** - 用
requests.post()时,**不要把整个URL塞进params里**,否则会二次拼接出错 - 如果URL是从钉钉管理后台复制的,粘贴后用
print(repr(url))看有没有隐藏字符(比如\n或\u200b)
Python用requests发消息必须设Content-Type为application/json
钉钉接口只认application/json,默认requests.post()发的是application/x-www-form-urlencoded,不设会返回{"errcode":310000,"errmsg":"invalid media type"}。
- 必须显式传
headers={"Content-Type": "application/json"} -
json=参数会自动序列化+设header,比data=json.dumps(...)更安全(避免漏设header或手动编码出错) - 别用
data=传字典,否则body是b'key=value'格式,钉钉直接拒收
text类型消息里content字段要换行就得用\n,不是
运维告警常要分多行显示主机、时间、错误码,但钉钉text类型不支持HTML标签,
<br>会被当纯文本显示出来。
-
content里的换行必须用\n,例如"主机: web01\n时间: 2024-05-20 14:22\n错误码: 502" - 如果内容来自日志文件或subprocess输出,注意原始字符串可能含
\r\n,建议统一用.replace('\r\n', '\n').replace('\r', '\n') - 想加粗或高亮?text类型做不到,得切到
markdown类型,但要注意markdown的title字段不能空,且text字段仍需存在(哪怕为空字符串)
生产环境必须加超时和重试,否则网络抖动就丢告警
运维系统对告警到达率敏感,但requests.post()默认无限等待,DNS失败、连接卡住、钉钉临时限流都可能导致脚本hang住或静默失败。
立即学习“Python免费学习笔记(深入)”;
- 强制加
timeout=(3, 7):3秒连上,7秒内收到响应,超时抛requests.exceptions.Timeout - 对
ConnectionError、Timeout、状态码非200的情况做1–2次重试(别无脑循环),用time.sleep(1)隔开 - 钉钉返回
{"errcode":0,"errmsg":"ok"}才算成功;errcode非0时,errmsg里可能有线索(比如"daily limit reached"说明机器人被限频)
access_token泄露等于告警通道被接管,所有生产环境的URL必须从环境变量或密钥管理服务读取,绝不能硬编码在脚本里。










