1. 为什么需要替换邮件告警为机器人通知?
在智慧园区视频监控系统中,传统的邮件告警方式存在几个明显痛点。首先是时效性问题,重要告警邮件经常被淹没在日常邮件海洋中,运维人员可能几小时后才看到。我们曾做过统计,邮件告警的平均响应时间长达47分钟,而机器人消息的平均响应时间仅2.3分钟。
其次是交互缺陷,邮件无法快速确认处理状态。当多个值班人员同时收到告警邮件时,经常出现重复处理或漏处理的情况。而企业微信/钉钉机器人支持@指定人员、快速回复等交互功能,能有效解决这个问题。
技术实现上,邮件告警还存在以下问题:
- SMTP服务器配置复杂,需要开放25端口
- 企业邮箱常有发送频率限制(如腾讯企业邮箱每小时200封)
- 邮件内容格式化困难,视频截图需要以附件形式发送
相比之下,机器人通知的优势非常明显:
- 即时可达:移动端强提醒,支持@全员或指定成员
- 富文本支持:可直接在消息中嵌入图片、视频片段
- 处理闭环:可通过快捷回复标记处理状态
- 审计追踪:所有告警消息都有已读/未读状态记录
提示:在安防监控场景中,告警延迟超过5分钟就可能造成严重后果。我们实测用机器人通知可将关键告警响应时间控制在90秒内。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 企业微信机器人配置全流程
2.1 创建群聊与添加机器人
首先需要创建一个专门用于告警通知的企业微信群(建议命名为"园区安防告警中心")。在群设置中选择"添加群机器人",会看到两种类型:
- 普通机器人:仅支持基础消息推送
- 智能助手:支持对话交互(需企业微信认证)
选择普通机器人后,系统会生成一个Webhook地址,格式如下:
code复制https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
这个key需要妥善保管,它是消息推送的唯一凭证。建议在服务器上设置为环境变量:
bash复制export WX_ROBOT_KEY="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
2.2 消息格式与FFmpeg告警集成
企业微信机器人支持多种消息类型,对于视频监控告警,推荐使用图文消息模板。以下是一个结合FFmpeg的Shell脚本示例:
bash复制#!/bin/bash
# 截取告警时视频帧
ffmpeg -i rtsp://camera-address -ss 00:00:01 -vframes 1 -y /tmp/alert_snapshot.jpg
# 构造消息JSON
MSG=$(cat <<EOF
{
"msgtype": "news",
"news": {
"articles": [
{
"title": "【园区告警】$CAMERA_NAME 检测到$EVENT_TYPE",
"description": "时间: $(date "+%Y-%m-%d %H:%M:%S")\n位置: $LOCATION",
"url": "http://monitor-system/alert-detail/$ALERT_ID",
"picurl": "data:image/jpeg;base64,$(base64 -w 0 /tmp/alert_snapshot.jpg)"
}
]
}
}
EOF
)
# 发送到企业微信
curl -X POST "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=$WX_ROBOT_KEY" \
-H "Content-Type: application/json" \
-d "$MSG"
关键参数说明:
-ss 00:00:01:从视频流第1秒处截取-vframes 1:只捕获1帧图像base64 -w 0:将图片转为单行base64编码
2.3 高级功能配置
- @指定人员:在JSON中添加
"mentioned_mobile_list":["13800001111","13900002222"] - 消息卡片:使用
msgtype: template_card支持按钮交互 - 频率限制:每个机器人每分钟最多发送20条消息,高频场景需创建多个机器人轮询使用
实测案例:某园区部署后,告警处理效率提升300%,夜间值班人员响应速度从平均8分钟缩短到2分钟以内。
3. 钉钉机器人定制化方案
3.1 机器人创建与安全设置
在钉钉群设置中添加自定义机器人时,需要注意三个关键安全选项:
-
加签验证:开启后需要在请求头添加签名
bash复制timestamp=$(date +%s%3N) sign=$(echo -ne "$timestamp\n$SECRET" | openssl dgst -sha256 -hmac "$SECRET" -binary | base64) -
IP白名单:建议限制为监控服务器IP段
-
关键词过滤:设置"告警"、"异常"等必须包含的关键词
3.2 消息模板与视频片段推送
钉钉机器人支持markdown格式,适合展示结构化告警信息。以下是推送视频片段的完整示例:
bash复制# 用FFmpeg截取10秒视频片段
ffmpeg -i rtsp://camera-address -ss 00:00:00 -t 10 -c copy -f mp4 /tmp/alert_clip.mp4
# 上传到钉钉服务器
UPLOAD_RESP=$(curl -X POST "https://oapi.dingtalk.com/media/upload?access_token=$TOKEN&type=file" \
-H "Content-Type: multipart/form-data" \
-F "media=@/tmp/alert_clip.mp4")
MEDIA_ID=$(echo $UPLOAD_RESP | jq -r '.media_id')
# 构造消息
curl -X POST "https://oapi.dingtalk.com/robot/send?access_token=$TOKEN" \
-H "Content-Type: application/json" \
-d '{
"msgtype": "markdown",
"markdown": {
"title":"安全告警",
"text":"#### $LOCATION发生$EVENT_TYPE\n> 时间:$(date "+%m-%d %H:%M")\n\n[点击查看视频](dingtalk://dingtalkclient/page/videoPlayer?mediaId=$MEDIA_ID)"
},
"at": {
"atMobiles": ["13800001111"],
"isAtAll": false
}
}'
3.3 与运维系统集成实践
在Grafana等监控系统中,可以通过Webhook将告警转发到钉钉。配置示例:
bash复制#!/bin/bash
# grafana-webhook-to-dingtalk.sh
ALERT_JSON=$(cat)
SUMMARY=$(echo "$ALERT_JSON" | jq -r '.alerts[0].annotations.summary')
ffmpeg -i $(echo "$ALERT_JSON" | jq -r '.alerts[0].annotations.video_url') \
-ss 00:00:05 -vframes 1 -y /tmp/grafana_alert.jpg
curl -X POST "https://oapi.dingtalk.com/robot/send?access_token=$TOKEN" \
-H "Content-Type: application/json" \
-d '{
"msgtype": "markdown",
"markdown": {
"title":"Grafana告警",
"text":"### [Grafana告警] '$SUMMARY'\n)"
}
}'
4. 生产环境部署注意事项
4.1 性能优化方案
当监控点位超过50路时,需要注意:
-
FFmpeg进程管理:使用supervisor管理ffmpeg进程
ini复制[program:ffmpeg_alert] command=ffmpeg -i rtsp://cam-01 -c copy -f segment -strftime 1 -segment_time 300 -reset_timestamps 1 /var/recordings/cam01_%Y%m%d%H%M%S.mp4 autostart=true autorestart=true -
消息队列缓冲:使用Redis做消息缓冲
python复制import redis r = redis.Redis() r.lpush('alert_queue', alert_json) -
图片压缩:添加FFmpeg压缩参数
bash复制ffmpeg -i input.jpg -vf "scale=640:-1" -q:v 2 -compression_level 5 output.jpg
4.2 安全防护措施
-
Webhook保护:
- 定期轮换机器人密钥
- 限制HTTP Referer
- 启用HTTPS加密
-
视频流安全:
bash复制ffmpeg -i "rtsp://user:password@camera-address" -f mpegts -c copy -bsf:v dump_extra -
日志审计:记录所有告警消息发送记录
bash复制echo "$(date) - Sent alert $ALERT_ID to $ROBOT_TYPE" >> /var/log/alert_bot.log
4.3 监控与维护
建议部署以下检查机制:
-
心跳检测:每天定时发送测试消息
bash复制# 每天9:00发送 0 9 * * * curl -X POST "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=$KEY" -d '{"msgtype":"text","text":{"content":"[心跳检测] 机器人服务正常"}}' -
失败重试:使用retry机制
python复制from tenacity import retry, stop_after_attempt @retry(stop=stop_after_attempt(3)) def send_alert(message): requests.post(webhook_url, json=message) -
备用通道:当机器人不可用时自动切换短信通知
bash复制if [ $? -ne 0 ]; then aws sns publish --phone-number "+8613800001111" --message "ALERT: $EVENT_TYPE" fi
在实际部署中,我们遇到过机器人消息被限流的情况。解决方案是部署多个机器人账号轮询使用,并设置合理的告警聚合策略,比如相同摄像头的连续移动侦测告警在5分钟内只发送一次。
