- bridge/ 常驻桥接服务器(WebSocket 9600 + HTTP 9601,平台状态缓存) - patch/ TriliumNext 补丁(publisher 服务、API 路由、发布控制台前端) - install.sh 一键安装 + Docker 容器 CLI 处理 - 全链路使用 host.docker.internal 解决容器访问宿主机 - mcp/ AI Agent 集成说明
TriliumNext × WechatSync 多平台发布
在 TriliumNext 上集成 WechatSync 文章同步助手,实现一篇笔记一键发布到 20+ 中国内容平台(知乎、微信公众号、CSDN、掘金、B站、头条、百家号、小红书…),并在发布控制台实时显示各平台登录状态、发布结果与草稿编辑链接。
架构
┌──────────────┐ ①HTTP /api/publisher/publish ┌───────────────────┐
│ 浏览器 │ ───────────────────────────────▶ │ TriliumNext 服务 │
│ /publish 页面 │ ◀─────────────────────────────── │ (Docker/裸机) │
└──────────────┘ 发布结果 / 平台状态 └─────────┬─────────┘
②HTTP │ (9601)
▼
┌───────────────────────┐
│ 桥接服务器 (本仓库) │
│ wechatsync-server.mjs │
│ WS 9600 / HTTP 9601 │
└───────────┬───────────┘
③WS │ (9600)
▼
┌───────────────────────┐
│ Chrome + WechatSync │
│ 扩展(各平台已登录) │
└───────────┬───────────┘
④ ▼
知乎 / 公众号 / CSDN / …
为什么需要桥接? WechatSync CLI 只以 SECONDARY 模式短暂运行;Chrome 后台页约 40s 会被休眠导致 WebSocket 断连。桥接服务器常驻 PRIMARY 模式,扩展连一次即可保持在线(25s 心跳保活),并把平台状态缓存起来。
快速开始
1. 安装桥接(宿主机)
sudo bash install.sh
安装后:
- WebSocket 监听
:9600(Chrome 扩展连这里) - HTTP API 监听
:9601(CLI / Trilium 连这里) - 生成 Token 存于
/etc/wechatsync-token.conf
2. 配置 Chrome 扩展
- 安装 WechatSync 扩展
- 打开扩展设置页
- 服务器地址填
ws://<NAS_IP>:9600 - Token 填上一步生成的值
- 点击连接 → 状态变为「已连接」
- 在各平台网页登录(扫码)
3. 给 TriliumNext 打补丁
bash patch/patch.sh /path/to/triliumnext
补丁做三件事:
- 替换
apps/server/src/services/publisher/wechatsync.ts(桥接检查、重试、URL 提取) - 替换
apps/server/src/routes/api/publisher_frontend.ts(新增platform-status等接口) - 替换
apps/client/public/publish.html(发布控制台前端) - 重新构建
pnpm server:build
4. 安装 wechatsync CLI
npm install -g @wechatsync/cli
若 Trilium 在 Docker 容器内,CLI 也要装进容器:
docker exec triliumnext npm install -g @wechatsync/cli
5. 访问发布控制台
打开 http://<your-trilium>:<port>/publish
⚠️ Docker 网络关键点
Trilium 在容器、桥接在宿主机时,容器内的 localhost 指向容器自身,访问不到宿主机服务。必须使用 host.docker.internal(Docker 内置 DNS → 宿主机网关 172.17.0.1)。
本仓库所有代码默认使用 host.docker.internal:
wechatsync.ts:checkBridge()用http://host.docker.internal:9601/statuspublisher_frontend.ts:platform-status用http://host.docker.internal:9601/platforms- CLI 调用注入
SYNC_WS_HOST=host.docker.internal @wechatsync/cli的hostname改为读SYNC_WS_HOST
宿主机裸跑 Trilium 时,设置环境变量 BRIDGE_HOST=localhost 即可。
修改容器内
main.cjs后必须重启容器才生效(Node 启动时只加载一次代码到内存,改文件不重载)。
目录结构
trilium-wechatsync/
├── install.sh # 桥接一键安装
├── bridge/
│ ├── wechatsync-server.mjs # 常驻桥接服务器(PRIMARY)
│ ├── wechatsync-bridge.service # systemd 服务
│ └── wechatsync-bridge-wrapper.sh
├── patch/
│ ├── wechatsync.ts # → apps/server/.../publisher/wechatsync.ts
│ ├── publisher_frontend.ts # → apps/server/.../routes/api/publisher_frontend.ts
│ ├── publish.html # → apps/client/public/publish.html
│ └── patch.sh # 应用补丁 + Docker 修正
└── mcp/
└── MCP_INTEGRATION.md # MCP Server 集成说明
支持的平台
WechatSync 扩展内置 19 个平台 + 可扩展配置:
知乎 · 掘金 · 微博 · 哔哩哔哩 · 百家号 · CSDN · 语雀 · 豆瓣 · 搜狐号 · 雪球 · 微信公众号 · 人人都是产品经理 · 51CTO · 慕课手记 · 开源中国 · 思否 · 博客园 · Markdown 压缩包 · 东方财富 ·(可加)头条号 · 小红书 · 什么值得买
功能
- ✅ 平台登录状态实时检测(绿=已登录 / 红=未登录 / 灰=未知)
- ✅ 未登录平台自动置灰不可选
- ✅ 桥接/扩展断开时返回缓存状态(标注 📦 缓存),页面不再一片空白
- ✅ 发布结果按文章分组,成功返回草稿编辑链接
- ✅ 5 次重试等待扩展连接
- ✅ 支持多文章批量发布到多平台
已知问题
- 什么值得买 (SMZDM):扩展侧 CSRF token 缺失,发布报错。其他平台正常。
- 头条号 / 小红书 / 什么值得买:不在扩展原生
listPlatforms()中,可发布但登录状态显示「❓ 未知」。
协议
MIT