一句话进来,一篇能直接发公众号的稿子出去。
打开链接 → 写两句想讲什么 → 选标题 → 改大纲 → 拿成稿 → 点「复制到公众号」→ 在微信编辑器里 ⌘V。
线上地址: https://wechat-studio-57144.app.workbuddy.host/?sharecode=LOMYO4IMBO
写公众号的真实痛苦不是「不会写」,而是三件小事叠在一起:
- 空页面焦虑:知道要写,但不知道从哪个角度切入,标题也想不出来;
- 结构塌陷:写着写着变成流水账,读者在第二屏就划走了;
- 排版返工:正文写完还要在微信编辑器里一段段调样式,复制粘贴带不过去格式。
稿台把这三件事拆成一条流水线:选题 → 标题 → 大纲 → 正文 → 排版,每一步都能改、能重来、能只改一小段。
输入:主题/素材 + 风格 + 读者 + 篇幅 + 必提要点
↓ ① 选题与标题 (一次调用 → JSON:切入角度 / 5 个标题 / 摘要 / 封面文案)
↓ ② 大纲 (可编辑,带每节字数预算)
↓ ③ 正文 (流式输出,边写边渲染成公众号版式)
↓ ④ 排版与发布 (4 套主题 / 中英间距 / 一键复制富文本 / 导出 md、html)
↺ 助手随时介入 (整篇改:更口语、加钩子、压缩 30%、补案例、换小标题;发前体检)
| 能力 | 做法 |
|---|---|
| 样式真的能粘进公众号 | 公众号编辑器会丢掉 <style> 和 class 规则,所以渲染器把每条样式都写成 inline style,并且不用 flex/grid、不用伪元素,只用最保守的标签结构 |
| 手机阅读节奏 | 提示词里把「一段 2–4 行」「小标题 3–5 个」「开头两句话内出现具体场景」写成硬约束,不是靠模型自觉 |
| 改稿不怕改坏 | 任何一次改写都返回整篇正文、整体替换,并保留上一版,一键撤销 |
| 生成过程可见 | 正文流式输出,每 140ms 重渲染一次排版预览,写到哪里看到哪里 |
| 可量化的体检 | 本地体检(字数、阅读时长、长段落、风险用词)+ AI 体检(钩子 / 清晰 / 信息密度 / 手机阅读 / 可信度 五维打分 + 三条具体改法) |
| 层 | 选择 | 理由 |
|---|---|---|
| 前端 | 原生 HTML + CSS + ES5 语法的 JS,无构建步骤 | 一个 index.html 就能跑,加载 < 1s;不需要 Node 环境也能本地打开 |
| AI | WorkBuddy 云服务 LLM API(免密钥,服务端持有供应商密钥) | 密钥不进前端;模型列表运行时拉取,可切换 |
| 排版引擎 | 自研 assets/renderer.js(346 行) |
公众号只认 inline style,现成的 Markdown 库全都输出 class |
| 存储 | localStorage(草稿箱,最多 12 篇) |
不需要登录就能用,符合「打开就能体验」 |
没有 API Key 硬编码在前端:前端只有 publishableKey(只标识应用、本身无权限,服务端会校验来源域名)。
wechat-studio/
├── index.html 单页应用骨架(三栏:输入 / 工作台 / 助手) 314 行
├── assets/
│ ├── app.css 设计系统与响应式布局 779 行
│ ├── config.js 云服务公开配置
│ ├── wbcloud.sdk.js 自托管的云 SDK(避免 CDN 抖动影响首屏)
│ ├── ai.js LLM 调用层:模型列表 / 流式 / JSON / 错误翻译 200 行
│ ├── prompts.js 五组提示词(选题、大纲、正文、改稿、体检) 170 行
│ ├── renderer.js Markdown → 公众号行内样式 HTML + 体检 346 行
│ ├── sample.js 示例稿(不调模型也能看排版效果)
│ └── app.js 状态机与业务流程 863 行
├── tests/
│ ├── renderer.test.cjs 15 项渲染引擎自测
│ ├── ai.test.cjs 10 项 AI 层自测(错误归类 / JSON 容错 / 重试判定)
│ └── llm.smoke.cjs 线上链路冒烟(需联网)
├── AI_LOG.md 开发过程与 8 类失败记录
├── ATTRIBUTION.md 借鉴来源与自研边界
└── LICENSE MIT
# 方式一:直接开(只测界面与排版)
open index.html
# 方式二:起个静态服务(推荐,云服务 Origin 校验需要 http(s))
python3 -m http.server 8080
# 打开 http://localhost:8080注意:本地
localhost不在云服务白名单域名内,模型调用会返回 403;界面、排版、导出、草稿箱都能正常用。要测完整 AI 流程,请用线上链接。
node tests/renderer.test.cjs # 15 项通过,全绿
node tests/ai.test.cjs # 10 项通过,全绿零测试框架依赖,node 直接跑。
- 渲染层 15 项:行内样式完整性、代码块换行保留、标题层级、引用/列表/表格/分隔线、Callout、中英间距(含全角标点不插空)、关闭间距、HTML 注入转义、四套主题、字数统计、风险词、长段落识别。
- AI 层 10 项:错误归类(403 带 origin 才归因域名、纯 403/429 归因限流)、JSON 容错解析、可重试判定、失败文案不误导。
- 公众号会过滤外部链接,正文里的
<a>粘过去会变成不可点文字,建议改成「搜索公众号 xxx」这类说明; - 复制富文本依赖
Clipboard API,Safari 需要在用户手势内触发(本项目就是点击触发);不支持时自动退回到选中节点execCommand('copy'); - 草稿存在浏览器本地,换设备不同步;
- 正文生成质量受所选模型影响,切换模型会明显不同。
MIT(见 LICENSE)。提示词与排版引擎欢迎拿去改成自己的工具。
开发过程:AI_LOG.md(10 轮迭代,含 8 类真实失败与修复)| 借鉴来源:ATTRIBUTION.md