---
name: suyuan2022-get-biji
description: "Get 笔记（biji.com）：把账号里的笔记同步成本地 Markdown 并检索；用 Get 的转写额度把视频、播客、本地音视频转成逐字稿。 触发：用户要同步或查 Get 笔记里的录音和笔记；给了抖音、小红书、B 站、小宇宙链接或本地音视频，要逐字稿。"
license: "MIT"
metadata:
  decimalai-skill-id: "2a50ad44-41ae-42c7-b5e5-e2b48f62a210"
  decimalai-version-id: "c7d1d321-e260-4f03-a73c-66224e4384a3"
  decimalai-version: "1"
  decimalai-body-sha256: "6cc92c729807406a8a7e009891c4ffb53830e91af18dfa524e68c96990a54cae"
  decimalai-name: "suyuan2022/get-biji"
  decimalai-format: "1"
  decimalai-invocation: "model"
  decimalai-category: "productivity"
  decimalai-source: "https://app.decimal.ai/s/suyuan2022-get-biji@1/SKILL.md"
---
# Get 笔记

两件事，共用一个 biji.com 登录态：

- **同步**：账号里的笔记（录音、链接、文字）存成 `<笔记目录>` 下按日期分的 Markdown，增量更新
- **转逐字稿**：链接或本地音视频交给 Get 转写，取回文字后删掉 Get 里的临时笔记

下文 `<skill-dir>` 是本文件所在的目录；`<状态目录>` 是环境变量 `GET_BIJI_HOME` 的值，没设就是 `~/.config/get-biji/`。登录态、同步记录和 `<笔记目录>` 的位置都记在 `<状态目录>`，重装 skill 不受影响。

## 首次准备

需要 Node.js 18 及以上。

```bash
cd <skill-dir> && npm install && npx playwright install chromium
```

chromium 约 250MB，只用来登录。装好的标志：`node -e "require('playwright')"` 不报错。按需再装：ffmpeg（含 ffprobe，转本地音视频时用），yt-dlp（下载其他网站的音视频时用）。

## 登录

没有登录态或登录态过期（约 90 天一次）时，任何脚本都会打开一个 Chrome 窗口，等用户登录 biji.com，最多等 10 分钟：

1. 先告诉用户：电脑上会弹出浏览器，请在里面登录 Get 账号，登录后窗口会自己关
2. 命令放后台跑，盯着输出：出现 `Login successful` 就是登录好了，脚本接着干原来的活
3. 报 `Cannot open a browser` 是机器没有图形界面（远程服务器、云端环境）：请用户在自己电脑上装好这个 skill 先跑一次，再把那台电脑的 `<状态目录>` 拷过来

## 同步

第一次同步先问用户笔记放哪，要绝对路径。录音转写是隐私，提醒他别放进会推到公开仓库的目录。

```bash
cd <skill-dir> && OUTPUT_DIR="<笔记目录>" node scripts/sync.js
```

之后不用再带 `OUTPUT_DIR`，脚本用记下的目录；想知道是哪个，看 `<状态目录>/config.json` 的 `outputDir`。带上新的 `OUTPUT_DIR` 就是换目录，会把全部笔记重新同步到新目录。

- `TEST_LIMIT=3`：只同步最新的 3 条，第一次可以先试，看看格式
- `SINCE_DATE=YYYY-MM-DD`：只同步这天及以后的，默认全部

第一次全量同步每条 1 到 2 秒，笔记多就放后台跑。退出码 0、结尾是 `Sync Completed`，就是全部同步好了。退出码 1 时结尾会列出失败的笔记，直接重跑，只补没拉下来的。

## 查笔记

先读 [`references/检索.md`](references/检索.md)：笔记文件长什么样，怎么由粗到细地搜。

搜之前先把新进 Get 的笔记补上，看 `<状态目录>/sync-state.json` 分两种：

- 有 `fullSyncAt`（本地是全的）：不带 `SINCE_DATE` 跑一次同步。它只拉还没拉过的笔记，录音卡隔几天才传上来的录音也补得到，平时几十秒就完。按日期窗口同步会漏掉窗口外晚到的录音，所以这种情况一律完整同步
- 没有 `fullSyncAt`（本地只同步过一部分，比如用户只试跑过）：完整同步会把所有没拉过的都拉下来，可能要很久，先别跑。问最近的事，用 `SINCE_DATE=<一个月前的日期>` 补一段再搜；不管问什么，回答时都说明本地不全、搜不到不等于没有，问用户要不要全量同步

每次同步都要把 Get 的笔记列表从头翻一遍，笔记多的账号光这一步就要几十秒到一两分钟。

## 转逐字稿

```bash
cd <skill-dir> && node scripts/link-transcript.js "<链接>" --json
cd <skill-dir> && node scripts/link-transcript.js --file "<本地路径或媒体直链>" --json
```

链接和路径都加引号，分享链接里的 `?`、`&` 会被 shell 吃掉。

按来源选路，免费的先走：

| 来源 | 走法 | 额度 |
|------|------|------|
| 抖音、小红书、B 站（认 `?p=N` 分 P）、小宇宙链接 | 链接解析 | 不扣 |
| 链接解析报错，或其他网站的音视频 | 先下载到本地（比如用 yt-dlp），再 `--file` | 按时长扣 |
| 本地音视频 | `--file` | 按时长扣 |
| YouTube | 用别的工具拿字幕：Get 会抓到错误语言的字幕轨 | — |

`--file` 按音频时长扣每月的转写额度，四舍五入到分钟，同一个文件重复传也照扣；单个文件最长 3 小时、最大 1GB。上传前先看时长：`ffprobe -v error -show_entries format=duration -of csv=p=0 "<文件>"`（单位秒），告诉用户大约扣几分钟，超过 30 分钟的等他确认。

stdout 只有一行 JSON：

- `title`、`url`：标题和规范化后的链接
- `text`：给用户的正文
- `source`：`get-corrected` 是 Get 按提示词出的纠错稿，直接交付；`get-raw`（链接解析）和 `get-upload-raw`（`--file`）是原始识别，专有名词和同音字常错，先纠错再交付。出不出纠错稿由 Get 决定，同一个平台也会变，以这个字段为准
- `raw`：原始识别全文；`corrected`：来源是纠错稿时就是 `text`，来源是原始识别时是 Get 的智能总结
- `minutes`：`--file` 实际扣的分钟数

逐字稿太长、不适合直接贴在对话里时，问用户存到哪个文件。

### 纠错原始识别

按段切成约 3000 字的块，每块只改错别字、同音字和品牌型号等专有名词，补全标点；时间戳、分段、说法和内容一律原样保留。`corrected` 里的智能总结专有名词基本是对的，拿来当参照。一块纠完长度变了 15% 以上，说明被删改了，这块退回原文。逐字稿长的，分块交给更便宜的模型并发去纠。

## 出问题时

- 反复要求登录、或者登录相关报错：删掉 `<状态目录>` 里的 `token-cache.json` 和 `auth-state.json`，重新运行登录
- 同步记录丢了（换了电脑、删了 `<状态目录>`），但笔记目录还在：带上 `OUTPUT_DIR` 跑 `node scripts/rebuild-state.js`，按硬盘上已有的文件重建记录，缺的下次同步补上
- 同一条笔记出现多个总结文件：`node scripts/dedupe.js` 按 note_id 去重，留最大的那份，连同它配对的原文文件一起删
- 转逐字稿时加 `--keep`，Get 里的临时笔记会留着不删，排查用
