企业微信机器人告警需用requests.post发送json格式消息,注意webhook地址、msgtype字段及content-type;linux定时用crontab并处理环境变量;避免报警风暴需收敛告警;消息格式混乱因msgtype选择不当,应优先验证text类型再升级。

怎么用 requests.post 发送告警消息到企业微信机器人
核心就是一条 HTTP POST 请求,目标是机器人提供的 webhook 地址。不能直接发裸文本,必须按企业微信要求的 JSON 格式构造请求体,且 Content-Type 必须设为 application/json。
常见错误现象包括:{"errcode":40014,"errmsg":"invalid webhook url"}(地址粘贴错、带空格或被 URL 编码过)、{"errcode":40002,"errmsg":"invalid content"}(JSON 格式错、字段名拼错、缺少 msgtype)。
实操建议:
- 先用
curl手动测试一次,确认 webhook 地址和基础消息结构可用 - Python 中优先用
requests.post(url, json=payload, timeout=5),不要自己拼data=json.dumps(...)和headers,json=参数会自动处理序列化和 header -
payload至少包含msgtype和对应类型字段,比如文本用{"msgtype": "text", "text": {"content": "服务宕机了"}}} - 生产环境务必加
timeout,避免网络卡住导致定时任务堆积
怎么让 Python 脚本在 Linux 上按时执行(不是用 Windows 任务计划)
Linux 下最可靠、最轻量的定时方案就是 crontab,不依赖 Python 的第三方调度库(如 APScheduler),也不需要常驻进程。Zabbix、日志清理、日报推送等运维场景都靠它。
关键点在于:脚本本身要可独立运行,crontab 只负责“喊它一声”。容易踩的坑是环境变量不一致——crontab 默认 PATH 极简,找不到 python3 或你装的包。
实操建议:
- 脚本第一行写好解释器路径,比如
#!/usr/bin/env python3,并chmod +x /path/to/alert.py - 在脚本开头显式添加 Python 模块路径(如果用了虚拟环境):
import sys; sys.path.insert(0, "/opt/venv/lib/python3.x/site-packages") -
crontab -e里写绝对路径,例如:*/5 * * * * /usr/bin/python3 /opt/alerts/prod_alert.py - 务必重定向输出:
*/5 * * * * /usr/bin/python3 /opt/alerts/prod_alert.py >> /var/log/prod_alert.log 2>&1,否则失败时你根本不知道
怎么避免报警风暴把群聊刷屏(特别是 Zabbix 多触发器同时告警)
企业微信机器人有硬性限制:20 条/分钟。Zabbix 一个主机宕机,可能瞬间触发 CPU、内存、Ping、端口等多个 Trigger,如果每个都单独发一条,立刻超限,后续消息全部丢弃。
这不是代码写得不够快的问题,而是平台策略。强行重试或并发发送只会让问题更糟。
实操建议:
- Zabbix 端启用“告警收敛”:配置
Action的Operations时勾选Recovery message,并设置Default subject和Default message合并多条告警为一条,例如用{TRIGGER.NAME}+{ITEM.LASTVALUE}拼成汇总内容 - Python 脚本层做简单缓冲:把同一分钟内收到的多个告警暂存内存或临时文件,到整点再合并发送(适合自建采集+推送架构)
- 真正高频场景(如秒级监控)必须拆分机器人:给不同业务线、不同严重等级(P0/P1)配不同 webhook,分散流量
- 发送前加判断:
if alert_level == "DISASTER": send_immediately() else: queue_for_batch()
为什么发出去的消息看起来格式混乱、@ 不生效、链接打不开
企业微信对不同 msgtype 的渲染逻辑差异很大。你以为发的是文本,其实想让它支持 @ 或跳转,就必须用 markdown 或 news 类型,而且字段名、嵌套层级、转义规则都有严格要求。
典型问题:text 类型里写 @xxx 完全没反应;markdown 里中文括号没转义导致解析失败;news 的 url 字段值不是合法 URL 导致卡片不显示。
实操建议:
- 需要 @ 成员,必须用
markdown,且写法是(ID)或,不能用昵称;ID 需从企业微信管理后台或 API 查,不是手机号 -
markdown内容中所有]、[、(、)都要反斜杠转义,否则会被误识别为链接语法 - 发链接推荐用
news类型,它生成卡片,点击直接跳转,比 markdown 里手写[文字](url)更稳 - 永远先用最简
text类型验证通路,再逐步升级格式,别一上来就堆 markdown
企业微信机器人的 webhook 地址本质是公开 endpoint,只要拿到就能发消息。所以真正的复杂点从来不在“怎么发”,而在于“谁该看到”“什么时候该发”“发重复了怎么办”。尤其是生产环境报警,消息延迟几秒可能就错过黄金恢复时间,但发太快又淹没有效信息——平衡点得靠实际告警频率、团队响应节奏和 Zabbix 触发逻辑共同决定,没法套模板。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











