掐指一算,从大学时代开始使用 Leanote 至今,已经有近十年了,它曾是我学习和记录想法的重要工具。
然而,这款应用已经数年没有更新,官网也透露着一种随时可能停止服务的气息,为了防止数据丢失,我决定将所有笔记备份出来,并彻底离开这个平台。
我本想“和平分手”,利用官方提供的导出功能来解决问题,但在一番寻找后,我发现 Leanote 的网页版根本没有提供任何形式的批量导出功能,看官方博客的说法,这个功能似乎在客户端中,我本想下载的,但查了一下相关的条例,免费账户导出的 PDF 会带有水印,对于数据迁移来说,显然不是一个理想的方案,因为我只想要原始数据,不需要“帮”我打包。
于是我转而查询它的 API 文档,希望能通过写脚本的方式,将笔记完整地导出来,它在 Github 上提供了相关文档(虽然这文档也有快十年没更新了),我花了几分钟,很快写好了一套简单的脚本。然而,在执行到“获取所有笔记本”(getNotebooks)这一步时,程序就卡住了,接口返回的错误信息是“NEED-UPGRADE-ACCOUNT”。
这时我才意识到问题的根源,我这个一直都是免费版的账户,不知何时被动地开始了一段“试用会员”,现在每次登录都会提示我会员已到期。原来,不付费升级,我甚至没有通过 API 读取自己笔记列表的权限,自己的数据,想要用一种高效的方式取出来,竟然需要先付费,何意味?
在研究 API 的过程中,我还发现了另一个不安全的设计,它文档中的登录接口竟然是 GET 请求,这意味着账户和密码会作为查询字符串(query string)直接拼接在 URL 中进行传输,虽然 HTTPS 能够加密请求体,但 URL 本身在传输链路的许多中间节点中,都可能以明文形式被记录下来,将敏感的登录凭证以这种方式暴露,是一个相当基础且严重的安全疏忽。
最终,所有“技术”和“官方”的道路都被堵死了,我只能选择最原始、最耗时的方式:手动备份。我的笔记数量不算特别多,几十篇而已,但一篇篇地打开、复制、粘贴到新的笔记应用中,再处理格式问题,依然耗费了我好几个小时。
完成这次备份后,我便会去注销掉 Leanote 的账户,一段始于大学时代的数字记忆,以这样一种不算愉快的方式画上了句号,再也不见,Leanote。
PS:我查看了其他开发者做的备份工具,发现他们用的和我也是同一套接口,推测免费调用是过去式,付费限制是后更新加入的。
PS2:Web 项目专门避开了这套 API,直接将笔记本列表数据注入到了 HTML 中,后续的内容获取是通过另一套 API 实现的,但我已经没有必要去研究了。
