Skip to content

About

Markdown → 多平台 CLI 发布工具,支持微信公众号/知乎/掘金等 20+ 平台,12 套渲染主题,Playwright 浏览器自动登录

Resources

Contributing

Stars

13 stars

Watchers

0 watching

Forks

Repository files navigation

multi-publisher

一行命令,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 --version

Node.js ≥ 18 required.

配合 AI 使用

本工具已制作为 Claude Code Skill,可让 AI 直接帮你发布文章:

# 在任意 Claude Code 对话中,直接描述你的需求:
# "帮我把这篇 article.md 发布到微信公众号"
# "用 wechat 主题渲染预览一下"
# AI 会调用 mpub 完成操作

查看支持的所有命令:mpub --help


快速开始

配合 AI 使用:安装本工具后,在 Claude Code 中直接说"帮我发布文章到微信公众号",AI 会调用 mpub 自动完成。

1. 配置平台登录

方式一:浏览器自动登录(推荐)

# 登录知乎
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

2. 发布文章

# 发布到微信公众号(默认)
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

运营命令(2026-10-22 新增)

面向"每天要发、要回盘"的用法。这些命令只读、或只做可回退的动作。

# 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        # 三平台一张表(粉丝/草稿/笔记数)

平台接口权限的现实(2026-10-22 实测,别踩)

微信公众号(个人未认证订阅号)

能力 接口 结果
草稿增删改查 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 回查为准,发表成功以"这篇从草稿箱消失"为准。


支持的平台

平台可用性(如实标注,2026-08-15 更新)

平台 登录命令 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 platforms

主题系统

🎨 4 套内置主题(按平台自动匹配)

mpub 内置 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)

正文可用卡片容器突出重点——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 是必需的!缺少 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, 副业]
---

正文内容...

小红书发布包(xhs-package → publish --package)

小红书的笔记是"图集 + 短标题 + 短正文 + 标签",不吃长文排版;而且发出去不能删除。 所以小红书在 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 --location

项目结构

src/
├── 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

添加新平台

  1. 在 src/adapters/ 创建 <platform>.ts,实现 IPlatformAdapter 接口
  2. 在 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'
// 添加到导出列表

FAQ

Q: 微信公众号发布需要什么权限?

需要已认证的公众号(订阅号或服务号),在微信公众平台 → 开发 → 基本配置获取 AppID 和 AppSecret。

Q: 浏览器自动登录支持哪些平台?

目前支持:微信、头条号(已实测)+知乎、掘金、CSDN、小红书、企鹅号、微博、B站(适配器就绪,待实测)。

Q: 多平台发布失败会怎样?

已发布成功的平台不受影响,失败平台返回具体错误信息,支持重试。

Q: 可以只发布到草稿箱吗?

是的,所有平台默认发布到草稿箱,需手动在各平台确认发布。


许可证

Apache-2.0 License

About

Markdown → 多平台 CLI 发布工具,支持微信公众号/知乎/掘金等 20+ 平台,12 套渲染主题,Playwright 浏览器自动登录

Resources

Contributing

Stars

13 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages