『DevOps运维』从零搭建企业微信告警机器人:接口对接、消息模板与自动化通知


📣读完这篇文章里你能收获到

  1. 📁 掌握企业微信群机器人的完整创建与配置流程
  2. 🐍 学会使用 curl 调用 Webhook 发送多种类型的告警消息
  3. 🌐 精通 Markdown 消息格式,实现彩色字体、@成员等高级功能
  4. 🖥️ 获得可直接落地的告警通知模板和最佳实践
  5. 🔧 了解文件发送、模板卡片等进阶用法

前言

在运维和开发工作中,及时获取系统告警是保障服务稳定性的关键一环。企业微信作为企业内部沟通的主流工具,其群机器人功能为我们提供了一种轻量、高效的告警通知方案。不用写复杂的邮件模板,不用搭沉重的消息队列,一个 Webhook 地址就能搞定。

这篇东西不长,但能帮你从零到一跑通整个对接流程,包括怎么@人、怎么显示彩色字体、怎么让告警消息看起来更专业。


一、创建与配置企业微信群机器人

1.1 在群里添加机器人

企业微信的群机器人功能非常直观,不需要任何开发背景就能完成创建:

  1. 打开目标群聊,点击右上角「···」进入群设置
  2. 选择「添加群机器人」→「新创建一个机器人」
  3. 填写机器人名称(建议用有意义的名称,如「生产环境监控机器人」)
  4. 点击「添加机器人」完成创建

创建完成后,系统会生成一个唯一的 Webhook 地址,格式如下:

复制代码
https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

这个 key 就是机器人的身份标识,务必妥善保管。 如果泄露,可以在群设置中重置。

1.2 对接流程概览

整个对接流程可以归纳为四个步骤:

简单来说,就是「创建机器人 → 配置服务端 → 发消息 → 收通知」。下面我们来详细看看怎么发消息。


二、消息类型与格式详解

2.1 支持的六种消息类型

企业微信机器人目前支持六种消息类型,各自适用于不同的场景:

消息类型 msgtype 适用场景 特点
文本消息 text 简单通知、快速告警 支持@成员,纯文本展示
Markdown markdown 复杂告警、格式化内容 支持3种颜色、@成员
Markdown V2 markdown_v2 标准 Markdown 内容 支持表格、代码块,不支持颜色和@
图片消息 image 截图、图表发送 需 base64 + md5
图文消息 news 文章推送、图文展示 支持图片+标题+描述+链接
文件消息 file 日志、报表发送 需先上传获取 media_id

对于告警场景,Markdown 消息是最佳选择,因为它支持颜色区分和@成员。

2.2 文本消息(text)

文本消息是最简单的类型,适合快速发送纯文本通知。

curl 示例:

bash 复制代码
curl 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY' \
   -H 'Content-Type: application/json' \
   -d '{
        "msgtype": "text",
        "text": {
            "content": "服务器 CPU 使用率超过 90%,请尽快处理!"
        }
    }'

@指定成员:

bash 复制代码
curl 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY' \
   -H 'Content-Type: application/json' \
   -d '{
        "msgtype": "text",
        "text": {
            "content": "广州今日天气:29度,大部分多云,降雨概率:60%,<@zhangsan> 请关注",
            "mentioned_list": ["wangqing", "@all"]
        }
    }'

@手机号:

bash 复制代码
curl 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY' \
   -H 'Content-Type: application/json' \
   -d '{
        "msgtype": "text",
        "text": {
            "content": "服务器 CPU 使用率超过 90%,请尽快处理!",
            "mentioned_mobile_list": ["13800001111", "13900002222"]
        }
    }'

关键参数说明:

参数 必填 说明
content 消息内容,最长不超过 2048 个字节
mentioned_list userid 列表,@all 表示@所有人
mentioned_mobile_list 手机号列表,用于@对应成员

注意: 文本消息不支持 Markdown 格式和颜色设置,如果需要富文本展示,请使用 Markdown 类型。

2.3 Markdown 消息(重点)

