This commit is contained in:
2025-08-29 12:36:30 +08:00
commit e772719844
8 changed files with 721 additions and 0 deletions

295
PostgreSQL/qqnt/qqnt.sql Normal file
View File

@@ -0,0 +1,295 @@
-- use database fortern
create schema qqnt;
comment on schema qqnt is 'Fortern的QQNT聊天记录';
-- https://docs.aaqwq.top/view/db_file_analysis/nt_msg.db.html
-- group_msg_table
create table qqnt.group_msg_table
(
-- 40001 消息ID具有唯一性
id bigint not null
primary key,
-- 40002 消息随机值,用于对消息去重
msg_random bigint not null,
-- 40003 群聊消息ID在每个聊天中依次递增
msg_seq integer not null,
-- 40010 聊天类型私聊为1群聊为2频道为4公众号为103企业客服为102临时会话为100
chat_type integer not null,
-- 40011 消息类型,详见下表
msg_type integer not null,
-- 40012 pb消息类型详见下表
sub_msg_type integer not null,
-- 40013 发送标志本机发送的消息为1其他客户端发送的为2别人发的消息为0 转发消息为5在已退出或被封禁的消息中为当日整点时间戳
send_type integer not null,
-- 40020 nt_uid, 对应 nt_uid_mapping_table
sender_uid varchar(200) not null,
-- 40026 未知
q40026 integer,
-- 40021 会话ID
peer_uid varchar(200) not null,
-- 40027 会话ID通常是群号
peer_uin bigint not null,
-- 40040 未知
q40040 integer,
-- 40041 发送状态2为成功0为发送被阻止如不是对方好友1为尚未发送成功比如网络问题3为消息被和谐
send_status integer not null,
-- 40050 发送消息时的时间戳(精确到秒)
msg_time integer not null,
-- 40052 未知
q40052 integer,
-- 40090 发送者群名片,旧版 QQ 迁移数据中格式为 name(12345) 或 name<i@example.com> QQNT 中为群名片
send_member_name varchar(200),
-- 40093 发送者昵称,旧版 QQ 此字段为空QQNT 中未设置群名片时才有此字段
send_nick_name varchar(200) not null,
-- 40800 聊天消息,最为复杂
msg_content bytea,
-- 40900 不同情况下存在不一样的数据以列40011为区分。 值为8时列40900存贮转发聊天的缓存值为9时列40900存贮引用的消息
msg_quote bytea,
-- 40105 未知
q40105 integer,
-- 40005 只知道自己发的消息一定概率存在数值正常情况为0
q40005 integer,
-- 40058 当日 0 时整的时间戳格式,精确到秒,时区为 UTC+08:00
midnight_timestamp integer not null,
-- 40006 未知
elem_id bigint not null,
-- 40100 @状态
at_status integer,
-- 40600 十六进制。值为 14 00 时,为回复消息,为 6 代表有人回复自己为2代表他人回复他人值为c2e91304a8d114****时(不唯一),为撤回消息
msg_status bytea,
-- 40060 已退出或已解散的群聊标志
disband_flag integer,
-- 40850 该消息所回复的消息的序号,默认为 0
reply_to bigint,
-- 40851 未知,默认为 0 或 NULL
q40851 integer,
-- 40601 未知,默认为 NULL
q40601 bytea,
-- 40801 未知,默认为 NULL
q40801 bytea,
-- 40605 未知,默认为 NULL
q40605 bytea,
-- 40030 群号
group_no bigint not null,
-- 40033 消息发送者QQ号
qq_no bigint not null,
-- 40062 存贮详细表态信息(包括表态表情和表态数量),其数字与 QQBOT 中表情编号对应(超级表情不在此列表中)
emoji bytea,
-- 40083 表态表情数量总和?
emoji_num integer,
-- 40084 表态表情数量总和?
emoji_num_2 integer
);
-- 发送者QQ号索引
create index qq_no_index on qqnt.group_msg_table (qq_no);
-- 群号与QQ号联合索引
create index group_no_index on qqnt.group_msg_table (peer_uin, qq_no);
-- 时间索引
create index group_msg_time_index on qqnt.group_msg_table (msg_time);
-- 群号与日期的索引
create index group_no_msg_time_index on qqnt.group_msg_table (peer_uin, msg_time);
-- 消息类型联合索引
create index group_msg_type_index on qqnt.group_msg_table (peer_uin, msg_type, sub_msg_type);
-- 40011 msg_type 消息类型
-- 无消息消息损坏多见于已退出群聊且时间久远0
-- 消息空白msgid存在应该是没加载出来1
-- text文本消息2
-- 群文件3
-- 我的聊天记录里没有4~大佬带带>︿<
-- 系统灰字消息5
-- 语音消息6
-- 视频文件7
-- 合并转发消息8
-- 回复类型消息9
-- 红包10
-- 应用消息11
-- 40012 sub_msg_type 区分pb消息类型
-- 非常规text消息0
-- 普通文本消息1
-- 群文件其他类型消息1
-- 图片消息2
-- 群文件图片消息2
-- 群公告3
-- 群文件视频消息4
-- 撤回消息提醒4
-- 群文件音频消息8
-- 原创表情包8
-- 射精消息11
-- 拍一拍消息12
-- 群文件docx消息16
-- 平台文本消息32
-- 群文件pptx消息32
-- 回复类型消息33
-- 群文件xlsx消息64
-- 存在链接161
-- 群文件zip消息512
-- 群文件exe消息2048
-- 表情消息4096
-- msg_type(40011) 与 sub_msg_type(40012) 组合可判断消息类型
-- 由于优先级问题特别是2类别的信息部分消息不满足以下规则
-- 空消息00
-- 已撤回消息10
-- 普通文本类消息21
-- 图片消息22
-- 只带图片的纯文本消息23
-- 纯表情消息216
-- 带表情的纯文本消息217
-- 带图片带表情的纯文本消息219
-- 纯链接消息2129
-- 带表情链接消息2145
-- 机器人消息2577
-- 机器人Markdown消息265
-- @消息235
-- 回复引用消息不带表情233
-- 回复引用消息带表情249
-- 收藏表情22
-- 收藏表情包24096
-- 群文件其他类型消息31
-- 群文件图片pngjpg消息32
-- 群文件视频消息34
-- 群文件音频mp3flac消息38
-- 群文件docx消息316
-- 群文件pptx消息332
-- 群文件xlsx消息364
-- 群文件zip消息3512
-- 群文件exe消息32048
-- 拍一拍消息512
-- 撤回消息提醒54
-- amr语音文件消息60
-- 视频文件消息70
-- 合并转发消息80
-- 回复消息933
-- 回复带图片消息(无@934
-- 回复带图片消息(有@935
-- 回复带图片带@935
-- 回复卡片引用消息949
-- 带表情回复949
-- 带表情带图片带@951
-- 回复存在链接的消息9161
-- 红包100
-- 应用消息如小程序110
-- 群公告113
-- 表情包178
-- 原创表情178
-- c2c_msg_table
create table qqnt.c2c_msg_table
(
-- 40001 消息ID具有唯一性
id bigint not null
primary key,
-- 40002 消息随机值,用于对消息去重
msg_random bigint not null,
-- 40003 位置
q40003 integer not null,
-- 40010 聊天类型私聊为1群聊为2频道为4公众号为103企业客服为102临时会话为100
chat_type integer not null,
-- 40011 消息类型,详见上表
msg_type integer not null,
-- 40012 pb消息类型详见上表
sub_msg_type integer not null,
-- 40013 发送标志,可能?
send_type integer not null,
-- 40020 未知
q40020 varchar(200) not null,
-- 40026 未知
q40026 integer not null,
-- 40021 未知
q40021 varchar(200) not null,
-- 40027 未知
q40027 integer not null,
-- 40040 未知
q40040 integer not null,
-- 40041 未知
q40041 integer not null,
-- 40050 发送消息时的时间戳(精确到秒)
msg_time integer not null,
-- 40052 未知
q40052 integer not null,
-- 40090 未知
q40090 text,
-- 40093 消息发送者的 QQ 昵称或是备注名
q40093 varchar(200) not null,
-- 40080 消息内容
q40800 bytea,
-- 40900 未知
q40900 bytea,
-- 40105 未知
q40105 integer not null,
-- 40005 未知
q40005 integer not null,
-- 40058 当日 0 时整的时间戳格式,精确到秒,时区为 UTC+08:00
midnight_timestamp integer not null,
-- 40006 未知
q40006 bigint not null,
-- 40010 未知
q40100 integer not null,
-- 40600 未知
q40600 bytea,
-- 40060 未知
q40060 integer not null,
-- 40850 未知
q40850 integer not null,
-- 40851 未知
q40851 integer not null,
-- 40601 未知
q40601 bytea,
-- 40801 未知
q40801 bytea,
-- 40605 未知
q40605 bytea,
-- 40030 对方 QQ 号(无论是对方还是自己发送的消息)
peer_qq_no bigint not null,
-- 40033 发送者的 QQ 号
sender_qq_no bigint not null,
-- 40062 未知
q40062 bytea,
-- 40083 未知
q40083 integer not null,
-- 40084 未知
q40084 integer not null
);
-- 时间索引
create index c2c_msg_time_index on qqnt.c2c_msg_table (msg_time);
-- 私聊者 QQ 号与时间的索引
create index qq_no_msg_time_index on qqnt.c2c_msg_table (peer_qq_no, msg_time);
create table qqnt.group_msg_fts
(
-- 主键id
id bigint primary key,
-- 消息内容
msg_text text,
-- 文件名
file_name varchar(250),
-- 41703 未知
q41703 varchar(50),
-- 41704 未知
q41704 varchar(50),
-- 41705 未知
q41705 varchar(50),
-- 41706 未知
q41706 varchar(50),
-- 41707 未知
q41707 varchar(50),
-- 41701 group_msg_table的id的外键
msg_id bigint unique,
-- 40050 发送消息时的时间戳(精确到秒)
msg_time integer not null,
-- 40003 群聊消息ID在每个聊天中依次递增
msg_seq integer not null,
-- 40010 聊天类型私聊为1群聊为2频道为4公众号为103企业客服为102临时会话为100
chat_type integer not null,
-- 40021 会话ID
peer_uid varchar(200) not null,
-- 40027 会话ID
peer_uin bigint not null,
-- 40020 nt_uid, 对应 nt_uid_mapping_table
sender_uid varchar(200) not null
);
-- 时间索引
create index msg_time_index on qqnt.group_msg_fts (msg_time);
-- 群号与时间的索引
create index group_msg_time_index on qqnt.group_msg_fts (peer_uin, msg_time);