乐于分享
好东西不私藏

AI替你发公众号

AI替你发公众号

从码字到推送,公众号全链路自动化实操指南

你的公众号,从写文章到点发布,全程都是手工操作吗?

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 × 自动化