在 Linux 脚本里调用钉钉机器人,最稳妥的方式是用 curl 命令向 webhook 地址发送 POST 请求,适合监控脚本、定时任务或部署流程需要即时通知的场景。
先说结论:通过 HTTP 协议推送消息,无需安装额外 SDK,但必须配置安全设置才能发送成功。
- 适合:Shell/Python 脚本、Cron 定时任务、CI/CD 流水线。
- 先准备:钉钉群自定义机器人 Webhook 地址及安全关键词或签名。
- 验收:本地 curl 测试通后再写入脚本,并检查 exit code。
- 安全:生产环境建议使用签名加密,Token 存入环境变量。
命令速用版
下面是一条可直接替换变量使用的 curl 命令模板,注意消息内容需包含安全关键词:
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 里。签名加密方式安全性更高,推荐生产环境使用。
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 命令生成签名。
#!/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