观自26 downloadsSync the current Obsidian Markdown note to WeChat draft and Feishu docs via local gz CLI.
GZH Sync is a local CLI and community plugin that syncs the current Markdown note to WeChat Official Account drafts and Feishu Docs. It parses Markdown, generates WeChat-compatible HTML, uploads images and covers, creates a WeChat draft, and imports the same article into an online Feishu document.
Important: this tool only creates WeChat drafts. It never publishes articles automatically; review every draft in the WeChat admin before publishing.
GZH Sync 是一个本地 CLI + Obsidian 插件,用来把 Obsidian / Markdown 文章一键同步到:
你正常写 Markdown,工具负责解析文章、生成微信兼容 HTML、上传公众号图片和封面、创建公众号草稿,并把同一篇文章导入为飞书在线文档。
重要:本工具只创建公众号草稿,不会自动群发。草稿创建后,请到公众号后台人工检查再发布。
CLI:
gz sync "文章.md"
Obsidian:
命令面板 -> GZH Sync:同步当前文章到公众号和飞书
也可以分开执行:
gz draft "文章.md" # 只创建微信公众号草稿
gz feishu "文章.md" # 只创建飞书云文档
gz preview "文章.md" # 只生成本地预览
thumb_media_idgit clone https://github.com/London-Chen/gz-sync-obsidian.git
cd gz-sync-obsidian
npm install
npm run build
npm link
验证:
gz preview test/fixtures/sample.md
如果不想 npm link,也可以直接运行:
node dist/src/cli.js preview test/fixtures/sample.md
先在项目根目录构建:
npm install
npm run build
然后复制插件目录:
obsidian-plugin -> 你的 vault/.obsidian/plugins/gz-sync
在 Obsidian 里:
GZH Sync。GZH Sync 插件设置页。项目根目录示例:
/path/to/gz-sync-obsidian
CLI 绑定只是让你能在本地运行 gz sync,或者让 Obsidian 能调用这个命令。
但微信公众号和飞书都是开放平台接口,调用接口必须证明“你有权操作这个账号/租户”。所以仍然需要:
AppID / AppSecretApp ID / App Secret这些凭证可以填在 Obsidian 插件设置页,也可以写入本地 config.local.json 或 .env。
AppID。AppSecret。AppSecret,不要发给别人。微信公众号接口通常要求调用机器的公网 IP 在白名单中。
先运行:
gz config validate
如果真正同步时微信返回类似:
invalid ip xxx.xxx.xxx.xxx not in whitelist
请以微信错误里的 IP 为准,把它添加到公众号后台的 IP 白名单。
Obsidian 插件设置页填写:
CLI 配置文件方式:
gz config init
生成:
config.local.json
填写:
{
"appid": "你的公众号 AppID",
"secret": "你的公众号 AppSecret",
"author": "你的公众号作者名",
"defaultCover": "/absolute/path/to/default-cover.jpg",
"feishuAppId": "",
"feishuAppSecret": "",
"feishuFolderToken": ""
}
环境变量方式:
WECHAT_APPID=你的公众号 AppID
WECHAT_SECRET=你的公众号 AppSecret
WECHAT_AUTHOR=你的公众号作者名
WECHAT_DEFAULT_COVER=/absolute/path/to/default-cover.jpg
飞书同步使用的是飞书开放平台“导入文件为云文档”的能力。流程是:
tenant_access_token。docx。https://open.feishu.cn/。App IDApp Secret进入飞书开放平台应用后台:
应用详情 -> 权限管理 -> API 权限
建议开启以下权限:
| 权限名 | 权限标识 | 用途 |
|---|---|---|
| 查看、创建云文档导入任务 | docs:document:import |
创建和查询 Markdown 导入任务 |
| 上传图片和附件到云文档中 | docs:document.media:upload |
上传待导入的 Markdown 文件 |
如果你不想逐项排查,也可以开启更大的云空间权限:
| 权限名 | 权限标识 | 用途 |
|---|---|---|
| 查看、评论、编辑和管理云空间中所有文件 | drive:drive |
覆盖上传素材、创建导入任务、查询导入结果 |
推荐最小权限组合:
docs:document:import
docs:document.media:upload
如果要导入到某个指定飞书文件夹,还需要确保应用对该文件夹有权限。否则导入任务可能返回无权限或 job_status=116。
开启权限后,通常还需要:
如果只创建了应用但没有发布/安装,App ID / App Secret 可能能获取 token,但后续云文档接口仍可能报无权限。
Obsidian 插件设置页填写:
CLI 配置文件填写:
{
"feishuAppId": "cli_xxx 或 cli_a1b2c3...",
"feishuAppSecret": "你的飞书 App Secret",
"feishuFolderToken": "可选,目标飞书文件夹 token"
}
环境变量方式:
FEISHU_APP_ID=你的飞书自建应用 App ID
FEISHU_APP_SECRET=你的飞书自建应用 App Secret
FEISHU_FOLDER_TOKEN=可选,目标飞书文件夹 token
如果你希望文档导入到指定文件夹:
FEISHU_FOLDER_TOKEN 或 Obsidian 插件设置里的“目标文件夹 Token”。如果不填,工具会把 mount_key 传空,表示导入到云空间根目录。
打开:
Obsidian 设置 -> 第三方插件 -> GZH Sync -> 设置
填写:
package.json 和 dist/src/cli.js 的目录插件会把这些设置作为环境变量传给 CLI。你不必再手动写 .env。
打开一篇 Markdown 文章,然后打开 Obsidian 命令面板:
GZH Sync:同步当前文章到公众号和飞书
也可以只同步一边:
GZH Sync:仅发送当前文章到公众号草稿箱
GZH Sync:仅同步当前文章到飞书
初始化配置:
gz config init
检查配置:
gz config validate
检查文章 readiness:
gz inspect "文章.md"
生成本地预览:
gz preview "文章.md"
只创建公众号草稿:
gz draft "文章.md"
只创建飞书文档:
gz feishu "文章.md"
一键同步公众号和飞书:
gz sync "文章.md"
在 Obsidian / Markdown 文件顶部写 frontmatter:
---
title: 文章标题
author: 你的公众号作者名
digest: 文章摘要
cover: ./attachments/cover.jpg
source_url: ""
---
正文继续正常写 Markdown:
# 一级标题
这是一段正文,支持 **加粗**、链接、引用、列表和图片。
## 二级标题

