- feishu-group-msg-sync/SKILL.md: 修正引用关系识别机制说明(reply_to字段) - feishu-group-msg-sync/references/query_examples.md: 重写引用查询文档,增加多级追溯、字段对照 - user-feedback-collector/SKILL.md: 新增飞书+微信引用关系统一查询章节 - sync_group_to_mysql.py: 修复extract_quote_message_id从reply_to提取 - sync_feishu_full_history.py: 同步修复
5.0 KiB
5.0 KiB
飞书群消息查询示例
数据库表结构
lark_group_message 表包含以下关键字段:
| 字段 | 类型 | 说明 |
|---|---|---|
message_id |
varchar(128) | 消息唯一ID(om_xxx) |
quote_message_id |
varchar(128) | 引用消息ID — 当消息是引用回复时,记录被引用消息的 message_id |
parent_id |
varchar(128) | 父消息ID(话题根消息,预留字段) |
root_id |
varchar(128) | 根消息ID(话题根消息,预留字段) |
sender_id |
varchar(128) | 发送者ID(open_id) |
sender_name |
varchar(255) | 发送者显示名称 |
msg_type |
varchar(32) | 消息类型(text/post/image/media/audio/file/sticker) |
content |
text | 消息文本内容或描述 |
media_url |
varchar(1024) | 媒体文件COS URL |
msg_time |
datetime | 消息发送时间 |
msg_timestamp |
bigint | 消息时间戳(毫秒) |
引用回复关系
数据来源
飞书中用户点击"回复"某条消息时,lark-cli 返回的消息数据中包含 reply_to 字段(字符串类型,值为被引用消息的 message_id)。同步脚本提取后存入 quote_message_id 字段。
判断一条消息是否是引用回复
-- quote_message_id 不为 NULL 的消息就是引用回复
SELECT * FROM lark_group_message WHERE quote_message_id IS NOT NULL;
与微信数据表的对应关系
| 飞书表字段 | 微信表字段 | 类型差异 | 说明 |
|---|---|---|---|
message_id (varchar) |
svr_msg_id (bigint) |
飞书是字符串、微信是数字 | 消息唯一标识 |
quote_message_id (varchar) |
refer_msg_svrid (bigint) |
飞书是字符串、微信是数字 | 被引用消息的ID |
两张表的引用关系逻辑完全一致:
- 飞书:
quote_message_id指向被引用消息的message_id - 微信:
refer_msg_svrid指向被引用消息的svr_msg_id
引用回复查询
1. 查询某条消息的所有回复
-- 查询某条消息被哪些消息引用回复了
SELECT message_id, sender_name, content, msg_time
FROM lark_group_message
WHERE quote_message_id = 'om_xxx'
ORDER BY msg_timestamp;
2. 查询完整对话链(原消息 + 所有回复)
SELECT
message_id,
sender_name,
content,
media_url,
msg_time,
CASE
WHEN quote_message_id IS NULL THEN '📝 原消息'
ELSE CONCAT('↳ 回复 ', quote_message_id)
END AS message_role
FROM lark_group_message
WHERE message_id = 'om_xxx' OR quote_message_id = 'om_xxx'
ORDER BY msg_timestamp;
3. 多级引用链追溯(A → B → C)
当存在多级引用时(C 引用 B,B 引用 A),需要递归查询:
-- 第一步:找到目标消息(起点)
SELECT message_id, sender_name, content, quote_message_id, msg_time
FROM lark_group_message WHERE message_id = 'om_目标消息ID';
-- 第二步:向上追溯(找到被引用的原消息)
SELECT message_id, sender_name, content, quote_message_id, msg_time
FROM lark_group_message WHERE message_id = '上一步的quote_message_id';
-- 第三步:向下展开(找到引用目标消息的所有回复)
SELECT message_id, sender_name, content, quote_message_id, msg_time
FROM lark_group_message WHERE quote_message_id = 'om_目标消息ID'
ORDER BY msg_timestamp;
4. 统计热门话题(被回复最多的消息)
SELECT
m1.message_id,
m1.sender_name,
LEFT(m1.content, 80) AS content_preview,
m1.msg_time,
COUNT(m2.id) AS reply_count
FROM lark_group_message m1
INNER JOIN lark_group_message m2 ON m1.message_id = m2.quote_message_id
WHERE m1.chat_id = 'oc_fabff7672e62a9ced7b326ee4a286c26'
AND m1.msg_time >= DATE_SUB(NOW(), INTERVAL 7 DAY)
GROUP BY m1.message_id
ORDER BY reply_count DESC
LIMIT 10;
5. 查看某人发出的消息中,哪些收到了回复
SELECT
m1.message_id,
LEFT(m1.content, 60) AS original_content,
m1.msg_time,
COUNT(m2.id) AS reply_count,
GROUP_CONCAT(m2.sender_name SEPARATOR ', ') AS replied_by
FROM lark_group_message m1
INNER JOIN lark_group_message m2 ON m1.message_id = m2.quote_message_id
WHERE m1.sender_name = '胡陈辰'
GROUP BY m1.message_id
ORDER BY m1.msg_timestamp DESC;
常用查询
6. 查询最近7天的所有消息
SELECT message_id, sender_name, msg_type, content, media_url, quote_message_id, msg_time
FROM lark_group_message
WHERE chat_id = 'oc_fabff7672e62a9ced7b326ee4a286c26'
AND msg_time >= DATE_SUB(NOW(), INTERVAL 7 DAY)
ORDER BY msg_timestamp DESC;
7. 按消息类型统计
SELECT msg_type, COUNT(*) AS count
FROM lark_group_message
WHERE chat_id = 'oc_fabff7672e62a9ced7b326ee4a286c26'
AND msg_time >= DATE_SUB(NOW(), INTERVAL 7 DAY)
GROUP BY msg_type
ORDER BY count DESC;
8. 关键词搜索
SELECT message_id, sender_name, content, quote_message_id, msg_time
FROM lark_group_message
WHERE chat_id = 'oc_fabff7672e62a9ced7b326ee4a286c26'
AND content LIKE '%闪退%'
ORDER BY msg_timestamp DESC;