WPS便签导出内容解析与导入各个平台
7月底,WPS便签提示即将停服。为了拯救这几年来攒下的笔记,我展开了积极自救。 上一篇文章 中我们已经介绍了从WPS便签APP端导出数据的方法,本篇我们则说一说如何处理这些笔记,并导入到各个笔记软件里——这里包括 Obsidian, Flomo浮墨笔记 ,Notion,以及WPS笔记。
一、解包&获取笔记元信息
(一)通过网页爬虫的方法获得元信息json
正如上篇文章所述,导出的结果是一个zip压缩包,解压缩后是一系列以hash编码命名的文件夹,也没有创建日期的信息,更没有子文件夹或者置顶、星标之类的信息。
那么这些信息应该从哪里获取呢?很遗憾,官方没有暴露接口,我们只能使用一些土办法去半人工半自动的获取。
说人话:使用WPS便签网页版,进行网页抓包的方法获取信息。需要准备的材料是一个现代化的浏览器(如Chrome,Firefox,Edge等),并知道如何使用F12开发者工具抓包。
如下图,当我们打开一个WPS笔记页面时,在Network标签页中可以看到网页加载了许多XHR资源(这是因为网页端WPS便签是动态网页架构,只会下载和展示用户翻到的笔记,当用户使用鼠标滚动目录栏、查看过去的笔记时,网页会通过XHR请求的方式自动加载这些新的笔记条目,并将这些笔记的标题、链接、创建日期等信息以json请求的形式发送给浏览器)。

那么,具体是要怎么做呢?如下图,我们需要开启开发者工具,然后滚动鼠标加载当前分组下所有日记条目,随后筛选出XHR请求中对应的json文件,将这些json文件保存下来,它们就是我们笔记的元数据。

对于我的WPS便签,我保存了很多个json,最终的结果如下(有些分组下只有一个json,因此没有为此新建文件夹):
1 | (base) cyclin@DESKTOP-23BCT60:jsons$ ls *json |
对于单个json文件,其内部是一个webNotes 字典列表,列表中的每一个元素对应着一篇笔记,包含这篇笔记的hash编码、创建和修改的时间,以及标题、内容等信息。我们重点提取hash编码(即noteId)和笔记创建的时间戳(createTime),如下图:

(二)处理json并将相关信息合并到笔记当中
这一步也需要半人工半自动的去处理。如下图,我写了一个json转tsv的脚本,输入json文件的路径,以及这个json文件所属的分组,则输出的tsv中就会包含笔记条目的hash编码、创建时间和分组信息。通过batch run调用脚本,批量处理上面得到的json,最终就可以得到一个完整的metadata表。

最终得到的metadata表如下所示:

我们将WPS便签APP导出的便签压缩包解压到 ./unzip 文件夹,并使用 os.listdir() 获取所有的笔记信息,之后就可以对照上面的metadata表,明确每一篇笔记的创建日期和分组信息了。值得注意的是,由于WPS便签APP端和服务器端同步不充分,一些远古笔记可能没有对应的metadata信息,这里我们可以用随机数为其生成一个时间戳,并新增标签”unknown_group”。

到这一步,我们的预处理基本上算是完成了。
二、导出到各个笔记软件
(一)整理为DataFrame和csv文件供存档
这是最简单的处理步骤。我们只需要从文件夹中读取笔记内容,并附上笔记标签(分组信息)和创建日记就算完成了。【下图中的代码对图片链接进行了替换,这是因为为了节省存储空间,我把图片全部上传到了我的私人腾讯云图床,因此markdown中对应的图片链接也需要替换】

(二)整理为csv并导入Flomo浮墨笔记
如下图所示,Flomo浮墨笔记支持通过csv格式的文件导入笔记,入口在网页端的flomo笔记的设置页面当中。这个csv文件只需要提供两列内容即可:content(笔记内容),created_at(创建时间)

我们构建这个csv文件的方法和(一)中的方法基本相同;但是有一点需要注意,Flomo笔记当中,井字符号 # 会被识别为标签,而不是markdown中的标题开头——因此我们需要批量替换删除文件中原本的 # 符号,并增加 #{tag} (将tag替换为实际分组名称)这样的标签信息,从而实现类似WPS便签中分组的效果。

完成后,将输出的文件 flomo_import_df.csv 拖入flomo的导入接口,等待其处理完成后点击确认按钮,即可完成导入。最终效果如下:

【补充:flomo笔记不支持markdown格式标记,也不支持在批量导入时插入图片,因此使用体验上有阉割】
(三)通过Flomo浮墨笔记的接口导入Notion笔记
这一步最为简单,但是需要Flomo笔记的VIP会员。
如下图,在网页端flomo的设置界面,有个“实验室”(Labs)选项,这里有个“同步到Notion”的开关,点击开关后按提示完成操作就完事了。

最终效果:

【很不幸的是,免费版的Notion对于笔记block数量有限制,上述批量导入方法很有可能触发导入block数量上限,影响后续使用】
(四)清理markdown格式标签并导入obsidian
这一步也非常简单。
如下图,我们直接创建一个formated文件夹,然后按照笔记分组将每条笔记存储到 formated/{tag} (tag替换为实际分组)即可——为了方便,直接使用笔记的创建时间作为文件名。
之后,我们将formated文件夹整体复制到obsidian的vault下面,就完成了导入。

最终效果:

(五)通过官方MCP接口导入WPS笔记(WPS AI note)
这个步骤是最繁琐的。因为WPS笔记提供了导入接口,但是导入接口做得非常麻烦——他们是以MCP的格式提供接口的,并且开启MCP的前提是安装他们的PC客户端。下面几个链接是官方提供的教程参考(很显然,他们的MCP接口做得很草台班子,这几个教程写的非常简单,许多细节都没提到,还是我后面和DeepSeek一起翻源码搞明白的)
具体来说,我先安装了他们的客户端,启动了开发者功能并获得了API KEY,之后我写了下面这段代码测试MCP接口:

最终得到的MCP工具列表如下:

围绕这一堆MCP工具,我们就可以使用python编写一些方法解析笔记并插入。
比较麻烦的地方在于:
- 笔记需要先创建→获取笔记ID→调用编辑工具写入数据,并不是一步就能完成的
- MCP接口不支持markdown格式;相反,它们接受xml格式的笔记,也就是说笔记的标题、文本格式需要用xml编码好,然后提交到MCP接口,才能实现插入
- MCP接口支持插入图片,但是插入图片时需要提供锚点位置(也就是需要在笔记的哪个位置插入),因此需要额外的代码维护和更新笔记篇目中的文本锚点信息
- 笔记标签需要额外的代码进行设置
- 通过MCP的编辑速度很慢,一篇笔记大概需要几十秒才能处理完
因此,我们的代码需要同时实现markdown格式解析+转xml格式+实时维护和更新笔记ID以及文本锚点信息等功能。这个工作量很大,我用AI帮忙实现了一下;受限于篇目长度,此处不展示源代码了(我想读者朋友们根据上面那个MCP工具列表,用AI帮忙大概率能够实现一个功能类似的程序)。
最终效果:
