多平台运营的"隐形工程":从一张图到 4 平台 — 多媒体生成/处理/上传全链路实战
写在前面:别再被"5 分钟发 4 平台"骗了
如果你刚接触多平台运营,大概率被"AI 帮我 5 分钟自动发 4 平台"这种话术忽悠过。我的经验是:那 5 分钟只是文字 + 占位符的跑完时间。真实成本里 50% 在多媒体。

我自己跑了两个月的"主稿 markdown -> zhihu + 小红书 + 公众号 + 博客园"全链路。同样的内容,文字部分确实 5 分钟能跑完,但多媒体——从生成到上传到重试——通常吃掉 30-50 分钟,失败率仍是主要痛点。
这篇文章是《OpenClaw 多平台运营系统的实现架构》(姊妹篇)的血肉篇。架构篇把系统拆成 6 层、14 个交互;这篇只挑最复杂的"内容形态"——图片/视频等多媒体——讲具体怎么过每一个环节。
适合看的人:
- 想搭多平台内容系统的工程师
- 做内容运营想理解"自动化背后到底卡在哪"的人
- 踩过 AI 图片 lazy load / 知乎 inline 上传 race condition / 小红书滑块之类坑的人
不适合:
- 只想看"5 分钟"魔法结论的——回去看上一篇
一、生成:AI image 不是 fire-and-forget
多平台文章通常不是"一篇文章一张图"。一篇深度技术文,经验是:封面 1 + 内文图 3-5 张 + 平台头像/专题图(部分平台需要) = 5-8 张图。
如果用 AI 生成,预算是:生成 8 张 + 期望成功率 80% = 实际跑 10 次。10 次 × 单次 30-60 秒 = 5-10 分钟。这是纯粹生成时间,还没算上重试、看图调整、人工选图。
1.1 模型选择:不是"哪个最强",而是"哪个匹配场景"
我自己一张主稿图库,通常用 2-3 个模型组合:
| 场景 | 倾向模型 | 理由 |
|---|---|---|
| 封面大图、写实风格 | Midjourney / Flux Pro | 美感强、构图稳定 |
| 概念图 / 信息图 / 流程图 | GPT-image-1.5 / 即梦 | 文字渲染好、不乱 |
| 内文插图 / 风格化 | Midjourney + 固定风格提示词 | 视觉一致性强 |
经验法则:
- 美感差的图可以靠 prompt 救;渲染模糊的中文几乎救不回来——选支持中文字渲染的模型(Midjourney v6+ / GPT-image-1.5)
- 同一篇文章如果配图风格不统一,读者会觉得是"AI 凑的"——选 1 个模型 + 固定提示词前缀
- 数字 / 流程图 / 表格类信息,AI 直接生成效果差,用代码画(Mermaid / Graphviz / draw.io)再渲染
1.2 Batch 策略与失败处理
实操经验:批量请求 80% 会失败一些。
OpenClaw agent 处理 AI 图片生成走的就是经典 batch:
并发发 8 张 (asyncio.gather):- 4 个成功 → 接受- 4 个失败 / timeout → 不阻塞,先继续
失败 4 张后:- 单独 retry 一遍(指数退避)- retry 后还有失败 → 降级方案:- 简单提示词换模型重试一次- 还是失败 → 占位图(灰底 + "图片生成失败")占位- 上传阶段这个占位会被跳过
关键:降级方案要提前设计,不能在出问题时再想。我自己栽过一次——周日下午跑 8 张,6 张失败,我只能盯着屏幕手动调 prompt 重试,白白浪费 1 小时。
1.3 占位符:让 draft 阶段图像跟终态无关
我最得意的设计是这个:图片不直接出现在 markdown 里,而是用占位符:
正文里写:
``
``
``
``文件存在 Obsidian vault 的 ./assets/ 目录里。
发布到每个平台时,平台 publisher skill 干的事:1. 解析正文里的 local:xxx 占位符2. 上传对应文件到目标平台(拿到真 URL)3. 把占位符替换成真 URL (zhihu editor 里是 atomic block,cnblogs 里是直接 src,...)
好处:
- markdown 主稿在任何环境都能读(本地 / 草稿 / 公开页)
- 重试时不用重写正文,只重跑上传
- 占位符命名带语义(
cover_v1/inline_arch_001),重排图片顺序不需要改 markdown - AI 生成失败那个占位符可以直接保留为"占位图",不影响发布流程
坏处:
- 第一次写文章时要手动维护
local:这个特殊语法 - 编辑器里看不到预览(直到 publish 阶段才 resolve)
- 需要严格的命名规范,不然
[图片生成失败]全变成[local:1] [local:2] [local:3]
1.4 命名规范
我自己定的规矩:
{位置}_{用途}_{编号}.{扩展}cover_v1.png 封面,第一版
inline_arch_001.png 内文,架构主题,第一张
inline_arch_002.png 内文,架构主题,第二张
inline_table_001.png 内文,表格图
inline_roadmap_001.png 内文,roadmap / 时序图
位置 限定到 cover / inline / profile:
cover:首发封面inline:正文内插图profile:作者头像/平台专题
用途 是简短中文或英文,例如 arch / table / roadmap / ui / concept。
编号 三位 zero-pad(001 不是 1),方便字典排序时跟视觉顺序对齐。
二、处理:让一张图适配 4 个平台
同一张图,放到 4 个平台就是 4 个配置。封面尤其:zhihu 专栏 16:9 大图、小红书 3:4 9 图轮播、公众号 2.35:1、博客园默认 16:9。如果只生成"原图",每个平台打开后都可能被裁/压缩/比例怪。
2.1 一个完整流程

