乐于分享
好东西不私藏

我给 Anki 做了一个插件备份工具,换电脑终于不用重新找插件了

我给 Anki 做了一个插件备份工具,换电脑终于不用重新找插件了

墨池有雨

读完需要

12

分钟

速读仅需 4 分钟

我给 Anki 做了一个插件备份工具,换电脑终于不用重新找插件了

AnkiWeb 可以同步牌组和卡片,但不会同步本地插件。这个小工具解决的就是这件特别具体、特别烦人的事,把插件 ID 存进牌组,也把整个插件目录打包到自己的 WebDAV 里。

故事是这样的。

我最近在折腾 Anki。

准确说,是在折腾 Anki 插件。

折腾着折腾着,突然意识到一个特别朴素,但又特别烦的问题。

AnkiWeb 可以同步你的牌组。

可以同步你的卡片。

可以同步你辛辛苦苦攒下来的知识库。

但它不会同步你的插件。

不会。

一个都不会。

这事儿听起来好像没什么。

直到你真的换了一台电脑。

或者重装了一次系统。

然后你打开一个干干净净的 Anki。

看着那个空荡荡的插件列表,脑子里开始闪回。

我之前装过哪个插件来着?

那个能改界面的叫什么来着?

那个批量处理笔记的插件,ID 是多少来着?

还有那个我自己魔改过一点点的小插件。

配置文件是不是也没了?

尼玛。

那一刻,你就会发现,Anki 这个东西最有意思的地方之一,反而是最容易被忽略的地方。

它不只是一个记忆软件。

它更像一个被你长期驯化过的工作台。

牌组是你的知识。

插件是你的手感。

而手感这玩意,一旦丢了,真的很难受。

说真的,我以前也没有特别在意这个问题。

大不了重装嘛。

插件 ID 再搜一下嘛。

配置再调一遍嘛。

听起来都很简单。

但你想想看,一个长期使用 Anki 的人,电脑里可能装了十几个,甚至几十个插件。

有些插件是 AnkiWeb 上公开发布的,有数字 ID。

有些插件是自己从 GitHub 下的。

有些插件是别人发你的压缩包。

有些插件你还手动改过一两行代码。

更骚的是,越来越多插件会在自己的目录里存一些配置,缓存,状态文件。

这些东西平时安安静静待在那里,你根本感觉不到它们存在。

直到某一天,它们没了。

你才发现。

哦豁。

我之前那个环境,原来是被这么多小东西一点点搭起来的。

牌组是你的知识,插件是你的手感。而手感这玩意,一旦丢了,真的很难受。

这就有点像搬家。

你以为你要搬的是几件大家具。

结果真正让你崩溃的,是抽屉里那些零零碎碎的小东西。

数据线。

旧钥匙。

不知道什么时候买的螺丝刀。

还有一张你也不知道有没有用,但就是不敢扔的小票。

Anki 插件目录,差不多就是这么个东西。

所以我这两天,鬼使神差的,给自己写了一个小插件。

名字很朴素。

插件备份。

英文名也很朴素。

Addon Backup。

我本来只是想解决一个很简单的问题。

换电脑的时候,别再让我重新回忆我到底装过哪些插件了。

一开始的方案也很简单。

把所有 AnkiWeb 公开插件的数字 ID 扫出来。

写进一个叫 @插件备份@ 的牌组里。

这个牌组跟普通牌组一样,可以跟着 AnkiWeb 同步。

换电脑以后,只要这个牌组同步回来了。

你点一下复制插件 ID。

再打开 Anki 的获取插件,把 ID 粘进去。

完事。

这条路线很轻。

很稳。

也很符合 Anki 官方的安装方式。

但写着写着,我发现这事儿只解决了一半。

因为插件 ID 只能帮你重新安装公开插件。

它救不了你的插件目录。

它救不了你本地安装的插件。

它也救不了那些藏在插件目录里的配置文件和运行数据。

而我真正想要的,其实不是一份插件名单。

我想要的是把整个插件环境,尽量原样搬走。

于是就有了第二条路线。

WebDAV。

说到 WebDAV,很多朋友可能第一反应是,怎么又是这个老东西。

但我一直觉得,WebDAV 这玩意有一种非常迷人的老派感。

它不炫酷。

它不性感。

它没有什么 AI Native 的光环。

但是它真的到处都能用。

坚果云能用。

Nextcloud 能用。

ownCloud 能用。

群晖能用。

Koofr 能用。

InfiniCLOUD 也能用。

就像一个平时不怎么说话的老工程师,衣服有点旧,头发有点乱,但你真遇到问题的时候,他默默掏出一套工具箱,咔咔两下就给你修好了。

我对这种东西是有感情的。

所以这个插件现在做的事也很直接。

你在 Anki 里打开工具。

找到插件备份。

里面有一个 WebDAV 设置。

填 WebDAV 地址。

填用户名。

填密码。

填远端目录。

然后点备份插件目录到 WebDAV。

它会把本机已安装插件目录打成一个 zip。

名字大概长这样。

anki_addons_backup_20260705_041928.zip

里面会有一个 backup_manifest.json,记录这次备份的信息。

然后所有插件目录会放在 addons/ 下面。

恢复的时候也很朴素。

新电脑先装这个插件。

填同一个 WebDAV。

点从 WebDAV 恢复插件目录。

选一个备份包。

选择要不要覆盖本地同名插件目录。

恢复完重启 Anki。

大概就这样。

听着很简单对吧。

但真正写的时候,最麻烦的地方反而不是上传下载。

