从零开始实现自动化消息推送
目录导读
- 钉钉机器人是什么?能做什么?——基础概念与适用场景
- 钉钉机器人调用前的准备——创建机器人、获取Webhook地址
- 三种核心调用方式详解——HTTP POST、Python代码、第三方工具
- 常见问题与避坑指南——签名校验、消息格式、频率限制
- 实战问答——针对高频问题的详细解答
- 最佳实践建议——如何让机器人更稳定高效
钉钉机器人是什么?能做什么?
问:钉钉机器人到底怎么用?它和普通用户有什么区别?

钉钉机器人本质上是一个自动化的消息推送接口,它不需要登录账号,而是通过一个专用的Webhook地址(类似一个网络“门牌号”)接收外部系统发送的HTTP请求,然后将消息推送到指定的钉钉群聊中。
常见的应用场景包括:
- 运维监控:服务器异常时自动发送告警到群
- 代码部署通知:GitLab/GitHub代码更新后自动推送
- 业务数据日报:每天定时发送销售数据、报表统计
- 客户咨询流转:外部表单提交后,机器人自动将信息转入内部群
核心优势:无需开发App、无需复杂认证,只要会发HTTP请求就能调用,但需要注意:机器人只能向“群聊”发送消息,不能私聊用户。
钉钉机器人调用前的准备
问:我要从哪里开始?需要哪些权限?
第一步:在钉钉群中创建自定义机器人
- 打开一个钉钉群(建议先建测试群),点击群设置 → 智能群助手 → 添加机器人。
- 选择“自定义(通过Webhook接入)” → 填写机器人名称(如“报警机器人”)。
- 设置安全策略(必须开启):
- 消息中必须包含至少一个关键词(如“告警”“日报”),否则消息被丢弃,适合内部简单场景。
- 加签:生成一个Secret密钥,每次请求需要附带签名(更安全,推荐生产环境使用)。
- IP白名单:仅允许特定IP调用(适合固定服务器)。
- 获取Webhook地址:格式类似
https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxxxxxx。
关键提醒:Webhook地址一旦泄露,任何知道地址的人都可以往群里发消息,因此务必开启加签或IP白名单。
三种核心调用方式详解
直接使用HTTP POST(最通用)
问:不懂编程能用吗?
可以,任何能发送HTTP请求的工具都可以,比如浏览器插件(Postman)、Linux curl命令。
示例:发送纯文本消息(使用curl命令)
curl -X POST "你的Webhook地址" \
-H "Content-Type: application/json" \
-d '{
"msgtype": "text",
"text": {
"content": "告警:服务器CPU负载超过90%,请检查!"
}
}'
示例:发送Markdown消息(支持标题、列表、加粗)
{
"msgtype": "markdown",
"markdown": {
"title": "今日销售数据",
"text": "## 销售日报\n- 总销售额:**¥128,000**\n- 订单数:256\n- 异常订单:3(点击[查看详情](http://example.com))"
}
}
使用Python代码调用(适合自动化脚本)
问:我有Python环境,怎么集成到自己的系统?
安装依赖(仅需内置库requests):
import requests
import json
import time
import hashlib
import base64
import hmac
import urllib.parse
# 如果开启加签,需要计算签名
def calculate_sign(secret, timestamp):
secret_enc = secret.encode('utf-8')
string_to_sign = f'{timestamp}\n{secret}'
sign = base64.b64encode(hmac.new(secret_enc, string_to_sign.encode('utf-8'), digestmod=hashlib.sha256).digest())
return urllib.parse.quote(sign)
# 发送消息函数
def send_dingtalk_msg(webhook_url, secret, content):
timestamp = str(round(time.time() * 1000))
sign = calculate_sign(secret, timestamp)
full_url = f"{webhook_url}×tamp={timestamp}&sign={sign}"
headers = {'Content-Type': 'application/json'}
payload = {
"msgtype": "text",
"text": {"content": content}
}
response = requests.post(full_url, headers=headers, json=payload)
return response.json()
# 使用示例
webhook = "https://oapi.dingtalk.com/robot/send?access_token=你的token"
secret = "你的加签密钥"
send_dingtalk_msg(webhook, secret, "Python脚本测试消息")
使用第三方平台(零代码)
问:完全不懂代码怎么办?
可以使用自动化工具如Zapier、腾讯云HiFlow、阿里云Serverless函数计算,它们提供模板化的钉钉机器人集成,配置步骤:
- 选择触发器(如“收到Webhook请求”或“定时触发”)。
- 添加动作 → 选择“钉钉机器人”。
- 填写Webhook地址和消息内容(支持插入变量)。
常见问题与避坑指南
问题1:消息发出去,但是群里没显示?
- 未开启安全设置:检查是否配置了“关键词”或“加签”。
- 格式错误:钉钉要求JSON消息体必须严格符合格式(尤其是双引号必须用英文半角)。
- 频率限制:每个机器人每分钟最多20条消息,超出会被限流。
问题2:如何发送@某个人?
- 在
text消息中增加at字段:{ "msgtype": "text", "text": {"content": "@某用户 请关注此问题"}, "at": {"atMobiles": ["13800138000"], "isAtAll": false} } - 注意:手机号必须在群成员内才会生效。
问题3:支持发送文件和图片吗?
- 仅支持链接消息(ActionCard)、Markdown中插入图片URL。
- 不支持直接上传文件或本地图片,需搭配钉钉开放平台的文件上传接口。
实战问答
问:如何用钉钉机器人实现定时推送天气预报?
答:可以使用云函数(阿里云函数计算)+ 定时触发器 + 爬取天气API数据,步骤如下:
- 编写Python代码调用免费天气API(如andatong.cn)获取JSON数据。
- 格式化消息为Markdown(包含温度、湿度、穿衣建议)。
- 使用上述Python代码中
send_dingtalk_msg函数发送到群。 - 配置定时触发(每天8:00执行)。
问:多个服务器怎么共享一个机器人?
答:一个Webhook地址可以被多台机器同时调用,但注意总频率限制(每分钟20条),建议在每台服务器上使用相同token,但使用不同关键词区分来源(如“服务器A告警”“服务器B告警”)。
问:调用时出现“签名错误”怎么办?
答:检查两点:
① 签名算法必须严格按照钉钉文档(先拼接timestamp + "\n" + secret,然后用HmacSHA256加密后Base64编码)。
② 时间戳必须是当前秒数(毫秒级),偏差超过1小时会被拒绝。
最佳实践建议
- 优先使用加签:避免Webhook地址泄露后被恶意利用。
- 格式化:学会使用Markdown,让告警信息一目了然(加粗、标题、分隔线)。
- 错误重试机制:在代码中加入
try-except,当请求失败时自动重试2次(间隔5秒)。 - 日志记录:每次调用后记录返回结果,方便排查问题。
- 避免敏感信息:不要在消息中直接暴露密码、API密钥等,可通过短链跳转。
钉钉机器人的调用本质是一次安全的HTTP POST请求,核心在于准备好Webhook地址和正确的消息格式,无论是运维人员、开发者还是业务人员,都可以通过上述方法快速实现自动化消息通知,提升团队协作效率。