自建企微消息推送主要有「群机器人」和「自建应用」两种路径,简单告警选机器人,需要指定接收人或复杂交互选自建应用。
先说结论:如果只是向固定群聊发送简单通知,群机器人配置最快;如果需要发送给特定成员、部门或使用模板卡片,必须走自建应用接口。
- 适合:群机器人适合运维告警、日常通知;自建应用适合业务触达、需要用户回复的场景。
- 重点看:消息接收范围是否受限,机器人只能发进群,应用可以发给具体人。
- 别忽略:自建应用需将接收人纳入应用可见范围,无需用户主动关注。
选型核心逻辑
群机器人本质是一个 Webhook 地址,绑定在某个群聊里,权限仅限于该群。自建应用则是基于企业身份调用的 API,权限更高,可以指定接收人,但鉴权流程更复杂,需要 CorpID、Secret 和 AgentID。
不需要执行复杂命令,先明确你的通知对象是谁。如果是群聊,直接添加机器人;如果是具体的人,去企业微信后台创建应用。
群机器人实操(Webhook)
机器人无需鉴权,获取 Webhook 地址后即可直接发送 HTTP POST 请求。
1. 获取地址
在群聊设置中添加机器人,复制 Webhook 地址,格式通常为:https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx
2. 发送测试(curl 示例)
curl 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY' \
-H 'Content-Type: application/json' \
-d '{
"msgtype": "text",
"text": {
"content": "告警测试:服务 CPU 使用率超过 80%"
}
}'3. 注意事项
- 消息类型支持 text、markdown、news 等,告警建议用 markdown 保留格式。
- 频率限制:每个机器人每分钟最多 20 条,高频告警需在代码层合并。
自建应用实操(API)
自建应用需要先获取 access_token,再调用发送接口。Token 有效期为 2 小时,建议缓存。
1. 基础配置
在企业微信管理后台「应用管理」创建自建应用,记录以下信息:
- CorpID: 企业 ID
- Secret: 应用密钥(建议存储在环境变量,不要硬编码)
- AgentID: 应用 ID
2. 获取 access_token
curl 'https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=YOUR_CORPID&corpsecret=YOUR_SECRET'返回 JSON 中包含 access_token 字段。
3. 发送消息(curl 示例)
curl 'https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=YOUR_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"touser": "UserID1|UserID2",
"msgtype": "text",
"agentid": YOUR_AGENTID,
"text": {
"content": "业务通知:订单已生成"
},
"safe": 0
}'4. 接收人配置(关键)
自建应用需将接收人纳入应用可见范围,无需用户主动关注。在管理后台「应用」->「可见范围」中添加成员或部门,否则接口会返回错误码 60020。
验证与常见错误
发送一条测试消息,检查手机端企业微信是否收到。对于自建应用,确认接收人是否在可见范围内。
常见错误码及处理:
- 40003: Secret 错误。检查是否复制完整,注意环境变量是否加载正确。
- 42001: access_token 过期。重新获取 token 并更新缓存。
- 60020: 用户不在应用可见范围。去后台添加成员到可见范围。
- 45015: 响应超时。检查网络或增加重试机制。
安全与最佳实践
- 密钥管理: Secret 不要提交到代码仓库。推荐使用环境变量,如
export WECOM_SECRET="xxx",代码中通过os.getenv读取。 - Token 缓存: 不要每次发消息都请求 token。将 token 存入 Redis 或内存,过期前主动刷新。
- 人员离职: 自建应用发送前需确认用户状态,避免接口报错。可定期同步通讯录状态。
参考来源
企业微信开发者文档 - 群机器人 https://developer.work.weixin.qq.com/document/path/91770
企业微信开发者文档 - 自建应用消息发送 https://developer.work.weixin.qq.com/document/path/91771