而是安全。

我跟你说,写恢复功能的时候,人会天然变得老阴逼。

因为只要涉及解压 zip。

只要涉及覆盖目录。

只要涉及删除旧文件。

你脑子里就必须一直有一个声音在问。

如果这个 zip 里面有人塞了 ../ 怎么办?

如果它想把文件解压到插件目录外面怎么办?

如果文件名里混了反斜杠怎么办?

如果用户选了覆盖,结果新目录移动到一半失败了怎么办?

如果 Anki 重复加载插件,菜单挂了两次怎么办?

这些问题看起来都很边角料。

但它们决定了一个工具到底是能用,还是只是看起来能用。

备份工具最怕的不是功能少,而是假装稳。真到恢复那一步,它手里拿着的就是你的插件目录。

我这次专门做了一轮对抗性调试。

听着有点正式。

其实就是自己当自己的黑粉,疯狂想办法搞坏它。

比如远端备份文件名,我现在只允许它是一个单独文件名。

必须长得像 anki_addons_backup_*.zip

../xxx.zip 不行。

sub/xxx.zip 不行。

Windows 反斜杠绕一下,也不行。

WebDAV 远端目录也做了清洗。

. 和 .. 这种东西直接拒绝。

zip 包里面也一样。

绝对路径不行。

路径穿越不行。

双斜杠异常路径也不行。

而且恢复的时候,不是上来就把你原来的插件目录删了。

它会先解压到临时目录。

确认路径都没问题。

再移动到目标位置。

如果你选择覆盖,旧目录会先被挪到回滚目录里。

新目录移动成功,旧目录再删。

新目录移动失败,就尽量把旧目录挪回来。

这事儿做完之后,我还专门写了一个 test_security.py

以后不管是我自己换电脑,还是哪天换个 AI 继续开发,第一件事就是跑它。

python test_security.py

看到 security tests ok,心里就踏实一点。

说实话,这种小工具最容易被写成一次性脚本。

当下能跑就行。

反正给自己用嘛。

但我越来越觉得,工具只要准备给别人用,就不能只停留在给自己用的状态。

尤其是 Anki 这种东西。

它面对的不是一次性任务。

它面对的是人的长期记忆。

它被很多人放在电脑里,一用就是几年。

这种软件生态里的小插件,哪怕功能很小,也应该尽量诚实一点,稳一点。

至少不要一恢复,把人家插件目录干碎了。

那就太特么尴尬了。

当然,这个版本也不是没有问题。

WebDAV 密码现在还是明文保存在插件目录里的 webdav_config.json

我不想藏着这个点。

它就是明文。

所以我在代码里做了两件事。

第一,webdav_config.json 不会被打进发布包。

第二,它也不会被打进 WebDAV 备份包。

但我还是建议,如果你用第三方网盘,尽量开一个应用专用密码,不要直接把主账号密码填进去。

这是一个很现实的取舍。

如果要做得更安全,可以接系统密钥环,可以做加密,可以做更多跨平台适配。

但那会让这个插件复杂很多。

我现在更想先把一个能理解,能维护,能迁移的版本做出来。

愚钝如我,还是比较相信简单系统的生命力。

回到这个插件本身。

它其实解决的是一个很小的问题。

小到大部分人平时不会想起它。

但只要你真的遇到一次,就会觉得,卧槽,这个东西我怎么之前没有。

这也是我一直喜欢做小工具的原因。

它们不一定宏大。

不一定改变世界。

也不一定有什么惊天动地的技术含量。

但它们会在某一个非常具体的时刻,替你挡掉一点点麻烦。

有时候,技术最动人的地方,不是把一个人变得多么强大。

而是让一个人不用在重复的麻烦里消耗自己。

不用重新找一遍插件。

不用重新调一遍配置。

不用在换电脑那天,对着空白的插件列表发呆。

这就够了。

大时代当然很重要。

AI 当然很重要。

Agent,Claude Code,Codex,Deepresearch,这些东西都很让人兴奋。

但人的日常工作流,最后往往就是由这些很小的螺丝钉撑起来的。

一个备份。

一个恢复。

一个可以带走的插件目录。

一个不用重新开始的 Anki。

坦率的讲,我做这个东西,也不是什么宏大的产品规划。

就是某个凌晨,看着自己的插件目录,突然觉得。

这玩意,应该能被带走。

于是就写了。

如果你也是 Anki 重度用户。

如果你电脑里也装了一堆插件。

如果你也经历过换电脑以后重新找插件的痛苦。

可以试试这个小东西。

安装包叫 addon_backup.ankiaddon

安装方式也很普通。

Anki 里打开工具,插件,从文件安装。

选这个文件。

重启。

然后在工具菜单里找到插件备份。

如果你只想保存插件 ID,就点备份插件 ID 到牌组。

如果你想完整保存插件目录,就去 WebDAV 设置里填账号,然后备份插件目录到 WebDAV。

恢复的时候也一样。

新电脑装插件。

填 WebDAV。

从 WebDAV 恢复插件目录。

记得重启 Anki。

就这样。

希望它能在某一次你换电脑的时候,帮你少骂两句。

哪怕,只是少骂很小很小的两句。

那我也觉得,这个插件就有点用了。

以上,既然看到这里了,如果觉得不错,随手点个赞、在看、转发三连吧,如果想第一时间收到推送,也可以给我个星标⭐~

谢谢你看我的文章,我们,下次再见。

/ 作者,墨池有雨
/ 插件获取,ID:237806660