导语
因为 Ankiweb 的服务器实在太慢,另外有网友指出,Anki 可能是一个个人项目,指不定哪天就不见了。稳妥起见,打算趁着寒假的空闲自建一个 Anki 服务器(这样就能好好背单词了)。然而事实证明建这个 Server 的时间能做不少东西……在此记录遇到的坑,想到的一些解决方案,作为纪念,也供将来折腾的人参考。
由于网上自建服务器的教程很多,重复之处不再赘述。我的目的是补充现有教程很多过时(out of date)的地方。考虑到一部分自建 Anki 的同学在技术操作上存在困难,先说结论:
- 目前 Anki (Windows)最新版本为 2.1.8, Ankidroid 最新版本为 2.8.4。
- 我的同步方案最高支持 Anki 2.1.7,尽管 Sync-Server 称支持 Anki 2.1,但是其声明了最高测试过支持 2.1.7,并且 2.1.7 和 2.1.8 在同步部分的代码有些不一样。建议在官方出解决方案之前不要使用 2.1.8 版本。
- Github 有如下两个 anki-sync-server 的项目:
前者更新于若干年前。后者近期仍然有更新,就是最高支持 2.1.7 的版本(不知道 Ankiweb 用的是啥?)。刚开始一直用旧版同步服务,PC 的 anki 2.1 一直连不上……
Em……简要地说明下步骤。
操作步骤
我的环境是 Debian 9.5,git clone 下 https://github.com/tsudoko/anki-sync-server 的代码,按照 README.md 中的 Installing 步骤安装。解决完依赖之后,根据需要修改 ankisycd.conf。我的是这样的:
需要修改 host 以及 data_root、auth_db_path、session_db_path 的目录,注意创建好所需的目录。
完成后 cd ankisyncd 进入主程序的目录,执行:
1 | nohup python3 __main__.py & |
PC 上的 Anki,以插件的形式在程序 load 时修改同步的 URL.
在 addons21 目录创建一个空文件夹,名称任意,然后把前述 anki-sync-server 下的 addon 目录内的内容拷进来,修改两个文件中的 URL为自己的同步的地址。Anki 2.1.8 使用这个脚本会报错,不知道为什么。
但是还存在一个问题,就是 Anki2.1.7 每次打开时仍然向Ankiweb 请求同步,然后返回密码错误。目前还没找到默认登录的URL存在哪。点击右上角的“同步”再重新输入用户名、密码就好了。因为平时使用手机端,电脑端只用来批量添加卡片,所以不算特别麻烦。
写在后面
这次折腾,我感觉 Github 真是个好平台,每个人可以提 issue,交流软件相关内容,但是项目缺乏主心骨,有些资料很乱(比如用的 fork 之后的 anki-sync-server 不能像老版本一样 ./ankisyncctl.py start ……咦,程序入口呢?),也不知道 ankiweb 所使用的版本(因为他们的server对接 anki2.1.8 没异常)。
一开始是想尽快搞定,用了很多网上的方法(主要是简书和知乎上的文章),但是大多数文章基于 Anki 2.0.x,“打开插件目录”这一项在 2.1.x 版本中就没有。这也浪费了我很多时间。
1 | import anki.sync |
这个插件的代码好像只最高支持 2.0.x 版本,之后草草翻了一下 2.1.8 版本的代码,是这么写的:
1 | # deck schema & syncing vars |
没有出现 SYNC_MEDIA_SYNC ,也曾经想试过自己 build 一个 Anki,这样能实时调试,说不定还可以提交 commit ! 但是个人对 PyQt 实在不了解。刚开始想到这个方法,感觉尽管 Qt 套件和 python 均支持跨平台,代码可以直接移植,但是有关资料几乎没有,就放弃了,直到写这篇博客的时候,发现 Anki 源代码根目录下有个 Python3 文件 runaki:
1 | cd .. |
可能可以用来执行。因为没有安装 pyaudio,等有空的时候再研究研究更完美的解决方案。
一更
在 Anki 打开的过程中,关闭它的“正在同步”框,进入主界面后再点同步,就不用次次输密码了。
参考资料
-
Github 搜索 “anki sync”