我的知识记录

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}&timestamp={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 上带 timestampsign 两个参数,这是和企业微信最大的区别。
  • 签名算法:把 timestamp + 换行 + SECRET 当作消息体,用 SECRET 做 HmacSHA256 签名,再 base64 + URL encode。
  • isAtAll=True 表示 @ 所有人;atMobiles 填手机号列表可 @ 具体人,被 @ 的人会强提醒。
  • 每次发消息前重新算签名,因为 timestamp 有效期是 1 小时,复用旧签名会失败。

运行结果

运行后钉钉群会立刻收到两条消息:一条 @ 全体的文本日报,一条带 Markdown 排版的告警卡片并 @ 指定手机号。返回 JSON 中 errcode: 0 表示发送成功。

注意事项

  • 安全设置三选一:自定义关键词、加签、IP 白名单。用了加签就别再填关键词,否则消息内容必须包含关键词才会发送成功。
  • 机器人每分钟最多 20 条,超过会被限流。
  • ACCESS_TOKENSECRET 都是敏感信息,不要硬编码进公开仓库,建议读环境变量。
  • Markdown 文本里换行必须用 \n,否则格式会乱。
  • 如果只配了"自定义关键词",消息内容里必须包含那个关键词,否则钉钉会直接忽略。

Python 钉钉机器人 Webhook 推送通知:加签与消息示例

标签:

更新时间:2026-09-14 20:39:47

上一篇:Python 每小时每隔几分钟执行任务:schedule 循环调度示例

下一篇:Python 识别二维码内容:pyzbar 解码图片教程