Python 钉钉机器人 Webhook 推送通知:加签与消息示例
Python 用 requests 调用钉钉群机器人 webhook,支持加签安全设置、文本和 Markdown 消息推送,实现告警和日报自动发到钉钉群,附完整代码。
场景痛点
团队用钉钉沟通,脚本跑完想自动把结果推到群里;服务挂了想第一时间 @ 值班同事。钉钉自定义机器人 webhook 配置简单,但开启了"加签"安全设置后直接 POST 会报错,本文把签名计算和消息发送一次讲清楚。
用到的库
pip install requests
完整代码
import requests
import time
import hmac
import hashlib
import base64
import urllib.parse
# 替换为你自己钉钉机器人的 webhook 和加签密钥
ACCESS_TOKEN = "XXXXXXXXXXXXXXXXXXXX"
SECRET = "SECXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
def sign():
"""按钉钉规则计算加签参数,返回 timestamp 和 sign"""
timestamp = str(round(time.time() * 1000))
string_to_sign = f"{timestamp}\n{SECRET}"
hmac_code = hmac.new(
SECRET.encode("utf-8"),
string_to_sign.encode("utf-8"),
digestmod=hashlib.sha256,
).digest()
sign = urllib.parse.quote_plus(base64.b64encode(hmac_code))
return timestamp, sign
def build_url():
"""拼接带签名的完整请求 URL"""
timestamp, sign = sign()
return (
f"https://oapi.dingtalk.com/robot/send?"
f"access_token={ACCESS_TOKEN}×tamp={timestamp}&sign={sign}"
)
def send_text(content, at_mobiles=None, is_at_all=False):
"""发送文本消息"""
payload = {
"msgtype": "text",
"text": {"content": content},
"at": {
"atMobiles": at_mobiles or [],
"isAtAll": is_at_all,
},
}
r = requests.post(build_url(), json=payload, timeout=10)
print(r.json())
return r.json()
def send_markdown(title, text, at_mobiles=None, is_at_all=False):
"""发送 Markdown 消息"""
payload = {
"msgtype": "markdown",
"markdown": {"title": title, "text": text},
"at": {
"atMobiles": at_mobiles or [],
"isAtAll": is_at_all,
},
}
r = requests.post(build_url(), json=payload, timeout=10)
print(r.json())
return r.json()
def main():
send_text(
"【日报】今日订单 1234 单,已自动归档。",
is_at_all=True,
)
send_markdown(
"服务告警",
"## 服务告警\n"
"- 接口:`/api/order`\n"
"- 错误率:**8.2%**\n"
"- 时间:2026-09-14 09:30\n"
"> 请值班同学尽快处理",
at_mobiles=["13800000000"],
)
if __name__ == "__main__":
main()
代码讲解
- 钉钉机器人安全设置里如果选了"加签",每次请求都要在 URL 上带
timestamp和sign两个参数,这是和企业微信最大的区别。 - 签名算法:把
timestamp + 换行 + SECRET当作消息体,用 SECRET 做 HmacSHA256 签名,再 base64 + URL encode。 isAtAll=True表示 @ 所有人;atMobiles填手机号列表可 @ 具体人,被 @ 的人会强提醒。- 每次发消息前重新算签名,因为 timestamp 有效期是 1 小时,复用旧签名会失败。
运行结果
运行后钉钉群会立刻收到两条消息:一条 @ 全体的文本日报,一条带 Markdown 排版的告警卡片并 @ 指定手机号。返回 JSON 中 errcode: 0 表示发送成功。
注意事项
- 安全设置三选一:自定义关键词、加签、IP 白名单。用了加签就别再填关键词,否则消息内容必须包含关键词才会发送成功。
- 机器人每分钟最多 20 条,超过会被限流。
ACCESS_TOKEN和SECRET都是敏感信息,不要硬编码进公开仓库,建议读环境变量。- Markdown 文本里换行必须用
\n,否则格式会乱。 - 如果只配了"自定义关键词",消息内容里必须包含那个关键词,否则钉钉会直接忽略。

更新时间:2026-09-14 20:39:47
上一篇:Python 每小时每隔几分钟执行任务:schedule 循环调度示例