2026.06.06 | youres | 21次围观
钉钉机器人加签是什么?为什么必须配置?
钉钉自定义机器人提供三种安全设置方式:
- 自定义关键词:消息内容必须包含指定关键词才能发送成功
- IP地址(段):只有白名单IP才能触发机器人
- 加签(签名校验):请求必须携带正确的时间戳签名,防伪造
「加签」是目前最推荐的方式,原因如下:
- 不依赖固定IP(适合云函数、动态IP环境)
- 比关键词方式更安全(不会被绕过)
- 官方文档优先推荐
如果你勾选了加签但没有在curl请求中携带正确的 timestamp 和 sign 参数,钉钉会返回错误:
{"errcode":310000,"errmsg":"sign not match"}
获取钉钉机器人Webhook和加签密钥的完整步骤
第一步:打开钉钉群 → 右上角群设置 → 智能群助手 → 添加机器人 → 自定义机器人
第二步:填写机器人名称,在安全设置中勾选「加签」,不要只勾关键词或IP。
第三步:点击「完成」后,会看到:
- Webhook地址:
https://oapi.dingtalk.com/robot/send?access_token=XXXX - 加签密钥(SEC开头的一串字符串):立即复制保存,页面关闭后无法再查看完整密钥
⚠️ 注意:加签密钥默认在输入框中置灰,需要鼠标点进去 Ctrl+C 才能复制成功,直接全选复制会失败。
curl命令对接钉钉加签的完整实现(含3个实战脚本)
钉钉加签的算法逻辑:
- 取当前毫秒时间戳
timestamp - 拼接签名字符串:
timestamp + "\n" + secret - 使用
HMAC-SHA256算法计算签名,密钥为secret - 对签名结果做
Base64编码 - 对编码结果做
URL Encode - 将
timestamp和sign作为查询参数拼接到 Webhook URL
脚本1:纯bash + openssl 实现HMAC-SHA256签名(推荐)
#!/bin/bash
# 钉钉加签curl告警 - 基础版
WEBHOOK="https://oapi.dingtalk.com/robot/send?access_token=YOUR_TOKEN"
SECRET="SECxxx..."
# 获取毫秒时间戳
TIMESTAMP=$(date +%s%3N)
# 拼接签名字符串
STRING_TO_SIGN="${TIMESTAMP}"$'\n'"${SECRET}"
# 使用openssl计算HMAC-SHA256签名
SIGN=$(echo -ne "${STRING_TO_SIGN}" | openssl dgst -sha256 -hmac "${SECRET}" -binary | base64)
# URL编码签名
SIGN_ENCODED=$(python3 -c "import urllib.parse; print(urllib.parse.quote_plus('${SIGN}'))")
# 拼接完整URL
FULL_URL="${WEBHOOK}×tamp=${TIMESTAMP}&sign=${SIGN_ENCODED}"
# 发送告警消息
curl -s -X POST "${FULL_URL}" \
-H 'Content-Type: application/json;charset=utf-8' \
-d '{"msgtype":"text","text":{"content":"🚨 网站重定向异常告警"}}'
脚本2:纯bash不依赖python的URL编码版本(兼容性更好)
#!/bin/bash
# 钉钉加签 - 纯bash实现(无python依赖)
WEBHOOK="https://oapi.dingtalk.com/robot/send?access_token=YOUR_TOKEN"
SECRET="SECxxx..."
TIMESTAMP=$(date +%s%3N)
STRING_TO_SIGN="${TIMESTAMP}"$'\n'"${SECRET}"
# openssl计算签名并Base64编码
SIGN=$(echo -ne "${STRING_TO_SIGN}" | openssl dgst -sha256 -hmac "${SECRET}" -binary | base64)
# 纯bash实现URL编码函数
urlencode() {
local string="${1}"
local strlen=${#string}
local encoded=""
for (( i=0; i
脚本3:完整告警脚本(含重试、Markdown格式、@指定人)
#!/bin/bash
# 钉钉重定向异常告警 - 完整生产级脚本
# 用法: ./dingtalk_alert.sh "告警内容" [可选: 手机号1 手机号2]
WEBHOOK="https://oapi.dingtalk.com/robot/send?access_token=YOUR_TOKEN"
SECRET="SECxxx..."
TIMESTAMP=$(date +%s%3N)
STRING_TO_SIGN="${TIMESTAMP}"$'\n'"${SECRET}"
SIGN=$(echo -ne "${STRING_TO_SIGN}" | openssl dgst -sha256 -hmac "${SECRET}" -binary | base64)
# URL编码函数
urlencode() {
local LANG=C IFS; local i; local c; local output=""
for ((i=0; i<${#1}; i++)); do
c="${1:$i:1}"
case "$c" in
[a-zA-Z0-9.~_-]) output+="$c" ;;
' ') output+='+' ;;
*) printf -v 'output+=%%%02X' "'$c" ;;
esac
done
echo "$output"
}
SIGN_ENCODED=$(urlencode "${SIGN}")
FULL_URL="${WEBHOOK}×tamp=${TIMESTAMP}&sign=${SIGN_ENCODED}"
ALERT_CONTENT="${1:-网站重定向异常,请立即排查!}"
shift
while [[ $# -gt 0 ]]; do
AT_MOBILES+="\"$1\","
shift
done
AT_MOBILES=${AT_MOBILES%,}
MESSAGE=$(cat <
使用方式:
# 发送普通告警
./dingtalk_alert.sh "curl检测到 example.com 重定向次数>5,疑似重定向循环"
# @指定人
./dingtalk_alert.sh "数据库连接有问题" "13800138000" "13800138001"
3个常见错误排查
错误1:sign not match(签名不匹配)
原因:签名计算错误,或时间戳与服务器时间偏差超过1小时。
解决:
- 确认
timestamp是毫秒级时间戳(13位),不是秒级(10位) - 确认签名字符串格式是
timestamp + "\n" + secret,\n是真实换行符 - 检查服务器时间是否准确(
date命令查看)
错误2:curl: command not found(Windows环境)
原因:Windows的PowerShell中 curl 是 Invoke-WebRequest 的别名,不是GNU curl。
解决:使用 curl.exe 明确调用GNU curl,或安装Git for Windows。
错误3:消息发送成功但群内没收到
原因:机器人被群管理员禁用了,或消息频率超过限制(每个机器人每分钟最多20条)。
解决:检查群设置 → 智能群助手 → 查看机器人状态;在脚本中加重试间隔。
总结
钉钉机器人加签配置的核心就是 时间戳 + HMAC-SHA256签名 + Base64 + URL Encode 这4步。本文给出的3个脚本从简单到完整,可以直接用于生产环境的网站重定向异常告警。配置完成后,你的网站一旦出现问题,钉钉群会秒级收到通知,运维响应速度大幅提升。
相关阅读:
Shell脚本curl重定向告警钉钉配置:5个实战方案让网站问题无处遁形
curl重定向耗时过长钉钉告警配置:3个实战脚本让网站跳转问题秒级感知
版权声明
本文仅代表个人观点。
本文系AI辅助作者原创,未经许可,转载请保留原文链接。

发表评论