怎么在 Linux 服务器脚本中调用钉钉机器人发送报警信息

文章导读
在 Linux 脚本里调用钉钉机器人,最稳妥的方式是用 curl 命令向 webhook 地址发送 POST 请求,适合监控脚本、定时任务或部署流程需要即时通知的场景。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 参考来源
A A

在 Linux 脚本里调用钉钉机器人,最稳妥的方式是用 curl 命令向 webhook 地址发送 POST 请求,适合监控脚本、定时任务或部署流程需要即时通知的场景。

先说结论:通过 HTTP 协议推送消息,无需安装额外 SDK,但必须配置安全设置才能发送成功。

  • 适合:Shell/Python 脚本、Cron 定时任务、CI/CD 流水线。
  • 先准备:钉钉群自定义机器人 Webhook 地址及安全关键词或签名。
  • 验收:本地 curl 测试通后再写入脚本,并检查 exit code。
  • 安全:生产环境建议使用签名加密,Token 存入环境变量。

命令速用版

下面是一条可直接替换变量使用的 curl 命令模板,注意消息内容需包含安全关键词:

怎么在 Linux 服务器脚本中调用钉钉机器人发送报警信息
curl 'https://oapi.dingtalk.com/robot/send?access_token=YOUR_TOKEN' \
   -H 'Content-Type: application/json' \
   -d '{
     "msgtype": "text",
     "text": {
         "content": "【报警】服务器 CPU 负载过高,请检查。关键词"
     }
   }'

为什么会这样

钉钉机器人本质是一个 HTTP Webhook 接口。Linux 服务器通常自带 curl 或 wget,不需要安装 Python SDK 或复杂依赖,直接在脚本里嵌一条 HTTP 请求就能用。安全设置(关键词或签名)是为了防止 Webhook 地址泄露后被恶意调用,所以请求内容必须符合安全规则,否则接口会返回错误码。

分步处理

1. 获取 Webhook 地址

在钉钉群设置里添加“自定义”机器人,复制 Webhook 地址,格式通常包含 access_token 参数。

2. 配置安全设置

务必开启“自定义关键词”或“签名”。如果选关键词,消息内容里必须包含该词;如果选签名,需要按文档算法生成 timestamp 和 sign 参数拼接到 URL 里。签名加密方式安全性更高,推荐生产环境使用。

怎么在 Linux 服务器脚本中调用钉钉机器人发送报警信息

3. 编写脚本

以 Shell 为例,将 curl 命令写入脚本。建议把 token 和关键词设为变量,方便管理。

#!/bin/bash
# 从环境变量读取 Webhook,避免明文泄露
WEBHOOK="${DINGTALK_WEBHOOK}"
KEYWORD="报警"
MESSAGE="【测试】服务器脚本运行正常,包含关键词${KEYWORD}"

RESPONSE=$(curl -s "${WEBHOOK}" \
  -H "Content-Type: application/json" \
  -d "{
    \"msgtype\": \"text\",
    \"text\": {
        \"content\": \"${MESSAGE}\"
    }
  }")

# 检查发送结果
if echo "${RESPONSE}" | grep -q '"errcode":0'; then
    echo "发送成功"
    exit 0
else
    echo "发送失败:${RESPONSE}"
    exit 1
fi

4. 处理签名(可选但更安全)

如果开启了签名加密,需要计算 hmac-sha256。需使用 openssl 命令生成签名。

怎么在 Linux 服务器脚本中调用钉钉机器人发送报警信息
#!/bin/bash
WEBHOOK_URL="https://oapi.dingtalk.com/robot/send?access_token=YOUR_TOKEN"
SECRET="SECxxxxxxxx"

# 生成时间戳(毫秒)
TIMESTAMP=$(date +%s)000
# 生成签名
SIGN=$(echo -n "${TIMESTAMP}\n${SECRET}" | openssl dgst -sha256 -hmac "${SECRET}" -binary | openssl base64)
# URL 编码签名 (+ -> %2B, / -> %2F, = -> %3D)
SIGN_ENCODED=$(echo -n "${SIGN}" | sed 's/+/%2B/g; s/\//%2F/g; s/=/%3D/g')

# 拼接最终 URL
FINAL_URL="${WEBHOOK_URL}×tamp=${TIMESTAMP}&sign=${SIGN_ENCODED}"

curl "${FINAL_URL}" -H "Content-Type: application/json" -d '{"msgtype":"text","text":{"content":"test"}}'

怎么验证是否生效

执行脚本后,观察钉钉群是否收到消息。同时检查 curl 命令的返回值,钉钉接口成功会返回 errcode 为 0 的 JSON。

# 推荐安装 jq 进行解析
curl -s "${WEBHOOK}" -H "Content-Type: application/json" -d '{"msgtype":"text","text":{"content":"test"}}' | jq '.errcode'

# 若无 jq,使用 grep 精确匹配
curl -s "${WEBHOOK}" -H "Content-Type: application/json" -d '{"msgtype":"text","text":{"content":"test"}}' | grep '"errcode":0'

也可以查看脚本日志,确认 HTTP 状态码是否为 200。

常见坑

  • 关键词缺失:安全设置里加了关键词,但消息内容里没写,接口会拦截。
  • URL 泄露:Webhook 地址等同于密码,不要提交到 Git 仓库,建议用环境变量或配置文件。
  • 频率限制:钉钉对机器人发送频率有限制,高频报警可能被限流,脚本里最好加延时或聚合逻辑。
  • 特殊字符:JSON 格式对双引号敏感,脚本里拼接变量时要注意转义。

参考来源

  • 钉钉开放平台 - 自定义机器人接入:https://open.dingtalk.com/document/robots/custom-robot-access