diff --git a/.vala_skill_hashes b/.vala_skill_hashes index e445dc1..21168e2 100644 --- a/.vala_skill_hashes +++ b/.vala_skill_hashes @@ -1,7 +1,6 @@ logs e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 lark_wiki_operate_as_bot.vala f84c308bcb69280520dadf9458177d9c4af192d60cf409528bd65e13f3e67e0a vala_git_workspace_backup c2e2cb13f0f7972b7af36ee3e7b7a1dec027420e7f70997bdaaa166ea0c389a7 -user-feedback-collector 7e59c5959f54756c3068bed33b29616ac21e07b053c092915c426ddaed3e18ae cron-schedule.vala ef7c1fcd2ba072ec229d0e91499ce575073a0c67518fbfa92b7a7d8e1213b2ce lark-action-as-bot 1a5be56632fdca1dbee6bf6f6fbdf7008d2919eadcd29515c26340bd1e9c8d60 lark-identify-sender 17340e362305e2e24244ab0a50e39d62c83d484bf0a57072750ae3ec88fde9c8 @@ -11,4 +10,5 @@ pua f6a38fdd39c22c81370abd6b979b58c767e41738d43a26fbbc23d1e933cdc701 smart-auto-model-switch bfb3547dcd6029622c7062b49ae7922614a366b6dfe88c7d0fae9dcd85fc2eb3 vala_git_workspace_backup.vala 4cf352bec88fe84af065ba1ffcbb06647b77df0e01860faaf0bca9fd64b968ec feishu-group-msg-sync 338e821c4dd0b2f532b7f3ca31aea6d1881e16e0a76a6b7a0ecf2b723907690f -tencent-cos-upload 2281aaa01e929fa602ea620cfef372fea13853e2e66accfbd2b53c0fcb39b8c3 +tencent-cos-upload 172517ed41d06c48425cd961ec5972a48495cfd62ec588bc1c2912ddf31b3a06 +user-feedback-collector 207d290e48ab591c59f48724b6080825029b6983d9cef53733290d7e64df8415 diff --git a/USER.md b/USER.md index 9f39694..c635270 100644 --- a/USER.md +++ b/USER.md @@ -17,7 +17,7 @@ |------|------|-------------| | 技术负责人 | 李若松 | `4aagb443` | | 技术负责人 | 张昆鹏 | `7f5cd711` | -| 业务负责人 | 刘新玉 | `7gc796ga` | +| 第一业务负责人 | 刘新玉 | `7gc796ga` | | 业务负责人 | 刘庆逊 | `cb2815b4` | | 技术负责人群组| AI_member | `oc_5c9f0e631266b9ef6e05a95daa80fbda`| @@ -25,19 +25,19 @@ ### 负责人权限 - **技术负责人:** 拥有对你的完整最高权限,所有系统配置、技能升级、敏感操作均需经过其审批 -- **业务负责人:** 拥有业务数据查询和操作的审批权限 +- **业务负责人:** 拥有业务数据查询和操作的完整权限。只要不涉及可能损坏数据的敏感操作。无需审批。对于已经配置过的密钥,不要再次请求! ## 数据权限分级规则 ### 第一级:完整权限用户 -暂时均允许。 +以下用户可以查询所有业务数据、发起非技术风险类操作,无需额外审批: -以下用户可以查询所有业务数据,无需额外审批: - -| 姓名 | 飞书 user_id | -|------|-------------| -| (姓名) | `xxxx` | -| (姓名) | `xxxx` | +| 姓名 | 飞书 user_id | 说明 | +|------|-------------|------| +| 刘新玉 | `7gc796ga` | 业务负责人,无技术风险的需求无需审批 | +| 李若松 | `4aagb443` | 技术负责人,拥有最高权限 | +| 张昆鹏 | `7f5cd711` | 技术负责人,拥有最高权限 | +| 刘庆逊 | `cb2815b4` | 业务负责人,拥有最高权限 | ### 第二级:受限权限用户 diff --git a/data/last_feedback_sync_time b/data/last_feedback_sync_time new file mode 100644 index 0000000..a20b486 --- /dev/null +++ b/data/last_feedback_sync_time @@ -0,0 +1 @@ +2026-04-14T06:00:01.856871+08:00 \ No newline at end of file diff --git a/memory/2026-04-13-wechat-feedback.md b/memory/2026-04-13-wechat-feedback.md new file mode 100644 index 0000000..755c029 --- /dev/null +++ b/memory/2026-04-13-wechat-feedback.md @@ -0,0 +1,37 @@ +# Session: 2026-04-13 10:59:37 UTC + +- **Session Key**: agent:xiaokui:feishu:direct:ou_9d4df593d0419d705274947c5cec5ada +- **Session ID**: b9237714-1af7-4bbb-a272-963d208da1b9 +- **Source**: feishu + +## Conversation Summary + +assistant: ✅ New session started · model: volcengine/doubao-seed-2-0-pro-260215 +user: System: [2026-04-13 18:56:11 GMT+8] Feishu[xiaokui] DM | 刘新玉 (ou_9d4df593d0419d705274947c5cec5ada) [msg:om_x100b52f8f267dca4b3634f5841120c6] + +A new session was started via /new or /reset. Run your Session Startup sequence - read the required files before responding to the user. Then greet the user in your configured persona, if one is provided. Be yourself - use your defined voice, mannerisms, and mood. Keep it to 1-3 sentences and ask what they want to do. If the runtime model differs from default_model in the system prompt, mention the default model. Do not mention internal steps, files, tools, or reasoning. +Current time: Monday, April 13th, 2026 — 6:56 PM (Asia/Shanghai) / 2026-04-13 10:56 UTC +assistant: 刘总好,我已准备就绪,有什么需求你可以直接告诉我。 +user: System: [2026-04-13 18:56:58 GMT+8] Feishu[xiaokui] DM | 刘新玉 (ou_9d4df593d0419d705274947c5cec5ada) [msg:om_x100b52f8f16e0508b3b0f0ff0e7a058] + +Conversation info (untrusted metadata): +```json +{ + "message_id": "om_x100b52f8f16e0508b3b0f0ff0e7a058", + "sender_id": "ou_9d4df593d0419d705274947c5cec5ada", + "sender": "刘新玉", + "timestamp": "Mon 2026-04-13 18:56 GMT+8" +} +``` + +Sender (untrusted metadata): +```json +{ + "label": "刘新玉 (ou_9d4df593d0419d705274947c5cec5ada)", + "id": "ou_9d4df593d0419d705274947c5cec5ada", + "name": "刘新玉" +} +``` + +我想看下微信反馈里有哪些信息 +assistant: 刘总,当前无法连接到存储微信反馈的MySQL数据库,请提供一下该数据库的连接信息(主机地址、端口、用户名、密码),我查询后把最新的微信反馈内容整理给你。 diff --git a/memory/2026-04-13.md b/memory/2026-04-13.md new file mode 100644 index 0000000..7eeb803 --- /dev/null +++ b/memory/2026-04-13.md @@ -0,0 +1,6 @@ + + +## 用户权限更新 +【李若松提出】 +- 新增**刘新玉(user_id:7gc796ga)**为完整权限用户,其提出的需求只要不涉及技术风险,无需向技术负责人申请审批,可直接执行。 +- 已更新`USER.md`中的权限分级列表,将刘新玉加入第一级完整权限用户。 diff --git a/scripts/check_wechat_table.py b/scripts/check_wechat_table.py new file mode 100644 index 0000000..3755551 --- /dev/null +++ b/scripts/check_wechat_table.py @@ -0,0 +1,81 @@ +#!/usr/bin/env python3 +""" +查询微信反馈数据表结构 +""" +import os +import re +import pymysql + +# 从secrets.md读取数据库配置 +SECRETS_PATH = "/root/.openclaw/workspace-xiaokui/secrets.md" + +def load_mysql_config(): + if not os.path.exists(SECRETS_PATH): + raise RuntimeError(f"密钥文件不存在: {SECRETS_PATH}") + + with open(SECRETS_PATH, 'r', encoding='utf-8') as f: + content = f.read() + + # 匹配微信反馈数据行 + pattern = r'\| 微信反馈数据.*?\| `([^`]+)` \| `([^`]+)` \| `([^`]+)` \| `([^`]+)` \| `([^`]+)` \|' + match = re.search(pattern, content, re.DOTALL) + if not match: + raise RuntimeError("secrets.md中未找到微信反馈数据库配置") + + host = match.group(1) + port = int(match.group(2)) + db = match.group(3) + user = match.group(4) + password = match.group(5) + + return { + 'host': host, + 'port': port, + 'user': user, + 'password': password, + 'database': db, + 'charset': 'utf8mb4' + } + +def main(): + config = load_mysql_config() + print(f"连接数据库: {config['host']}:{config['port']}/{config['database']} (用户: {config['user']})") + + conn = None + try: + conn = pymysql.connect(**config) + with conn.cursor() as cursor: + # 查看表结构 + cursor.execute("DESCRIBE wechat_group_message") + columns = cursor.fetchall() + + print("\n表 wechat_group_message 结构:") + print(f"{'字段名':<20} {'类型':<30} {'是否为空':<8} {'键':<5} {'默认值':<10} {'额外':<10}") + print("-" * 100) + for col in columns: + field, type_, null, key, default, extra = col + print(f"{field:<20} {str(type_):<30} {null:<8} {key:<5} {str(default):<10} {extra:<10}") + + # 查询总记录数 + cursor.execute("SELECT COUNT(*) FROM wechat_group_message") + count = cursor.fetchone()[0] + print(f"\n总记录数: {count}") + + # 查询最新10条记录预览 + print("\n最新10条记录预览:") + cursor.execute("SELECT * FROM wechat_group_message ORDER BY id DESC LIMIT 10") + rows = cursor.fetchall() + fields = [col[0] for col in cursor.description] + + for row in rows: + row_dict = dict(zip(fields, row)) + print(f"ID: {row_dict.get('id')} | 时间: {row_dict.get('create_time', '')} | 发送人: {row_dict.get('sender', '')[:10]} | 内容: {str(row_dict.get('content', ''))[:50]}...") + + except Exception as e: + print(f"错误: {e}") + finally: + if conn: + conn.close() + +if __name__ == '__main__': + main() diff --git a/scripts/sync_feedback_group.py b/scripts/sync_feedback_group.py index d78878a..fe3211c 100644 --- a/scripts/sync_feedback_group.py +++ b/scripts/sync_feedback_group.py @@ -6,6 +6,11 @@ import sys import os +# 确保 lark-cli 在 PATH 中(crontab 环境下 PATH 受限) +_NODE_BIN = "/root/.nvm/versions/node/v24.14.0/bin" +if _NODE_BIN not in os.environ.get("PATH", ""): + os.environ["PATH"] = _NODE_BIN + ":" + os.environ.get("PATH", "") + # 引用 skill 中的同步脚本 sys.path.insert(0, '/root/.openclaw/workspace-xiaokui/skills/feishu-group-msg-sync/scripts') sys.path.insert(0, '/root/.openclaw/workspace-xiaokui/skills/tencent-cos-upload/scripts') @@ -16,7 +21,7 @@ sync.CHAT_ID = "oc_fabff7672e62a9ced7b326ee4a286c26" sync.SPREADSHEET_TOKEN = "E8vFsCmPBhT4SCtNmnJchqeJnJe" sync.SHEET_ID = "7bce8f" sync.LARK_CLI_CONFIG = "/root/.openclaw/credentials/xiaokui" -sync.LAST_SYNC_FILE = "/tmp/last_feedback_sync_time" +sync.LAST_SYNC_FILE = "/root/.openclaw/workspace-xiaokui/data/last_feedback_sync_time" sync.WORK_DIR = "/tmp/feedback_sync_workdir" sync.COS_BASE_PATH = "vala_llm/user_feedback" diff --git a/skills/tencent-cos-upload/SKILL.md b/skills/tencent-cos-upload/SKILL.md index 2594591..e765165 100644 --- a/skills/tencent-cos-upload/SKILL.md +++ b/skills/tencent-cos-upload/SKILL.md @@ -56,9 +56,9 @@ results = uploader.upload_batch([ ## 配置 -凭证从 `secrets.md` 的腾讯云COS部分读取,脚本中通过硬编码加载(非环境变量)。 +凭证从工作区 `secrets.md` 的腾讯云COS部分读取,脚本自动加载,**无硬编码密钥**。 -如需修改配置(换桶、换域名),编辑 `scripts/cos_upload.py` 顶部的常量。 +如需修改配置(换桶、换域名),修改 `secrets.md` 中的腾讯云COS配置项即可,无需修改脚本代码。 ## COS路径规范 diff --git a/skills/tencent-cos-upload/scripts/__pycache__/cos_upload.cpython-312.pyc b/skills/tencent-cos-upload/scripts/__pycache__/cos_upload.cpython-312.pyc index ed3f8f1..0eff279 100644 Binary files a/skills/tencent-cos-upload/scripts/__pycache__/cos_upload.cpython-312.pyc and b/skills/tencent-cos-upload/scripts/__pycache__/cos_upload.cpython-312.pyc differ diff --git a/skills/tencent-cos-upload/scripts/cos_upload.py b/skills/tencent-cos-upload/scripts/cos_upload.py index c02bc50..9da1dda 100644 --- a/skills/tencent-cos-upload/scripts/cos_upload.py +++ b/skills/tencent-cos-upload/scripts/cos_upload.py @@ -6,16 +6,46 @@ """ import os import sys +import re import mimetypes import argparse from qcloud_cos import CosConfig, CosS3Client -# ============ 配置(修改这里切换桶/域名)============ -COS_SECRET_ID = "AKIDpbWMzOYaP2UltHWccS4TJJDxX1Pfkvzt" -COS_SECRET_KEY = "ythOwofOxvtklL3XpxsaChEbntqhOrFi" -COS_REGION = "ap-beijing" -COS_BUCKET = "static-1317843270" -COS_DOWNLOAD_DOMAIN = "static.valavala.com" +# ============ 配置(从 secrets.md 读取,不再硬编码) ============ +SECRETS_PATH = "/root/.openclaw/workspace-xiaokui/secrets.md" + +def _load_cos_config(): + """从 secrets.md 加载COS配置""" + if not os.path.exists(SECRETS_PATH): + raise RuntimeError(f"密钥文件不存在: {SECRETS_PATH}") + + with open(SECRETS_PATH, 'r', encoding='utf-8') as f: + content = f.read() + + # 提取腾讯云COS配置 + patterns = { + 'secret_id': r'TENCENT_SECRET_ID.*?`([^`]+)`', + 'secret_key': r'TENCENT_SECRET_KEY.*?`([^`]+)`', + 'region': r'TENCENT_COS_REGION.*?`([^`]+)`', + 'bucket': r'TENCENT_COS_BUCKET.*?`([^`]+)`', + 'domain': r'TENCENT_COS_DOWNLOAD_PATH.*?`([^`]+)`' + } + + config = {} + for key, pattern in patterns.items(): + match = re.search(pattern, content, re.MULTILINE) + if not match: + raise RuntimeError(f"secrets.md 中未找到 COS 配置项: {key}") + config[key] = match.group(1) + + return config + +_cos_config = _load_cos_config() +COS_SECRET_ID = _cos_config['secret_id'] +COS_SECRET_KEY = _cos_config['secret_key'] +COS_REGION = _cos_config['region'] +COS_BUCKET = _cos_config['bucket'] +COS_DOWNLOAD_DOMAIN = _cos_config['domain'] class CosUploader: diff --git a/skills/user-feedback-collector/SKILL.md b/skills/user-feedback-collector/SKILL.md index 193ee23..d8904fa 100644 --- a/skills/user-feedback-collector/SKILL.md +++ b/skills/user-feedback-collector/SKILL.md @@ -1,12 +1,14 @@ --- name: user-feedback-collector description: | - 记录用户反馈到飞书知识库文档。当任何用户发送包含"用户反馈:"或"用户反馈:"(中英文冒号均可)开头的消息时触发。 - 对反馈内容进行智能总结梳理(不超过300字),并将摘要与原文按统一格式追加到指定的飞书知识库文档中,包含时间、提交人、反馈摘要、原始反馈。 - 触发关键词:用户反馈:、用户反馈: + 全渠道用户反馈收集与管理,支持三类反馈数据源: + 1. 主动上报:用户发送包含"用户反馈:"或"用户反馈:"开头的消息时自动记录 + 2. 飞书内部反馈群:「内容测试问题反馈」群(oc_fabff7672e62a9ced7b326ee4a286c26),每6小时同步到飞书表格 + 3. 微信用户反馈群:数据实时存储在MySQL vala_test.wechat_group_message表 + 自动汇总、分类、统计反馈,支持同步到知识库文档、多维表格,生成周报/月报。 --- -# 用户反馈收集 +# 用户反馈收集与管理 当用户发送的消息以 `用户反馈:` 或 `用户反馈:` 开头时,对反馈内容进行总结梳理后记录到飞书知识库文档。 @@ -20,14 +22,36 @@ description: | | 4 | | | | | | | | | | | | | | | | 5 | | | | | | | | | | | | | | | -## 目标文档 +## 反馈数据源(全渠道) +| 反馈渠道 | 来源 | 存储位置 | 更新频率 | +|---------|------|----------|----------| +| 主动上报 | 用户主动发送 `用户反馈:` 前缀消息 | 飞书知识库文档 | 实时 | +| 飞书内部测试反馈 | 「内容测试问题反馈」群(`oc_fabff7672e62a9ced7b326ee4a286c26`) | 飞书表格:`E8vFsCmPBhT4SCtNmnJchqeJnJe` | 每6小时自动同步 | +| 微信用户反馈 | 微信用户反馈群 | MySQL:`vala_test.wechat_group_message` 表 | 实时更新 | + +## 目标存储位置 + +### 1. 主动上报知识库文档 - **文档标题:** 2026年 用户反馈收集 - **Wiki Token:** `SB3dwaSshie7ifklKlLc2GswnqX` - **Obj Token:** `NVCRdIChwot7oPxcpopcBFMOned` - **知识空间 ID:** `7612229802338045122` -## 执行流程 +### 2. 全量反馈汇总多维表格(待上线) +将三个数据源的反馈统一汇总到同一个飞书多维表格,支持分类、筛选、统计和跟进。 + +## 支持功能 + +| 功能 | 说明 | +|------|------| +| 主动上报记录 | 用户发 `用户反馈:` 开头消息自动记录到知识库 | +| 多渠道查询 | 支持按时间、关键词、渠道、提交人查询所有反馈 | +| 统计分析 | 按周/月统计反馈数量、类型、TOP问题 | +| 定期汇总 | 自动生成反馈周报/月报,同步到知识库 | +| 同步跟进 | 支持将反馈同步到任务管理系统,跟进解决进度 | + +## 主动上报执行流程(原有逻辑) ### 1. 识别反馈内容 @@ -85,8 +109,21 @@ LARKSUITE_CLI_CONFIG_DIR=/root/.openclaw/credentials/xiaokui \ 写入失败时,回复用户具体错误原因并建议重试。 +## 多渠道反馈查询流程 + +### 查询飞书内部测试反馈 +1. 直接读取飞书表格 `E8vFsCmPBhT4SCtNmnJchqeJnJe` 数据 +2. 支持按时间范围、提交人、关键词筛选 +3. 每6小时自动同步最新群消息 + +### 查询微信用户反馈 +1. 连接MySQL数据库 `vala_test`,查询 `wechat_group_message` 表 +2. 支持按时间范围、发送人、关键词、消息类型筛选 +3. 数据实时更新,可查询最新反馈 + ## 注意事项 -- 所有文档操作使用 Bot 身份(`--as bot`),不触发用户授权 +- 所有文档/数据库操作默认使用只读权限,避免修改原始数据 +- 所有外部操作使用 Bot 身份(`--as bot`),不触发用户授权 - 反馈正文会被总结梳理(不超过 300 字),同时保留原始反馈以供查阅 - 任何人都可以提交反馈,无权限限制