首先将有道云协作中需要备份的笔记保存到云笔记中,保存完毕后应该会在笔记本'我的资源'中看到一个新的笔记本'来自云协作',该笔记本内包含了从云协作保存到云笔记的笔记.
然后需要获得云笔记的备份文件.选择右上角倒数第四个图标 --> 导出 --> 有道云笔记 文件,得到所有笔记的备份文件,后缀名应该为.ynt(有道云笔记3.x导出的好像是.ynote格式,这两种是不一样的).该备份文件包含了所有的笔记内容和笔记中的文件和附件.
获得了所有个人笔记的.ynt备份文件后,用压缩软件打开该文件,解压后,得到一个文件夹.文件夹包含一个Note文件夹,Note文件夹内一个子目录的树状结构大约如下所示:
├─B9A878F3963D404B95BDAEA2DFA964F (笔记文件夹)
│ │ Content (笔记内容)
│ │ Info (笔记标题)
│ │
│ └─Resources
│ ├─52A96111A6D949CAB2B85B9C00B3DA6 (附件所在文件夹)
│ │ Content (附件内容)
│ │ Info (附件引用名称和文件名)
│ │
│ └─D8F40AEFEA9D4FAD9D4A4291AB655F5
│ Content
│ Info
... ... ... ...
首先Note的子文件夹对应一个笔记,其中Info存储了笔记的标题,以及链接(详细信息--来源),获取标题基本足够了;Content文件存储了笔记的内容,解析出来是html格式的;笔记的附件,包括笔记中的图片,保存的pdf,office文档,压缩包,exe或其他类型的文件等,其Info文件中存储了长度为32的一串字符(后文就称作附件散列吧),在笔记内容中通过这长度32的字串(附件散列),来引用相应的文件,Content是未修改的附件原文件,如果知道附件类型,比如是jpg图片,那直接把Content文件重命名为Content.jpg就可以用看图软件打开看到图片了,其他格式同理.这里需要注意一下,附件所在的文件夹的名字(长度32的字串)和附件散列是不一样的.
以上获得了所有的笔记,不过缺失了笔记本的结构特征(即笔记是存在哪个文件夹里的,文件夹之间又是什么样的层级关系).按照道理,备份文件中应该会存储笔记本结构的,不过我并没有找到.这里有一个替代方案,就是可以在安卓版的有道云笔记的数据中找到sqlite的数据库文件,里面存储了所有笔记本名称,上级目录和子目录,可以恢复所有笔记的存储结构.
首先需要一台拥有root权限的安卓机,安装好有道云笔记,登陆账号,同步后.用Root Explorer(或其他什么文件浏览器)进入到/data/user/0/com.youdao.note.找到文件夹databases,会发现一个几兆左右(视笔记的多少而定)以用户邮箱命名的db文件,将这个数据库文件拷贝到电脑,用sqlite browser或其他什么sqlite数据库的浏览器打开,可以看到里面存了很多表.note_meta表中存储了所有的笔记的标题,摘要,所属笔记本等信息;note_books表中存储了所有笔记本的id,标题,笔记数目,所属笔记本等信息;resource_meta表存储了所有附件的id(附件散列),文件名,文件长度等信息;group_开头的表都是和云协作有关的.通过以上信息就可以确定笔记和笔记本的组织结构,不过鉴于我暂时没有这个需求,就没有实现这个功能.
了解了云笔记的备份文件的目录结构,下一步就是要把每个文件中的内容解析出来.用Notepad++等编辑器打开Info或Content文件时会看到一堆乱码,不可卒读.这是因为不知道文件的编码,没法显示正确的内容.
经过我的尝试与分析,备份中的文件主要编码是用的UTF-16(吐槽:好好的UTF-8不用,也够蛋疼的,估计就是怕用户太容易发现).
使用WinHex解析某附件的Info文件,得到以下的内容: