钉钉开放平台调用手册
向群发送自定义机器人通知
通过群 Webhook 发送文本,支持按机器人配置计算加签。
← 返回平台功能接入准备
- 在目标群创建自定义机器人并设置关键词、加签或 IP 安全条件。
- 此处 access_token 是群 Webhook 凭证,不是应用令牌。
准备环境变量
示例值需要替换为自己的凭证或资源 ID。代码在本机或服务端运行;密钥不应放进公开网页。
DINGTALK_WEBHOOK_TOKEN- 群 Webhook 的 access_token。
DINGTALK_SIGN_SECRET可选- 可选,仅机器人开启加签时设置;否则不设置。
export DINGTALK_WEBHOOK_TOKEN='replace_with_webhook_access_token'
# 可选,按需启用
# export DINGTALK_SIGN_SECRET='SEC_replace_with_sign_secret'以上 export 适用于 macOS / Linux 的终端,在同一终端内运行后续代码。Python 示例保存为 request.py 后执行 python3 request.py。
调用步骤
- 01
复制机器人 Webhook,把 access_token 参数存入 DINGTALK_WEBHOOK_TOKEN。
- 02
若使用关键词校验,可把关键词设为接入测试;若开启加签,设置 DINGTALK_SIGN_SECRET。
- 03
执行 Python 示例;签名使用毫秒时间戳、HMAC-SHA256 和 URL 编码,和飞书群签名算法不同。
调用 01
发送群文本通知
自定义机器人仅向绑定群发送消息,本例默认不 @ 全员。
POST
https://oapi.dingtalk.com/robot/send?access_token=${DINGTALK_WEBHOOK_TOKEN}请求头
Content-Typeapplication/json
参数说明
参数表可左右滑动,查看完整说明。
| 字段 / 位置 | 类型 / 必填 | 说明 |
|---|---|---|
access_tokenQuery | string必填 | 群 Webhook 的 Token。 |
timestamp / signQuery | string可选 | 加签开启时必填;timestamp 为毫秒,误差不超 1 小时;HMAC key 为 secret,消息为 timestamp+换行+secret,Base64 后 URL 编码。 |
msgtype请求体 | string必填 | 本例 text。 |
text.content请求体 | string必填 | 发送正文;应匹配机器人配置的关键词。 |
at.isAtAll请求体 | boolean可选 | true 提醒全员,本例 false。 |
msgUuid请求体 | string可选 | 可设置业务幂等 key,同一发送操作超时后复用,减少重复推送。 |
调用代码
替换示例 ID 与请求体内容后运行。
import os, time, json, hmac, hashlib, base64, urllib.request, urllib.parse, urllib.error
query = {"access_token": os.environ["DINGTALK_WEBHOOK_TOKEN"]}
secret = os.environ.get("DINGTALK_SIGN_SECRET")
if secret:
timestamp = str(int(time.time() * 1000))
message = (timestamp + "\n" + secret).encode()
signature = base64.b64encode(hmac.new(secret.encode(), message, hashlib.sha256).digest()).decode()
query.update(timestamp=timestamp, sign=signature)
# urlencode 会完成签名所需的 URL 编码,不要预先再编码一次。
url = "https://oapi.dingtalk.com/robot/send?" + urllib.parse.urlencode(query)
payload = {"msgtype": "text", "text": {"content": "接入测试:通知服务已启动"}, "at": {"isAtAll": False}}
request = urllib.request.Request(url, data=json.dumps(payload).encode(), headers={"Content-Type": "application/json"}, method="POST")
try:
with urllib.request.urlopen(request, timeout=30) as response:
result = json.load(response)
except urllib.error.HTTPError as exc:
raise SystemExit(f"HTTP {exc.code}: {exc.read().decode()}")
if str(result.get("errcode", "0")) != "0":
raise SystemExit(json.dumps(result, ensure_ascii=False))
print(json.dumps(result, ensure_ascii=False, indent=2))
返回示例
按官方字段整理的节选示意,使用虚构 ID,不是实测结果。成功 errcode 为 0。 以下为结构示意,非本站实测结果。
{
"errcode": 0,
"errmsg": "ok"
}常见错误与排查
310000安全校验失败- 按 errmsg 区分关键词、时间戳、签名或出口 IP 不匹配。
410100发送过快被限流- 降低频率,勿立即重复发送。
400102机器人已停用- 联系管理员在目标群启用机器人。
调用注意
- 每个机器人每分钟最多 20 条;超出后官方说明会限流 10 分钟。
- Python 示例自动处理可选签名;不要混用应用 Token,也不要公开完整 Webhook。
注意事项
- 大量通知先聚合成摘要,避免群内刷屏和触发限流。
核验来源
本站按官方资料整理本场景的必要调用步骤与代码,覆盖范围以本页列出的接口为准。官方资料用于追溯规范及查看变更。
- 01自定义机器人发送群消息核验日期 2026-10-15
- 02自定义机器人安全设置核验日期 2026-10-15
