飞书笔记剪藏 & Obsidian 同步

在飞书里把链接发给机器人 → 本站自动清洗正文(trafilatura 主清洗 + yt-dlp 视频分支 + 手写规则兜底)→ Obsidian 插件一键同步到本地笔记库。

💬 飞书发链接
🧹 服务器清洗正文
🗄 存入笔记库
📥 Obsidian 同步

① 飞书应用配置(一次性,约 10 分钟)

  1. 打开 飞书开放平台,登录后点「创建企业自建应用」,名称建议填 笔记剪藏
  2. 左侧「添加应用能力」,开启 机器人 能力。
  3. 左侧「权限管理」,搜索并开通以下权限:
    • im:message.p2p_msg:readonly — 接收用户发给机器人的单聊消息
    • im:message.group_at_msg:readonly — 接收群里 @机器人 的消息
    • im:message:send_as_bot — 机器人回复「已保存 ✅」(可选)
  4. 左侧「事件与回调」→ 订阅方式选择 「将事件发送至开发者服务器」,请求地址填:
    https://note.ahpengchuang.net/feishu/callback
    首次保存时飞书会发送 URL 校验请求,服务端已实现自动应答。
  5. 同一页面下方「加密策略」里能看到 Encrypt KeyVerification Token,把这两个值抄下来,下一步填到服务器配置里。
  6. 「事件与回调」→「添加事件」→ 搜索并订阅 接收消息 v2.0im.message.receive_v1)。
  7. 「版本管理与发布」创建版本并发布(企业管理员审批通过后生效)。
💡 单聊里直接发链接即可触发;群聊里需要 @笔记剪藏 再发链接。

② 服务器端配置(SSH 一次)

把飞书应用凭据填进服务端配置文件:

vim /www/wwwroot/note.ahpengchuang.net/config.json

{
  "api_token": "…………",              # Obsidian 插件用的令牌,本文件里查看
  "feishu": {
    "app_id": "cli_xxxxxxxx",        # 飞书应用凭证页
    "app_secret": "xxxxxxxx",        # 飞书应用凭证页
    "encrypt_key": "xxxxxxxx",       # ①-5 抄下来的 Encrypt Key
    "verification_token": "xxxxxxxx",# ①-5 抄下来的 Verification Token
    "reply_enabled": true
  },
  "ytdlp_enabled": true,             # 视频链接分支开关(仅对视频站点生效)
  "ytdlp_timeout": 60,
  "fetch_timeout": 15
}

改完重启服务:

systemctl restart note-sync
journalctl -u note-sync -n 30 --no-pager
💡 api_token 是 Obsidian 插件的访问令牌,首次部署时已自动生成,就在这个文件里。泄露后改掉并 systemctl restart note-sync 即可。

③ Obsidian 插件安装与设置

安装(手动安装,无需第三方市场)

  1. 下载以下 3 个文件,放到你的仓库目录 <你的仓库>/.obsidian/plugins/feishu-note-sync/(文件夹需自建):
  1. 打开 Obsidian → 设置 → 第三方插件 → 关闭「安全模式」(如果还开着)→ 在已安装插件里启用 Feishu Note Sync
  2. 进入该插件设置,填写:
    • 服务器地址https://note.ahpengchuang.net(默认已填好)
    • API Token:服务器 config.json 里的 api_token
    • 同步文件夹:默认 飞书剪藏,可自行修改
    • 自动同步间隔:默认 10 分钟,填 0 只手动同步
  3. 点「测试连接」,提示「连接成功,服务端共 N 篇笔记」即配置完成。

插件功能一览

  • 左侧栏云朵图标 / 命令面板「立即同步」— 拉取新笔记
  • 命令「重新同步全部」— 清除进度从头同步(已在库里的笔记自动跳过,不会重复)
  • 命令「打开使用教程」— 在浏览器打开本页
  • 自动同步:按设置的间隔在后台静默拉取

