ai_member_xiaokui/skills/user-feedback-data-source/SKILL.md
--git_token 6dee41a195 refactor: 拆分 user-feedback-collector 为数据获取层和数据处理层
- user-feedback-data-source: 原始数据来源、采集、表结构、查询(技术负责人维护)
- user-feedback-processor: 分类、优先级、统计、报告(产品经理使用)
- 旧 skill 归档到 backup/
2026-04-24 10:59:32 +08:00

188 lines
7.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
name: user-feedback-data-source
description: |
用户反馈原始数据获取层。定义所有反馈数据的来源、存储位置、表结构和查询方式。
支持三类数据源:
1. 主动上报:用户发送"用户反馈:"开头的消息,实时记录到飞书知识库
2. 飞书内部反馈群:「内容测试问题反馈」群消息,定时同步到 MySQL
3. 微信用户反馈群:「用户火线救火」群消息,实时存储到 MySQL
**当以下情况时使用此 Skill**
(1) 需要了解反馈数据从哪来、存在哪、什么结构
(2) 需要查询原始反馈数据(飞书群/微信群/主动上报)
(3) 需要维护数据采集脚本或定时任务
(4) 用户发送"用户反馈:"开头的消息,需要记录
(5) 被 user-feedback-processor 技能引用,作为数据源说明
---
# 用户反馈数据获取
本技能定义用户反馈的**原始数据来源**、存储方式和查询接口。是反馈处理流程的底层数据层。
> **维护负责人:** 技术负责人(李若松)
> **下游消费者:** `user-feedback-processor` 技能(产品经理使用)
## 数据源总览
| 反馈渠道 | 来源 | 存储位置 | 更新频率 |
|---------|------|----------|----------|
| 主动上报 | 用户发送 `用户反馈:` 前缀消息 | 飞书知识库文档 | 实时 |
| 飞书内部测试反馈 | 「内容测试问题反馈」群(`oc_fabff7672e62a9ced7b326ee4a286c26` | MySQL`vala_test.lark_group_message` | 每天 8 次08/10/12/14/16/18/20/22 点) |
| 微信用户反馈 | 「用户火线救火」群 | MySQL`vala_test.wechat_group_message` | 实时(每分钟同步) |
## 数据源一:主动上报
### 触发条件
用户消息以 `用户反馈:``用户反馈:` 开头。
### 执行流程
1. **提取反馈正文** — 去掉前缀,去除前后空白
2. **总结梳理** — 提炼核心观点,保留关键事实和诉求,不超过 300 字;原文条理清晰则保持原文
3. **获取提交人** — 通过 `sender_id` 调用 `feishu_get_user` 获取姓名
4. **追加写入文档** — Bot 身份写入知识库文档:
```bash
LARKSUITE_CLI_CONFIG_DIR=/root/.openclaw/credentials/xiaokui \
lark-cli docs +update --doc NVCRdIChwot7oPxcpopcBFMOned --as bot --mode append \
--markdown '<写入内容>'
```
5. **确认回复** — 成功:「✅ 反馈已记录,感谢!」;失败:告知具体错误
### 写入格式
```markdown
---
**📅 时间:** YYYY-MM-DD HH:mm
**👤 提交人:** <用户姓名>
**📝 反馈摘要:**
<总结梳理后的内容不超过300字>
**💬 原始反馈:**
<反馈原文>
```
- 时间使用 Asia/Shanghai 时区
- 文档为空时先写标题 `# 📋 用户反馈记录`,首条不需要开头分割线
### 存储位置
- **文档标题:** 用户反馈问题汇总
- **Wiki Token** `ApVZw0fxGiv48ekuRS8cIfUjnRf`
- **知识空间 ID** `7612229802338045122`
## 数据源二:飞书内部测试反馈群
### 采集方式
定时脚本 `feishu-group-msg-sync` 以 Bot 身份拉取群消息,媒体文件上传到腾讯 COS所有记录写入 MySQL。
- **定时任务:** `scripts/run_lark_group_sync.sh`crontab 每天 8 次)
- **底层脚本:** `skills/feishu-group-msg-sync/scripts/sync_group_to_mysql.py`
- **同步状态文件:** `/tmp/last_feishu_feedback_sync_time`
### 数据库表:`vala_test.lark_group_message`
| 字段 | 类型 | 说明 |
|------|------|------|
| id | bigint unsigned | 自增主键 |
| chat_id | varchar(128) | 群聊 ID |
| chat_name | varchar(255) | 群聊名称 |
| sender_id | varchar(128) | 发送者 open_id |
| sender_name | varchar(255) | 发送者姓名 |
| message_id | varchar(128) | 飞书消息 ID`om_xxx`),唯一索引 |
| parent_id | varchar(128) | 父消息 IDthread |
| root_id | varchar(128) | 根消息 IDthread |
| quote_message_id | varchar(128) | 引用消息 ID回复引用 |
| 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 | 消息时间戳(毫秒) |
| collected_at | datetime | 入库时间 |
### 查询示例
```sql
-- 查询最近 7 天的飞书反馈
SELECT sender_name, msg_type, content, media_url, 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;
-- 查询某条消息的完整对话链(原消息 + 所有回复)
SELECT message_id, sender_name, content, msg_time,
IF(quote_message_id IS NULL, '原消息', '↳ 回复') AS role
FROM lark_group_message
WHERE message_id = '<target_id>' OR quote_message_id = '<target_id>'
ORDER BY msg_timestamp;
```
## 数据源三:微信用户反馈群
### 采集方式
微信群消息通过外部同步工具实时写入 MySQL每分钟增量同步。
- **定时任务:** `scripts/sync_wechat_feedback_minutely.py`crontab 每分钟)
### 数据库表:`vala_test.wechat_group_message`
| 字段 | 类型 | 说明 |
|------|------|------|
| svr_msg_id | bigint | 消息唯一 ID |
| sender_name | varchar(255) | 发送者昵称 |
| msg_type | int | 消息类型 |
| content | text | 文本内容 |
| media_url | varchar(1024) | 媒体文件 URL |
| refer_msg_svrid | bigint | 引用消息 ID回复引用 |
| msg_time | datetime | 消息时间 |
| msg_timestamp | bigint | 消息时间戳(毫秒) |
### 查询示例
```sql
-- 查询最近 7 天的微信反馈
SELECT sender_name, msg_type, content, media_url, msg_time
FROM wechat_group_message
WHERE msg_time >= DATE_SUB(NOW(), INTERVAL 7 DAY)
ORDER BY msg_timestamp DESC;
-- 查询完整对话链
SELECT svr_msg_id, sender_name, content, msg_time,
IF(refer_msg_svrid IS NULL, '原消息', '↳ 回复') AS role
FROM wechat_group_message
WHERE svr_msg_id = <target_id> OR refer_msg_svrid = <target_id>
ORDER BY msg_timestamp;
```
## 引用回复关系(跨渠道对照)
| 说明 | 飞书 `lark_group_message` | 微信 `wechat_group_message` |
|------|---------------------------|------------------------------|
| 消息唯一 ID | `message_id`varchar, `om_xxx` | `svr_msg_id`bigint |
| 被引用消息 ID | `quote_message_id`varchar | `refer_msg_svrid`bigint |
| 判断是否为回复 | `quote_message_id IS NOT NULL` | `refer_msg_svrid IS NOT NULL` |
## 数据库连接信息
- **主机:** `bj-cdb-8frbdwju.sql.tencentcdb.com`
- **端口:** `25413`
- **用户:** `chatbot`
- **密码:** 见 `secrets.env`
- **数据库:** `vala_test`
- **权限:** 查询操作默认只读
## 注意事项
- 所有飞书操作使用 Bot 身份(`--as bot`),不触发用户授权
- 反馈数据为原始数据,不做分类和优先级判定(由下游 `user-feedback-processor` 处理)
- 任何人都可以提交主动上报反馈,无权限限制
- 数据采集脚本和定时任务的维护由技术负责人负责