最近整理电子数据进行网盘备份时候,发现 vivo 的原子笔记不支持批量导出,只能支持单个单个导出。而我之前用 vivo 笔记来写日记,到现在也写了几百篇,逐个点击导出的话胜似捏鼻子吃史。在网上搜寻过后没有发现有类似工具,于是做了个自用。
写代码一小时,改bug三小时,剪视频剪了三小时。最开始是用我自己的日记来作为例子演示,然后在视频里面码掉日记内容,码完之后还是有露出来的,害怕盯帧侠盯出来,还是自己建了些示例笔记来重新录了一遍,感觉自己是换了个地方把史给吃了,怒。
(1)打开 vivo 笔记网页版 vivo 办公套件
(2)复制 prepare.js 中代码,在控制台执行,等待执行完成
(3)修改 export.js 中 startName
和 endName
,即从哪个笔记开始导出和结束导出
(4)复制 export.js 中代码,在控制台执行,等待执行完成
(5)可以继续重复 3~4 步骤,下载剩余笔记
(1)写死的逻辑导出的是 txt 格式,并且遇到重名的笔记会暂停导出
(2)执行脚本时候不要滚动或点击笔记列表
(3)若笔记下载重复或者其他问题,尝试浏览器前台运行,不要切后台
(4)虽然逻辑上脚本是通用的,但是实际使用起来可能非常脆弱,懒得完善了,有其他人用再说
如果有人看代码的话,可以参考下这里简要的思路说明。
批量导出的话两种思路,一种是调 vivo 的后端接口导出,但是看了下,接口返回的笔记内容是加密的,就放弃了;另外一种就是通过前端方式,模拟按钮点击,去自动化笔记下载,也是目前实现方式。
主要分为两个步骤,首先加载笔记列表,然后选中某个笔记点击导出:
(1)prepare.js
vivo 笔记左侧的笔记列表是滚动的,并且笔记少的时候,滚动列表中展示全部笔记;如果笔记数量过多,会切换到虚拟滚动列表,一次只会加载几十条笔记。
所以在 prepare.js 中,直接将列表滚动到底,如果数据过多,则会把虚拟滚动列表触发出来,这样不会在下载中途切换滚动列表,导致下载失败。
(2)export.js
在 export.js 中执行具体导出逻辑,主要是获取当前笔记列表,然后逐一选中导出,如果是虚拟滚动列表,则尝试向下滚动加载更多笔记,递归导出。
由于点击、滚动等动作会触发数据请求,所以需要设置延时执行下一操作,并且遍历笔记列表和递归下载更多笔记这些操作,有动作的先后顺序不能打乱,所以这里采用 setTimeout 来定时执行操作,用变量 k 来分配执行时间的先后。
(3)demo-1.js, demo-2.js
两个自己调 bug 过程中的示例代码。在 setTimeout 执行时候遇到一些bug,最后调试发现是闭包导致传入 setTimeout 的 k 值不符合预期,没想到很久没写前端了,闭包又把我暗算了一次。这个 bug 可以在这两个示例文件中模拟复现,demo-1.js 是错误逻辑,demo-2.js 是正确逻辑。