封面选择规则:
cover。cover 时,使用文章第一张图片。defaultCover / WECHAT_DEFAULT_COVER。预览和导出文件会写入:
dist/preview/<title>.html
dist/output/<title>.wechat.html
dist/output/<title>.feishu.md
如果你的 Agent 支持 slash command,可以继续使用:
/gzh
/gzh-setup
/gzh-check
/gzh-preview
/gzh-sync
/gzh-update
如果 Agent 不支持 slash command,就直接让它运行 CLI,例如:
gz preview "文章.md"
gz sync "文章.md"
排版参数在 style.profile.json 中,可以自己修改。
当前默认值:
15px#3F3F3F1px1.7515px12px20px18px16px12px #888888gz 命令找不到怎么办?在项目根目录运行:
npm link
或者直接用:
node dist/src/cli.js sync "文章.md"
微信公众号草稿接口的正文 content 是微信可接受的 HTML。Markdown 必须先转换成微信兼容内联 HTML。
因为飞书云文档属于你的企业租户。CLI 只是本地工具,必须通过飞书开放平台应用凭证获取授权后才能创建云文档。
invalid ip ... not in whitelist 怎么办?把错误信息里的 IP 添加到微信公众平台 IP 白名单。以微信返回的 IP 为准。
检查:
docs:document:import。docs:document.media:upload 或 drive:drive。job_status=116 怎么办?这通常表示当前身份无导入至该文件夹的权限。请换一个有权限的文件夹,或给应用开通该文件夹权限,或清空 FEISHU_FOLDER_TOKEN 先导入到根目录测试。
description size out of limit 怎么办?工具会自动截断摘要。如果仍然报错,请手动缩短 frontmatter 里的 digest。
author size out of limit 怎么办?工具会清洗 Obsidian 的 [[author]] 格式。如果仍然失败,请缩短作者名。
公众号正文不能引用本地图片路径。正文图片会上传到微信正文图片接口,封面会上传到微信素材接口。
config.local.json 或 .env 提交到 GitHub。npm run build
npm test
测试覆盖:
tenant_access_tokendrive/v1/medias/upload_alldrive/v1/import_tasksdrive/v1/import_tasks/:ticket