用 MiniMax 生图给公众号做每日封面:一条全自动管线的实战复盘
用 MiniMax 生图给公众号做每日封面:一条全自动管线的实战复盘
我们的公众号「码农早餐」每天早上 8 点推送一期技术圈日报。内容早就全自动了,但封面一直是短板:要么运营手动找图,要么用 SVG 模板生成一张信息卡片——工整,但太素,在订阅列表里毫无点击欲。
这周我们把封面也自动化了:MiniMax 生图出底图,程序合成标题文字,全程零人工。这篇文章复盘整条管线的设计与踩坑,三版真实产出图都贴在下面——不是概念稿,是同一天、同一条头条新闻跑出来的东西。
一、先想清楚:AI 生图的两个死穴
动手前先做减法。「让 AI 直接出一张带标题的封面」这条最短路径,有两个绕不过去的死穴:
死穴一:AI 画中文必乱码。 这不是调 prompt 能解决的问题,是当前文生图模型的通病。封面的核心信息恰恰是中文标题——标题糊了,封面就废了。
死穴二:比例对不上。 微信公众号头条大图封面要求 2.35:1(这是很多人不知道的冷知识,传 16:9 会被裁),而 MiniMax image-01 支持的最宽比例是 21:9,约 2.33:1。
对策也就顺理成章了,一句话概括:AI 只负责氛围,程序负责信息。
MiniMax 出 21:9 营销风底图(prompt 里明令禁止出现文字)
↓
sharp 居中裁切到精确 2.35:1(940×400)
↓
SVG 文字层合成:压暗渐变 + 品牌徽章 + 标题大字
↓
上传腾讯云 COS → Playwright 自动灌进公众号草稿
标题是 SVG 画的,所以永远锐利、永远不会乱码,还能每天自动跟随当日头条变化。
二、第一版翻车:一个形容词把主体挤出了画面
第一版底图 prompt 我们写了 generous negative space(大量留白)——做过设计的人都懂,留白显高级。结果:

主体整个被挤到一侧,剩下 60% 的画面是纯色空白。在方图上「留白」是构图,在 21:9 宽幅上「留白」就是灾难——模型会把 negative space 理解成「把东西堆到一边去」。
更要命的是一个微信特性:公众号分享到会话时,缩略图是从封面中央裁 1:1 方图。按上面这张图,用户在聊天窗口里看到的将是一片纯色橙——主体被整个裁掉。
修法很简单,prompt 里把留白类措辞全删,换成明确的构图指令:
main subject centered in the middle of the frame,
symmetric balanced composition filling the full width
一次生效:

三、第二版还不够:好看,但不「营销」
第二版构图没问题了,但放进订阅列表一看还是差口气:小清新插画风,没有标题,用户扫一眼根本不知道今天讲什么。封面的本职是卖点击,不是当装饰画。
最终版做了两件事。
底图换成营销风。 prompt 从「奶油色扁平插画」改成「暗色科技海报」:深色底、橙色光效、戏剧性打光,同时明确要求 main visual subject placed on the right half, left half darker and clean——给左侧的文字区让位。
文字层堆上去。 一张 940×400 的透明 SVG,从左到右一层渐变压暗(scrim),再放品牌徽章、日期、当日头条标题大字、底部 slogan。就算某天底图跑偏,scrim 也能保证标题的对比度——可读性不赌 AI 的发挥。

三张图放在一起看,这就是同一条管线三天内的进化:插画 → 居中 → 营销。而代码里改动的核心只有两处:一个 prompt 常量,一个 SVG 模板函数。
四、文字层的排版细节,比想象中多
「往图上写字」听起来简单,实际排版规则一条都不能少:
- 英文单词不能腰斩。 第一版折行按字符中点硬切,把 "Claude" 切成了 "Clau / de"。修法是先 token 化:ASCII 单词是不可拆分的整体,CJK 逐字,折行只发生在 token 边界。
- 视觉宽度要加权。 英文字符约半个汉字宽,
"OpenAI 发布 GPT-5.6"按字符数算 17 个字,按视觉宽算只有约 12 个汉字位。字号自适应必须按视觉宽算,否则英文多的标题会显得字小得可怜。 - 行首标点上提。 折行后第二行如果以逗号、句号开头(排版禁则),把标点上提到第一行行尾。
- 两行封顶。 超长标题截断加省略号,绝不挤第三行。
另一个本地开发的小坑:SVG 里的 emoji(我们徽章里原本有个 ☕)经 librsvg 渲染会变成纯色剪影。别修它,直接不用 emoji。
五、工程护栏:生图挂了怎么办
这条管线每天由 cron 无人值守地跑,任何一环都不能成为单点故障:
- MiniMax 的业务错误藏在 HTTP 200 里。 限流(1002)、鉴权失败(1004)、余额不足(1008)、内容安全拦截(1026)全都返回 200,错误码在
base_resp.status_code里——只判 HTTP 状态码等于没做错误处理。 - 只有限流值得重试。 1002 走 2s/5s 退避;鉴权、余额、敏感内容重试一万次也是那个结果,直接抛。
- 生图失败不断管线。 任何异常都回落到旧的 SVG 模板封面。封面素一天可以接受,日报断更不可以。
六、附赠发现:公众号编辑器会自动转存外链图
把封面塞进公众号草稿时还有个意外收获。都说「公众号图片必须用微信素材库 URL」,我们原本以为要逆向素材库上传接口——实测发现根本不用:
往编辑器里粘贴含外链 <img> 的 HTML,微信前端会自动把图转存到自己的 CDN(实测约 4 秒一张,先落 mmbiz.qlogo.cn 过渡,保存后固化为 mmbiz.qpic.cn 永久地址)。
唯一的坑:转存没完成就点「保存为草稿」会丢图。所以自动化脚本里要轮询正文里所有 <img> 的 src,全部变成微信域名后再保存。
收尾
复盘下来,这条管线里真正值钱的经验就三条:
- 分层,别让 AI 干它不擅长的事。 氛围交给生图,信息交给程序。中文标题、品牌元素、日期这些「必须精确」的东西,一个都不要交给模型。
- 宽幅生图的 prompt 要写构图指令。 「留白」这类审美词在 21:9 上会被模型放大成半屏空白;「主体居中、铺满全宽」这类工程词才稳定。
- 无人值守的管线,每一环都要有回落。 AI 接口天生不可靠,靠退避重试 + 降级方案兜底,而不是祈祷。
现在每天早上,从「今天的头条是什么」到「一张带标题的营销风封面躺在公众号草稿箱里」,中间没有任何人工步骤。这大概就是 AI 时代内容运营该有的样子:人定风格,机器执行。