anki本地服务器同步

2,030 阅读5分钟

以下内容 基于PC端 anki 2.15 、Android端 AnkiDroid 2.97 采用 Ankisyncd 在同一无线网连接下同步 所写

PC端 anki 2.15 下载** 、 **Android端 AnkiDroid 2.97 下载

本人已有环境

pc端:

	python 3.7
	pip 20.1
	anki 2.15
    win10(1909)专业版自带的ubutun

Android端:

	ankidroid 2.97

在PC端进行本地服务器配置

开始栏启动ubutun,设置用户名及密码。(第一次用的话需要设置)

下载安装git

$ sudo apt-get install git

新建一个文件夹(也就是下面服务器所在文件夹)并打开,shift+鼠标右键打开Linux shell 键入如下命令

$ git clone https://github.com/FanPenglei/anki-sync-server.git

然后cd

$ cd anki-sync-server

接着update

$ git submodule update --init

继续cd

$ cd anki-bundled

然后

在最初建的空文件夹里边找到anki-sync-server文件夹,打开里面的anki-bundled文件夹,选择并打开requirements.txt,将pyaudio这一行删掉,然后保存文件。 接下来关掉ubutu, 在anki-bundled文件夹中shift+鼠标右键打开Power shell,依次怼入下面代码下载三方库,这个cmd窗口暂且称之为cmd1

pip install -r requirements.txt
pip install webob

等三方库下载完用下面这个后查看本机ip地址

ipconfig

记着这个ip地址,下面要用

anki-sync-server文件夹中shift+鼠标右键打开Power shell,这个称之为cmd2

在cdm2中

python ankisyncctl.py adduser <username>

<username>改为你想要设置的账户名 然后回车根据提示,键入密码 接着(还是在cmd2中)

python -m ankisyncd

可以看到最后一行的27701

在浏览器地址中输入ip和27701如下: 192.168.1.7:27701/

如果出现Anki Sync Server则说明本地服务器配置完成了,这时cmd1没用了可以关掉,但cmd2不要关(关掉就相当于是把服务器给关了)

配置PC端anki

打开anki 工具附加组件查看文件addons21文件夹中新建一个名为ankisyncd的文件夹并打开,新建文件命名为__init__.py,用记事本打开它输入以下内容

import anki.sync, anki.hooks, aqt

addr = "http://192.168.1.7:27701/" # put your server address here
anki.sync.SYNC_BASE = "%s" + addr
def resetHostNum():
    aqt.mw.pm.profile['hostNum'] = None
anki.hooks.addHook("profileLoaded", resetHostNum)

注意:其中第三行ip地址为刚才输入浏览器的地址 然后重启anki,同步时账户选择之前cmd2中设置的账户密码(如果同步失败则原因可能是:服务器断了,此时需要重新启动服务器,也就是在anki-sync-server文件夹中shift+鼠标右键打开Power shell输入python -m ankisyncd

配置Android端ankidroid

设置→高级设置→自定义服务器→使用自定义服务器 然后就可以登录之前设置的本地账户进行本地同步了

注意:ip地址和前面保持一直;是http不是https。由于AnkiDroid 从 2.10 开始强制使用 https,所以要用最简单的办法是退回 2.9 版本,禁止更新即可。(GitHub 上 2.9.7 版的下载地址

在桌面快速打开服务器

anki-sync-server文件夹中新建记事本任意名字.txt并打开输入

cmd /k "python -m ankisyncd"

保存后将后缀改为bat 最后将该文件发送到桌面快捷方式即可,下次直接在桌面双击该快捷方式即可启动服务器。

补充

  1. 电脑重启后不能用了: 问题可能在电脑重新连接无线网了,这时路由器给电脑分配的ip地址变了。解决办法是将上述配PC端anki步骤时的那个__init__.py文件中的ip地址改为新的,然后Android端的也改一下。---------------此处换行--------------- 因为比较懒,不想每次同步时都改ip,所以将__init__.py文件中的内容替换为如下:
import socket
def get_host_ip():
    """
    查询本机ip地址
    :return: ip
    """
    try:
        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        s.connect(('8.8.8.8', 80))
        ip = s.getsockname()[0]
    finally:
        s.close()
    return ip

import anki.sync, anki.hooks, aqt
# addr = "http://192.168.1.3:27701/" # put your server address here
addr = get_host_ip() + ":27701/"
anki.sync.SYNC_BASE = "%s" + addr
def resetHostNum():
    aqt.mw.pm.profile['hostNum'] = None
anki.hooks.addHook("profileLoaded", resetHostNum)

替换之后PC端就不用每次手动去改ip了,但是Android端还需要老老实实的去改ip(小想法:通过邮箱把新ip发送到手机?!!以后再说吧)

  1. 切换到新的无线网: 参考上面,重新搞ip
  2. anki(ankidroid)不要更新

参考

FanPenglei/anki-sync-server

anki中国


md,有瑕疵,完美用了三天后,pc端anki无法同步了,Android端没问题。再说吧,反正我不怎用电脑看anki

同步失败:
Traceback (most recent call last):
  File "aqt\sync.py", line 409, in run
  File "aqt\sync.py", line 432, in _sync
  File "lib\site-packages\anki\sync.py", line 572, in hostKey
  File "lib\site-packages\anki\sync.py", line 552, in req
  File "lib\site-packages\anki\httpclient.py", line 36, in post
  File "lib\site-packages\requests\sessions.py", line 581, in post
  File "lib\site-packages\requests\sessions.py", line 533, in request
  File "lib\site-packages\requests\sessions.py", line 640, in send
  File "lib\site-packages\requests\sessions.py", line 731, in get_adapter
requests.exceptions.InvalidSchema: No connection adapters were found for '192.168.1.3:27701/sync/hostKey'

一个简单粗暴解决上述问题的办法,慎用,媒体文件可能会全丢失,主要还是我写的cmd命令太粗糙,需要完善(单独用一个命令来复制媒体文件夹)

从服务器上下载(复制)数据到pc端anki:(cmd命令中淦)

  1. 首先删除anki个人账户下的数据(注意路径及anki中设置的用户名)
  2. 然后将服务器数据复制到anki中 (至于为什么不直接复制,我在cmd中直接复制时需要y/n进行确认,如果先把数据给删了则复制时就不需要确认了。至于写道bat中怎么进行确认 我没试所以不知道,,,)
del /F /S /Q C:\Users\fpp\AppData\Roaming\Anki2\1\*.*
copy C:\ankilocal\anki-sync-server\collections\123\*.* C:\Users\fpp\AppData\Roaming\Anki2\1

将数据上传(复制)到服务器则将上面改下就行。

del /F /S /Q C:\ankilocal\anki-sync-server\collections\123\*.*
copy C:\Users\fpp\AppData\Roaming\Anki2\1\*.* C:\ankilocal\anki-sync-server\collections\123

最后将这个cmd命令改写成bat文件(参考上面快速启动服务器)