我自己处理流程(伪代码):
def process_image(src_path, target_platform, slot):img = open(src_path)for platform, spec in SPECS.items():variant = img.resize_to_fit(spec) # 按 spec 尺寸调整variant = variant.compress(spec.quality) # 压缩到 spec.max_kbif spec.format == 'webp':variant = variant.convert('webp')out_path = f"./out/{target_platform}_{slot}.{spec.format}"variant.save(out_path)return out_paths # 4 个变体
最关键的两列:
- 失败率:任何想搭"自动化"的人都要先明白,小红书的反爬门槛永远在涨——这是我目前 4 平台里唯一不能完全无人值守的
- 动图:公众号不支持 GIF,但小红书官方支持。同一张图在 4 平台是 3 个变体(公众号要转 JPG、压缩)
2.3 处理时机:前端处理 vs 后端处理
两种策略,选错会浪费 5 倍时间:
A. 前端处理(原图就生成 4 份变体)
- 好处:上传阶段只管"上传",逻辑单一
- 坏处:同一时间吃 4 倍存储;AI 生成时不知道平台需求可能出图(789 vs 666 KB)
B. 后端处理(原图上传,平台压缩)
- 好处:节省磁盘,平台自己压缩
- 坏处:压缩算法不可控;超大图先吃网络
我的选择:A(前端处理),原因:
- 压缩算法可控 —— 微信公众号 / 知乎封面压缩算法偏激,自己控制比交给它强
- 失败重试快 —— 上传失败时不用再处理图,只重传
- 后端的"不可控压缩"经常让图片重新变模糊,我栽过 3 次
但有一个坑:如果你把"AI 生成"和"平台处理"耦合到一起,每次平台升级(知乎改上限到 3 MB)都得重跑 AI。要解耦——AI 只产出原图,处理是独立 pipeline。
2.4 动图:一个被低估的复杂
动图(GIF、WebP)在多平台上是4 个独立生态:
- 知乎专栏:不支持。上传 GIF 会被转换为静态图(且很可能不转换,直接显示为播放图标)
- 小红书:支持 GIF,但上传后会强制改帧率(实测从 30fps 降到 15fps)
- 公众号:不支持(需要转视频 MP4 才能动)
- 博客园:取决于主题,多数支持 WebP,部分支持 GIF
多平台支持 GIF 的成本:
- 给小红书:原图(< 5 MB)
- 给博客园:同原图(或转 WebP 缩小 20%)
- 给知乎:静态封面 + 内文说明"原图为 GIF,见博客园版"
- 给公众号:方案 1:转 MP4 (麻烦) / 方案 2:截一帧静态图(取舍)
取舍:我自己的策略是少用 GIF。一篇 8000 字文章,通常 0-1 张动图(选最关键的)。把节省的精力花在静态图的细节上。
三、上传:每个平台的"固执细节"
讲处理完后,上传说起来很简单——每张图传到对应平台拿回 URL 替换占位符。但实际 4 个平台的"固执"会教你做人。
3.1 知乎专栏:Draft.js 的 inline race condition
最坑的平台。
知乎专栏编辑器是 Draft.js,图片上传走 atomic block。流程:
- 选中文字位置
- 点"插入图片"
- 浏览器弹出文件选择
- JS 触发
inputchange 事件 - Playwright
set_input_files喂文件 - 等待上传完成(出现真 URL)
- Draft.js 在当前位置插入 atomic block
但多图时有 race condition:
- 上传 3 张图,并发发 3 个
set_input_files - Draft.js 的状态可能被 race,导致只插入 1 张
- 第二次插入时,前几张图被覆盖
解决方案:
- 串行:一次只传 1 张,等 DOM 出现 atomic block 后再传下一张
- 降级:用
resetWithValue一次性 bulk inject(但还是有 race,见 7-3 教训) - 最终方案:
save_draft后到/edit页面verify 图数 = 预期,不等不等
我前几周栽的一个坑是:4 张 inline 3 张 race 丢图,preview 截图全是空容器。重写脚本串行 + verify 才稳。
知乎还有另一个坑:/preview 页 lazy load,full_page screenshot viewport 外的图全是占位。preview force-load imgs await Promise.all(imgs.map(i => i.decode())) 之后才截图。
3.2 小红书:反爬第一线
小红书对自动化是4 个平台里最严格的。
我目前的状态:
- 文本发布:基本通自动化
- 图片发布:手动滑块 + 9 图轮播确认
- 视频发布:接近完全手动
具体卡点:
- 登录态:CDP 接 BrowserOS 已经登录的 cookie,但时不时被踢(滑动验证码)
- 9 图轮播顺序:上传顺序会被算法打乱,有的图 swap 前后顺序
- 发布时间戳:凌晨发布会被压低流量(平台规则),但 agent 不知道当前时间
当前方案:
- 上传走 API(部分稳定)
- 触发滑块时主动 escalate 到人工 — 飞书/Slack 通知你"需要手动滑块一下"
- 不要做"自动滑块绕过",会被封号(我栽过一次,封了 7 天)
3.3 公众号:form-encoded upload + 原创声明
微信公众号"图片"上传走的不是直观路径,而是 /cgi-bin/upload 这个老牌 form-encoded API。
坑点:
access_token2 小时过期,需要 refresh token 自动续- 图片上传返回的
url只能用在图文里,不能外链(这是公众号的"反盗链"机制) - "原创声明"是另一个 API call,需要先声明才能在图文里标"原创"
- "留言"开关也是独立 API
我自己跑的发布流程:
1. upload_image(本地路径) -> {url: "http://mmbiz..."}
2. create_draft(标题+正文+正文含 url)
3. apply_friendly_statement(原创声明)
4. (人工) review + 点群发
第 4 步永远人工。公众号发出去就不能删(测试号除外),所以这一步的红线再小心也不为过。
3.4 博客园:最简
博客园是这 4 个平台里对自动化最友好的——因为它 markdown 直接 src paste。
正文:

