harbor:基于 Python 与 Playwright 生态的 AI 多平台内容分发项目

Self-hosted AI publishing hub �� write once, ship to 15 platforms, keep every copy in sync.

分支1Tags9
文件最后提交记录最后更新时间
1 天前
13 小时前
1 天前
14 小时前
1 天前
14 小时前
21 天前
27 天前
27 天前
2 天前
1 天前
14 小时前
27 天前
1 天前
27 天前
1 天前
1 天前
1 天前
1 天前
1 天前
6 天前
6 天前
6 天前

Harbor 港

English · 简体中文

面向中文创作者的自托管发布中枢:一次写作,分发到十五个平台,已发布的内容保持同步。 内置 AI 写稿、合规门禁,以及在平台风控拦截时把控制权交回给人的机制。

CI License: MIT

写作台


能力

十五个平台,一次发布 知乎、掘金、CSDN、B站、博客园、头条、开源中国、SegmentFault、51CTO、MetaWeblog 自建博客、微信公众号、GitHub Pages、Dev.to、Telegraph、小红书。每个适配器声明自己真实支持的能力(发布/草稿/更新/标签/封面/问答),前端按声明置灰。
原地更新 改一次,所有已发布副本同步更新,不产生重复内容。
AI 写稿 + 合规门禁 七条 Provider 路由带故障转移;上线前四道闸门:安全扫描 → AIGC 标识 → 双模型审查 → 人工确认。
卡住就暂停,不瞎猜 验证码、风控、登录失效:任务停下并告知你,处理完从原处继续。
登录态持久 每个平台扫码一次。Cookie 存本地 profile 并额外做原子快照,profile 被清也不用重扫。
MCP Server,32 个工具 可从 Claude Code、Cursor 或任意 MCP 客户端驱动整条流水线。默认 stdio;远程 SSE 必须带 Bearer Token。
全部本地 SQLite + FTS5 全文检索,媒体内容寻址去重,无厂商账号,无遥测。

界面

发布中心 任务中心
发布中心 任务中心
设置 移动端
设置 移动端

平台账号

十五个适配器,每个都声明自己真实支持的能力。置灰的动作是平台不支持,不是功能缺失。

快速开始

需要 Python 3.10+、uv、Node 20+ 与 pnpm。

git clone https://github.com/badhope/harbor.git
cd harbor

# 终端 1 —— 后端
cd backed
uv sync
uv run uvicorn app.factory:create_app --factory --host 127.0.0.1 --port 8000 --reload

# 终端 2 —— 前端
cd web
pnpm install
pnpm dev            # http://127.0.0.1:5173

打开 http://127.0.0.1:5173,Vite 会把 /api 代理到 8000 端口。

桌面形态(实验)

cd web
pnpm install
pnpm run tauri dev

Tauri 以 sidecar 方式拉起 Python 后端。跨平台打包尚未验证,见「已知限制」。

接入平台

两类接入方式,按平台决定:

浏览器登录 —— 没有可用 API 的平台。打开「设置 → 平台账号」,点该平台的「登录」, 在弹出窗口里完成扫码或输密码。登录态存进本地 profile,之后长期复用。

uv run --project backed python -m backed.cli --headed login --platform zhihu

协议凭据 —— 有稳定 API 的平台。在 config.json 里填 platforms.<名>,免浏览器。 字段清单见 PLATFORM_CONNECTION.md。

uv run --project backed python -m backed.cli publish --id <文章ID> --platforms zhihu,juejin

配置

编辑 backed/config.json,或用环境变量:

变量 用途 默认
HARBOR_API_TOKEN REST 鉴权 Token 回环下自动生成;生产/Docker 必须显式设置
SECRET_KEY / HARBOR_SECRET_KEY 签名 / JWT 密钥 生产必须设置,不使用公开默认值
TRUSTED_NETS 免 Token 的客户端网段 仅回环
TRUSTED_PROXIES 允许采信 X-Forwarded-For 的反向代理网段 空
CORS_ORIGINS 跨域白名单 同源
ALLOWED_HOSTS 接受的 Host 头 回环
HUB_DATA_DIR 数据库/媒体/登录态/配置的持久根 仓库内 data/
HUB_BROWSER_CHANNEL 复用系统浏览器(msedge / chrome) 自带 Chromium
PUBLIC_BASE_URL 托管媒体的对外基地址 空(只入库不改写)
DEMO=1 演示模式:不开浏览器、不调外部 API 关

部署

Docker Compose 把后端藏在 nginx 后面,Token 由服务端注入:

export SECRET_KEY=$(openssl rand -hex 32)
export HARBOR_API_TOKEN=$(openssl rand -hex 32)
docker compose -f deploy/docker-compose.yml --profile web up -d --build

后端不对宿主暴露端口;nginx 负责终止连接并注入 Token。数据落在 hub_data 卷。

测试

bash scripts/check_all.sh          # 全部门禁;Linux/macOS
pwsh -File scripts/check_all.ps1   # 全部门禁;Windows

cd backed && uv run pytest -q      # 只跑后端
pnpm --dir web test                # 只跑前端

check_all 覆盖八道门禁:compileall、ruff、版本一致性、密钥扫描、pytest、 eslint、vitest、vite build。

架构

Vue 3 SPA  ──REST/SSE──►  FastAPI  ──►  发布中枢
(Tauri 外壳)              (uvicorn)      ├── 15 个平台适配器
                                         ├── 任务引擎 + 调度器
                                         ├── SQLite(WAL + FTS5)
                                         └── MCP 桥(stdio/SSE)

详见 docs/architecture/ARCHITECTURE.md。

已知限制

在看懂这一节之前,不要完全相信上面的描述。

  • 浏览器抓取与截图已启用,但受网络限制。 目标主机会在 Chromium 内部钉扎到已校验的 公网 IP,每个子资源都会再校验一次;私网、回环、链路本地地址一律拒绝。
  • 真实发布没有对线上平台 DOM 做回归。 适配器只通过静态契约探针,只有掘金有采集到 的 DOM 样本。依赖任何平台前,请先用草稿试发。
  • Docker 与 Tauri 构建在本机未验证。 Docker daemon 不可用;Tauri 卡在本机 linker 错误。compose 文件与 sidecar 脚本存在,但这里没有产出过通过验证的安装包。
  • 没有自动更新、没有签名发布清单、没有跨平台安装程序。

文档

项目管理 分支模型、完成定义、门禁、五仓同步
版本管理 SemVer 策略与发布清单
路线图 已交付 / 下一步 / 待排期 / 明确不做
平台接入 各平台凭据与 CLI
架构 模块边界与数据流
验证记录 人工检查的带日期证据
审计报告 历史缺陷审计与修复记录
贡献指南 如何提交改动
安全策略 漏洞上报方式

许可

MIT —— 见 LICENSE。

项目介绍

Self-hosted AI publishing hub �� write once, ship to 15 platforms, keep every copy in sync.

https://github.com/badhope/content-harbor定制我的领域