一款 Halo 插件:无需离开 Halo 控制台,即可把已写好的文章推送到微信公众号的草稿箱,封面与正文图片会自动转存到微信素材库,同步结果实时显示在文章列表。
- 插件名称:
plugin-wechat-official-sync(微信公众号同步) - 适配版本:Halo
>= 2.26.0 - 许可证:GPL-3.0
- 作者:宏尘极客 · https://www.hcjike.com
- 仓库:https://github.com/hcjike/plugin-wechat-official-sync
功能特性
- 一键同步:文章行的操作菜单中新增「同步到微信公众号」,先在弹窗中预览上传后的排版效果,并核对本次上传的标题、作者、原文链接与留言设置——字段因超过微信长度上限被截断时,会在该字段旁标出「已截断」(悬停可看说明)并在底部给出长度检查结论;确认后即提交同步任务。
- 复制正文兜底:预览弹窗底部提供「复制正文」按钮,把美化后的正文按富文本复制到剪贴板(保留行内样式),用于同步失败的场景——直接粘贴到公众号编辑器即可手动发布,无需重新排版。注意:复制内容中的图片仍是原图地址,微信通常不会自动转存(甚至会被过滤),图片与封面需自行在公众号中上传处理,详见常见问题。
- 提交前预检:点击「同步到微信公众号」时先自动校验微信配置(AppID / AppSecret)、封面图与文章同步状态等「提交前即可发现」的已知问题,有问题直接提示并中止、不进入预览与同步流程(预检只读:不调用微信接口、不写任何记录)。
- 自动创建草稿:调用微信
draft/add接口,把文章标题、作者、摘要、正文写入公众号草稿箱,并把「原文链接(阅读原文)」填为文章在站点上的地址。 - 重复同步更新草稿(可在 微信公众号 → 重复同步更新草稿 中关闭,默认开启):同一篇文章首次同步直接新建草稿;再次同步时先校验上次写入的那份草稿是否还在——在则调用
draft/update更新它(草稿media_id不变),不在则新建。校验草稿时发生任何错误都按「草稿不存在」处理、直接新建,一次校验失败不会打断同步。这样反复同步、修改后重推都不会在草稿箱里堆出一堆重复草稿(草稿被手动删除后也会自动改为新建,无需人工干预)。关闭该开关则不做任何校验,每次同步都新建一份草稿(与旧版本行为一致)。 - 封面处理:将文章封面下载后上传为微信永久图片素材,作为草稿封面(
thumb_media_id)。 - 正文图片转存:解析正文 HTML,把其中的图片逐张转存到微信域名(
media/uploadimg)并替换链接,避免微信过滤外部图片。 - 正文附件链接处理:正文里指向文件的链接(Halo 附件库的
/upload/...、带文件扩展名的下载链接,以及「下载链接」等插件组件在美化阶段转换出的链接)会先按真实字节判定,再决定是否调用微信接口:是微信支持的图片(jpg/png/gif/bmp,webp 自动转码)就转存为微信图片显示;其余(pdf / zip 等非图片、字节与图片不符、下载失败)不上传,直接把链接改为纯文本,避免草稿里留下微信点不开的死链、或把非图片字节交给图片接口换来40005/40113报错——纯文本显示链接地址(默认,正文里写的是什么就显示什么)还是链接内容(链接自身的文字)可在 正文美化 → 附件链接显示 中配置。站内文章路由、无文件扩展名的网页链接不受影响,原样保留。 - 正文排版美化:微信图文会剥离外部 CSS 与
class,只保留行内style。插件在提交草稿前用 jsoup 按标签为标题、段落、引用、代码块、图片、列表、表格等注入微信友好的内联样式,让排版贴合公众号阅读体验(你在编辑器里已设置的行内样式优先保留)。代码块采用微信编辑器原生代码块结构:自带行号(删除代码行时行号自动减少)、内容不折行,行号与代码行严格对应,微信会按代码语言自动高亮;表格对齐微信编辑器插入表格的原生观感:1px 浅灰细边框、表头加粗无底色、单元格内容自动换行,表格宽度模式可配(默认「保持比例」):按文章表格的原始列宽比例渲染,列宽总和超出屏宽时由外层容器横向滚动查看全貌;「宽度铺满」则把列宽按比例压缩进屏宽、表格始终铺满。任务列表(待办清单)重建为 Emoji 图标呈现:微信会剥离<input>复选框,已完成显示✅、未完成显示⬜,列表去掉默认圆点——编辑器输出的待办清单与 markdown 渲染输出的任务列表(如「Markdown 编辑块」的- [ ]/- [x]清单)均已适配;正文中以纯文本残留的 markdown 任务清单也会自动转为图标。列表结构会压紧:<ul>/<ol>/<li>之间的换行与缩进空白(如「Markdown 编辑块」渲染出的<ul>\n<li>…</li>\n</ul>)在浏览器预览里会被折叠,但微信编辑器重建列表结构时会把它当成列表项内容、表现为列表前后多出空的<li>行,故提交草稿前统一清除这类结构空白与视觉为空的列表项。Halo 编辑器的折叠内容(<details>)在微信中无法保留折叠交互,会重建为静态展开的卡片:加粗标题栏(▸标记、底部细分隔线与内容区隔开)+ 内容区,内容照常排版;标题栏与内容区的背景色、边框颜色均可配置(默认浅灰标题栏 + 白色内容区)。分栏卡片与画廊版式可分别配置(各默认「表格」,也可选「独占一行」):Halo 编辑器用display:flex/display:grid排布分栏与画廊,而微信会过滤grid、对flex支持不稳定,直接同步会让各列、各图纵向堆叠、各占一行;「表格」版式下分栏卡片按列宽flex比例换算为单元格百分比宽度,让各列并排;画廊重建为一张整体表格、所有列等宽——所有行合并进同一个表格、不按行拆表,行内图片用列合并(colspan)均分整行,末行不满时也铺满整行;行/列间距折算为单元格内边距。「独占一行」版式则不重建表格:分栏卡片每栏一行、画廊每张图片一行,图片与描述内容照常保留。引用块边框(可开关,默认显示)、引用块背景色、标题边框(可开关)、各级标题颜色、行内代码配色、折叠块配色(标题背景色/内容背景色/边框颜色)、视频/音频卡片配色(背景色/主行/引导语/标记符号)、表格宽度模式、分栏卡片版式、画廊版式均可在插件设置的 正文美化 标签中配置。 - 视频与音频提示卡片:微信图文会过滤
<video>/<audio>标签(草稿接口不支持正文内嵌视频与音频),直接同步会渲染成空白块;插件会把编辑器插入的视频、音频重建为提示卡片——主行为标记 + 加粗标签(▶ 视频/♪ 音频),编辑器中填写的媒体描述随卡片保留,末行为引导语「请点击文末『阅读原文』观看 / 收听」(公众号正文外链不可点击,「阅读原文」是进入原文页播放的唯一可靠入口)。卡片配色(背景色、主行文字、引导语、标记符号)可在 正文美化 标签中随文章风格配置;预览与草稿中呈现的都是这一卡片形态。 - webp 自动转换:微信素材仅支持
bmp/png/jpeg/jpg/gif;插件会把webp等格式自动解码并重编码为png/jpg再上传。 - 异步不阻塞:接口立即返回
202 Accepted,实际同步在后台线程执行,不卡住控制台。 - 任务持久化与重启恢复:同步任务(含待同步的文章输入与状态)持久化为 Halo 自定义模型
WechatSyncTask(保存在 Halo 数据库中,随 Halo 数据备份/迁移一起走);插件或 Halo 服务重启后,未完成的任务会自动恢复执行(按持久化输入重放一遍,执行时读取最新的插件配置),无需手动重新提交。 - 状态可视化:文章列表新增状态列,用颜色编码的微信 Logo 展示每篇文章最近一次同步结果,鼠标悬停查看详细信息。
- MCP 工具(可选):安装并启用 Halo MCP Server 插件后,AI 助手可通过
wechat_sync_preview(获取预览信息)、wechat_sync_submit(提交同步到微信)、wechat_sync_status(查询同步状态)与wechat_cache_cleanup(清理素材缓存)四个 MCP 工具完成预览、同步、结果查询与缓存维护,效果与在 Console 上操作一致,详见MCP 工具。
兼容性说明:正文美化的兼容与测试主要针对 Halo 默认编辑器输出的内容;由其他插件生成的内容(自定义组件、专属区块等)依赖插件自身的样式与脚本渲染,微信无法识别与渲染,因此无法同步到微信。