↓
cnblogs_save_draft.py 把正文 + frontmatter 灌进博客园编辑器
↓ (博客园直接渲染 markdown 链接)
↓
公开页:图片直接显示,无 lazy load 烦恼
唯一坑:
- 推荐(博客园的"上首页"):0 自动加,要文章火了才有
- slug:中文标题 fallback
untitled会卡保存,需要 ASCII slug 手动传 - "草稿"状态:博客园公开草稿前是真没人能看——这是好事,发布前不会有人碰瓷
四、失败:90% 自动化,10% 人工
跑过自动化发布的人都有一个共识:失败必然发生,问题只是频率和影响。

4.1 重试策略
我自己的重试 ladder(按失败次数升级):
第 1 次失败:- 直接 retry (1s 后)第 2 次失败:- 指数退避 retry (2s, 4s)第 3 次失败:- 换浏览器 context 重试(避免 cookie / CSP 状态污染)- 不同网络出口(代理切换,某些平台按 IP 风控)第 4 次失败:- 降级方案:动图 -> 静图(上一帧)视频 -> 截图(关键秒)超大图 -> 降低质量重试高分辨率图 -> 缩小一倍重试第 5 次失败:- 人工 escalation:Slack / 飞书通知: "图 xxx 上传 zhihu 第 5 次失败, 请人工 review"dashboard 标记: failed_uploads.jsonSTOP-AT-DRAFT: 暂停整个发布流程,等人工介入
关键:降级方案要可逆——人工介入时,降级的图要"标记"而不是"替换"。原文里保留占位符 local:xxx_failed,draf 时显示失败标记,人工 cover 后再发布,不会出现"覆盖了不知道原文是什么"。
4.2 Fallback 决策树
最常见的两个 fallback 决策:
A. 动图 vs 静图
- 平台支持动图? -> 用动图
- 平台不支持? -> 静图(说明文字 "原图为 GIF, 见博客园版")
- 都不行? -> 文字描述 + emoji 占位
B. 大图压缩失败
- 压缩一次失败? -> 试不同压缩算法 (Pillow -> ImageMagick)
- 都失败? -> 降分辨率(原图 4K -> 1K)
- 还失败? -> fallback 占位图(灰底 + "图片加载失败")
决策树实现不是 hardcode——必须数据驱动。每个 fallback 决策前记日志(为什么降级、是哪个条件触发),后面用这些日志调优规则。
4.3 人工 escalation 设计
90% 自动化跑得稳了之后,剩 10% 的失败谁来管?
错误的做法:
- 失败后静默 retry → 让失败堆积 → 发布了一篇内容丢失严重的文章
- 直接发邮件/IM 让所有人处理 → 噪音爆炸,真的紧急信号被淹没
正确的做法:
- 一个专门的 escalation dashboard(哪怕本地 markdown):
failed_uploads.md当前失败列表,带 ID / 平台 / 时间escalations.md已经等人工的列表,按严重程度排
- IM 通知按严重程度分流:
- P0:整篇发布卡住,影响主流程 — → Slack / 飞书 @oncall
- P1:单图失败,可降级 — → 飞书 group(异步)
- P2:动图降静图,小问题 — → 静默写日志
我自己的 dashboard 是 ~/.openclaw/workspace/tmp/escalations.md,每次发完写一条;月底 review 这个文件能找出哪些平台有"反复小问题"。
4.4 实战教训(7 个真踩过的)
这一节是我跑过 2 个月踩过的 7 个坑,每个都是血泪:
page.evaluate返回值要await,不要return— Playwright 异步 API 的常见错误,会导致 race- CDP 端口:我之前写 9100 卡了 1 小时,真实端口是 9103(没有 9201)
- 知乎
evaluate('window.scrollTo...')不触发 IntersectionObserver——必须page.mouse.wheel - 微信公众号图片不能外链——做"跨平台图片同步"时要各自上传一次,不能一处上传他处引用
- 博客园 slug 用中文 fallback =
untitled导致保存失败——手动传 ASCII slug - 小红书发完一次就有 IP 风控风险——批量发布要间隔 5 分钟以上
- AI image 4K 输出博客园 2MB 上限——必须自己压缩,不能交给平台
4.5 大故障复盘怎么做
一个发布失败的复盘模板:
[时间] 2026-07-03 16:32
[平台] 知乎专栏
[内容] 体验篇 v2.11 (ID: 2056405380863878373)
[症状] inline 4 张图,上传后只剩 1 张
[根因] Draft.js 多图 race condition, 3 张并发 set_input_files 时 race
[损失] 文章已发布, 但有 3 张图裂图
[修复] 串行上传 + verify (v2.10 fix)
[预防] 任何多图场景默认串行 + verify
没有这个模板就别做自动化。否则你最后会得到一堆"为什么我的文章裂图了,不知道为什么"。
写在后面:视频是 10x 复杂度
这篇文章从头到尾没谈视频。是刻意的——视频的多平台运营难度是图片的 10x,独立写一篇才能讲清楚。
只勾几个主要坑:
- 转码:小红书要 MP4、知乎要 H.264、公众号要 H.265——3 个平台就是 3 套编码参数
- 时长审核:抖音 / 小红书 / 视频号对时长限制不一样(60s / 5min / 不限)
- 字幕:小红书强制字幕,其他平台可选
- CDN:每个平台上传后 URL 都是平台私域,跨平台引用会失效
- 审核:视频审核比图文慢 10-100 倍,经常要等 1-2 小时
我自己目前的视频发布路径:完全手动。agent 只能负责"剪片子"之前的工作 + 审核后归档。
如果这篇文章反响好,下一篇就讲视频。
写在最后:为什么这事值得做
写到这里我数了一下:这篇文章覆盖了 4 段(生成/处理/上传/失败)、3 张图、12 个实战坑点。写完用了 2 个小时(其中一半时间在画图)。
那"5 分钟发 4 平台"是不是谎言?
不是。如果只发文字,5 分钟真能做到。但如果你一篇深度文章有 5-8 张图、还要动图、还要覆盖 4 个平台所有格式——60-90 分钟是真实成本。把这 60-90 分钟自动化,你才有时间写下一篇。
这就是我搭 OpenClaw 多平台系统的全部理由。
下次"5 分钟发 4 平台",你心里清楚:是 5 分钟文字 + 55 分钟多媒体。
(全文约 7500 字。架构篇链接:zhuanlan.zhihu.com/p/2058255641014187608 / cnblogs.com/michaelleelll/p/21262272)
写在草稿里的 (STOP-AT-DRAFT, 等大狗子 review)
- 状态: 草稿 (STOP-AT-DRAFT, 等人工 review)
- 适用版本: 2026-07 / OpenClaw v2.13 架构篇后续
- 作者: shenkang · 公众号/博客园: michaelleelll
- 阅读时长: 约 18 分钟
- 配套工具: ~/.openclaw/workspace/skills/publish-zhihu/ (zhihu) + publish-cnblogs/ (cnblogs)
