从码字到推送,公众号全链路自动化实操指南
你的公众号,从写文章到点发布,全程都是手工操作吗?
AI 写好文章 → AI 做好封面 → Python 脚本上传素材 → 调用微信 API 创建草稿。你只需要在手机上看一眼预览,点"发布"。整个链路,人只负责最后那一下。
今天这篇,就从密钥配置到接口对接,把"AI 替你发公众号"的每一步拆开讲清楚。
🤖 → 📝 → 📡 → 📱
AI 写文章、做封面 → Python 对接微信 API → 读者手机收到推送
一、整体思路:把后台搬进命令行
微信公众平台提供了开发者 API,允许通过程序完成三件事:
| 能力 | API | 说明 |
|---|---|---|
| 📤 上传图片 | add_material | 把图片传到微信服务器,拿到 media_id 作为封面 |
| 📝 创建草稿 | draft/add | 把标题+HTML内容+封面扔过去,在后台草稿箱里出现 |
| 🚀 发布 | freepublish/submit | ⚠️ 仅限服务号,订阅号会报 48001 权限不足 |
流程就是一条直线:写 HTML → 上传封面 → 填入标题 → 调 API 创建草稿。如果是服务号,还可以再走一步直接群发。
二、第一步:在正确的地方找到密钥
这部分网上很多教程写错了——它们说去"设置与开发→基本设置",但实际上那个菜单根本不存在。正确的操作路径是这样的:
📍 找 AppID 和 AppSecret:
登录 mp.weixin.qq.com(微信公众平台)→ 左侧菜单 "设置与开发" → "基本配置" → 页面上方就是 AppID,点"重置"可获取 AppSecret
📍 设 IP 白名单:
同一个页面,往下滚到 "IP 白名单" 区域 → 点"修改" → 填入你运行脚本那台机器的公网出口 IP
注意区分两个平台:
| 平台 | 地址 | 干什么的 | 有没有 AppSecret |
|---|---|---|---|
| 微信公众平台 | mp.weixin.qq.com | 日常发文、回复留言、看数据 | ✅ 在这里找 |
| 微信开发者平台 | open.weixin.qq.com | 网站扫码登录、App SDK 接入 | ❌ 找不到 |
很多人跑错地方,就是因为先在搜索引擎里搜到了 open.weixin.qq.com,翻了一圈找不到 AppSecret。记住:日常运营相关的一切都在 mp.weixin.qq.com。
三、核心脚本:不到 150 行
以下是完整可运行的 Python 脚本。你需要先 pip install requests,然后把 AppID 和 AppSecret 填入配置文件。
配置文件 config.json:
{
"appid": "wxXXXXXXXXXXXXXXXX",
"appsecret": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"name": "你的公众号名称"
}
主脚本 publish.py 核心函数:
# ── 1. 获取 access_token(带本地缓存)── def get_access_token(): # 优先读缓存,避免频繁请求 if os.path.exists(TOKEN_FILE): cached = json.load(open(TOKEN_FILE)) if cached['expires'] > time.time() + 300: return cached['access_token'] url = f'https://api.weixin.qq.com/cgi-bin/token' \ f'?grant_type=client_credential' \ f'&appid={APPID}&secret={SECRET}' r = requests.get(url, timeout=15) data = r.json() if 'access_token' not in data: raise Exception(f'Token获取失败: {data}') # 缓存,提前 5 分钟过期 token = data['access_token'] expires = time.time() + data['expires_in'] - 300 json.dump({'access_token': token, 'expires': expires}, open(TOKEN_FILE, 'w')) return token # ── 2. 上传封面图 ── def upload_image(image_path): token = get_access_token() url = f'https://api.weixin.qq.com/cgi-bin/material/' \ f'add_material?access_token={token}&type=image' fname = os.path.basename(image_path) with open(image_path, 'rb') as f: r = requests.post(url, files={'media': (fname, f, 'image/jpeg')}, timeout=30) data = r.json() return {'media_id': data['media_id'], 'url': data.get('url', '')} # ── 3. 创建草稿 ── def create_draft(title, html_content, thumb_media_id): token = get_access_token() url = f'https://api.weixin.qq.com/cgi-bin/draft/add' \ f'?access_token={token}' body = json.dumps({'articles': [{ 'title': title, 'content': html_content, 'thumb_media_id': thumb_media_id, }]}, ensure_ascii=False).encode('utf-8') r = requests.post(url, data=body, headers={'Content-Type': 'application/json'}, timeout=30) data = r.json() return data['media_id'] # 这是草稿 ID # ── 4. 一键流程 ── def quick_publish(title, html, cover_path): img = upload_image(cover_path) # 上传封面 draft_id = create_draft(title, html, img['media_id']) # 创建草稿 print(f'草稿已创建: {draft_id}') print('请到后台草稿箱手动发布')
每次发布一篇新文章,只需要:
cd wechat-publisher python publish_xxx.py
一行命令,五秒完事。
四、踩坑大全:这些都是用眼泪换的
坑一:IP 白名单不是你"当前 IP"那么简单
这是最大的坑。家用宽带运营商通常会分配一个动态 IP 池,你的每次网络请求可能走不同的出口网关。
比如我的情况:在 ifconfig.me 查到的是 xxx.xxx.xxx.161,但连微信 API 时实际走的是 xxx.xxx.xxx.169——不同目的地走不同线路。把 .161 加进白名单根本没用,因为微信那边看到的一直是 .169。
💡 正确做法
不要相信自己查 IP 的结果。运行脚本,让它报错——微信返回的错误信息里会明确告诉你当前请求来自哪个 IP。以那个 IP 为准,加入白名单。
坑二:订阅号无法自动群发
脚本可以创建草稿,但调用发布 API 时报 48001: api unauthorized。这不是你的问题——微信规定订阅号不能通过 API 群发,只有服务号有这个权限。
所以工作流是:脚本自动创建草稿 → 你登录后台草稿箱 → 预览一眼 → 手动点发布。虽然多了一步,但跟从头手动粘贴相比已经快了 90%。
坑三:ensure_ascii=False 这个参数
Python 的 requests.post() 如果用 json= 参数,会自动把中文转成 Unicode 转义符(\uXXXX),微信那边收到的就是乱码。必须用 json.dumps(xxx, ensure_ascii=False).encode() 再 data= 发送。
坑四:标题长度 64 字节
不是 64 个字符,是 64 个字节。一个中文字 3 字节,所以标题最多约 20 个中文字。超了就报错。
坑五:正文 HTML 不是你想写啥都行
微信不支持 <style> 标签和 CSS class。所有样式必须写成 内联 style=""。支持的标签也很有限:section、p、h1-h6、b、strong、span、img、blockquote、pre、table、ul/ol。flex 布局、JavaScript、iframe 统统不支持。
五、进阶:一劳永逸解决 IP 漂移
如果你要频繁发布,每次去后台改 IP 白名单确实烦。三种解决方案:
| 方案 | 成本 | 说明 |
|---|---|---|
| 🏅 云服务器 | ¥30-50/月 | 阿里云/腾讯云最低配 ECS,自带固定公网 IP。把脚本部署在上面,一次配置永不过期。 |
| 🥈 运营商静态 IP | ¥50-200/月 | 打运营商客服电话,把家宽升级为"公网固定 IP"。所有设备都能受益。 |
| 🥉 手动更新 | 免费 | IP 又不是天天变。什么时候脚本报错了,看错误信息里的 IP,花 30 秒去后台加一下就行。 |
六、一图总结完整流程
🤖 AI 写文章 🤖 AI 做封面图
(Markdown/HTML) (JPG, 900×500)
│ │
└────────┬───────────────┘
▼
🐍 Python 脚本
├─ upload_image() 上传封面 → media_id
├─ create_draft() 提交标题+HTML+封面
└─ print("请去草稿箱手动发布")
│
▼
👤 你打开手机 → 预览 → 点发布
写在最后
150 行 Python。三个 API 调用。一次配置,终身受用。
你可能觉得"不就省了几分钟的事嘛"。但如果你一个月写十几篇,一年下来就是几十个小时——这些时间拿去喝咖啡不香吗。
而且说实话,AI 把文章和封面都做好了,Python 脚本把上传和创建草稿也办了——你只剩一个动作:拿起手机,预览一眼,点发布。这种感觉,试过一次就回不去了。
本文中的所有 AppID、AppSecret、IP 地址均已替换为示例占位符。代码可直接使用,替换为你自己的密钥即可运行。
· 创客纪 · 工具手记 ·
Python × 微信 API × 自动化
夜雨聆风