企业微信Webhook需安全防护:密钥从环境变量读取并加入.gitignore;@所有人须用列表格式["@all"];必须设timeout和异常捕获;Markdown需转义特殊字符;返回errcode=0才成功。

直接用 requests.post 调企业微信 Webhook 就能发消息,但不加防护、不处理边界情况的脚本,上线三天准出问题。
Webhook 地址必须从环境变量读取,不能硬编码
硬写在代码里的 https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx 一旦被提交到 Git,等于把群发权限公开。很多团队踩过这个坑,导致测试群被刷屏甚至收到钓鱼消息。
- 正确做法:用
os.getenv("WECHAT_WEBHOOK")读取,配合.env文件管理 - 本地开发时用
python-dotenv自动加载:from dotenv import load_dotenv; load_dotenv() - 生产环境(如 Linux 服务器)通过
export WECHAT_WEBHOOK="https://..."设置系统级变量 - 别忘了把
.env加进.gitignore,否则等于白做
发送文本消息时,mentioned_list 容易传错格式
想 @所有人却只写了 "@all" 字符串?接口会静默忽略。企业微信要求它必须是列表类型,且大小写敏感。
- 正确写法:
"mentioned_list": ["@all"]或"mentioned_list": ["zhangsan", "lisi"] - 错误写法:
"mentioned_list": "@all"(字符串)、"mentioned_list": ["@ALL"](大写无效) - 如果要 @ 某个用户但不知道其账号名,得去企业微信后台查「成员账号」(不是昵称),例如
"w123456789" - 注意:@所有人功能仅对群内「有发送消息权限」的成员生效,部分禁言群可能不触发提醒
不设超时和异常捕获,脚本会卡死或静默失败
网络抖动、企业微信临时限流、DNS 解析失败——这些都可能导致 requests.post 长时间阻塞,尤其在 crontab 定时任务里,积压进程会越来越多。
立即学习“Python免费学习笔记(深入)”;
- 必须加
timeout=(3, 7):3 秒连不上就放弃,7 秒内没收到响应也中断 - 必须捕获
requests.exceptions.RequestException,而不是只看response.status_code - 检查返回值里的
"errcode"字段:0才代表成功;errcode=40014是 key 错误,errcode=45009是发送太频繁(每分钟超 20 条) - 建议加简单重试逻辑(最多 1 次),但别无脑循环重发,避免雪崩
Markdown 消息排版失效,往往是因为换行或引号没转义
企业微信的 Markdown 渲染器比 GitHub 严格得多。看似正常的 **加粗** 在群里可能原样显示为文字,原因通常是 JSON 序列化时没处理好特殊字符。
- 内容里含换行符?用
\n,别用真实回车;含双引号?前面加反斜杠:"content": "当前状态:\"正常\"" - 标题、列表、代码块都支持,但语法必须规范:
### 三级标题、- 列表项、print(1)
- 别在 Markdown 里嵌 HTML 标签,企业微信不解析;也不要用 CSS 类名或 style 属性
- 调试技巧:先用最简 Markdown 发一次,比如
"content": "### 测试\n- OK",确认基础渲染正常再加复杂格式
真正难的不是发第一条消息,而是让脚本在无人值守时连续跑三个月不出错——超时设置、密钥隔离、错误码分类、限频兜底,每一处都是线上稳定性的分水岭。



















