AutoPublish - 多平台文章自动发布系统
一键将 Markdown 文章同步发布到掘金、CSDN、知乎、编程导航、语雀五大技术平台
项目地址:Github仓库
项目简介
autoPublish 是一个基于 Java + Playwright 的浏览器自动化工具,旨在解决技术博客创作者需要手动将同一篇文章分别发布到多个平台的重复劳动问题。
系统通过调用 DeepSeek AI 接口智能提取文章元数据(分类、标签、摘要),结合 Playwright 浏览器自动化技术,实现从内容解析到多平台发布的全流程自动化。
核心亮点
- 一键多平台发布 — 支持掘金、CSDN、知乎、编程导航、语雀五大平台
- AI 智能标签 — 自动调用 DeepSeek API 提取各平台适配的分类、标签和摘要
- 元数据缓存 — AI 生成的元数据本地缓存(
.meta.json),避免重复调用 API - YAML Front Matter 支持 — 可在 Markdown 文件头直接指定标签、分类和摘要
- 登录态持久化 — 浏览器 Cookie 本地保存,首次登录后无需反复认证
- 反检测机制 — 隐藏 WebDriver 自动化标识,绕过平台滑块验证
- 容错设计 — 单平台发布失败不影响其他平台,自动截图保存错误现场
支持平台
| 平台 | 网址 | 功能 | 状态 |
|---|---|---|---|
| 掘金 | juejin.cn | 自动填写标题、正文、分类、标签、封面、摘要,支持专栏收录 | 已跑通 |
| CSDN | csdn.net | 自动填写标题、正文、标签(最多5个)、封面、摘要,支持专栏/原创声明/可见范围配置 | 已跑通 |
| 知乎 | zhuanlan.zhihu.com | 使用文档导入功能发布正文,自动设置话题(最多3个)、创作声明 | 已跑通 |
| 编程导航 | codefather.cn | ByteMD 编辑器自动填写,支持必选标签 + AI 推荐标签组合(最多7个) | 已跑通 |
| 语雀 | yuque.com | 自动创建文档并填入内容,Base64 封面图片粘贴,保存为草稿 | 已跑通 |
技术栈
| 技术 | 版本 | 用途 |
|---|---|---|
| Java | 17 | 主开发语言 |
| Playwright | 1.48.0 | Chromium 浏览器自动化 |
| org.json | 20231013 | JSON 解析(AI 响应处理) |
| DeepSeek API | — | AI 智能元数据提取 |
| Maven | — | 项目构建与依赖管理 |
项目结构
autoPublish/
├── pom.xml # Maven 构建配置
├── cookie/
│ └── PlaceHolder.txt # 浏览器数据目录占位文件
├── src/main/
│ ├── java/com/mrchen/
│ │ ├── Article.java # 文章数据模型(标题、内容、各平台元数据)
│ │ ├── Publisher.java # 发布器接口(getName + publish)
│ │ ├── MultiPlatformPublisher.java # 主入口:配置加载、Markdown 解析、AI 调用、流程编排
│ │ ├── JuejinPublisher.java # 掘金发布实现
│ │ ├── CsdnPublisher.java # CSDN 发布实现(含图片自动压缩)
│ │ ├── ZhihuPublisher.java # 知乎发布实现(文档导入模式)
│ │ ├── CodeFatherPublisher.java # 编程导航发布实现
│ │ └── YuquePublisher.java # 语雀发布实现(Base64 封面粘贴)
│ └── resources/
│ ├── config-example.properties # 配置文件模板(已脱敏,使用时请自行配置项目目录及API Key)
│ └── myArticles/ # 文章与封面存放目录
│ ├── your-article.md # 你的 Markdown 文章
│ └── cover.png # 文章封面图
快速开始
1. 环境要求
- JDK 17 及以上
- Maven 3.x
- 稳定的网络环境(需访问各平台及 DeepSeek API)
2. 克隆项目
git clone <your-repo-url>
cd autoPublish
3. 安装 Playwright 浏览器
首次运行前需安装 Chromium 浏览器引擎:
mvn exec:java -e -Dexec.mainClass=com.microsoft.playwright.CLI -Dexec.args="install chromium"
4. 配置文件
将 config-example.properties 复制为 config.properties,并填入实际配置:
cp src/main/resources/config-example.properties src/main/resources/config.properties
需要修改的关键配置项:
# 必改项 — 文章工作目录
workspace.dir=E:/java_project/autoPublish/src/main/resources/myArticles
# 必改项 — 每次发布新文章时更新
target.file=你的文章标题.md
target.cover=cover.png
# 必改项 — DeepSeek API 密钥
ai.api.key=sk-your-actual-key
ai.api.url=https://api.deepseek.com/chat/completions
# 按需开启各平台(true/false)
platform.juejin.enabled=true
platform.csdn.enabled=true
platform.zhihu.enabled=true
platform.codefather.enabled=true
platform.yuque.enabled=true
各平台的候选标签池、专栏、创作声明等详细配置请参考
config-example.properties中的注释说明。
5. 运行
mvn compile exec:java -Dexec.mainClass=com.mrchen.MultiPlatformPublisher
或在 IntelliJ IDEA 中直接运行 MultiPlatformPublisher.main()。
首次运行时,浏览器会以非无头模式启动。如果未登录过某个平台,请手动完成登录操作,Cookie 会自动保存到
./cookie目录,后续运行无需再次登录。
工作流程
┌─────────────────────────────────────────────────────────────┐
│ 启动多平台自动发布系统 │
└─────────────────────────┬───────────────────────────────────┘
│
▼
┌─────────────────┐
│ 加载配置文件 │ config.properties
└────────┬────────┘
│
▼
┌─────────────────┐
│ 解析 Markdown │ 提取标题、正文、YAML Front Matter
└────────┬────────┘
│
▼
┌────────────────────┐
│ 检查元数据缓存/来源 │
└────────┬───────────┘
│
┌─────────────┼─────────────┐
│ │ │
▼ ▼ ▼
┌──────────┐ ┌───────────┐ ┌────────────┐
│ 本地缓存 │ │ MD配置完整 │ │ 调用 AI API │
│.meta.json│ │ 直接使用 │ │ DeepSeek │
└────┬─────┘ └─────┬─────┘ └──────┬─────┘
│ │ │
└──────────────┼───────────────┘
│
▼
┌─────────────────┐
│ 启动 Chromium │ Playwright + 持久化上下文
└────────┬────────┘
│
┌──────────────┼──────────────┐
│ │ │
▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────┐
│ 掘金发布 │ │ CSDN发布 │ │ 更多... │
└────┬─────┘ └────┬─────┘ └────┬─────┘
│ │ │
└──────────────┼──────────────┘
│
▼
┌─────────────────┐
│ 输出执行报告 │ 成功/失败汇总 + 错误截图
└─────────────────┘
Markdown 文章格式
系统支持可选的 YAML Front Matter,在文章开头用 --- 包裹:
---
summary: 文章摘要,80字以内
tags: Java,架构,AI
category: 后端
---
# 文章标题
正文内容...
| 字段 | 说明 |
|---|---|
summary | 文章摘要,各平台通用 |
tags | 逗号分隔的标签列表,作为 AI 未启用时的兜底 |
category | 文章分类,作为全局默认分类 |
如果 Front Matter 信息完整,系统将跳过 AI 调用直接使用这些信息。未填写 Front Matter 时系统会自动调用 DeepSeek API 智能提取。
AI 元数据提取
系统通过 DeepSeek Chat API 实现以下自动化:
- 智能摘要 — 自动生成 80 字以内的文章摘要
- 平台适配 — 根据各平台候选池,精确匹配最佳分类和标签
- 一次生成,永久缓存 — 结果以
.meta.json文件保存在文章同级目录,重复运行直接读取缓存
缓存文件示例(文章标题.md.meta.json):
{
"summary": "本文探讨了企业级场景下 Agent 输出不符合规范的系统性解决方案...",
"juejin_category": "人工智能",
"juejin_tags": ["Agent"],
"csdn_tags": ["人工智能", "AIGC", "ai", "架构", "后端"],
"zhihu_topics": ["人工智能", "AI开发", "编程"],
"codefather_tags": ["AI", "人工智能", "开源", "后端"]
}
如果不想使用 AI,可在 Markdown Front Matter 中填写完整的
summary、tags、category,系统将自动跳过 AI 调用。
配置参考
全局配置
| 配置项 | 说明 | 示例 |
|---|---|---|
workspace.dir | 文章存放目录的绝对路径 | E:/java_project/autoPublish/src/main/resources/myArticles |
target.file | 要发布的 Markdown 文件名 | my-article.md |
target.cover | 封面图片文件名 | cover.png |
user.data.dir | 浏览器数据目录(保存 Cookie) | ./cookie |
ai.api.key | DeepSeek API 密钥 | sk-xxxxxxxx |
ai.api.url | DeepSeek API 地址 | https://api.deepseek.com/chat/completions |
article.default.tags | 默认标签(兜底用) | 后端 |
article.default.category | 默认分类(兜底用) | 后端 |
平台配置
每个平台均支持以下通用配置模式:
# 平台开关
platform.<name>.enabled=true/false
# 平台编辑器 URL
platform.<name>.url=https://...
# 标签/分类候选池(AI 从中选择最匹配的项)
platform.<name>.candidates.tags=标签1,标签2,标签3
各平台特有配置详见 config-example.properties 中的注释。
常见问题
首次运行时平台要求登录怎么办?
程序以非无头模式启动浏览器,你可以手动完成登录。登录后 Cookie 会自动保存到 user.data.dir 指定的目录(默认 ./cookie),后续运行无需再次登录。
某平台发布失败会影响其他平台吗?
不会。系统采用独立 try-catch 包裹每个平台的发布流程,单个平台异常不会中断整体执行。失败时会在项目根目录生成 error_snapshot_<平台名>.png 截图供排查。
不想使用 DeepSeek API 怎么办?
在 Markdown 文件头添加完整的 YAML Front Matter(包含 summary、tags、category 三个字段),系统将直接使用这些信息,跳过 AI 调用。
支持哪些 AI 接口?
系统使用 OpenAI 兼容的 Chat Completions 接口格式,理论上支持所有兼容该格式的 AI 服务(如 DeepSeek、OpenAI、通义千问等),只需修改 ai.api.url 和 ai.api.key 即可。
语雀平台的 URL 如何配置?
语雀需要配置到具体知识库的链接,格式如:https://www.yuque.com/<用户名>/<知识库名>。程序会在该知识库下创建新文档并保存为草稿。
许可证
本项目仅供学习交流使用。