| name | getnote-obsidian-sync |
| description | Use when the user wants to sync Get笔记 notes to a local Obsidian vault folder. Triggers on "同步Get笔记", "同步笔记到Obsidian", "把Get笔记同步到本地", "sync getnote to obsidian", or any request to download/export Get笔记 notes as local markdown files. |
Get笔记 → Obsidian 同步
将 Get笔记 中的笔记同步为 Obsidian 兼容的 .md 文件,支持增量同步。
凭证
从环境变量读取(用户已在 .zshrc 中配置):
$GETNOTE_API_KEY(格式 gk_live_xxx)
$GETNOTE_CLIENT_ID(格式 cli_xxx)
如果环境变量缺失,引导用户前往 https://www.biji.com/openapi 获取并添加到 .zshrc。
API 调用
Base URL: https://openapi.biji.com
请求头:
Authorization: $GETNOTE_API_KEY
X-Client-ID: $GETNOTE_CLIENT_ID
列表接口
GET /open/api/v1/resource/note/list?since_id={cursor}
返回 data.notes[]、data.has_more、data.next_cursor,每页 20 条。从 since_id=0 开始翻页。
详情接口
GET /open/api/v1/resource/note/detail?id={note_id}
默认不调用 detail 接口,因为 API 有每日 1000 次读取限制,列表接口已包含 title/content/tags 等核心字段。
仅在用户明确要求时调用 detail:
link → data.web_page.content、data.web_page.url
- 音频类(
audio、meeting、local_audio、internal_record、class_audio、recorder_audio、recorder_flash_audio)→ data.audio.original(转写全文)
录音全文补充
对已同步的个人录音和会议录音,可按需调用 detail 接口补充转写全文:
- 扫描
个人录音/ 和 会议录音/ 下的 .md 文件
- 检查文件中是否已包含
## 转写原文 段落,已有则跳过
- 从 frontmatter 取
getnote_id,调用 detail 接口获取 data.audio.original
- 追加
## 转写原文 段落到文件末尾
- 每次调用间隔 1 秒,注意每日 1000 次配额(当前约 137 条录音,单次全量补充即可)
同步流程
- 读取凭证 — 从环境变量
$GETNOTE_API_KEY 和 $GETNOTE_CLIENT_ID 读取
- 确定输出目录 — 优先使用环境变量
$GETNOTE_SYNC_DIR;若未设置,则要求用户传入目标文件夹路径,不使用默认值
- 构建已同步 ID 集合 — 递归扫描输出目录下所有
.md 文件,从 frontmatter 中提取 getnote_id,构建 set。文件可能已被用户移动到子文件夹,所以必须递归扫描
- 遍历笔记列表 —
since_id=0 起始,逐页获取(API 按时间倒序返回)
- 增量检查 — API 返回的
note.id 在已同步集合中则跳过。若某页 20 条全部已存在,说明更早的笔记也已同步,立即停止翻页(省 API 配额)
- 写入 .md 文件 — 文件名格式
{YYYY-MM-DD}_{title}.md,格式见下。新笔记默认写入 收藏/ 子目录(用户后续手动分类)
- 文件名清理 — 移除
/\:*?"<>| 及控制字符,多余空格合并,标题截断 80 字符,重名追加 note_id
- 翻页 —
has_more=true 则用 next_cursor 继续
- 打印统计 — 新增 N 条,跳过 M 条
注意:每次 API 调用间隔至少 1 秒。遇到错误码 42900(限流)sleep 10 秒重试一次。遇到 10201(非会员)提示用户开通。
.md 文件格式
Frontmatter
---
id: "123456789"
title: "笔记标题"
note_type: plain_text
tags:
- 标签1
- 标签2
source_url: "https://..."
created_at: "2025-01-15 10:30:00"
updated_at: "2025-01-15 11:00:00"
synced_at: "2026-03-15 22:00:00"
---
Body(按 note_type)
| 类型 | 格式 |
|---|
plain_text / img_text | # {title}\n\n{content} |
link | # {title}\n\n> Source: {web_page.url}\n\n## AI 总结\n\n{content}\n\n## 原文\n\n{web_page.content} |
| 音频类 | # {title}\n\n{content}\n\n## 转写原文\n\n{audio.original} |
标签从 note.tags[].tag 取值。title 中的双引号需转义。
实现方式
用 Bash 工具执行 curl 调用 API,用 Write 工具写入 .md 文件。不要生成独立脚本,直接在对话中逐步执行。
对于大量笔记(>50 条),可以用 Bash 工具批量执行 curl + Python 提取数据,然后用 Write 逐个写入文件。
⚠️ 大整数精度:笔记 ID 是 64 位整数,超过 JavaScript 的 Number.MAX_SAFE_INTEGER(2^53)。禁止使用 jq 处理 ID 字段(jq 用浮点数表示数字会丢失精度)。必须用 Python 的 json.loads(Python int 无精度限制)或从原始 JSON 字符串中用正则提取 ID。
整理流程
用户可请求对已同步的笔记进行整理归类。整理分两步:
第一步:按 note_type 分文件夹
从 frontmatter 的 note_type 字段读取类型,移入对应子目录:
| note_type | 目标文件夹 |
|---|
link | 链接收藏/ |
meeting | 会议录音/ |
audio、local_audio | 个人录音/ |
plain_text | 文本笔记/ |
第二步:链接收藏按主题细分
对 链接收藏/ 下的文件,基于 frontmatter 的 tags 和 title 进行关键词模糊匹配(大小写不敏感),归入主题子目录:
| 主题 | 匹配关键词(部分) |
|---|
AI编程与工具 | claude, cursor, copilot, windsurf, trae, vibe coding, ai编程, mcp, ai开发, 零代码 |
AI应用与趋势 | ai工具, ai agent, 大模型, llm, gpt, aigc, rag, 提示词, 生成式ai, gemini |
创业与商业 | 创业, 一人公司, 商业, saas, pmf, 独立开发, 副业, 赚钱 |
游戏开发 | 游戏开发, 独立游戏, phaser, pixijs, 像素画, 游戏设计 |
内容与营销 | 内容创作, 自媒体, 小红书, 个人ip, reddit, 跨境电商, seo, 短视频 |
前端与开发 | 前端, typescript, react, next.js, javascript, python, go语言, tailwind |
产品与设计 | 交互设计, ui设计, 产品经理, 产品思维, 竞品分析 |
个人成长 | 认知, 个人成长, 面试, 学习方法, 时间管理, 知识管理, 职场 |
其他 | 以上均未匹配 |
匹配规则:按上表顺序逐一检查,命中第一个即归类。忽略自动标签 AI链接笔记 和 录音笔记。
注意事项
- 跳过
_ 开头的元数据文件(如 _cursor.json、_stats.md)
- 用 Python 批量处理,不逐个调用 Write 工具
- 整理前先统计各分类数量,确认后再执行移动
错误处理