使用 Python 的 requests 库调用企业微信机器人 Webhook 接口,配合操作系统的定时任务(如 Linux cron 或 Windows 任务计划程序)可实现定时发送。适用场景为内部运维通知或日报推送,主要风险边界在于 Webhook 地址泄露可能导致垃圾消息注入。
先说结论:Python 脚本结合系统级定时任务是企业微信日报自动化的标准实现方案,无需额外部署复杂服务。
- 适合:已有 Python 运行环境的服务器或办公电脑,需要定期推送固定格式文本。
- 先看:企业微信群机器人 Webhook 地址获取权限及网络连通性。
- 建议:将 Webhook 密钥存入环境变量或配置文件,避免硬编码在代码中。
命令速用版
以下脚本通过 requests 库发送 Markdown 格式消息,保存为 send_report.py 后可由定时任务调用。
import requests
import json
import os
webhook_url = os.getenv("WECOM_WEBHOOK")
headers = {"Content-Type": "application/json"}
data = {
"msgtype": "markdown",
"markdown": {
"content": "## 日报通知\n> 日期:2023-10-27\n> 内容:系统运行正常"
}
}
response = requests.post(webhook_url, headers=headers, data=json.dumps(data))
print(response.json())Linux 系统可使用 crontab 设置每日 18:00 执行:
0 18 * * * /usr/bin/python3 /path/to/send_report.py为什么会这样
企业微信机器人基于 HTTP Webhook 机制,任何能发起 HTTP POST 请求的程序均可触发消息推送。系统定时任务负责在指定时间点唤醒 Python 脚本,脚本负责构建 payload 并请求接口。这种解耦设计让发送逻辑与调度逻辑分离,便于独立排查问题。
分步处理
- 获取 Webhook 地址:在企业微信群聊设置中添加机器人,复制 Webhook 地址。该地址包含 key 参数,等同于密码。
- 编写发送脚本:使用 Python requests 库构造 POST 请求。消息类型推荐 markdown,支持简单排版。代码中不要直接写入 Webhook 地址,建议通过环境变量读取。
- 配置定时任务:Linux 使用 crontab -e 编辑任务,Windows 使用任务计划程序创建基本任务。确保执行权限和 Python 路径正确。
- 设置网络策略:如果服务器有防火墙,需放行 outbound HTTPS 流量。企业微信 API 域名通常为 qyapi.weixin.qq.com。
怎么验证是否生效
查看企业微信目标群聊是否在预定时间收到消息卡片。检查脚本运行日志,确认 HTTP 状态码为 200 且返回 JSON 中 errmsg 为 ok。Linux 系统可查看 cron 日志 /var/log/cron 或 syslog 确认任务是否触发。
常见坑
- 时区不一致:服务器系统时间可能与当地时间不同,导致发送时间偏差。需在 cron 设置前确认 date 命令输出。
- 环境变量缺失:定时任务环境往往不加载用户 profile,导致读取不到 Webhook 环境变量。建议在脚本内写死测试或用绝对路径加载配置。
- 消息频率限制:企业微信机器人有频率限制,短时间内高频调用会被拦截。日报类任务通常不会触发,但调试时需注意。
- 网络超时:脚本未设置 timeout 参数可能导致网络波动时进程挂起。建议在 requests.post 中设置 timeout=5。
常见问题
发送失败如何排查?
首先检查脚本本地运行是否成功,再确认定时任务是否触发。查看返回 JSON 中的 errcode,非 0 值表示接口报错,常见原因是 Webhook 地址无效或内容格式错误。
支持发送图片或文件吗?
群机器人 Webhook 主要支持文本和 Markdown 类型。图片和文件上传需要调用企业微信正式应用的 API,需要更复杂的鉴权流程,不适合简单机器人场景。
如何在多台服务器复用脚本?
将脚本放入版本控制系统,通过配置文件区分不同服务器的 Webhook 地址。确保每台服务器的定时任务独立配置,避免重复发送。
参考来源
- 企业微信官方文档,群机器人 API 说明,work.weixin.qq.com
- Python requests 库官方文档,HTTP 请求方法说明,requests.readthedocs.io