④ 笔记同步使用教程(日常流程)

第 1 步:在飞书里发送链接

  • 单聊:直接给机器人发一条含链接的消息,如 https://example.com/some-article;也可以先写一句评论再贴链接。
  • 群聊@笔记剪藏 看看这篇 https://…
  • 富文本消息里插入的超链接同样能被识别;一条消息最多处理 3 个链接。
  • 机器人会回复:✅ 已保存《文章标题》,可在 Obsidian 同步查看。

第 2 步:服务器自动清洗

链接类型处理方式说明
普通网页 / 公众号 / 新闻trafilatura 主清洗主力 提取标题、作者、日期与正文,输出 Markdown(含图片与表格)
B站 / 抖音 / 西瓜 / 腾讯视频 / 快手 / YouTubeyt-dlp 视频分支按需开启 只取标题、UP主、时长、播放量、简介等元数据,不下载视频;仅对上述视频站点触发,不会常开。可在 config.json 用 ytdlp_enabled 关闭。注意:B站等对云服务器 IP 有反爬(HTTP 412),此类链接可能清洗失败并明确报错
反爬 / 结构特殊的页面手写规则兜底 og: 元信息 + 正文容器 + 逐行去噪的正则方案

第 3 步:同步到本地 Obsidian

  1. 点左侧栏云朵图标(或命令面板 →「立即同步」)。
  2. 新笔记出现在 飞书剪藏/ 文件夹,文件名即文章标题。
  3. 每篇笔记头部自动带 frontmatter 属性:
---
title: "文章标题"
source: https://原始链接
note_id: 12
extractor: trafilatura   # 或 yt-dlp / rules
created: 2026-09-12 10:30:00
---
  • 同步按 note_id 增量进行,只拉新笔记;重复同步不会产生重复文件。
  • 正文末尾保留「来源」链接,点击可回跳原文。
💡 想手动验证清洗效果?在服务器或本机执行:
curl -X POST https://note.ahpengchuang.net/api/clean \
  -H "X-Api-Token: 你的TOKEN" -H "Content-Type: application/json" \
  -d '{"url":"https://某篇文章"}'

⑤ 常见问题

  • 飞书保存回调地址时提示校验失败?
    确认服务器 config.json 已按①-5 填好 Encrypt Key 后 systemctl restart note-sync;若应用开启了加密策略,未配置密钥时校验会失败。
  • 发链接机器人没反应?
    ① 应用是否已发布生效;② 群聊是否 @ 了机器人;③ 权限是否包含对应的消息接收权限;④ journalctl -u note-sync -n 50 看服务日志。
  • 回复「⚠️ 清洗失败」?
    目标网站反爬或需要登录。B站等站点对云服务器 IP 有反爬限制(HTTP 412),视频链接可能失败;普通文章链接不受影响。可稍后重试,或改用截图等其它方式收藏。
  • 收到重复消息?
    服务端已按 message_id / event_id 幂等去重,重复推送不会重复入库。
  • 插件同步报 Token 无效?
    核对插件设置里的 Token 与服务器 config.jsonapi_token 是否一致;更换后需重启 note-sync 服务。

⑥ API 一览(开发者)

接口方法鉴权说明
/feishu/callbackPOST飞书验签事件回调:URL 验证 / 加解密 / 幂等 / 异步清洗
/api/pingGETX-Api-Token连通性与笔记总数
/api/notes?since_id=0&limit=50GETX-Api-Token增量笔记列表(id, title, excerpt, source_url…)
/api/note/<id>GETX-Api-Token笔记全文 content_md 与元数据
/api/cleanPOSTX-Api-Token{"url":"…"} 手动清洗一条链接
/healthzGET健康检查

清洗管线安全约束:仅允许 http/https;请求前校验 host,拒绝 localhost、环回、私有和保留地址;重定向逐跳复检;下载上限 4MB。