乐于分享
好东西不私藏

Obsidian 插件,让本地笔记和腾讯 IMA 知识库自动双向同步

Obsidian 插件,让本地笔记和腾讯 IMA 知识库自动双向同步

      你有没有过这种时刻:笔记写在 Obsidian 里,资料却躺在腾讯 IMA 知识库里。两头的搜索各跑各的,复制粘贴传到手软,改了一版还得再传一次。

01 为什么要做

       本地文件和云端知识库之间的割裂,是很多知识工作者的日常。Obsidian 胜在本地优先、双向链接、可玩性高;IMA 胜在多端同步、AI 问答、团队共享。可惜两者之间的那道墙,过去只能靠人肉搬运来翻。

       我受够了来回倒。于是写了 iam_tongbu,一个 Obsidian 插件,名字取「IAM同步」的意思,把本地文件夹和 IMA 知识库连成一条双向管道。

02 iam_tongbu 能做什么

它现在提供 3 项核心能力:把本地文件夹上传到 IMA、从 IMA 手动下载文件、让 IMA 自动下载镜像到本地。配置一次,剩下的交给定时任务。

03 能力一:上传,本地文件夹到 IMA

在设置里指定一个本地文件夹,把它映射到某个 IMA 知识库。插件按你设定的时间间隔去轮询,把新增和修改的文件同步上去,不必实时占用接口。

底层走的是 IMA OpenAPI(ima.qq.com/openapi),鉴权头部是 ima-openapi-clientid 和 ima-openapi-apikey。这里有个坑我记了很久:IMA 的上传实质是腾讯云 COS 的直传。

COS v5 签名要用 HMAC-SHA1,把 host 和 content-type 算进签名。但发送时不能手动设 host,否则 Electron 的 net.request 会直接抛 ERR_INVALID_ARGUMENT。最稳的做法是传 ArrayBuffer,让底层自动补 content-length,签名正确就够了。

04 能力二:下载,IMA 到本地

反过来,你也可以把 IMA 知识库里的文件取回本地。点 ribbon 上的云形下载图标,或在命令面板搜「从 IMA 知识库下载到本地」,先选知识库,再勾文件,最后选目标文件夹。

下载链路分三步:先调 get_knowledge_list 拿到条目清单(注意字段是 knowledge_list,不是 info_list,我在这踩过一次);逐条调 get_media_info 拿到签名下载地址 url_info.url;再用一个带签名的 GET 把内容拉回来。

media_type 覆盖了 PDF、网页、docx、pptx、xlsx、Markdown、笔记、txt、xmind、mp3 等类型,文件夹(类型 99)会自动跳过。

05 能力三:自动下载,把 IMA 镜像到本地

如果你只想让某个 IMA 知识库「镜像」到本地,打开文件夹配置里的「自动下载」开关就行。插件每 30 秒轮询一次 scheduledSync,对开启了自动下载的映射,自动把云端更新落回本地指定目录。

重名策略有三种可选:跳过、覆盖、或保留两者。我一般用「保留两者」,避免覆盖自己正在改的稿子。

06 几个实现细节,和怎么装

说几个值得记的实现点。定时同步用 main.ts 里的 registerInterval,每 30 秒触发一次,开销很低。空值 IMA 头(url_info.headers 里偶尔出现空字符串)在 fetchMediaContent 里做了过滤,实测不带额外头也能拿到 200,签名 URL 是自洽的。文件名做了 sanitize,扩展名按 media_type 和 content-type 双重推断,减少乱码和打不开的情况。

安装步骤:

1. 把插件放进 vault 的 .obsidian/plugins/iam_tongbu/。

2. 在设置里填 IMA 的 clientid 和 apikey。

3. 添加同步文件夹,选上传或自动下载,设好轮询间隔。

4. 重载 Obsidian。

收束

这个插件,就是为了解决一件很小但很烦的事:让笔记和知识库不再各说各话。如果你也在用 Obsidian 和 IMA,欢迎试试,也欢迎来提需求。下一步我打算把下载计划和上传计划拆开,再做增量同步,只拉改过的那部分。

留言获取插件