知识星球我写了快三年,一个免费星球里,零零碎碎发了几千条。
这些帖子都沉在星球里面,想找回一条以前的想法,得翻半天。
最近我用 WorkBuddy 把整个星球的内容批量同步进了 Obsidian 知识库。这篇把完整流程写清楚,照着做你也能把自己的星球搬下来。
01 为什么要同步
知识星球本身检索很弱,帖子刷过去就沉了。同步到 Obsidian 之后,这些内容能和我的其他笔记放在一起,全文检索、互相链接——一条两年前的想法,搜个关键词就能调出来,价值立刻不一样。
02 方案:WorkBuddy + 知识星球 Skill
手动复制粘贴不现实——几千条根本搬不动。正确做法是用 WorkBuddy 跑脚本批量拉。
WorkBuddy 里有两个入口可以用:
- 知识星球 Skill(连接器):在 WorkBuddy 里连接「知识星球」连接器,直接对话就能拉内容、查成员。
- zsxq-cli 客户端:命令行工具,适合写脚本批量跑、做清洗和落库。
本文用 zsxq-cli 讲完整流程,因为批量同步要写循环和清洗逻辑,命令行最顺手。连接好连接器后,zsxq-cli 会自动复用登录态。
03 准备清单
- WorkBuddy(已连接知识星球连接器,或本地装好 zsxq-cli 并登录)。
- 一个 Obsidian 知识库,确定好落库目录,比如 01_Sources/my-articles/星球-xxx/。
- 确认登录身份:
zsxq-cli auth status
# 输出:✓ Logged in as 小路 (<user_id>)记下自己的 user_id,后面过滤「只保留本人帖子」要用。
04 实操步骤
第 1 步:拿到星球 ID
zsxq-cli group +list --json从返回的 GROUP ID 列表里找到目标星球。
第 2 步:拉取内容(必须带 owner)
关键一点:不要用 group +topics,它的返回不含发帖人信息,拉回来分不清谁发的。要用原始接口,返回里带 owner.user_id:
zsxq-cli api call get_group_topics \
--params '{"group_id":"<星球ID>","limit":30}'返回每条结构里有:
"owner": { "name": "小路", "user_id": "841844818125582" }翻页用返回里的 next_end_time 作为下一页的 end_time 参数继续拉。
第 3 步:只保留本人帖子
星球的帖子不全是你发的——群友提问、机器人回复都会混进来。必须按 owner.user_id == 你的user_id 过滤,别人的一律丢掉。这是整个流程最容易翻车的地方。
第 4 步:清洗
- 去掉 <e type="web">、<e type="hashtag"> 这类 XML 标签;
- 去掉纯链接、空内容;
- 按内容 MD5 去重(同一条发两遍只留一份)。
第 5 步:分类 + 落库
- 长文(≥500 字)单独存成一个 .md 文件;
- 短文按「主题 + 月份」合并成一个文件,避免几千个碎片文件;
- 主题分类按关键词命中次数取最多(不能取第一个匹配到的,否则会被顺带提到的词带偏);
- 文件名优先取《书名号》里的标题,否则取首句,限 24 字。
第 6 步:批量跑(分批续传)
几千条一次性拉会被运行环境杀掉进程。写成可续传脚本,每批 30~40 页,游标存到文件,断了接着跑:
# 核心逻辑(简化)
import subprocess, json
GID = "<星球ID>"
MYID = "<你的user_id>"
end = None
while True:
p = {"group_id": GID, "limit": 30}
if end:
p["end_time"] = end
d = json.loads(subprocess.run(
["zsxq-cli", "api", "call", "get_group_topics",
"--params", json.dumps(p)],
capture_output=True, text=True).stdout)
for t in d["topics_brief"]:
if t["owner"]["user_id"] != MYID:
continue # 只留本人
# ... 清洗、去重、落库
if not d.get("has_more"):
break
end = d.get("next_end_time")第 7 步:验收
打开 Obsidian 看目录,抽查几个文件的 frontmatter,确认没有别人发的帖子、字数统计符合预期,就完成了。
05 我同步的真实结果
我把自己一个免费星球近三年的内容全量同步了,过滤掉别人发的帖子和重复项之后:
| 指标 | 数量 |
| --- | --- |
| 总条数 | 6504 条 |
| 总字数 | 约 104 万(1,039,684 字) |
| 时间范围 | 2024-01-02 ~ 2026-09-13 |
| 长文(≥500 字) | 243 条 / 20.1 万字 |
| 短文(<500 字) | 6261 条 / 83.8 万字 |
| 落库文件数 | 474 个(长文单独 + 短文按月合并) |
按主题分类的占比:
| 主题 | 条数 | 占比 |
| --- | --- | --- |
| 副业赚钱 | 1845 | 28.4% |
| 写作 | 728 | 11.2% |
| 认知成长 | 722 | 11.1% |
| 工具 | 444 | 6.8% |
| 自媒体 | 413 | 6.3% |
| AI编程 | 150 | 2.3% |
| 出海 | 71 | 1.1% |
| 其他(无明确主题) | 2131 | 32.8% |
长文主要集中在副业赚钱(141 条),其次是认知成长(29 条)和写作(22 条)。
06 必须避开的 4 个坑
- 混进别人帖子:group +topics 不含 owner,拉回来分不清谁发的。一定要用 api call get_group_topics 拿 owner,按 user_id 过滤本人。
- 进程被杀:几千条一次性拉,分页太深会被运行环境杀掉。改用可续传脚本,每批 30~40 页。
- 分类误归:一条讲副业的帖子顺带提了「AI」,按首个匹配会被归到 AI 编程。要按关键词命中次数取最多的主题。
- 标题乱码:直接取整行当标题会很长很丑。优先取《》里的标题,否则取首句到标点,限 24 字。
07 适合谁
- 在知识星球发过大量内容、想统一检索和复用的人;
- 本身就用 Obsidian 做知识库、希望星球内容能和其它笔记互相链接的人;
- 有多个星球、想把其中一个或几个的内容归档的人。
不适合:只想偶尔回看一两条的人,直接搜星球更快;或者星球内容主要是外部文章转发(这类和知识库已有资料重复,同步价值低)。