Markdown 消息是告警场景的核心,支持标题、加粗、代码块、引用,以及三种颜色

基本格式

curl 示例:

bash 复制代码
curl 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY' \
   -H 'Content-Type: application/json' \
   -d '{
        "msgtype": "markdown",
        "markdown": {
            "content": "**实时新增用户反馈**<font color=\"warning\">132例</font>,请相关同事注意。"
        }
    }'

支持的 Markdown 语法

语法 示例 说明
标题 # 一级标题 支持1-6级
加粗 **bold**
链接 [文字](URL) 可点击链接
引用 > 引用文字 灰色引用块
颜色 <font color="info">绿色</font> 仅支持3种颜色
@成员 <@userid> @指定成员

颜色支持说明(重要)

企业微信 Markdown 只支持以下三种颜色

markdown 复制代码
<font color="info">绿色文字(info)</font>
<font color="comment">灰色文字(comment)</font>
<font color="warning">橙红色文字(warning)</font>

不支持 自定义色值(如 #FF0000redgreen 等),也不支持其他颜色名。

@成员的方法

在 Markdown 中@成员有两种方式:

markdown 复制代码
# 方式一:@指定成员(通过 userid)
<@zhangsan> 请尽快处理

# 方式二:@所有人
<@all> 全体成员注意

注意: @userid 中的 userid 是企业微信成员的唯一标识,不是手机号,也不是姓名。获取方式:

  1. 管理员在管理后台查看
  2. 通过企业微信 API 查询

完整告警消息示例

bash 复制代码
curl 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY' \
   -H 'Content-Type: application/json' \
   -d '{
        "msgtype": "markdown",
        "markdown": {
            "content": "## <font color=\"warning\">【严重告警】数据库主从延迟过高</font>\n\n**实例**: `prod-mysql-master`\n**延迟**: <font color=\"warning\">15.2s</font>\n**阈值**: 5s\n\n可能原因:\n1. 从库 IO 线程阻塞\n2. 大事务执行中\n3. 网络抖动\n\n**时间**: 2026-05-13 14:32:08\n**状态**: <font color=\"warning\">待处理</font>\n\n<@zhangsan> <@lisi> 请尽快处理"
        }
    }'

2.4 Markdown V2 消息(markdown_v2)

markdown_v2 是新版 Markdown,支持更标准的语法,但不支持颜色和@成员

curl 示例:

bash 复制代码
curl 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY' \
   -H 'Content-Type: application/json' \
   -d '{
        "msgtype": "markdown_v2",
        "markdown_v2": {
            "content": "# 标题\n## 二级标题\n**加粗**\n*斜体*\n- 无序列表\n1. 有序列表\n> 引用\n[链接](https://work.weixin.qq.com)\n| 表格 | 列2 |\n| :----- | :----: |"
        }
    }'

支持的语法子集:

语法 示例 说明
标题 # 标题(#后需空格) 支持1-6级
加粗 **bold**
斜体 *italic*
无序列表 - item
有序列表 1. item
引用 > 引用 支持多级
链接 [文字](URL)
图片 ![alt](URL)
分割线 ---
行内代码 code
代码块 ` ```code````
表格 ` 列1

⚠️ 注意 :需要客户端版本 4.1.36+(安卓 4.1.38+)

2.5 图片消息(image)

图片消息需要 base64 编码和 md5 值。

curl 示例:

bash 复制代码
curl 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY' \
   -H 'Content-Type: application/json' \
   -d '{
        "msgtype": "image",
        "image": {
            "base64": "DATA",
            "md5": "MD5_VALUE"
        }
    }'
参数 必填 说明
base64 图片内容的 base64 编码
md5 图片内容的 MD5 值

2.6 图文消息(news)

图文卡片适合需要展示图片、标题、描述和跳转链接的场景。

curl 示例:

bash 复制代码
curl 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY' \
   -H 'Content-Type: application/json' \
   -d '{
        "msgtype": "news",
        "news": {
            "articles": [
                {
                    "title": "中秋节礼品领取",
                    "description": "今年中秋节公司有豪礼相送",
                    "url": "www.qq.com",
                    "picurl": "http://res.mail.qq.com/node/ww/wwopenmng/images/independent/doc/test_pic_msg1.png"
                }
            ]
        }
    }'
参数 必填 说明
title 标题,最长 128 字节
description 描述,最长 512 字节
url 点击后跳转的链接
picurl 图片 URL(可选)

2.7 文件消息(file)

文件消息需要先上传文件获取 media_id,再发送。

步骤一:上传文件

bash 复制代码
curl -F "file=@test.xlsx" 'https://qyapi.weixin.qq.com/cgi-bin/webhook/upload_media?key=YOUR_KEY&type=file'

步骤二:发送文件消息

bash 复制代码
curl 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY' \
   -H 'Content-Type: application/json' \
   -d '{
        "msgtype": "file",
        "file": {
            "media_id": "MEDIA_ID"
        }
    }'
参数 必填 说明
media_id 通过上传接口获取的文件 ID

三、实战:构建完整的告警通知系统

3.1 告警消息模板设计

一个好的告警消息应该包含以下要素:

  1. 告警级别:严重(warning 橙红)、警告(warning 橙红)、恢复(info 绿色)
  2. 告警内容:具体的指标和阈值
  3. 影响范围:涉及的服务或主机
  4. 处理人:@相关责任人
  5. 时间戳:精确到秒
  6. 状态:待处理/处理中/已恢复

3.2 常用告警模板

服务器指标告警

bash 复制代码
curl 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY' \
   -H 'Content-Type: application/json' \
   -d '{
        "msgtype": "markdown",
        "markdown": {
            "content": "## <font color=\"warning\">【严重告警】CPU使用率异常</font>\n\n**主机**: `prod-web-01`\n**指标**: CPU使用率\n**当前值**: <font color=\"warning\">95.2%</font>\n**阈值**: 85%\n**持续时间**: 5分钟\n\n**时间**: 2026-05-13 14:32:08\n**状态**: <font color=\"warning\">待处理</font>\n\n<@wangwu> 请尽快处理"
        }
    }'

数据库告警

bash 复制代码
curl 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY' \
   -H 'Content-Type: application/json' \
   -d '{
        "msgtype": "markdown",
        "markdown": {
            "content": "## <font color=\"warning\">【严重告警】数据库主从延迟过高</font>\n\n**实例**: `prod-mysql-master`\n**延迟**: <font color=\"warning\">15.2s</font>\n**阈值**: 5s\n\n可能原因:\n1. 从库 IO 线程阻塞\n2. 大事务执行中\n3. 网络抖动\n\n**时间**: 2026-05-13 14:32:08\n**状态**: <font color=\"warning\">待处理</font>\n\n<@zhangsan> <@lisi> 请尽快处理"
        }
    }'

告警恢复通知

bash 复制代码
curl 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY' \
   -H 'Content-Type: application/json' \
   -d '{
        "msgtype": "markdown",
        "markdown": {
            "content": "## <font color=\"info\">【告警恢复】CPU使用率恢复正常</font>\n\n**主机**: `prod-web-01`\n**指标**: CPU使用率\n**当前值**: <font color=\"info\">45.6%</font>\n**阈值**: 85%\n**持续时间**: 12分钟\n\n**时间**: 2026-05-13 14:44:08\n**状态**: <font color=\"info\">已恢复</font>\n\n<@wangwu> 告警已恢复,无需处理"
        }
    }'

服务宕机告警

bash 复制代码
curl 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY' \
   -H 'Content-Type: application/json' \
   -d '{
        "msgtype": "markdown",
        "markdown": {
            "content": "## <font color=\"warning\">【严重告警】服务不可用</font>\n\n**服务**: `order-service`\n**环境**: 生产环境\n**状态**: <font color=\"warning\">DOWN</font>\n**错误率**: 100%\n\n**影响范围**:\n- 用户下单功能\n- 订单查询功能\n\n**时间**: 2026-05-13 15:10:22\n**状态**: <font color=\"warning\">待处理</font>\n\n<@oncall> <@devops> 请立即处理"
        }
    }'

3.3 与监控系统集成

以 Prometheus + Alertmanager 为例,配置 webhook 接收器:

yaml 复制代码
# alertmanager.yml
receivers:
  - name: 'wechat-work'
    webhook_configs:
      - url: 'http://your-service:5000/webhook/wechat'
        send_resolved: true
        http_config:
          timeout: 10s

route:
  receiver: 'wechat-work'
  group_by: ['alertname', 'severity']
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 4h

四、常见问题与最佳实践

4.1 常见问题

Q1:发送失败,返回 errcode: 93000

A:Webhook key 无效或已过期。检查 key 是否正确,或重新创建机器人获取新 key。

Q2:Markdown 颜色不生效

A:企业微信只支持 info(绿色)、comment(灰色)、warning(橙红)三种颜色,且必须使用 <font color="info"> 语法(注意是双引号)。不支持 redgreenblue 等颜色名。

Q3:@成员没有高亮效果

A:确保使用的是 <@userid> 语法,且 userid 正确。注意不是手机号,也不是姓名。

Q4:消息内容被截断

A:Markdown 消息最长 4096 字节,文本消息最长 2048 字节。超长内容需要精简或拆分为多条消息。

Q5:频率限制

A:每个机器人每分钟最多发送 20 条消息。超出会被限流,建议对告警进行聚合后再发送。

Q6:markdown_v2 为什么不显示颜色?

A:markdown_v2 是标准 Markdown,不支持 <font> 标签和 @成员 语法。如果需要颜色和@人,请使用 markdown 类型。

4.2 最佳实践

  1. 分级告警:严重告警@具体负责人,一般告警只发群不@人,避免骚扰
  2. 聚合发送:同一类告警在 5 分钟内只发一次,减少消息轰炸
  3. 包含恢复通知:告警恢复时主动通知,让值班人员知道问题已解决
  4. 添加跳转链接:告警消息中附上 Grafana、Kibana 等监控面板的链接
  5. 控制消息长度:关键信息放在前面,详细日志放链接里
  6. 使用代码块 :主机名、IP、错误码等用 ````` 包裹,提高可读性
  7. 选择合适的消息类型 :需要颜色和@人用 markdown,需要表格用 markdown_v2

总结

到这一步,你应该就能稳稳复现了。咱们回顾一下这篇的核心内容:

  • 创建机器人:群设置 → 添加机器人 → 复制 Webhook key
  • 消息类型:text / markdown / markdown_v2 / image / news / file
  • 彩色字体<font color="info">(绿)、<font color="warning">(橙红)、<font color="comment">(灰)
  • @成员<@userid> @个人,<@all> @所有人
  • 文件发送 :先调用 upload_media 上传获取 media_id,再发送
  • 告警模板:提供了 CPU、数据库、服务宕机、恢复通知等完整 curl 示例

企业微信机器人的优势在于轻量和低门槛,不需要额外的服务器或复杂的配置,一个 HTTP POST 就能搞定。对于中小型团队的告警通知场景,它是一个非常实用的选择。


相关推荐
乘云数字DATABUFF10 小时前
5分钟部署开源APM Databuff:OpenTelemetry全链路追踪入门实战
运维·后端
荣--2 天前
一键部署不是为了省时间 —— 它是把"买来的 PaaS"变成"自己的平台"的拐点
运维·zabbix·工程化·一键部署·平台化·边界设计
江华森2 天前
动手实战学 Docker — 从零到集群编排完全指南
运维
Avan_菜菜3 天前
FRP 内网穿透完整实战:从 HTTP 映射到 HTTPS 自签代理
运维·nginx·https
SelectDB4 天前
Litefuse 开源并推出单进程轻量模式,25 秒就能跑起来的 Agent 可观测与评估平台
运维·后端·自动化运维
XIAOHEZIcode5 天前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
用户0328472220706 天前
如何搭建本地yum源(上)
运维
大树889 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠9 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质9 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务