用「微信云托管 + 开放接口服务」把文章自动推送到公众号草稿箱。 云托管容器内调用微信 API 不需要配置 IP 白名单(官方机制),彻底摆脱 "家庭宽带动态 IP / 代理节点轮换导致白名单失效"的问题。
本机(每天 20:00 计划任务)
└─ client/push_wechat_draft.py ──POST 图文──▶ 微信云托管服务 /push
│ 开放接口服务(免鉴权)
▼
api.weixin.qq.com
add_material / uploadimg / draft/add
│
▼
公众号草稿箱(不自动发布)
wechat-cloud/
├── app.py # 云托管服务端(Flask,/push 接口)
├── Dockerfile # 构建镜像
├── requirements.txt
├── container.config.json # 云托管服务配置(端口 80)
└── client/
└── push_wechat_draft.py # 本机推送脚本(纯 Python 标准库,零依赖)
- 打开 https://cloud.weixin.qq.com ,用公众号管理员微信扫码登录
- 首次进入会提示选择「小程序/公众号」→ 选公众号
- 提示新建环境 → 填环境名称(如
wechat-push),按提示开通(会引导绑定 腾讯云账号/支付方式用于按量计费,免费体验额度内不扣费)
- 控制台 → 服务列表 → 【新建服务】
- 服务名称:
wechat-push,开启「允许公网访问」(本机脚本要走公网调它)
- 方式 A(GitHub/Gitee 流水线):把
wechat-cloud/目录内容推到一个 Git 仓库(Dockerfile 必须在仓库根目录),在服务详情 → 流水线 → 新建流水线 → 选你的仓库 → 构建发布 - 方式 B(本地部署):安装微信云托管 CLI(文档见云托管控制台),在
wechat-cloud/目录执行部署命令,把代码/镜像推到云托管
- 端口填 80(必须与 Dockerfile 的 EXPOSE 80 一致)
- CPU/内存用默认即可(0.25 核 / 0.5G 足够,每天就推一篇)
- 控制台 → 云调用 → 微信令牌权限配置,添加以下接口(逐个添加):
/cgi-bin/material/add_material/cgi-bin/media/uploadimg/cgi-bin/draft/add
- 打开「开放接口服务」开关
- 重新构建/发布一个新版本(开关开启后创建的版本才生效!)
- 验证:服务日志里请求应带
x-openapi-seqid头(说明走了云调用链路)
- 服务详情 → 版本列表 → 当前版本 → 复制「公网访问域名」
(形如
https://wechat-push-xxxx.service.tcloudbase.com)
python client/push_wechat_draft.py "<文章HTML绝对路径>" "https://你的公网域名"成功返回 {"ok": true, "media_id": "..."} → 去公众号后台草稿箱查看。
- 打开「任务计划程序」→ 创建基本任务
- 触发器:每天 20:05(等 20:00 文章生成完)
- 操作:
- 程序:
python.exe(建议用绝对路径) - 参数:
"D:\a project\自媒体\公众号\wechat-cloud\client\push_wechat_draft.py" "<当天文章HTML>" "https://你的公网域名" - 起始于:
D:\a project\自媒体\公众号\wechat-cloud\client
- 程序:
- 若当天文章路径带日期,可在参数里写死当天日期,或用批处理动态拼
- 微信云托管按量计费(CPU/内存 × 运行时长,100ms 粒度),有免费体验 额度;每天 1 篇推文的调用量极小,基本都在免费额度内
- 服务配了
minNum: 0→ 没请求时自动缩到 0,不运行就不计费 - 建议在云托管控制台设置费用预警,避免意外超支
- 防意外:正文图单张建议 < 5MB(云调用单请求上限 32MiB)
- 接口返回 40164(IP 不在白名单):说明没走开放接口服务——检查第 5 步 开关是否开启、接口是否加入令牌权限配置、版本是否在开启后重新构建
- 请求超时:云调用单次上限 30s,图片过大时先压缩再传
- 没有封面:
/push支持cover字段上传封面图(比百家号强,公众号封面 可以 API 设置);不传封面时微信会用正文首图兜底