QQ聊天记录工具的后端模块之一,用于本地消息数据库的导出,目前计划支持Android和Windows端的数据解析,是Hakuuyosei/QQHistoryExport项目的不兼容重构
目前只编写并成功运行了一些解析相关的测试函数,后续代码缓慢编写中...
QQWebUI 对Windows QQ界面的模仿,是导出形式的聊天记录的展示工具
QQRecordBot 旧版的记录聊天解决方案,使用第三方QQ机器人记录消息
消息存储在/data/data/com.tencent.mobileqq/databases/下的{QQ号}.db和slowtable_{QQ号}.db,其中slowtable存储时间较为久远的消息
好友消息位于mr_friend_{md5-32Upper(好友QQ号)}_New表中
群聊消息位于mr_troop_{md5-32Upper(群号)}_New表中
{QQ号}-IndexQQMsg.db里没有什么有效信息
senderuin是此条消息发送者的QQ号
frienduin是此条消息接受者的QQ号/群号
msgData是消息的主体,大部分信息在这里面
msgtype标识消息的类型,不同的消息类型需要不同的读取方式
extStr根据消息的类型存储不同的信息,其中包括回复的引用信息
time是此条消息发送时间的时间戳,位数为十位
shmsgseq是消息的序列号,意思是shortmsgseq,由以下转换得到
short shmsgseq = (short)(int)msgseq;msgUid是Random随机摇出来的,对于提取消息没什么用处
uniseq(大部分)由time做以下转换得到,同样意义不大
long uniseq = ((int)time) << 32;其他字段比较显然不包含有效信息,就不再逐一说明
已知消息的序列化方式包括
json(常见的数据传输格式)
Java Serialization(Java内置的序列化方式)
protobuf(Google提出的一种序列化方式)
XmlBuff(疑似腾讯自己实现的序列化方式)
其中json格式使用任意json解析库即可解析
java序列化需要通过对QQ代码中的相关数据类进行模拟,然后通过Java内置类ObjectInputStream进行解析
protobuf需要通过参考QQ代码中对应数据类的__fieldMap__字段,然后通过官方解析和黑盒解析两种方式之一解析数据
官方解析:手动还原.proto文件并通过protobuf提供的代码生成器生成解析代码
黑盒解析:利用__fieldMap__中提供的信息和黑盒解析方式(protobuf代码库提供的UnknownFieldSet.parseFrom即可)提取出需要的数据
XmlBuff格式目前解析方式不明
具体各消息类型对应的序列化方式见QQ消息格式.xlsx
消息存储在个人文件夹\<QQ号>\Msg3.0.db下的Msg3.0.db
个人文件夹的位置取决于你在QQ中的设置,默认为C:\Users\<用户名>\Documents\Tencent
好友消息位于buddy_<好友QQ号>表中
群聊消息位于group_<好友QQ号>表中
消息的序列号位于对应的$Seq$表中
SenderUin是此条消息发送者的QQ号
MsgContent是消息的主体,大部分信息在这里面
Time是此条消息发送时间的时间戳,位数为十位
Rand推测是随机数,可用于在对应的$Seq$表中查询消息的序列号
Info字段暂未解析,内容未知
$Seq$表中的Seq字段是消息的序列号
消息的序列化方式为TLV(Tag-Length-Value)格式,字符串类型数据编码为UTF-16LE,数值类型都为无符号类型