聊一聊聊天记录的备份 Part 1

年轻一代泡在即时聊天软件的时间恐怕是不少的,虽然这两年可能逐渐把时间花短视频、直播、手游之类的上面了,至少我还在上学的时候,一天起码有一半时间在各种聊天软件上和朋友吹牛。自然,存下的聊天记录也是不少的,备份就成为一件麻烦事,其他软件用的少,没什么需要备份的记录,QQ 倒至少也有十几 G 了。一开始是直接备份Msg3.0.db这个数据库,直到有一天发现,原来图片是分开放的,只能把整个账号文件夹备份起来,还好这几年 PC 逐渐都用上了 SSD,虽然图片散开来放读取很慢,但起码备份起来还是比较方便的。

上大学之后微信开始火起来,虽然功能残废,但有些弱智总觉得很好用,不得不被绑架着使用,对于微信来说,备份变成个大问题。首先是同步机制十分弱智,虽然有电脑版,但是聊天记录只能同步 1 天以内的,超过 1 天没登陆就只能在手机看了,其次聊天记录不能云同步,又当又立的行为真的十分傻逼。至于自带的备份机制,可以说是十分垃圾了:微信备份聊天记录一般有 2 种办法,一是跨设备转移,二是 PC 客户端备份。如果使用跨设备转移聊天记录,他会丢文件,根据我的观察,一般是概率性丢 1 年以上的图片。换而言之,如果把聊天记录翻到 1 年之前,有部分图片可能看不了大图,即使当时已经下载过原图。如果使用 PC 备份,在恢复的时候会概率性搜不到聊天记录,同时会有部分接收的文件或者别人转发过来的聊天记录丢失,可以说是相当废物了。

工作之后 QQ 逐渐用得更少了,我退出了一大堆群,最后决定把这些群的聊天记录备份成 mht,然后注销掉 QQ,这时候又碰到了另一个问题——QQ 备份出来的 mth 太大了,一个好几 G,没几个浏览器能打开的。倒腾了好久最后终于转换成了一个网页+一堆图片,不过浏览器打开还是相当有压力,这时候我开始琢磨,有没有什么办法能把这些聊天记录整合成一个数据库之类的呢?

不过想了好久还是懒得折腾,暂时做成了 git 库备份到服务器上了,就这样又拖了一阵子,又被微信坑了一把,具体来说是这样的:微信不知道啥时候上了个注销账号的功能——实际上有没有注销另说——然后有个同学不知道什么原因注销了账号,直到有天我需要找找好久之前问过他的一个问题,结果点开聊天记录微信就报错:账号已注销,不能看聊天记录。如此设计实属弱智,我决定把备份聊天记录提上日程了。

既然要备份,那么以后估计是会重新看的,那么基于软件本身逻辑的备份还原是不用考虑的,鬼知道会不会哪天一更新,旧的聊天记录就还原不了了。如果像 QQ 这样备份出一个网页,我认为体验是相当差劲的,如果把所有聊天记录放在单个网页里,那会变得相当卡,但是如果拆成多个网页,检索起来就很麻烦了。微信似乎在备份这方面有些第三方做得好一些,可以输出成 json,再通过本地网页分步加载,不过那些软件基本都收费,而且只能备份微信,不是很好。而且如果我之后还想备份其他的聊天软件呢?或者短信,iMessages?

这样的话,设计一个数据库用来存放通用的数据似乎比较好。数据表可以包含诸如时间,发送人,发送内容之类的,并基于附加的元数据展示更多的类型,譬如说图片视频,或者微信的转账、小程序。至于显示前端,则可以将每种展示类型模块化,没必要跟随微信或者 QQ 的原始界面,一来本身设计得不好看,二来可以设计成更加通用的界面,以容纳更多的消息类型。

通过前后端分离开发,可以把通用性提高,至于聊天数据怎么来,则可以通过搞一个转换程序,把各种聊天软件转换为通用的数据库条目,避免聊天软件一更新就没法用了。而且自行储存单独的数据结构,还可以做更多的事情,譬如说做全文检索,灵活的分页,跨软件的聊天记录查询,等等。这个通用的聊天数据读写库已经搞了一阵子了,刚才忽然想到博客好久没更新了,水一篇设计思路,具体的开发就留在下一篇吧。

等我
等我