大多数情况下,这是因为消息内容里没有包含设定的关键词,或者机器人安全设置被改成了“加签”但代码没跟着改。
先说结论:钉钉自定义机器人的安全设置是“三选一”机制,如果选了关键词,发送的消息正文里必须包含该关键词,否则会被拦截。
- 先确认:登录钉钉 PC 端查看群机器人安全设置当前选的是“关键词”、“IP 白名单”还是“加签”。
- 先处理:确保发送的 JSON payload 中 text 或 markdown 内容里完整包含设定的关键词。
- 再验证:发送测试消息,检查 HTTP 响应状态码及钉钉群内是否实际收到消息。
快速验证:使用 curl 命令测试
在本地终端使用 curl 命令可以直接验证 webhook 和关键词配置,无需编写代码:
curl "https://oapi.dingtalk.com/robot/send?access_token=YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d "{\"msgtype\":\"text\",\"text\":{\"content\":\"关键词:测试消息\"}}"
将 YOUR_TOKEN 替换为你的实际 accessToken,将“关键词”替换为后台设置的具体词。如果返回 errcode: 0 且群内收到消息,说明配置无误。
代码示例:Python 发送带关键词消息
以下是 Python 请求示例,注意如何在内容中动态插入关键词:
import requests
import json
webhook = "https://oapi.dingtalk.com/robot/send?access_token=YOUR_TOKEN"
keyword = "报警" # 必须与后台设置完全一致
content = f"{keyword}:服务器 CPU 使用率超过 90%"
headers = {"Content-Type": "application/json"}
data = {
"msgtype": "text",
"text": {
"content": content
}
}
response = requests.post(webhook, headers=headers, data=json.dumps(data))
print(response.json())
为什么失效
钉钉开放平台为了防范恶意调用,要求自定义机器人 webhook 必须配置安全设置。系统提供了三种互斥的验证方式:关键词、IP 白名单、加签。
当你选择“关键词”时,钉钉服务器接收到请求后,会解析消息内容。如果内容字符串中不包含你预设的关键词,服务器会直接拒绝发送,即使你的 HTTP 请求本身是成功的。很多开发者容易忽略的是,安全设置在后台修改后,代码端如果没有同步调整(比如从关键词改成了加签,但代码还在发纯文本),消息就会发不出去。
分步处理
- 核对安全设置类型
在钉钉群机器人设置页面,确认安全设置选项。如果是“关键词”,记下具体的词;如果是“加签”,需要拿到 Secret。 - 检查请求内容
查看你的代码中构造的 JSON 数据。如果是关键词模式,确保text字段或markdown字段的内容里完整包含设定的关键词。关键词是 substring 匹配,不需要完全相等,但必须连续且字符一致。 - 检查请求头与地址
确认 webhook URL 没有多余空格。如果是加签模式,需要在请求参数或 headers 中正确携带 timestamp 和 sign,关键词模式则不需要。 - 隔离测试
建议在测试群聊中关闭安全设置进行验证,生产群请勿随意关闭。如果能发送,说明就是安全验证环节的问题。
怎么验证是否生效
发送消息后,通过以下两点判断是否成功:
- 业务响应码:重点检查返回 JSON 中的
errcode是否为 0,而非仅看 HTTP 状态码。HTTP 200 仅表示请求到达,不代表业务逻辑成功。 - 错误信息:如果
errcode非 0,通常会提示具体的错误原因,如“关键词不匹配”。 - 群消息表现:最直接的标准是钉钉群内是否出现了机器人头像和消息内容。
常见坑
- 关键词匹配规则:关键词必须完全匹配,注意不要混入空格或特殊不可见字符。中文字符不存在大小写敏感问题,但英文关键词区分大小写。
- 内容长度限制:消息内容过长可能会被截断,导致关键词被切掉,从而匹配失败。
- 频率限制:机器人发送消息有频率限制,短时间内大量发送会被限流,表现为偶尔发不出去,这与关键词无关,但现象相似。
- 混合使用验证:后台只能选一种安全设置。不要试图同时满足关键词和加签,代码只需匹配当前后台选中的那一种。