一行命令,Markdown 发布到全网。
将排版好的 Markdown 文章一键发布到微信公众号、头条号、知乎、掘金、CSDN 等平台,无需手动复制粘贴。支持浏览器自动登录获取 Cookie,4 套精排渲染主题(按平台自动匹配),是内容创作者的效率神器。
| 特性 | 说明 |
|---|---|
| 多平台支持 | 微信公众号、头条号、知乎、掘金、CSDN、小红书、企鹅号、微博、B站(9 个适配器,2 个已实测) |
| 浏览器自动登录 | Playwright 驱动扫码/账号登录,Cookie 自动获取保存 |
| 4 套精排主题 | default(通用)、wechat(公众号)、modern(技术/知乎)、minimal(轻阅读/头条),均按平台自动匹配 |
| 自动封面图生成 | AI 根据标题生成封面图,自动上传到微信 CDN |
| Markdown 直发 | front-matter 元数据、代码高亮、LaTeX 公式 |
| CI/CD 友好 | 纯命令行无需浏览器,配置文件统一管理 |
| 草稿箱发布 | 微信公众号 → 草稿箱,其他平台 → 各自草稿箱 |
| 全流程运营命令 | doctor 体检三平台凭据(真实请求探测)、list drafts/fans 回读状态、publish-draft 发表已有草稿;成功判定一律靠可回查的证据 |
| 诚实契约 | 命令输出 {ok, data} / {ok, false, error{code,message,hint}},失败非零退出码 |
# 推荐:一键安装(Node.js ≥ 18)
npm install -g multi-publisher
# 验证安装
mpub --versionNode.js ≥ 18 required.
本工具已制作为 Claude Code Skill,可让 AI 直接帮你发布文章:
# 在任意 Claude Code 对话中,直接描述你的需求:
# "帮我把这篇 article.md 发布到微信公众号"
# "用 wechat 主题渲染预览一下"
# AI 会调用 mpub 完成操作查看支持的所有命令:mpub --help
配合 AI 使用:安装本工具后,在 Claude Code 中直接说"帮我发布文章到微信公众号",AI 会调用
mpub自动完成。
方式一:浏览器自动登录(推荐)
# 登录知乎
mpub login -p zhihu
# 登录掘金
mpub login -p juejin
# 登录小红书
mpub login -p xiaohongshu
# 查看所有支持平台
mpub login --help方式二:手动 Cookie 配置
# 交互式输入 Cookie
mpub cookie --platform zhihu --set
# 检查 Cookie 状态
mpub cookie --platform zhihu --check# 发布到微信公众号(默认)
mpub publish -f article.md
# 发布到知乎草稿
mpub publish -f article.md -p zhihu
# 一键发布到所有已登录平台
mpub publish-all -f article.md
# 渲染预览(不发布)
mpub render -f article.md
# 指定主题渲染
mpub render -f article.md -t wechat
# 自动封面图(文章无封面时 AI 生成)
mpub publish -f article.md -p weixin --auto-cover
# 指定封面图
mpub publish -f article.md -p weixin -c cover.jpg面向"每天要发、要回盘"的用法。这些命令只读、或只做可回退的动作。
# 1) 体检:凭据存在 ≠ 凭据可用(头条 cookie、公众号 token 都可能已过期)
mpub doctor # 人读表格;加 --json 输出 {ok,data}
mpub doctor -p toutiao # 只查某个平台
# 2) 回读:草稿 / 粉丝(只读 API,不开浏览器)
mpub list drafts -p toutiao -n 20
mpub list drafts -p weixin
mpub list fans -p toutiao
mpub list fans -p weixin --backend # 公众号粉丝数只能从后台读(见下)
# 3) 发表已有草稿(不重新渲染;发表后回查草稿箱确认这篇消失)
mpub publish-draft -p toutiao -t "标题前 10 个字就够"
mpub publish -f a.md -p toutiao --publish-now # 新稿:先存草稿再发表
mpub publish -f a.md -p toutiao --no-first-claim # 内容先在别的平台发过 ⇒ 不声明首发
# 4) 小红书(走本地 xiaohongshu-mcp,mpub 当客户端)
mpub xhs status
mpub xhs tools
mpub xhs call get_my_profile --args '{"tab":"note"}'
mpub xhs publish --title "标题" --body-file a.txt -i 1.png -i 2.png --yes
# ⇒ 发完自动回查我的主页;笔记不可撤销,务必 --yes
# 5) 每天一条命令:读排期 → 拉三平台数字 → 回填 metrics.csv → 报异常
mpub daily --plan growth/schedule.json --metrics growth/metrics.csv
mpub metrics # 三平台一张表(粉丝/草稿/笔记数)微信公众号(个人未认证订阅号)
| 能力 | 接口 | 结果 |
|---|---|---|
| 草稿增删改查 | draft/add draft/get draft/update draft/delete draft/count |
✅ |
| 素材 | material/* |
✅ |
| 发表 | freepublish/submit message/mass/send message/mass/sendall |
❌ 48001 |
| 粉丝数 | user/info |
❌ 48001 |
⇒ 个人未认证订阅号在接口层就没有"发表"这个能力(所有个人订阅号都是在后台点群发)。
mpub publish-weixin --backend 的作用是帮你定位到那一篇的编辑页并给出直达链接,
最后一步必须人点「发表」并按弹出的「微信验证」用管理员微信扫码——这一步是微信的设计,不是自动化能绕过的。
粉丝数改从后台读:mpub list fans -p weixin --backend(先 mpub login -p weixin 扫码一次)。
判定原则(与 OpenCLI 对齐):"我点了按钮"不算成功。头条以服务端回执 code=0 为准,
公众号以 draft/get 回查为准,发表成功以"这篇从草稿箱消失"为准。
| 平台 | 登录命令 | Cookie 获取 | 草稿发布 | 状态 |
|---|---|---|---|---|
| 微信公众号 | mpub credential --set |
✅ | ✅ | ✅ 已实测(AppID + AppSecret) |
| 头条号 | mpub login -p toutiao |
✅ | ✅ | ✅ 已实测(2026-08-15,含封面/正文图) |
| 知乎 | mpub login -p zhihu |
✅ | 🔄 | 🔄 适配器就绪,待实测 |
| 掘金 | mpub login -p juejin |
✅ | 🔄 | 🔄 适配器就绪,待实测 |
| CSDN | mpub login -p csdn |
✅ | 🔄 | 🔄 适配器就绪,待实测 |
| 小红书 | mpub login -p xiaohongshu |
✅ | 🔄 | 🔄 适配器就绪,待实测 |
| 企鹅号 | mpub login -p qq |
✅ | 🔄 | 🔄 适配器就绪,待实测 |
| 微博 | mpub login -p weibo |
✅ | 🔄 | 🔄 适配器就绪,待实测 |
| B站 | mpub login -p bilibili |
✅ | 🔄 | 🔄 适配器就绪,待实测 |
- ✅ 已实测:作者真实环境验证可用
- 🔄 适配器就绪:代码已实现,尚未在真实环境验证
# 查看所有支持平台
mpub platformsmpub 内置 4 套浅色阅读主题,均针对公众号 / 知乎 / 头条等白底平台的真实排版规范做了优化:
| 主题 | 风格 | 适配平台 |
|---|---|---|
default |
通用简洁,绿调标题/引用 | 兜底,所有平台可用 |
wechat |
琥珀编辑风(Tufte 灵感):重点琥珀高亮、金句引用块、卡片容器 | 微信公众号 |
modern |
深色代码块、清晰层次(知乎/网页友好) | 知乎、技术博客 |
minimal |
极简留白、轻装饰 | 头条号等轻阅读平台 |
平台自动匹配:未用 -t 指定主题时,发布按平台自动选默认主题——
微信 → wechat,知乎 → modern,头条 → minimal,其余回退 default。
(手动 -t 仍可覆盖。)
完整预览:themes/all-themes-preview.html(含卡片容器示例,重新生成:npx tsx scripts/generate-all-themes-preview.ts)
正文可用卡片容器突出重点——tip(重点,琥珀)、warning(警示,红)、note(说明,灰),标题可选,内部支持完整 Markdown:
:::tip 先记住结论
项目放对地方:warm build **2.63s**。
:::
:::warning 验证纪律
黑洞连接也能完成 TCP 握手——验证必须看真实业务效果。
:::
:::note 适合谁
纯轻编辑型 → Windows 原生也可。
:::命令行预览:
mpub render -f article.md -t wechat
mpub render -f article.md -t modern
mpub render -f article.md -t minimal全部 4 主题: default、wechat、modern、minimal
# 不指定主题:发布到微信自动用 wechat,知乎自动用 modern
mpub publish -f article.md -p weixin
mpub publish -f article.md -p zhihu
# 渲染时手动指定主题
mpub render -f article.md -t wechat
# 发布时手动覆盖主题
mpub publish -f article.md -t modern -p zhihu# 使用自定义 CSS 文件
mpub render -f article.md --custom-theme ./my-theme.css/* my-theme.css 示例 */
body { font-family: 'PingFang SC', sans-serif; }
h1 { color: #1a1a1a; font-size: 1.5em; }
pre { background: #f6f8fa; border-radius: 6px; }重要:front-matter 是必需的!缺少 front-matter 会导致标题显示为"无标题"。
---
title: 文章标题 # 必填,用于公众号标题
author: 作者名 # 必填
description: 文章描述(可选) # 用于公众号摘要
cover: https://example.com/cover.jpg # 可选,有 --auto-cover 可省略
source_url: https://original.url # 原文链接(可选)
tags: [技术, 前端, JavaScript] # 标签(可选)
xhs: # 小红书专用块(可选,见下)
title: 20 字内的短标题
body: 小红书正文(短文案)
tags: [AI, 副业]
---
正文内容...小红书的笔记是"图集 + 短标题 + 短正文 + 标签",不吃长文排版;而且发出去不能删除。 所以小红书在 mpub 里走图文分支,完全绕开 Markdown→HTML 渲染:
# 1) 出包(长文 → 图文包)
mpub xhs-package -f article.md -i cover.png -i 2.png -i 3.png
# 2) 发(默认不真发:只体检 + 预览)
mpub publish -p xiaohongshu --package dist/xhs/<slug> --via-script ./my-publish.sh
# 3) 真发布(小红书不可撤销,需要显式确认)
mpub publish -p xiaohongshu --package dist/xhs/<slug> --via-script ./my-publish.sh --publish-now--via-script <path>:把投递交给带闸门的脚本(查重 / AI 腔检查 / 发布后回查),mpub 只做编排与校验 ⇒ 通用包不绑死某台机器- 不带
--via-script时走 mpub 自带的 Playwright 适配器(仅存草稿,除非加--publish-now) - 小红书适配器的
capabilities已从article改为image_post:长文路径对它直接报错,防止误用
出包命令:
mpub xhs-package -f article.md -i cover.png -i 2.png -i 3.png产物(默认 dist/xhs/<文件名>/):
post.md # 带 front-matter 的短文案(可直接作为发布正文)
meta.json # 标题/正文/标签/图集/警告(给脚本消费)
images/ # 拷进来的图集
- 标题取
xhs.title→title,超过 20 字自动截断并警告 - 正文取
xhs.body→summary(≥600 字)→ 长文正文(截到 1000 字) - 标签取
xhs.tags→tags - 会检查图片比例(小红书封面建议 1080×1440,3:4)
- 结尾打印投递命令:把发布交给带查重/回查的闸门脚本,而不是 mpub 直发
为什么不在 mpub 里直发小红书:小红书笔记不可删除,误发与双发都收不回来。 直发链路应当带幂等(发布前查重)、发布后回查与人工确认。
所有配置存储在统一文件中,无分散文件:
// ~/.config/multi-publisher/config.json (Linux/macOS)
// %APPDATA%/multi-publisher/config.json (Windows)
{
"version": 1,
"weixin": {
"appId": "wx...",
"appSecret": "..."
},
"zhihu": {
"cookies": { "z_c0": "..." }
},
"juejin": {
"cookies": { "uid_tt": "..." }
}
}# 查看配置文件路径
mpub credential --locationsrc/
├── index.ts # CLI 入口,命令注册
├── config.ts # 统一配置管理(ConfigStore)
│
├── cli/ # 命令行接口
│ ├── index.ts # Commander.js 入口
│ ├── publish.ts # publish 命令
│ ├── render.ts # render 命令(预览)
│ ├── platforms.ts # platforms 命令
│ ├── credential.ts # credential 命令(微信凭据)
│ ├── cookie.ts # cookie 命令(Cookie 管理)
│ ├── login.ts # login 命令(浏览器自动登录)
│ └── publish-all.ts # publish-all 命令
│
├── core/ # 核心渲染引擎
│ ├── parser.ts # Markdown + front-matter 解析
│ ├── renderer.ts # 渲染管道(Markdown → HTML)
│ ├── styler.ts # CSS 内联(juice)
│ ├── mathjax.ts # LaTeX → SVG/PNG 公式
│ └── theme.ts # 主题加载与切换
│
├── adapters/ # 平台适配器
│ ├── interface.ts # IPlatformAdapter 接口定义
│ ├── index.ts # 适配器注册表
│ ├── base-adapter.ts # 基础适配器
│ ├── registry.ts # 平台注册与管理
│ ├── wechat-publisher.ts # 微信公众号发布核心
│ ├── weixin.ts # 微信公众号适配器
│ ├── zhihu.ts # 知乎适配器
│ ├── juejin.ts # 掘金适配器
│ └── ... # 其他平台适配器
│
└── runtime/ # 运行时抽象
├── index.ts # RuntimeInterface 接口
├── node-runtime.ts # Node.js 运行时实现
└── browser-runtime.ts # Playwright 浏览器运行时
Markdown 文件
│
▼
┌─────────────┐ ┌──────────────┐ ┌────────────────┐
│ parser.ts │───▶│ renderer.ts │───▶│ styler.ts │
│ front-matter│ │ AST → HTML │ │ CSS 内联 │
│ Markdown 解析│ │ 代码高亮/LaTeX│ │ 主题应用 │
└─────────────┘ └──────────────┘ └────────────────┘
│
┌──────────────────────────┘
▼
┌───────────────┐ ┌──────────────────────┐
│ wechat-publish│ │ platform adapter │
│ 图片上传 → media_id│ │ 调用平台 API 发布 │
└───────────────┘ └──────────────────────┘
interface IPlatformAdapter {
readonly meta: PlatformMeta // 平台元信息
init(runtime: RuntimeInterface): Promise<void>
checkAuth(): Promise<AuthResult> // 认证检查
publish(article: Article): Promise<SyncResult> // 发布文章
}# 安装依赖
npm install
# 开发模式
npm run dev
# 构建
npm run build
# 类型检查
npm run typecheck- 在
src/adapters/创建<platform>.ts,实现IPlatformAdapter接口 - 在
src/adapters/index.ts注册
// src/adapters/my-platform.ts
export class MyPlatformAdapter implements IPlatformAdapter {
readonly meta: PlatformMeta = {
id: 'myplatform',
name: '我的平台',
icon: 'https://...',
homepage: 'https://...',
capabilities: ['article', 'draft'],
}
// 实现 init / checkAuth / publish
}// src/adapters/index.ts
export { MyPlatformAdapter } from './my-platform.js'
// 添加到导出列表Q: 微信公众号发布需要什么权限?
需要已认证的公众号(订阅号或服务号),在微信公众平台 → 开发 → 基本配置获取 AppID 和 AppSecret。
Q: 浏览器自动登录支持哪些平台?
目前支持:微信、头条号(已实测)+知乎、掘金、CSDN、小红书、企鹅号、微博、B站(适配器就绪,待实测)。
Q: 多平台发布失败会怎样?
已发布成功的平台不受影响,失败平台返回具体错误信息,支持重试。
Q: 可以只发布到草稿箱吗?
是的,所有平台默认发布到草稿箱,需手动在各平台确认发布。
Apache-2.0 License