把一段素材自动写成公众号文章、配好封面与插图、推进草稿箱——技术完全可行,成熟开源轮子齐全。但整条链路撞同一道与工具无关的硬门槛:账号资质。关键在于把「写稿配图」(容易)和「进草稿箱 / 发布」(卡认证)分开看,才不会在最后一步被接口拒掉、白白浪费模型与生图成本。
官方服务端 API 支持"自动写稿 + 自动配图 + 写入草稿箱"。Python 侧 wechatpy 已封装草稿 / 素材 / 正文图全套接口;全链路成品(wewrite / AIWriteX)也已开源。不需要买任何"AI 写作课"。
官方文档:draft/add(新增草稿)公众号 / 服务号都 ✔;freepublish/submit(发布)公众号 仅认证。个人主体订阅号无法微信认证 → 无法用 API 发布。想跑"草稿→发布"全自动,账号必须企业主体 + 已认证。
让 LLM 产出干净 Markdown / JSON 中间稿,把"转微信行内样式 HTML"交给确定性工具(doocs/md、juice)。LLM 不熟微信白名单,手搓 HTML 必然样式失效。生成与排版解耦。
自动化默认止步于"写入草稿箱",发布保留人工确认。既规避发布接口的认证门槛与内容合规风险,也给人留一道把关闸——这也是所有认真项目的共识(human-in-the-loop)。
LLM 用 CO-STAR 框架 + 防注水硬约束产出干净 Markdown → 排版交 doocs/md / juice 内联成微信 HTML → 配图走 AI 出底图 + Pillow 叠中文字 → 正文图换微信图床 URL、封面传永久素材 → 调 draft/add 进草稿箱 → 人工点发布。全程不需要买课。
// LLM 只产出数据,不碰接口、不拼 HTML { "title_candidates": ["标题1", "标题2", …], "selected_title": "…", // ≤32字 "author": "…", // ≤16字 "digest": "…", // ≤128字 "sections": [ {heading, body_md}, … ], "cover_prompt": "…", "inline_image_prompts": [ … ], "fact_claims": [ {claim, source} ], // 供核查 "source_links": [ … ], "risk_flags": [ … ] }
把事实核查、字段裁剪、生图、HTML 渲染、API 调用拆开,任一步失败可单独重试。
走微信开放的服务端接口 media/uploadimg + material/add_material + draft/add。
适合:有认证企业 / 组织号、想稳定自动化的团队。
浏览器插件 / 自动化复用你已登录后台的 cookie,直调 mp 后台内部 Web 接口。
适合:个人订阅号、低频自用、只存草稿后人工确认。不适合商用 / 高频 / 多账号 / 代客发布。
| 接口 | 作用 | 公众号(订阅号) | 服务号 | 认证要求 |
|---|---|---|---|---|
draft/add | 新增草稿 | ✔ 可调 | ✔ 可调 | 文档层面未限"仅认证" |
material/add_material | 上传永久素材(封面) | ✔ 可调 | ✔ 可调 | 无 |
media/uploadimg | 上传正文图 | ✔ 可调 | ✔ 可调 | 无 |
freepublish/submit | 发布 | 仅认证 | ✔ 可调 | 企业主体已认证才放行 |
"本接口在不同账号类型下的可调用情况:公众号 服务号 — 仅认证 ✔。"
"仅认证:表示仅允许企业主体已认证账号调用,未认证或不支持认证的账号无法调用。"
官方"适用范围"表把 draft/add 标 ✔,但微信开放社区有大量实测反馈:未认证 / 个人订阅号调 draft/add 也返回 48001 api unauthorized。
两者不一致 → 以目标账号实际调用返回码为准。有账号就先实调一次定论,别只信文档表格。
cgi-bin/token(GET) / cgi-bin/stable_token(POST)
40164。cgi-bin/media/uploadimg
<img> 必须用它,外链会被过滤。cgi-bin/material/add_material?type=image
media_id。thumb_media_id。cgi-bin/draft/add
articles 数组,返回草稿 media_id。正文插图走 media/uploadimg(换图床 URL,不占配额);封面走 material/add_material(永久素材,拿 media_id 当 thumb)。两者格式 / 大小 / 返回值都不同。正文里任何外链图片都会被微信草稿接口直接过滤掉,且微信端对非微信域名图片有 Referer 防盗链屏蔽。
补充:草稿发布走 freepublish/submit(异步,仅返回任务提交成功,最终结果靠 PUBLISHJOBFINISH 事件回调)——但本方案默认止步草稿,发布交人工。
draft/add 的 articles[] 字段(同页亲核)。在写稿阶段就做约束,别等末端被拒。| 字段 | 必填 | 限制 / 说明 |
|---|---|---|
article_type | 否 | news 图文消息(默认)/ newspic 图片消息(小绿书,最多 20 图) |
title | 是 | 标题,≤32 个字 |
author | 否 | 作者,≤16 个字 |
digest | 否 | 摘要,≤128 个字;仅单图文有,不填默认抓正文前 54 字 |
content | 是 | 正文 HTML,<2 万字符、<1M;去 JS;图片 url 必须来自 uploadimg,外部 url 被过滤 |
content_source_url | 否 | "阅读原文"链接,≤1KB |
thumb_media_id | news 必填 | 封面,必须是永久 MediaID |
need_open_comment / only_fans_can_comment | 否 | 评论开关 / 仅粉丝可评,0 否 1 是 |
pic_crop_235_1 / pic_crop_1_1 | 否 | 封面 2.35:1 / 1:1 裁剪坐标 |
⚠ 官方同句出现"content 大小不可超过 2kb"与"少于 2 万字符 / 小于 1M"自相矛盾——按 2 万字符 / 1M 写为安全上界,别贴近 2kb 边界。常见错误码:40164 IP 白名单 · 48001 接口未授权 · 40007 无效 media_id · 40001 token 无效 · 45009 超日调用上限。
Context 素材是什么 / 写给谁 / 发公众号 Objective 把素材改写成一篇公众号文章 Style 模仿谁 / 什么文风 Tone 正式 / 幽默 / 共情 Audience 目标读者画像 Response 标题+导语+小标题正文+CTA
把"风格 / 语气 / 受众"显式拆开——正是公众号成败的包装层。求快可用更轻的 RTGO(Role/Task/Goal/Objective)。
标题(15-30字、含情绪词) → 3 秒钩子开头 → 小标题正文(每~300字一钩子,移动端每段≤3行)→ PREP / SCQA 论证骨架 → 开放式 CTA 结尾。
800–2000 字"最佳完读"区间,阅读 3–5 分钟。(注:该数字溯源到排版工具营销页,方向可信、别当硬科学)
不要让 LLM 手搓微信 HTML。它不熟微信白名单,易用 class/position/@media 导致样式全失效。让它只出 Markdown。
<style> 标签 / 外部 CSS;class 失效、id 被删除。style,且仅部分属性:font / color / margin / padding / line-height / text-align / border / background-color 等。position、@media、@keyframes、% 单位、float。GitHub 12.9k★ 的微信 Markdown 编辑器。网上多说"用 juice 内联"——方向对、定位不准:
var(--xxx) 解析成实际值。juice@12.1.1 把 CSS 全部 flatten 进 style 属性 → 粘进微信(剥 style/class/id)后样式存活。| 工具 | 形态 | 机制 / 定位 |
|---|---|---|
| doocs/md · 12.9k★ | 在线 / 开源核心包 | Markdown→公众号 HTML,patched juice 内联;在线版 md.openwrite.cn |
| juice(Automattic) | JS 库 | 通用 CSS 内联器,整个赛道的标准底层 |
| mdnice(墨滴) | 在线编辑器 | 多主题、免费图床,兼容公众号 / 知乎 / 掘金 |
| md2wechat-skill · 2.9k★ | Go CLI / AI Skill | 面向 Agent:写作→去AI痕→排版→配图→推草稿,48 主题 |
| 秀米 / 135 / 壹伴 | 可视化编辑器 | 本质同样是行内样式内联,靠拖拽模板而非写 MD |
核心信息(标题 / logo)放中央安全区,避免被缩略图裁掉。正文配图宽 900px(常规)/ 1080px(要清晰)。尺寸来自多个排版工具帮助文档交叉,非单一官方数字文档。
风格一致性:固定 style reference 图 > 复用 seed + 固定构图 > 纯文字风格后缀。
| 模型 / API | 中文字渲染 | 价格(USD/张) | 适合 / 短板 |
|---|---|---|---|
| Nano Banana Pro gemini-3-pro-image | 最强 ~90-97% 可读 | 1K/2K $0.134 | 海报 / 信息图 / 4K;最贵、慢、带 SynthID 水印 |
| Seedream 4.x doubao-seedream-4-* | 国风中文审美,原生双语 | ¥0.2–0.3(个人可调) | 写实 / 国风 / 4K 秒级;长文书法仍出错别字 |
| gpt-image-2 | 短标题基本无错别字,官方不背书 | 1024² $0.053 / 4K ~$0.41 | 文字 + 复杂版式、images.edit 强;密集小字仍瑕疵 |
| FLUX.2 [pro] | 复杂中文明显失败 | from $0.03/MP | 照片级写实、英文 in-image 强;中文弱 |
| SD 3.5 | CJK 乱码 | $0.035–0.065 | 开源自部署 + LoRA 生态;需 GPU |
| Midjourney V8 | 中文弱,需后期叠字 | 订阅 $10–120/月 | 顶级美学;无官方 API = 自动化硬伤 |
第一梯队(中文):Seedream(国内便宜、个人可调)与 Nano Banana Pro(海外最强中文 + 4K),路线不同。中文渲染百分比是第三方评测,非厂商保证值。所有海外模型输出带 SynthID / C2PA 水印。
路线 A(AI 直接出字):2026 年中文从"不可用"到"单张可用",但准确率非 100%、长 / 密文本掉字、重抽会变样——不适合"标题一字不差 + 批量"。
路线 B(推荐):AI 出无字底图,Python/Pillow 叠校对过的中文标题——零乱码、完全可控、可复现批量、零额外费。这也是 OpenAI 官方社区给的工作流。
# 1. 必须显式加载中文字体,否则豆腐块 □□□ font = ImageFont.truetype( "C:/Windows/Fonts/msyh.ttc", 72) # 2. 用 textlength 折行 + anchor='mm' 居中 draw.multiline_text((W/2, H/2), text, font=font, fill="white", anchor="mm", stroke_width=3, stroke_fill="black") # 白字黑边压任何底图
font.getsize() 在 Pillow 10+ 已删除;Linux 部署须装中文字体 + 绝对路径 + fc-list 验证。本工作台已有 poster-toolkit skill 与 gen_cover_poster.py 可复用。
图库替代:Unsplash(必署名 + 写入文章那刻异步回调 download_location)· Pexels(locale=zh-CN 最省事)· Pixabay(唯一零署名,但第三方上传版权风险转嫁使用者)。三家共同红线:禁止做成"在线图库 / 可批量导出"的检索器;含可识别人脸 / 商标的图须人工复核。
| 项 | 值 |
|---|---|
| 正文图(走 API) | jpg/png,<1MB |
| 正文图(网页编辑器) | ≤10MB(2020 起) |
| 封面永久素材 | ≤10M,bmp/png/jpeg/jpg/gif |
| webp | 不可上传 |
| 压缩阈值 | 宽 >1080 微信会二次有损压;自己先压到 1080 |
自动化走 API → 正文图按 <1MB 设硬目标;封面按 10M。产物绝不产 webp。
# 居中裁到 2.35:1 封面(一行,不变形) from PIL import Image, ImageOps cover = ImageOps.fit(im, (900, 383), centering=(.5, .5)) cover.save("cover.jpg", quality=88, optimize=True) # 压到指定 KB:循环降 quality(仅 JPG) # 更优:JPG 用 mozjpeg、PNG 用 pngquant+oxipng
格式选择:照片→JPG,图标 / 文字 / 透明→PNG,动图→GIF,webp 不用于上传。
| 平台 | 进草稿箱 | 门槛 |
|---|---|---|
| Coze 国内版(扣子) | 官方【微信公众号 API】插件:get_access_token→add_material→add_draft | 云托管免操心 IP,最省配置 |
| Dify | Marketplace 原生插件 Create Drafts(选 xwang152-jack,别选 bikeread 那个纯客服) | 插件文档明写"需账号已认证" |
| n8n | 社区节点 / HTTP Request 直调;自带 token 缓存 | 自托管最灵活,要自配 IP 白名单 |
| Make | 原生 Verified 模块 "Create Drafts"(官方维护) | 海外服务,需考虑访问 api.weixin.qq.com 可达性 |
| 项目 | star | 能力 |
|---|---|---|
| wechatpy(Python) | 4292 | draft + material + uploadimg + freepublish 全有,Python 侧最稳底座 |
| werobot(Python) | 4661 | 被动消息框架,无 draft 方法,发草稿不能直接满足 |
| wewrite | 2463 | Claude Code Skill:AI 写正文 + 配图 + 官方 API 进草稿,全链路 |
| AIWriteX | ~1200 | 独立桌面应用:热搜选题→写→配图→可选自动发布;README 诚实标认证门槛 |
| jiji262/wechat-publisher | 102 | 全网搜→深度文→6-10 图→官方 API 进草稿(注意另有同名 JS 停更版) |
| Node.js 库 | — | 无活跃且覆盖新版 draft 的库,相对 Python 的真实短板 |
没有一个对第三方开发者开放"程序化把 HTML 推到任意公众号草稿箱"。壹伴 / 365 是浏览器插件挂后台;135 / 秀米的"开发者接口"方向相反(把编辑器嵌进你的系统 / 把内容 POST 到你的 CMS),不是推进微信草稿箱。唯一真正程序化进草稿箱的是微信官方 draft/add。
Chrome 扩展,读已登录后台 cookie 直调内部 Web API,绕开认证与 IP 白名单,默认只存草稿 + 人工确认。难点:后台编辑器是 iframe 内 UEditor,样式必须内联、图片必须先传素材库。违反自动化条款,限个人低频自用。
有一云AI / 壹伴 / 135 / 快编AI 能"AI 写 + 配图 + 一键进草稿箱",但多数靠浏览器插件挂后台(需人在场),不是服务端无人值守。商业 SaaS 官网几乎都不提认证门槛与 IP 白名单,让人误以为任意个人号都能全自动发布。反而开源项目(AIWriteX)最坦白。
| 你的情况 | 推荐路径 |
|---|---|
| 有认证企业 / 组织号 + 想服务端无人值守 | 官方 API 路线:Coze 国内版插件 / Dify(xwang152-jack) / AIWriteX 自部署,配好 IP 白名单 |
| 在 Claude Code 工作流里、要全链路成品 | wewrite(Skill)或 jiji262/wechat-publisher |
| 自己拼、要最稳的 Python 底座 | wechatpy(draft+material+uploadimg 全有)+ 上层自接 AI 写作 |
| 只有个人订阅号、低频自用、能人工点一下 | Wechatsync(5793★ 插件)——但清楚它违反协议、限个人低频、只存草稿 |
| 想最少配置、不碰代码 | 135 编辑器 / 有一云AI(接受"插件 + 人在场") |
浏览器自动化确定违反《微信软件许可及服务协议》"自动化操作"条款;有群控外挂类司法赔偿判例。低频自用风险低,商用 / 高频 / 多账号显著上升。
大量"学员月入两万"案例被官媒(中新网)查实为伪造 / 盗用截图;几百上千元"AI 写作课"核心是拉人头分销。同等能力已大量开源,无需买课。
事实结论必须带来源、生成后做 claim check。"去 AI 味"被普遍当必备步骤,但有效性无客观验证,归为行业惯例、效果存疑。
含可识别人脸 / 商标 / logo 的图三家图库都要人工复核;微信明确点名生图避开名人 / 知名 IP。
AppSecret / access_token 只在服务端读取,不进前端、不进笔记、不进日志。IP 白名单换服务器记得同步更新。
本地先渲染微信安全 HTML(无 JS、无外链图、无超限样式),字段约束在写稿阶段做,避免末端被接口拒掉浪费成本。
sources/wechat-verify/ 与前序 sources/wechat-auto-draft/,双重留底。方法说明:微信开放文档(developers.weixin.qq.com)对 WebFetch / 普通 curl 持续返回 503(反爬 SPA),须用 Googlebot UA + 绕过本地代理才取到服务端渲染正文——调研时别把 503 误判为"页面不存在"。
本轮调研笔记与官方快照:research/notes/wechat-auto-draft/、research/sources/wechat-verify/。前序工程版报告:outputs/2026-06-20-wechat-auto-draft.html。