From e772719844d9804e54ed969b07a53b9cf06e5c3c Mon Sep 17 00:00:00 2001 From: Fortern Date: Fri, 29 Aug 2025 12:36:30 +0800 Subject: [PATCH] init --- .gitignore | 1 + MySQL/life/life.sql | 31 ++++ MySQL/person/person.sql | 23 +++ MySQL/qqnt/qqnt.sql | 294 ++++++++++++++++++++++++++++++++++ PostgreSQL/fortern.sql | 3 + PostgreSQL/life/life.sql | 38 +++++ PostgreSQL/person/person.sql | 36 +++++ PostgreSQL/qqnt/qqnt.sql | 295 +++++++++++++++++++++++++++++++++++ 8 files changed, 721 insertions(+) create mode 100644 .gitignore create mode 100644 MySQL/life/life.sql create mode 100644 MySQL/person/person.sql create mode 100644 MySQL/qqnt/qqnt.sql create mode 100644 PostgreSQL/fortern.sql create mode 100644 PostgreSQL/life/life.sql create mode 100644 PostgreSQL/person/person.sql create mode 100644 PostgreSQL/qqnt/qqnt.sql diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..485dee6 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.idea diff --git a/MySQL/life/life.sql b/MySQL/life/life.sql new file mode 100644 index 0000000..e5351ec --- /dev/null +++ b/MySQL/life/life.sql @@ -0,0 +1,31 @@ +create database fortern_life; + +use fortern_life; + +-- leaves_history table +create table leaves_history +( + id int auto_increment + primary key, + title varchar(50) not null comment 'Title', + description text not null comment 'Description' +) comment 'Historical events'; + +-- leaves_history_item table +create table leaves_history_item +( + id int auto_increment + primary key, + qq_no bigint not null comment 'QQ number', + qq_group_no int default 0 not null comment 'QQ group number', + time_of_occurrence timestamp not null comment 'Time of occurrence', + info varchar(1024) not null comment 'Description', + history_id int not null comment 'History table id', + index leaves_history_item_history_id_index (history_id), + index leaves_history_item_qq_group_no_index (qq_group_no), + index leaves_history_item_qq_no_index (qq_no), + index leaves_history_item_time_of_occurrence_index(time_of_occurrence), + constraint leaves_history_item_leaves_history_id_fk + foreign key (history_id) references leaves_history (id) + on update cascade +); diff --git a/MySQL/person/person.sql b/MySQL/person/person.sql new file mode 100644 index 0000000..7888d6f --- /dev/null +++ b/MySQL/person/person.sql @@ -0,0 +1,23 @@ +-- 描述一个人的身份证号和其他个人信息 +create table person +( + id int not null auto_increment, + address1 tinyint not null comment 'address1', + address2 tinyint not null comment 'address2', + address3 tinyint not null comment 'address3', + birthday date not null comment 'birthday', + sequence_number tinyint not null comment 'sequence number', + gender_code tinyint not null comment 'gender code', + check_code tinyint not null comment 'check code', + gender bit not null comment 'gender', + name varchar(20) not null comment 'name', + name_initials varchar(50) not null comment 'name initials', + address varchar(150) not null comment 'full address text', + phone_number varchar(50) null comment 'phone number', + update_time timestamp not null, + primary key (id), + unique index person_id_code_index (address1, address2, address3, birthday, sequence_number, gender_code), + index person_birthday_index (birthday), + index person_gender_index (gender), + index person_name_initials_index (name_initials) +) engine = InnoDB; diff --git a/MySQL/qqnt/qqnt.sql b/MySQL/qqnt/qqnt.sql new file mode 100644 index 0000000..f44d8aa --- /dev/null +++ b/MySQL/qqnt/qqnt.sql @@ -0,0 +1,294 @@ +create database fortern_qqnt; + +-- https://docs.aaqwq.top/view/db_file_analysis/nt_msg.db.html +-- group_msg_table +create table fortern_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, QQNT 中为群名片 + send_member_name varchar(200), + -- 40093 发送者昵称,旧版 QQ 此字段为空,QQNT 中未设置群名片时才有此字段 + send_nick_name varchar(200) not null, + -- 40800 聊天消息,最为复杂 + msg_content mediumblob, + -- 40900 不同情况下存在不一样的数据(以列40011为区分)。 值为8时,列40900存贮转发聊天的缓存;值为9时,列40900存贮引用的消息 + msg_quote mediumblob, + -- 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 blob, + -- 40060 已退出或已解散的群聊标志 + disband_flag integer, + -- 40850 该消息所回复的消息的序号,默认为 0 或 NULL + reply_to bigint, + -- 40851 未知,默认为 0 + q40851 integer, + -- 40601 未知,默认为 NULL + q40601 blob, + -- 40801 未知,默认为 NULL + q40801 blob, + -- 40605 未知,默认为 NULL + q40605 blob, + -- 40030 群号 + group_no bigint not null, + -- 40033 消息发送者QQ号 + qq_no bigint not null, + -- 40062 存贮详细表态信息(包括表态表情和表态数量),其数字与 QQBOT 中表情编号对应(超级表情不在此列表中) + emoji blob, + -- 40083 表态表情数量总和? + emoji_num integer, + -- 40084 表态表情数量总和? + emoji_num_2 integer not null, + -- 发送者QQ号索引 + index qq_no_index (qq_no), + -- 群号与QQ号联合索引 + index group_no_index (group_no, qq_no), + -- 时间索引 + index msg_time_index (msg_time), + -- 群号与时间的联合索引 + index group_msg_time_index (group_no, msg_time), + -- 群号与消息类型的联合索引 + index group_msg_type_index (group_no, 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类别的信息),部分消息不满足以下规则 +-- 空消息:0,0 +-- 已撤回消息:1,0 +-- 普通文本类消息:2,1 +-- 图片消息:2,2 +-- 只带图片的纯文本消息:2,3 +-- 纯表情消息:2,16 +-- 带表情的纯文本消息:2,17 +-- 带图片带表情的纯文本消息:2,19 +-- 纯链接消息:2,129 +-- 带表情链接消息:2,145 +-- 机器人消息:2,577 +-- 机器人Markdown消息:2,65 +-- @消息:2,35 +-- 回复引用消息(不带表情):2,33 +-- 回复引用消息(带表情):2,49 +-- 收藏表情:2,2 +-- 收藏表情包:2,4096 +-- 群文件其他类型消息:3,1 +-- 群文件图片(png,jpg)消息:3,2 +-- 群文件视频消息:3,4 +-- 群文件音频(mp3,flac)消息:3,8 +-- 群文件docx消息:3,16 +-- 群文件pptx消息:3,32 +-- 群文件xlsx消息:3,64 +-- 群文件zip消息:3,512 +-- 群文件exe消息:3,2048 +-- 拍一拍消息:5,12 +-- 撤回消息提醒:5,4 +-- amr语音文件消息:6,0 +-- 视频文件消息:7,0 +-- 合并转发消息:8,0 +-- 回复消息:9,33 +-- 回复带图片消息(无@):9,34 +-- 回复带图片消息(有@):9,35 +-- 回复带图片带@:9,35 +-- 回复卡片引用消息:9,49 +-- 带表情回复:9,49 +-- 带表情带图片带@:9,51 +-- 回复存在链接的消息:9,161 +-- 红包:10,0 +-- 应用消息(如小程序):11,0 +-- 群公告:11,3 +-- 表情包:17,8 +-- 原创表情:17,8 + +-- c2c_msg_table +create table fortern_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 mediumblob, + -- 40900 未知 + q40900 mediumblob, + -- 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 mediumblob, + -- 40060 未知 + q40060 integer not null, + -- 40850 未知 + q40850 integer not null, + -- 40851 未知 + q40851 integer not null, + -- 40601 未知 + q40601 mediumblob, + -- 40801 未知 + q40801 mediumblob, + -- 40605 未知 + q40605 mediumblob, + -- 40030 对方 QQ 号(无论是对方还是自己发送的消息) + peer_qq_no bigint not null, + -- 40033 发送者的 QQ 号 + sender_qq_no bigint not null, + -- 40062 未知 + q40062 mediumblob, + -- 40083 未知 + q40083 integer not null, + -- 40084 未知 + q40084 integer not null, + -- 时间索引 + index msg_time_index (msg_time), + -- 私聊者 QQ 号与时间的索引 + index qq_no_msg_time_index (peer_qq_no, msg_time) +); + +-- group_msg_fts +create table fortern_qqnt.group_msg_fts +( + -- 主键id + id bigint primary key, + -- 消息内容 + msg_text mediumtext, + -- 文件名 + 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, + -- 时间索引 + index msg_time_index (msg_time), + -- 群号与时间的联合索引 + index group_msg_time_index (peer_uin, msg_time) +); diff --git a/PostgreSQL/fortern.sql b/PostgreSQL/fortern.sql new file mode 100644 index 0000000..f9a3a46 --- /dev/null +++ b/PostgreSQL/fortern.sql @@ -0,0 +1,3 @@ +-- create database +create database fortern with owner postgres; +comment on database fortern is 'Fortern的数据'; diff --git a/PostgreSQL/life/life.sql b/PostgreSQL/life/life.sql new file mode 100644 index 0000000..877974b --- /dev/null +++ b/PostgreSQL/life/life.sql @@ -0,0 +1,38 @@ +create schema life; +comment on schema life is 'Fortern的朋友与记事'; + +-- leaves_history table +create table life.leaves_history +( + id serial not null + constraint history_pk primary key, + title varchar(50) not null, + description text not null +); +comment on table life.leaves_history is 'Historical events'; +comment on column life.leaves_history.title is 'Title'; +comment on column life.leaves_history.description is 'Description'; + +-- leaves_history_item table +create table life.leaves_history_item +( + id serial not null + constraint leaves_history_item_pk + primary key, + qq_no bigint not null, + qq_group_no integer default 0 not null, + time_of_occurrence timestamp not null, + info varchar(1024), + history_id integer not null + constraint leaves_history_item_history_id_fk + references life.leaves_history + on update cascade on delete restrict +); +comment on column life.leaves_history_item.qq_no is 'QQ number'; +comment on column life.leaves_history_item.qq_group_no is 'QQ group number'; +comment on column life.leaves_history_item.info is 'Description'; +comment on column life.leaves_history_item.history_id is 'History table id'; +create index leaves_history_item_history_id_index on life.leaves_history_item (history_id); +create index leaves_history_item_qq_group_no_index on life.leaves_history_item (qq_group_no); +create index leaves_history_item_qq_no_index on life.leaves_history_item (qq_no); +create index leaves_history_item_time_of_occurrence_index on life.leaves_history_item (time_of_occurrence); diff --git a/PostgreSQL/person/person.sql b/PostgreSQL/person/person.sql new file mode 100644 index 0000000..0e5e0f4 --- /dev/null +++ b/PostgreSQL/person/person.sql @@ -0,0 +1,36 @@ +-- 描述一个人的身份证号和其他个人信息 +create table sku.person +( + id bigserial not null + constraint person_pk primary key, + address1 smallint not null, + address2 smallint not null, + address3 smallint not null, + birthday date not null, + sequence_number smallint not null, + gender_coder smallint not null, + check_code smallint not null, + sex boolean not null, + name varchar(30) not null, + name_initials varchar(30) not null, + address varchar(150) not null default '', + phone_number varchar(25), + update_time integer not null +); +comment on table sku.person is 'person'; +comment on column sku.person.address1 is 'address1'; +comment on column sku.person.address2 is 'address2'; +comment on column sku.person.address3 is 'address3'; +comment on column sku.person.birthday is 'birthday'; +comment on column sku.person.sequence_number is 'sequence number'; +comment on column sku.person.gender_coder is 'gender coder'; +comment on column sku.person.check_code is 'check code'; +comment on column sku.person.sex is 'Biological sex'; +comment on column sku.person.name is 'name'; +comment on column sku.person.name_initials is 'name initials'; +comment on column sku.person.address is 'full address text'; +comment on column sku.person.phone_number is 'phone number'; +create index person_birthday_index on sku.person (birthday); +create unique index person_id_code_index on sku.person (address1, address2, address3, birthday, sequence_number, gender_coder); +create index person_name_initials_index on sku.person (name_initials); +create index person_sex_index on sku.person (sex); diff --git a/PostgreSQL/qqnt/qqnt.sql b/PostgreSQL/qqnt/qqnt.sql new file mode 100644 index 0000000..b7cae3a --- /dev/null +++ b/PostgreSQL/qqnt/qqnt.sql @@ -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, 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类别的信息),部分消息不满足以下规则 +-- 空消息:0,0 +-- 已撤回消息:1,0 +-- 普通文本类消息:2,1 +-- 图片消息:2,2 +-- 只带图片的纯文本消息:2,3 +-- 纯表情消息:2,16 +-- 带表情的纯文本消息:2,17 +-- 带图片带表情的纯文本消息:2,19 +-- 纯链接消息:2,129 +-- 带表情链接消息:2,145 +-- 机器人消息:2,577 +-- 机器人Markdown消息:2,65 +-- @消息:2,35 +-- 回复引用消息(不带表情):2,33 +-- 回复引用消息(带表情):2,49 +-- 收藏表情:2,2 +-- 收藏表情包:2,4096 +-- 群文件其他类型消息:3,1 +-- 群文件图片(png,jpg)消息:3,2 +-- 群文件视频消息:3,4 +-- 群文件音频(mp3,flac)消息:3,8 +-- 群文件docx消息:3,16 +-- 群文件pptx消息:3,32 +-- 群文件xlsx消息:3,64 +-- 群文件zip消息:3,512 +-- 群文件exe消息:3,2048 +-- 拍一拍消息:5,12 +-- 撤回消息提醒:5,4 +-- amr语音文件消息:6,0 +-- 视频文件消息:7,0 +-- 合并转发消息:8,0 +-- 回复消息:9,33 +-- 回复带图片消息(无@):9,34 +-- 回复带图片消息(有@):9,35 +-- 回复带图片带@:9,35 +-- 回复卡片引用消息:9,49 +-- 带表情回复:9,49 +-- 带表情带图片带@:9,51 +-- 回复存在链接的消息:9,161 +-- 红包:10,0 +-- 应用消息(如小程序):11,0 +-- 群公告:11,3 +-- 表情包:17,8 +-- 原创表情:17,8 + +-- 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);