数据表字段详细说明
本文档详细说明快手聊天数据库中各个表的字段含义、数据类型和示例数据。
由于未在其他表内找到有价值的信息,故忽略,被忽略的表详见数据库结构详解
如果你在被忽略的表找到了有用的信息请反馈
由于使用了AI来进行分析,很多都是根据名字意淫的,可能含有大量错误,欢迎指正
仅分析如下表
| 原序号 | 表名 (Table Name) | 类型 |
|---|---|---|
| 10 | kwai_conversation |
核心 |
| 12 | kwai_group_info |
群组 |
| 13 | kwai_group_member |
群组 |
| 15 | kwai_message |
核心 |
kwai_conversation 表字段说明
功能:存储会话列表数据(即快手 App “消息”页面展示的列表)。
核心作用:定义了你和谁(User/Group)在聊天,以及最后一条消息的时间、未读数等状态。
严格按照原数据库顺序排序
| 序号 | 字段名 (Column) | 类型 | 样本值示例 | 猜测含义(不保证完全正确) |
|---|---|---|---|---|
| 1 | _id |
INTEGER | 1, 24 |
主键 ID。可能为本地数据库自动生成的自增序号,无业务含义。 |
| 2 | subBiz |
TEXT | 0 |
子业务类型。通常为 0,预留字段。 用途未知 |
| 3 | target |
TEXT | 2828307026RECRUIT1 |
会话目标 ID (核心字段)。对应用户的 ID、群 ID 或系统账号(如 MERCHANT 小店),用于关联消息表。 |
| 4 | targetType |
INTEGER | 0,4,6,8 |
会话类型。0: 私聊 (Private)4: 群聊 (Group)6/8: 官方/系统号 (System) |
| 5 | unreadCount |
INTEGER | 0, 17 |
未读消息数。显示在会话列表上的红点数字。 |
| 6 | updatedTime |
INTEGER | 1740659171569 |
最后更新时间。13位毫秒级时间戳。用于列表排序,决定谁排在最上面。 |
| 7 | priority |
INTEGER | 0, 50 |
置顶优先级。0: 普通会话50: 置顶会话 (Top) |
| 8 | weightFactor |
INTEGER | 0 |
权重因子。可能为内部排序算法使用的辅助权重,一般为 0。 用途未知 |
| 9 | categoryId |
INTEGER | 0,1,2 |
分类 ID。可能用于区分会话类别。 用途未知 |
| 10 | lastContent |
BLOB | (protobuf) | 最后一条消息概览。存储二进制数据(Protobuf),显示为乱码或符号。不建议直接解析,请查消息表。 |
| 11 | accountType |
INTEGER | 0 |
账号类型。可能用于区分普通账号或企业账号等。 有待分析 |
| 12 | jumpCategoryId |
INTEGER | 0 |
跳转分类 ID。可能为APP 内部跳转逻辑使用的 ID。 有待分析 |
| 13 | draft |
TEXT | (null) | 草稿内容 可能是未发送的草稿内容? 有待分析 |
| 14 | targetReadSeqId |
INTEGER | 17372551264494530 |
对方已读序列号。用于判断对方读到了哪一条消息 部分为0 |
| 15 | reminder |
BLOB | (特殊字符) | 提醒标识。用于存储 "@我" 或其他强提醒的元数据,通常是二进制字符和null。 用途未知 |
| 16 | importance |
INTEGER | 0 |
重要性标记。可能用于折叠低优先级消息。 有待分析 |
| 17 | mute |
INTEGER | 0, 1 |
免打扰状态。0: 正常通知1: 开启免打扰 (Mute) |
| 18 | muteType |
INTEGER | 0,1,2,3 |
免打扰具体类型。 有待分析 |
| 19 | unreadRemindCountMap |
TEXT | 非null空 | 未读提醒映射。记录特殊类型的未读数结构。 有待分析 |
| 20 | status |
INTEGER | 0 |
会话状态。可能涉及会话是否被删除或隐藏。 有待分析 |
| 21 | extra |
BLOB | (null)或二进制 | 扩展字段。存储额外的业务数据。 用途未知 |
| 22 | receive_status |
INTEGER | 0 |
接收状态。是否拒收消息等状态位。 有待分析 |
| 23 | mark_unread |
INTEGER | 0 |
手动标记未读。0: 否1: 用户手动标为未读。 |
| 24 | mutedUnreadCount |
INTEGER | 0 |
免打扰未读数。开启免打扰后的未读消息数量。 |
| 25 | serverExtra |
BLOB | (null)或二进制 | 服务端扩展信息。从服务器同步下来的额外标记。 用途未知 |
| 26 | bizUnreadCount |
INTEGER | (null) | 业务未读数。特定业务场景的计数。 有待分析 |
| 27 | bizUnreadRemindCountMap |
TEXT | 非null空 | 业务提醒映射。 有待分析 |
| 28 | bizReadSeqId |
INTEGER | 1736831781059416 |
业务已读序列号。 有待分析 |
| 29 | hasDraft |
INTEGER | 0, 2 |
无法与draft字段关联 用途未知 |
kwai_group_info 表字段说明
表名:kwai_group_info
功能:存储群组的元数据(群名称、公告、群主、群成员概览等)。
排序依据:严格按照原顺序排列。
| 序号 | 字段名 (Column) | 类型 | 样本值示例 | 详细说明 |
|---|---|---|---|---|
| 1 | groupId |
TEXT | 400737228339680344 |
群组 ID (核心)。用于关联 kwai_message 表中的 target 字段,以及 kwai_group_member 表。 |
| 2 | appId |
INTEGER | 26 |
应用 ID。固定为 26,代表快手APP。 |
| 3 | groupName |
TEXT | 粉丝群 |
群名称。聊天界面顶部的群名字。部分群可能为空,需用 defaultGroupName 兜底。 |
| 4 | masterId |
TEXT | 3402398096 |
群主 ID。群拥有者的用户 ID。 |
| 5 | groupStatus |
INTEGER | 1, 2 |
群状态。1: 正常2: 可能被解散 |
| 6 | description |
TEXT | "禁止刷屏..." | 群公告。群规、介绍等文本内容。 |
| 7 | joinPermission |
INTEGER | 1, 2 |
加群权限。1: 直接申请加入2: 需要审核? |
| 8 | invitePermission |
INTEGER | 1 |
邀请权限。1: 允许成员邀请2不允许邀请新成员? |
| 9 | createTime |
INTEGER | 1717513387273 |
创建时间。13位毫秒级时间戳。 |
| 10 | lastUpdateTime |
INTEGER | 1737308639310 |
最后更新时间。群信息变更的时间。 |
| 11 | groupType |
INTEGER | 3, 4 |
群类型。3: 私信群(100人)4: 公开大群(200/500人) |
| 12 | forbiddenState |
INTEGER | 1 |
全员禁言状态。1: 未开启全员禁言 |
| 13 | antiDisturbing |
INTEGER | 0 |
防打扰模式。 有待分析 |
| 14 | memberCount |
INTEGER | 14, 148 |
当前成员数。群里现在有多少人。 |
| 15 | maxMemberCount |
INTEGER | 100, 200, 500 |
最大成员数。群人数上限。 |
| 16 | maxManagerCount |
INTEGER | 5, 15 |
最大管理员数。 |
| 17 | nickName |
TEXT | (群昵称) | 我的群昵称。我在本群的昵称(如果未设置则为空)。 |
| 18 | onlyAdminRemindAll |
INTEGER | 0 |
仅管理员可@全体。 全部为 0 |
| 19 | onlyAdminUpdateSetting |
INTEGER | 0 |
仅管理员改设置。 全部为 0 |
| 20 | inviterUid |
TEXT | 2856147173 |
邀请人 ID。谁拉你进群的。 |
| 21 | role |
INTEGER | 1, 2 |
我的角色。1: 普通成员2: 群主3:管理员 |
| 22 | joinTime |
INTEGER | 1720261363035 |
入群时间。我加入该群的时间戳。 |
| 23 | extra |
TEXT | {"originName"..."} |
扩展信息。JSON 格式,包含创建时是否跳过审核,原始群名、原始头像。 |
| 24 | tag |
INTEGER | 101, 102, 202, 302 |
群标签 ID 用途未知 |
| 25 | groupNumber |
TEXT | K339680344351 |
群号。用户搜索加群时显示的对外群号(以 K 开头)。 |
| 26 | introduction |
TEXT | (见样本) | 群简介。有的没有 |
| 27 | groupHeadUrl |
TEXT | ks://...png/6 |
群头像 URL。快手 CDN 链接,通常以 ks:// 开头,需替换为 http 协议才能访问。 |
| 28 | defaultGroupName |
TEXT | 无名、快手用户xxx... |
默认群名。当 groupName 为空时,快手会自动拼接前几个群成员的名字作为群名。 |
| 29 | groupNamePY |
TEXT | (见数据) | 群名拼音。 下面这些数据都好猎奇。。。 |
| 30 | groupNameAbbr |
TEXT | (见数据) | 群名缩写。 |
| 31 | defaultGroupNamePY |
TEXT | (见数据) | 默认群名拼音。 |
| 32 | defaultGroupNameAbbr |
TEXT | (见数据) | 默认群名拼音首字母。 |
| 33 | groupNameOpt |
TEXT | (见数据) | 群名操作标记。 |
| 34 | groupNamePinYinOpt |
TEXT | (见数据) | 群名拼音操作。 |
| 35 | groupNameAbbrOpt |
TEXT | (见数据) | 群名缩写操作。 |
| 36 | groupBackNameOpt |
TEXT | (见数据) | 群备注名操作。 |
| 37 | groupBackNamePinYinOpt |
TEXT | (见数据) | 群备注名拼音操作。 |
| 38 | groupBackNameAbbrOpt |
TEXT | (见数据) | 群备注名缩写操作。 |
| 39 | location |
TEXT | {"latitude":""...} |
位置信息。JSON格式,包含位置信息。 |
| 40 | memberStatus |
INTEGER | 2, 1, 4 |
成员状态。 用途未知 |
| 41 | isMuteAll |
INTEGER | 0 |
是否全员禁言 |
| 42 | canTalkUsers |
TEXT | (空) | 白名单用户。禁言模式下可发言的人。 |
| 43 | keepSilenceUsers |
TEXT | (空) | 黑名单用户。被单独禁言的人。 |
| 44 | topMembers |
TEXT | 3402...,2843... |
前几个成员 ID 列表。前几位成员 ID,用于生成默认群名。 |
| 45 | multiForbiddenState |
TEXT | (空) | 多重禁言状态。 有待分析 |
| 46 | managerId |
TEXT | null | 管理员 ID 列表。 |
| 47 | groupLabelIds |
TEXT | null | 群标签 ID 列表。 |
| 48 | inviteNeedUserAgree |
INTEGER | 0 |
邀请需用户同意。 |
| 49 | multiForbiddenStates |
TEXT | 0, 2, 4 |
群聊封禁状态码。0为正常,2,3未知 4为封禁 有待分析 |
| 50 | groupExtraSetting |
TEXT | 0,32,48 |
群额外设置。 用途未知 |
-
群名称显示逻辑:
- 解释:很多群没有显式命名,此时一定要用
defaultGroupName(也就是那一串成员名字拼接),否则用户看到全是空名字。*
- 解释:很多群没有显式命名,此时一定要用
-
头像处理:
- 数据库里的头像链接是
ks://协议(如ks://edmrred9...)。 - 在导出为 HTML/JSON 时,通常需要将其转换为
http://或https://,或者使用快手的 CDN 域名(需要抓包确认域名)。
- 数据库里的头像链接是
-
群号 vs ID:
groupId: 数据库内部用的唯一 ID,全是数字。groupNumber: 用户可见的群号,带K前缀。导出时建议展示groupNumber方便用户搜索。
-
成员管理:
- 虽然这里有
topMembers,但它不全。要获取完整的群成员列表和昵称,必须去查kwai_group_member表,用groupId关联。
- 虽然这里有
kwai_group_member表字段说明
表名:kwai_group_member
功能:存储群成员信息,用于建立“用户 ID”到“群昵称”的映射。
| 序号 | 字段名 (Column) | 类型 | 样本值示例 | 详细说明 |
|---|---|---|---|---|
| 1 | ID |
TEXT | 26_407148103_2715213950 |
主键 ID。格式为 AppID_GroupId_UserId,由这三者拼接而成的唯一标识。 |
| 2 | groupId |
TEXT | 407148103 |
群组 ID。关联 kwai_group_info 表。 |
| 3 | appId |
INTEGER | 26 |
应用 ID。固定为 26。 |
| 4 | userId |
TEXT | 2715213950 |
用户 ID。群成员的个人账号 ID。用于关联 kwai_message 中的 sender。 |
| 5 | nickName |
TEXT | (空) / 群昵称 |
群昵称。该用户在本群显示的昵称。如果为空,则显示用户原本的快手名。 |
| 6 | joinTime |
INTEGER | 1724940871001 |
入群时间。13位毫秒级时间戳。 |
| 7 | status |
INTEGER | 1,2,3,4 |
成员状态。 用途未知 |
| 8 | invitedUserId |
TEXT | 2856147173 |
邀请人 ID。是谁把这个用户拉进群的。 |
| 9 | antiDisturbing |
INTEGER | 0 |
防打扰状态。0: 关闭? 有待分析 |
| 10 | createTime |
INTEGER | 1724940871001 |
记录创建时间。通常等于 joinTime。 |
| 11 | updateTime |
INTEGER | 1720342293463 |
最后更新时间。修改昵称或权限变更的时间。 |
| 12 | silenceDeadline |
INTEGER | 0 |
禁言截止时间。 有待分析 |
| 13 | role |
INTEGER | 1, 2, 3 |
群内权限 1: 普通成员 (Member)2: 群主 (Owner)3: 管理员 (Admin) |
| 14 | nickNameOpt |
TEXT | (见数据) | 昵称搜索优化。用于本地搜索匹配,存储了昵称的所有后缀子串。 |
| 15 | nickNamePinYinOpt |
TEXT | (见数据) | 昵称拼音搜索。用于拼音首字母搜索。 |
| 16 | nickNameAbbrOpt |
TEXT | (见数据) | 昵称缩写。用于首字母快速匹配。 |
kwai_message 表字段说明
这个表是所有表里信息量最大的
功能:存储所有聊天记录的详细内容(气泡)。
| 序号 | 字段名 (Column) | 类型 | 样本值示例 | 详细说明 |
|---|---|---|---|---|
| 1 | _id |
INTEGER | 17382086371200092 |
主键 ID。本地数据库生成的唯一标识。 |
| 2 | subBiz |
TEXT | 0 |
子业务。通常为 0。 有待分析 |
| 3 | target |
TEXT | 4561100593 |
会话 ID。如果是私聊,这里是对方 ID;如果是群聊,这里是群 ID。用于关联 kwai_conversation。 |
| 4 | targetType |
INTEGER | 0, 4 |
会话类型。0: 私聊4: 群聊 |
| 5 | sender |
TEXT | 3440988052 |
发送者 ID。谁发的消息。如果是你发的,就是你自己的 ID。 |
| 6 | seq |
INTEGER | 1736678568014004 |
消息序列号。服务器端生成的唯一且递增的序列号。 |
| 7 | clientSeq |
INTEGER | 17366795434760424 |
客户端序列号。本地生成的消息唯一 ID。 |
| 8 | sentTime |
INTEGER | 1736679543510 |
发送时间 (核心)。13位毫秒级时间戳。用于展示消息时间。 |
| 9 | msgType |
INTEGER | 0, 2, 13006 |
消息类型 (核心) 详情见文档消息类型 |
| 10 | readStatus |
INTEGER | 0 |
已读状态。本地是否已读。 有待分析 |
| 11 | outboundStatus |
INTEGER | 0 |
发送状态。 0 代表发送成功 1 发送中 2 发送失败 -1 草稿 (Draft) |
| 12 | text |
TEXT | 你好 |
简略文本。简单的文本消息会直接存在这里,但复杂的(如图片、卡片)这里为空或乱码。 |
| 13 | unknownTips |
TEXT | [功能内测中] |
降级提示。当 APP 版本过低无法解析消息时显示的提示文本。 |
| 14 | placeHolder |
TEXT | (null) | 占位符 用途未知 |
| 15 | contentBytes |
BLOB | {"remind_body":...} |
消息体 (核心)。 这里存放了最完整的消息内容Protobuf 格式,包含了图片 URL、富文本结构等。 |
| 16 | impactUnread |
INTEGER | 1 |
是否计入未读数。1: 计入0: 不计入 (如系统撤回提示) |
| 17 | priority |
INTEGER | -1 |
优先级。 有待分析 |
| 18 | categoryId |
INTEGER | 0 |
分类 ID。 有待分析 |
| 19 | accountType |
INTEGER | 0 |
账号类型。 有待分析 |
| 20 | localSortSeq |
INTEGER | 1736678568014004 |
本地排序序列号。 有待分析 |
| 21 | reminders |
TEXT | {"remind_body":"[]"} |
提醒信息。json格式,可能用于存储 @ 某人的信息。 有待分析 |
| 22 | extra |
BLOB | (二进制数据) | 扩展信息。可能存储一些元数据。 用途未知 |
| 23 | localExtra |
BLOB | (二进制数据) | 本地扩展信息 用途未知 |
| 24 | receipt |
INTEGER | 0 |
回执状态。 有待分析 |
| 25 | createSession |
INTEGER | 0, 1 |
是否创建会话。 有待分析 |
| 26 | forward |
INTEGER | 0 |
是否为转发消息。 有待分析 |
| 27 | attachmentFilePath |
TEXT | (null)或路径 | 附件本地路径。如果是自己发送的图片,这里可能有本地文件的绝对路径。 |
| 28 | createTime |
INTEGER | 0或时间戳 |
创建时间。通常为 0,以 sentTime 为准。 |
| 29 | realFrom |
TEXT | (null) | 真实发送者。可能用于代发消息场景。 有待分析 |
| 30 | invisibleInConversationList |
INTEGER | 0 |
列表不可见。 有待分析 |
| 31 | previousReplaceSeq |
INTEGER | 0 |
上一条被替换的消息 seq。用于消息编辑/撤回逻辑。 |
| 32 | searchableContent |
TEXT | 好的,感谢... |
可搜索内容。用于本地搜索的纯文本索引,内容比 text 更全,解析文本消息时优先读这个。 |
| 33 | ftsRowId |
INTEGER | 44827... |
全文搜索索引 ID。 |
| 34 | isLocalMsg |
INTEGER | 0 |
是否为本地消息。0: 从服务器拉取1: 本地产生 |
由于快手使用了多种字段来存储内容,建议按以下优先级进行解析:
-
文本消息 (Text):
- 优先读取
searchableContent。这个字段通常包含了干净的文本内容,且不包含 XML 标签。 - 如果
searchableContent为空,再读取text。 - 注意:
contentBytes里有很多乱码和 XML 结构 (<a href=...>),那是原始格式,解析起来比较麻烦,直接用searchableContent更方便。
- 优先读取
-
图片/表情包 (Image/Sticker):
- 字段:
contentBytes。 - 解析方法:
contentBytes里包含了http://...jpg或webp的链接。
对于ks://开头的链接需要在前面加上快手的cdn。 - 特征:
msgType通常为1(图片) 或1014(表情包?)。
- 字段:
-
系统消息 (System):
- 特征:
msgType=200或sender=9223372036854775807(这是 Java Long 的最大值,代表系统)。 - 内容:如
群主已解散群、撤回了一条消息。这些内容通常直接存在text或searchableContent中。
- 特征:
如何关联“我是谁”
在 kwai_message 表中,并没有字段明确标记“我是发送者”。你需要结合 sender 字段:
* 在解析之前,你需要知道当前登录用户的 ID(也就是数据库文件名的那串数字)。
* 如果 sender 等于当前用户uid就是自己发的,否则就是对方发的。