0

curl重定向异常钉钉机器人加签配置:3个实战脚本让告警通知通过安全验证

2026.06.06 | youres | 24次围观

钉钉机器人加签是什么?为什么必须配置?

钉钉自定义机器人提供三种安全设置方式:

  1. 自定义关键词:消息内容必须包含指定关键词才能发送成功
  2. IP地址(段):只有白名单IP才能触发机器人
  3. 加签(签名校验):请求必须携带正确的时间戳签名,防伪造

「加签」是目前最推荐的方式,原因如下:

  • 不依赖固定IP(适合云函数、动态IP环境)
  • 比关键词方式更安全(不会被绕过)
  • 官方文档优先推荐

如果你勾选了加签但没有在curl请求中携带正确的 timestampsign 参数,钉钉会返回错误:

{"errcode":310000,"errmsg":"sign not match"}

获取钉钉机器人Webhook和加签密钥的完整步骤

第一步:打开钉钉群 → 右上角群设置 → 智能群助手 → 添加机器人 → 自定义机器人

第二步:填写机器人名称,在安全设置中勾选「加签」,不要只勾关键词或IP。

第三步:点击「完成」后,会看到:

  • Webhook地址:https://oapi.dingtalk.com/robot/send?access_token=XXXX
  • 加签密钥(SEC开头的一串字符串):立即复制保存,页面关闭后无法再查看完整密钥
⚠️ 注意:加签密钥默认在输入框中置灰,需要鼠标点进去 Ctrl+C 才能复制成功,直接全选复制会失败。

curl命令对接钉钉加签的完整实现(含3个实战脚本)

钉钉加签的算法逻辑:

  1. 取当前毫秒时间戳 timestamp
  2. 拼接签名字符串:timestamp + "\n" + secret
  3. 使用 HMAC-SHA256 算法计算签名,密钥为 secret
  4. 对签名结果做 Base64 编码
  5. 对编码结果做 URL Encode
  6. timestampsign 作为查询参数拼接到 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中 curlInvoke-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辅助作者原创,未经许可,转载请保留原文链接。

发表评论