用requests.post发送钉钉消息需指定content-type为application/json,传入合法json数据,并确保webhook url含正确access_token;常见错误包括json格式非法致400、token错误或机器人禁用致403。

如何用 requests.post 发送钉钉机器人消息
钉钉机器人最基础的告警能力,就是通过 HTTPS POST 向 Webhook 地址推送 JSON 数据。不依赖 SDK,纯 requests 就够用,也更可控。
关键点在于:必须带 Content-Type: application/json 请求头;消息体必须是合法 JSON;Webhook URL 末尾的 access_token 参数不能漏或拼错。
- 常见错误:
400 Bad Request多因 JSON 格式非法(比如中文没加双引号、逗号多写);403 Forbidden基本是 token 错、URL 被手动改过、或机器人被禁用 - 推荐用
json.dumps(..., ensure_ascii=False)避免中文乱码 - 简单文本消息示例:
import requests
import json
<p>url = "<a href="https://www.php.cn/link/93b5129e24b9c92e5b8e7115056b46bd">https://www.php.cn/link/93b5129e24b9c92e5b8e7115056b46bd</a>"
data = {
"msgtype": "text",
"text": {"content": "【告警】服务响应超时 > 5s"},
"at": {"isAtAll": False}
}
requests.post(url, headers={"Content-Type": "application/json"}, data=json.dumps(data, ensure_ascii=False))</p>
怎么构造带链接和按钮的富文本告警(actionCard 类型)
纯文本太单薄,生产环境通常需要跳转到 Grafana、Kibana 或运维平台。钉钉支持 actionCard 类型,能内嵌标题、描述、按钮,且点击直接唤起浏览器。
注意:actionCard 不支持 Markdown,按钮最多 1 个(singleURL)或最多 2 个(btns),且所有 URL 必须是 HTTPS 协议。
- 如果填了 HTTP 链接,消息会发出去但按钮置灰不可点
-
btnOrientation设为"0"是横向排列(默认),"1"是纵向 - 示例(单按钮跳转监控大盘):
data = {
"msgtype": "actionCard",
"actionCard": {
"title": "【P0 级告警】API 接口异常率突增",
"text": "⚠️ 当前异常率 23.6%(阈值 5%)\n\n- 时间:2024-06-12 14:22\n- 实例:api-service-03\n- 查看详情 →",
"singleTitle": "打开 Grafana",
"singleURL": "https://grafana.example.com/d/abc/api-error-rate"
}
}
如何避免被钉钉限流导致告警丢失(atMobiles 和频率控制)
钉钉对机器人有明确限流策略:每分钟最多 20 条,每秒最多 20 次调用。高频告警(如全量接口失败)极易触发限流,返回 {"errcode":310000,"errmsg":"invalid access"} —— 这不是认证失败,是被限了。
SkillSub Pro - Python 题解与代码注释双功能技能功能概述SkillSub Pro - Python 题解与代码注释双功能技能是一项面向实际任务的技能,主要用于SkillSub Pro 是一个 Python 题解生成与代码注释的 双功能合体技能 ,专为学生、算法学习者和开发者设计;✅ 一个技能,两种用途 :;核心要点📝 题解模式 :输入题目/题号,自动生成完整 Python 题解(含详细注释、解题思路、复杂度分析);💬 注释模式 :输入 Python 代码,自动添加详细中。它将相关步骤、
真正有效的缓解方式不是“重试”,而是从源头收敛:
- 用
atMobiles替代isAtAll=True,只 @ 当值人(需提前在群中开启“@所有人”权限限制) - 聚合告警:同一类错误 5 分钟内只发 1 条,附上累计次数和最近 3 条详情
- 加随机延迟(
time.sleep(random.uniform(0.1, 0.5)))防瞬时毛刺,但治标不治本 - 关键路径建议搭配企业微信/短信兜底,钉钉只做辅助通道
为什么用 sign 签名验证的机器人更安全(以及怎么生成)
不带签名的 Webhook 地址一旦泄露,任何人可伪造告警。开启“加签”后,URL 中多了 sign 和 timestamp 参数,服务端会校验签名有效性,大幅提升安全性。
签名生成逻辑固定:把 timestamp + "\n" + secret 做 SHA256 Hex 编码,再 Base64 编码。Python 一行搞定:
import hmac import base64 import hashlib <p>timestamp = str(int(time.time() * 1000)) secret = "SECxxx" sign = base64.b64encode(hmac.new(secret.encode(), (timestamp + "\n" + secret).encode(), digestmod=hashlib.sha256).digest()).decode()</p>
之后请求 URL 变成:https://www.php.cn/link/93b5129e24b9c92e5b8e7115056b46bd×tamp={timestamp}&sign={sign}。漏传 timestamp 或签名错,直接 403。
这个环节最容易忽略的是:时间戳单位必须是毫秒,且服务器时间与 NTP 误差不能超过 1 小时——否则签名永远验不过。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










