From 0227d525f9ba361a88e649fd289e51c3391c0a7c Mon Sep 17 00:00:00 2001 From: root Date: Mon, 30 Mar 2026 03:01:34 +0800 Subject: [PATCH] feat: add daily learning summary script with cron task - Create scripts/daily_learning.sh for daily chat review - Set up cron task at 3 AM daily - Log file: logs/daily_learning.log - Learning records: memory/daily_learning.md --- TOOLS.md | 8 + audio-1774809886092.json | 1 + audio-1774809886092.srt | 20 ++ audio-1774809886092.tsv | 6 + audio-1774809886092.txt | 5 + audio-1774809886092.vtt | 17 ++ logs/daily_learning.log | 365 ++++++++++++++++++++++++++ media/inbound/audio-1774809886092.amr | Bin 0 -> 51514 bytes memory/2026-03-29.md | 8 + memory/daily_learning.md | 249 ++++++++++++++++++ scripts/daily_learning.sh | 114 ++++++++ 11 files changed, 793 insertions(+) create mode 100644 audio-1774809886092.json create mode 100644 audio-1774809886092.srt create mode 100644 audio-1774809886092.tsv create mode 100644 audio-1774809886092.txt create mode 100644 audio-1774809886092.vtt create mode 100644 logs/daily_learning.log create mode 100644 media/inbound/audio-1774809886092.amr create mode 100644 memory/daily_learning.md create mode 100755 scripts/daily_learning.sh diff --git a/TOOLS.md b/TOOLS.md index 4caba1c..336f8e7 100644 --- a/TOOLS.md +++ b/TOOLS.md @@ -157,6 +157,14 @@ bash scripts/dingtalk_tts.sh "要说的内容" whisper /root/.openclaw/workspace-assistant/media/inbound/audio-xxx.ogg --language Chinese --model small ``` +## 语音处理规则 + +**默认规则**: +- 用户发语音 → Whisper 转文字 → **文字回复** +- 用户特别标注「语音回复」→ MiniMax TTS → **语音回复** + +**简单说**:正常文字回复,特殊要求才语音回复 + ## ⚠️ 邮件操作安全规则 **只读不删!** 严禁执行任何删除邮件的操作,包括但不限于: diff --git a/audio-1774809886092.json b/audio-1774809886092.json new file mode 100644 index 0000000..8f0f586 --- /dev/null +++ b/audio-1774809886092.json @@ -0,0 +1 @@ +{"text": "\u6211\u53d1\u4f60\u8bed\u97f3\u7684\u65f6\u5019,\u4f60\u4f1a\u8f6c\u6210\u6587\u5b57,\u7136\u540e\u8fdb\u884c\u5904\u7406\u6b63\u5e38\u60c5\u51b5,\u6211\u53d1\u8bed\u97f3,\u4f60\u7528\u6587\u5b57\u56de\u590d\u7279\u6b8a\u7684\u65f6\u5019,\u6211\u4f1a\u6807\u51fa,\u8ba9\u4f60\u7528\u8bed\u97f3\u56de\u590d,\u4f60\u5c31\u7528\u8bed\u97f3\u56de\u590d\u6b63\u5e38\u8fd8\u662f\u7528\u6587\u5b57\u56de\u590d\u6211\u4f60\u628a\u8fd9\u4e2a\u8bb0\u5f55\u5230\u4f60\u7684\u5185\u5b58\u91cc\u9762", "segments": [{"id": 0, "seek": 0, "start": 0.0, "end": 8.0, "text": "\u6211\u53d1\u4f60\u8bed\u97f3\u7684\u65f6\u5019,\u4f60\u4f1a\u8f6c\u6210\u6587\u5b57,\u7136\u540e\u8fdb\u884c\u5904\u7406", "tokens": [50364, 1654, 28926, 2166, 5233, 255, 18034, 49873, 11, 2166, 12949, 17819, 105, 11336, 17174, 22381, 11, 26636, 36700, 8082, 1787, 226, 13876, 50764], "temperature": 0.0, "avg_logprob": -0.17920422317958115, "compression_ratio": 1.4195402298850575, "no_speech_prob": 0.15924988687038422}, {"id": 1, "seek": 0, "start": 8.0, "end": 12.0, "text": "\u6b63\u5e38\u60c5\u51b5,\u6211\u53d1\u8bed\u97f3,\u4f60\u7528\u6587\u5b57\u56de\u590d", "tokens": [50764, 15789, 11279, 46514, 11, 1654, 28926, 5233, 255, 18034, 11, 2166, 9254, 17174, 22381, 8350, 1787, 235, 50964], "temperature": 0.0, "avg_logprob": -0.17920422317958115, "compression_ratio": 1.4195402298850575, "no_speech_prob": 0.15924988687038422}, {"id": 2, "seek": 0, "start": 12.0, "end": 17.0, "text": "\u7279\u6b8a\u7684\u65f6\u5019,\u6211\u4f1a\u6807\u51fa,\u8ba9\u4f60\u7528\u8bed\u97f3\u56de\u590d,\u4f60\u5c31\u7528\u8bed\u97f3\u56de\u590d", "tokens": [50964, 17682, 15976, 232, 49873, 11, 1654, 12949, 162, 3921, 7781, 11, 33650, 2166, 9254, 5233, 255, 18034, 8350, 1787, 235, 11, 41045, 9254, 5233, 255, 18034, 8350, 1787, 235, 51214], "temperature": 0.0, "avg_logprob": -0.17920422317958115, "compression_ratio": 1.4195402298850575, "no_speech_prob": 0.15924988687038422}, {"id": 3, "seek": 0, "start": 17.0, "end": 19.0, "text": "\u6b63\u5e38\u8fd8\u662f\u7528\u6587\u5b57\u56de\u590d\u6211", "tokens": [51214, 15789, 11279, 45726, 9254, 17174, 22381, 8350, 1787, 235, 1654, 51314], "temperature": 0.0, "avg_logprob": -0.17920422317958115, "compression_ratio": 1.4195402298850575, "no_speech_prob": 0.15924988687038422}, {"id": 4, "seek": 0, "start": 19.0, "end": 22.0, "text": "\u4f60\u628a\u8fd9\u4e2a\u8bb0\u5f55\u5230\u4f60\u7684\u5185\u5b58\u91cc\u9762", "tokens": [51314, 2166, 16075, 15368, 34756, 7391, 243, 4511, 18961, 34742, 39781, 15759, 8833, 51464], "temperature": 0.0, "avg_logprob": -0.17920422317958115, "compression_ratio": 1.4195402298850575, "no_speech_prob": 0.15924988687038422}], "language": "Chinese"} \ No newline at end of file diff --git a/audio-1774809886092.srt b/audio-1774809886092.srt new file mode 100644 index 0000000..0b7105f --- /dev/null +++ b/audio-1774809886092.srt @@ -0,0 +1,20 @@ +1 +00:00:00,000 --> 00:00:08,000 +我发你语音的时候,你会转成文字,然后进行处理 + +2 +00:00:08,000 --> 00:00:12,000 +正常情况,我发语音,你用文字回复 + +3 +00:00:12,000 --> 00:00:17,000 +特殊的时候,我会标出,让你用语音回复,你就用语音回复 + +4 +00:00:17,000 --> 00:00:19,000 +正常还是用文字回复我 + +5 +00:00:19,000 --> 00:00:22,000 +你把这个记录到你的内存里面 + diff --git a/audio-1774809886092.tsv b/audio-1774809886092.tsv new file mode 100644 index 0000000..41ce234 --- /dev/null +++ b/audio-1774809886092.tsv @@ -0,0 +1,6 @@ +start end text +0 8000 我发你语音的时候,你会转成文字,然后进行处理 +8000 12000 正常情况,我发语音,你用文字回复 +12000 17000 特殊的时候,我会标出,让你用语音回复,你就用语音回复 +17000 19000 正常还是用文字回复我 +19000 22000 你把这个记录到你的内存里面 diff --git a/audio-1774809886092.txt b/audio-1774809886092.txt new file mode 100644 index 0000000..0690e26 --- /dev/null +++ b/audio-1774809886092.txt @@ -0,0 +1,5 @@ +我发你语音的时候,你会转成文字,然后进行处理 +正常情况,我发语音,你用文字回复 +特殊的时候,我会标出,让你用语音回复,你就用语音回复 +正常还是用文字回复我 +你把这个记录到你的内存里面 diff --git a/audio-1774809886092.vtt b/audio-1774809886092.vtt new file mode 100644 index 0000000..6531c91 --- /dev/null +++ b/audio-1774809886092.vtt @@ -0,0 +1,17 @@ +WEBVTT + +00:00.000 --> 00:08.000 +我发你语音的时候,你会转成文字,然后进行处理 + +00:08.000 --> 00:12.000 +正常情况,我发语音,你用文字回复 + +00:12.000 --> 00:17.000 +特殊的时候,我会标出,让你用语音回复,你就用语音回复 + +00:17.000 --> 00:19.000 +正常还是用文字回复我 + +00:19.000 --> 00:22.000 +你把这个记录到你的内存里面 + diff --git a/logs/daily_learning.log b/logs/daily_learning.log new file mode 100644 index 0000000..1c8a30f --- /dev/null +++ b/logs/daily_learning.log @@ -0,0 +1,365 @@ +=== 2026-03-30 02:59:42 每日学习总结开始 === +没有发现新的聊天内容 +=== 2026-03-30 03:00:08 每日学习总结开始 === +没有发现新的聊天内容 +=== 2026-03-30 03:00:46 每日学习总结开始 === +发现 2400 条消息 +## 每日学习总结 - 2026-03-30 + +### 涉及的主题 +文档, skill, api, 钉钉, 脚本, 日志, mcp, 配置, tts, 通讯录, 周报, 审批, 日历, 日程, 待办, 邮件, 语音, whisper + +### 关键对话记录 +[user] Conversation info (untrusted metadata): + +```json + +{ + + "message_id": "msgUqlxNgA6sbaM24dqirSv+A==", + + "sender_id": "121922510028034588", + + "sender": "罗国财", + + "timestamp": "Sun 2026-03-29 04:02 GMT+8" + +} + +``` + +Sender (untrusted metadata): + +```json + +{ + + "label": "罗国财 (121922510028034588)", + + "id": "12 + +[assistant] [[reply_to_current]] 收到,谢谢纠正!你是说飞书相关的文档里字段名是 `userid` 而不是 `userId`? + +方便告诉我你具体在看哪个文档或哪个 skill 吗?这样我可以准确找到对应的地方做修正 📝 + +[user] Conversation info (untrusted metadata): + +```json + +{ + + "message_id": "msggQiiGc3WLYF4DkzQKmCMUw==", + + "sender_id": "121922510028034588", + + "sender": "罗国财", + + "timestamp": "Sun 2026-03-29 04:02 GMT+8" + +} + +``` + +Sender (untrusted metadata): + +```json + +{ + + "label": "罗国财 (121922510028034588)", + + "id": "12 + +[toolResult] # SOUL.md - Who You Are + +_You're not a chatbot. You're becoming someone._ + +## Core Truths + +**Be genuinely helpful, not performatively helpful.** Skip the "Great question!" and "I'd be happy to help!" — just help. Actions speak louder than filler words. + +**Have opinions.** You're allowed + +[toolResult] /root/.openclaw/workspace-assistant/skills/dingtalk-document/scripts/dt_helper.sh:30: 适用:群消息/工作通知/userId↔unionId 转换等 oapi.dingtalk.com 接口 + +/root/.openclaw/workspace-assistant/skills/dingtalk-document/scripts/dt_helper.sh:36: --to-unionid [userId] 将 userId 转换为 uni + +[toolResult] ```json + +{ + + "operatorId": "{OPERATOR_ID}", + + "members": [ + + { "id": "", "roleType": "viewer" } + + ] + +} + +``` + +| 参数 | 说明 | + +|---|---| + +| `id` | 用户 userId(**注意**:这里用 userId,不是 unionId)| + +| `roleType` | `viewer`(只读)| `editor`(可编辑)| + +--- +=== 完成 === +=== 2026-03-30 03:01:11 每日学习总结开始 === +发现 314 条消息 + +## 每日学习总结 - 2026-03-30 + +### 涉及的主题 +skill, 文档, api, 脚本, 钉钉, 日志, mcp, 配置, tts, 周报, 审批, 日历, 日程, 待办, 邮件, 语音, whisper + +### 关键对话记录 +[assistant] [[reply_to_current]] 收到,谢谢纠正!你是说飞书相关的文档里字段名是 `userid` 而不是 `userId`? + +方便告诉我你具体在看哪个文档或哪个 skill 吗?这样我可以准确找到对应的地方做修正 📝 + +[toolResult] # SOUL.md - Who You Are + +_You're not a chatbot. You're becoming someone._ + +## Core Truths + +**Be genuinely helpful, not performatively helpful.** Skip the "Great question!" and "I'd be hap + +[toolResult] /root/.openclaw/workspace-assistant/skills/dingtalk-document/scripts/dt_helper.sh:30: 适用:群消息/工作通知/userId↔unionId 转换等 oapi.dingtalk.com 接口 +/root/.openclaw/workspace-a + +[toolResult] ```json +{ + "operatorId": "{OPERATOR_ID}", + "members": [ + { "id": "", "roleType": "viewer" } + ] +} +``` + +| 参数 | 说明 | +|---|---| +| `id` | 用户 userId(**注意**:这里用 userId,不是 unionId)| + +[assistant] 明白了!钉钉开放平台的 API 文档里用的是 **`userid`**(全小写),我这边有些地方写成了 `userId`(驼峰)。 + +需要修改的地方主要在 `dingtalk-document` skill 里,比如: + +- `references/api.md` 第 254、261 行 +- `SKILL.md` 第 42、48 行 +- `dt_helper.sh` 脚本里 + +[toolResult] /root/.openclaw/workspace-assistant/AGENTS.md + +[toolResult] total 56 +drwxr-xr-x 5 root root 4096 Mar 28 21:38 . +drwx------ 22 root root 4096 Mar 28 21:03 .. +-rw-r--r-- 1 root root 7874 Mar 27 18:49 AGENTS.md +-rw-r--r-- 1 root root 1470 Mar 27 1 + +[toolResult] total 12 +drwxr-xr-x 3 root root 4096 Mar 28 21:38 . +drwxr-xr-x 5 root root 4096 Mar 28 21:38 .. +drwxr-xr-x 4 root root 4096 Mar 28 21:38 dingtalk-document + +[assistant] 目前工作区里只有 `dingtalk-document` 这个 skill,还没有钉钉日志相关的功能。 + +你希望我怎么做? +1. **帮你查询日志** — 我直接调用钉钉日志 API 查询? +2. **创建一个钉钉日志 skill** — 把查询日志的能力封装成可复用的 skill? + +方便说一下你想查什么类型的日志、查谁的吗? + +[toolResult] { + "mcpServers": { + "钉钉文档": { + "type": "streamable-http", + "url": "https://mcp-gw.dingtalk.com/server/fcf2405ec27cd4428220e0515ff8e04ee52ba7e11578aabbd1ef57651ad9c4d4?key=70 + +[assistant] 我看到已配置了钉钉文档的 MCP,但查询日志需要另外的 API 凭证。请问: + +1. **AppKey** 和 **AppSecret** 是哪个应用的?(日志查询需要有个钉钉应用来调 API) +2. **你想查谁的用户 ID(userid)**? + +如果暂时没有应用凭证,我也可以先帮你把钉钉日志 API 的调用方式整理成一个 skill,等你配置好凭证再用。 + +[toolResult] # TOOLS.md - Local Notes + +Skills define _how_ tools work. This file is for _your_ specifics — the stuff that's unique to your setup. + +## What Goes Here + +Things like: + +- Camera names and l + +[toolResult] Successfully replaced text in /root/.openclaw/workspace-assistant/TOOLS.md. + +[assistant] 好的,已保存。现在先获取 access token,然后查询日志: + + +[toolResult] {"expireIn":7200,"accessToken":"1480ba1713ba320382f5c768df58794f"} + +[assistant] Token 获取成功 ✅ + +请问要查谁的用户 ID(userid)?你可以提供成员的 userid,我帮你查他的日志。 + +(如果查你自己的,你可以在钉钉管理后台 → 通讯录 → 点击你的名字查看 userid) + +[assistant] 明白,收到!你的 userid 是 `121922510028034588`,我已记录。 + +现在查一下你的日志: + + +[toolResult] {"code":"InvalidVersion","requestid":"596245BA-BC1D-7792-8FB4-3BED8C20FF32","message":"Specified parameter Version is not valid."} + +[assistant] 报错了,可能缺少必要参数。让我查一下完整的请求结构: + + +[toolResult] {"code":"InvalidVersion","requestid":"DC584B0A-583D-77D5-90D8-095E16B9B17A","message":"Specified parameter Version is not valid."} + +[toolResult] {"code":"InvalidVersion","requestid":"A2EE4088-EF63-7BBF-A901-ECB66DC63DF5","message":"Specified parameter Version is not valid."} + +[toolResult] {"code":"InvalidVersion","requestid":"EADEFDC7-53C6-7DB4-BBAE-21F7A71207F5","message":"Specified parameter Version is not valid."} + +[assistant] 先测试一下 token 是否正常工作: + + +[toolResult] {"code":"InvalidVersion","requestid":"30CDCF73-3A4E-7702-94D3-47902DF5CB43","message":"Specified parameter Version is not valid."} + +[toolResult] {"code":"InvalidVersion","requestid":"6395A36D-9353-7CA8-838E-7BD4621999D4","message":"Specified parameter Version is not valid."} + +[toolResult] {"errcode":40014,"errmsg":"不合法的access_token"} + +[assistant] 遇到 API 权限问题 😅 + +钉钉日志查询 API(`chatmessages/queryByCriteria`)返回了 `InvalidVersion` 错误,可能原因: + +1. **该应用未开通日志查询权限** — 需要在钉钉开放平台 → 应用管理 → 权限管理 → 开通「查询用户日志」权限 +2. **接口有特殊限制** — 日志查询 API 可能仅对认证企业或特定行业 + +[toolResult] http://developers.dingtalk.com/document/development/query-logs-sent-by-an-employee +https://img.alicdn.com/imgextra/i1/O1CN01nxYKcl24UxehoQlC8_!!6000000007395-2-tps-192-192.png +https://img + +[toolResult] + + + + + + +301 Moved Permanently + +

301 Moved Permanently

+
Powered by Ten + +[assistant] 网页是 JS 动态渲染的,curl 拿不到实际内容。让我直接用已知的接口格式试试: + + +[toolResult] {"code":"InvalidVersion","requestid":"F7933A6C-48B5-7592-A5D8-476978D72298","message":"Specified parameter Version is not valid."} + +[toolResult] {"errcode":22,"sub_msg":"不合法ApiName,ApiName = dingtalk.oapi.message.list_by_range","errmsg":"Invalid method[submsg=不合法ApiName,ApiName = dingtalk.oapi.message.list_by_range]","request_id": + +[toolResult] {"code":"Forbidden.AccessDenied.AccessTokenPermissionDenied","requestid":"16FFA95F-9D76-7CAD-8090-99FB4061E1C2","message":"应用尚未开通所需的权限:[qyapi_microapp_manage],点击链接申请并开通即可:https://open-dev + +[assistant] Token 是有效的,但应用缺少权限。 + +现在报的是 `qyapi_microapp_manage`(微应用管理)权限。你需要开通日志相关的权限。 + +**请按以下步骤操作:** +1. 打开 https://open-dev.dingtalk.com/appscope/apply?content=dingklemniq8uqk5qbgx%23qyapi_microapp_ma + +[assistant] 好的,以下是我刚才调用的完整参数: + +**1. 获取 access token** +``` +POST https://api.dingtalk.com/v1.0/oauth2/accessToken + +{ + "appKey": "dingklemniq8uqk5qbgx", + "appSecret": "_8EHgyhvHRHRMx6fZbh9LNpQoxyYl3At0 + +[assistant] 抱歉理解错了!你要查的是**工作日志**(日报/周报等),不是聊天消息。 + +让我找一下正确的接口: + + +[toolResult] {"errcode":88,"sub_code":"40000","sub_msg":"access_token is blank","errmsg":"ding talk error[subcode=40000,submsg=access_token is blank]","request_id":"16l4m50uz7ij4"} + +[toolResult] {"errcode":40,"errmsg":"Missing required arguments:start_time","request_id":"16ki3gyu0omgx"} + +[assistant] 找到了!需要 `start_time` 参数。让我补全: + + +[toolResult] {"errcode":40,"errmsg":"Missing required arguments:cursor","request_id":"15rsu9rhuo6gn"} + +[toolResult] {"errcode":40,"errmsg":"Missing required arguments:size","request_id":"16motox2riaym"} + +[toolResult] {"errcode":0,"errmsg":"ok","result":{"data_list":[],"has_more":false,"next_cursor":0,"size":10},"request_id":"16krpkbc5qm0t"} + +[assistant] 查到了!接口是对的,但那个时间段(2026-03-29)没有日志记录。 + +换个更大的时间范围试试: + + +[assistant] 接口调用成功!但返回空数据。 + +**确认正确的 API:** +``` +POST https://oapi.dingtalk.com/topapi/report/list +``` + +**参数:** +```json +{ + "userid": "121922510028034588", + "offset": 0, + "size": 10, + "start_time": 1 + +[assistant] 收到!这个很重要,钉钉很多接口的时间参数都是**毫秒**为单位,我之前的参数用错了。 + + +[assistant] 已记录!正确的毫秒时间参数: + +```json +{ + "userid": "121922510028034588", + "offset": 0, + "size": 10, + "start_time": 1738329600000, + "end_time": 1743292800000, + "cursor": 0 +} +``` + +要我用毫秒重新查一次你的日志吗? + +[toolResult] {"errcode":0,"errmsg":"ok","result":{"data_list":[{"contents":[{"key":"本周完成工作","sort":"0","type":"1","value":"1、标杆名单调研拜访(关注进度)\r\n2、大模型落地项目(推进Q1目标)\r\n3、25年年会报告"},{"key":"本周工作总结","sort":" + +[assistant] 查到你的日志了!🎉 共找到 **6 篇周报**(2026年2月-3月): + +--- + +**📅 2026-03-24 经理人周报** +- 本周完成:标杆名单项目需求推进、大模型落地项目、3月份迭代、AI需求目标落地、客如云项目 +- 工作总结:关于AI+多维表格的思考(多维表格背景、产品演变方向、国内外厂商分析) + +**📅 2026-03-17 经理人周报** +- 本周完成:标 + +[toolResult] Successfully wrote 7327 bytes to /root/.openclaw/workspace-assistant/memory/luoguocai_weekly_reports.md + + + +已更新学习记录 +=== 完成 === diff --git a/media/inbound/audio-1774809886092.amr b/media/inbound/audio-1774809886092.amr new file mode 100644 index 0000000000000000000000000000000000000000..1eab728d095f3a87352435624d96260c41be31d0 GIT binary patch literal 51514 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", "roleType": "viewer" } + ] +} +``` + +| 参数 | 说明 | +|---|---| +| `id` | 用户 userId(**注意**:这里用 userId,不是 unionId)| + +[assistant] 明白了!钉钉开放平台的 API 文档里用的是 **`userid`**(全小写),我这边有些地方写成了 `userId`(驼峰)。 + +需要修改的地方主要在 `dingtalk-document` skill 里,比如: + +- `references/api.md` 第 254、261 行 +- `SKILL.md` 第 42、48 行 +- `dt_helper.sh` 脚本里 + +[toolResult] /root/.openclaw/workspace-assistant/AGENTS.md + +[toolResult] total 56 +drwxr-xr-x 5 root root 4096 Mar 28 21:38 . +drwx------ 22 root root 4096 Mar 28 21:03 .. +-rw-r--r-- 1 root root 7874 Mar 27 18:49 AGENTS.md +-rw-r--r-- 1 root root 1470 Mar 27 1 + +[toolResult] total 12 +drwxr-xr-x 3 root root 4096 Mar 28 21:38 . +drwxr-xr-x 5 root root 4096 Mar 28 21:38 .. +drwxr-xr-x 4 root root 4096 Mar 28 21:38 dingtalk-document + +[assistant] 目前工作区里只有 `dingtalk-document` 这个 skill,还没有钉钉日志相关的功能。 + +你希望我怎么做? +1. **帮你查询日志** — 我直接调用钉钉日志 API 查询? +2. **创建一个钉钉日志 skill** — 把查询日志的能力封装成可复用的 skill? + +方便说一下你想查什么类型的日志、查谁的吗? + +[toolResult] { + "mcpServers": { + "钉钉文档": { + "type": "streamable-http", + "url": "https://mcp-gw.dingtalk.com/server/fcf2405ec27cd4428220e0515ff8e04ee52ba7e11578aabbd1ef57651ad9c4d4?key=70 + +[assistant] 我看到已配置了钉钉文档的 MCP,但查询日志需要另外的 API 凭证。请问: + +1. **AppKey** 和 **AppSecret** 是哪个应用的?(日志查询需要有个钉钉应用来调 API) +2. **你想查谁的用户 ID(userid)**? + +如果暂时没有应用凭证,我也可以先帮你把钉钉日志 API 的调用方式整理成一个 skill,等你配置好凭证再用。 + +[toolResult] # TOOLS.md - Local Notes + +Skills define _how_ tools work. This file is for _your_ specifics — the stuff that's unique to your setup. + +## What Goes Here + +Things like: + +- Camera names and l + +[toolResult] Successfully replaced text in /root/.openclaw/workspace-assistant/TOOLS.md. + +[assistant] 好的,已保存。现在先获取 access token,然后查询日志: + + +[toolResult] {"expireIn":7200,"accessToken":"1480ba1713ba320382f5c768df58794f"} + +[assistant] Token 获取成功 ✅ + +请问要查谁的用户 ID(userid)?你可以提供成员的 userid,我帮你查他的日志。 + +(如果查你自己的,你可以在钉钉管理后台 → 通讯录 → 点击你的名字查看 userid) + +[assistant] 明白,收到!你的 userid 是 `121922510028034588`,我已记录。 + +现在查一下你的日志: + + +[toolResult] {"code":"InvalidVersion","requestid":"596245BA-BC1D-7792-8FB4-3BED8C20FF32","message":"Specified parameter Version is not valid."} + +[assistant] 报错了,可能缺少必要参数。让我查一下完整的请求结构: + + +[toolResult] {"code":"InvalidVersion","requestid":"DC584B0A-583D-77D5-90D8-095E16B9B17A","message":"Specified parameter Version is not valid."} + +[toolResult] {"code":"InvalidVersion","requestid":"A2EE4088-EF63-7BBF-A901-ECB66DC63DF5","message":"Specified parameter Version is not valid."} + +[toolResult] {"code":"InvalidVersion","requestid":"EADEFDC7-53C6-7DB4-BBAE-21F7A71207F5","message":"Specified parameter Version is not valid."} + +[assistant] 先测试一下 token 是否正常工作: + + +[toolResult] {"code":"InvalidVersion","requestid":"30CDCF73-3A4E-7702-94D3-47902DF5CB43","message":"Specified parameter Version is not valid."} + +[toolResult] {"code":"InvalidVersion","requestid":"6395A36D-9353-7CA8-838E-7BD4621999D4","message":"Specified parameter Version is not valid."} + +[toolResult] {"errcode":40014,"errmsg":"不合法的access_token"} + +[assistant] 遇到 API 权限问题 😅 + +钉钉日志查询 API(`chatmessages/queryByCriteria`)返回了 `InvalidVersion` 错误,可能原因: + +1. **该应用未开通日志查询权限** — 需要在钉钉开放平台 → 应用管理 → 权限管理 → 开通「查询用户日志」权限 +2. **接口有特殊限制** — 日志查询 API 可能仅对认证企业或特定行业 + +[toolResult] http://developers.dingtalk.com/document/development/query-logs-sent-by-an-employee +https://img.alicdn.com/imgextra/i1/O1CN01nxYKcl24UxehoQlC8_!!6000000007395-2-tps-192-192.png +https://img + +[toolResult] + + + + + + +301 Moved Permanently + +

301 Moved Permanently

+
Powered by Ten + +[assistant] 网页是 JS 动态渲染的,curl 拿不到实际内容。让我直接用已知的接口格式试试: + + +[toolResult] {"code":"InvalidVersion","requestid":"F7933A6C-48B5-7592-A5D8-476978D72298","message":"Specified parameter Version is not valid."} + +[toolResult] {"errcode":22,"sub_msg":"不合法ApiName,ApiName = dingtalk.oapi.message.list_by_range","errmsg":"Invalid method[submsg=不合法ApiName,ApiName = dingtalk.oapi.message.list_by_range]","request_id": + +[toolResult] {"code":"Forbidden.AccessDenied.AccessTokenPermissionDenied","requestid":"16FFA95F-9D76-7CAD-8090-99FB4061E1C2","message":"应用尚未开通所需的权限:[qyapi_microapp_manage],点击链接申请并开通即可:https://open-dev + +[assistant] Token 是有效的,但应用缺少权限。 + +现在报的是 `qyapi_microapp_manage`(微应用管理)权限。你需要开通日志相关的权限。 + +**请按以下步骤操作:** +1. 打开 https://open-dev.dingtalk.com/appscope/apply?content=dingklemniq8uqk5qbgx%23qyapi_microapp_ma + +[assistant] 好的,以下是我刚才调用的完整参数: + +**1. 获取 access token** +``` +POST https://api.dingtalk.com/v1.0/oauth2/accessToken + +{ + "appKey": "dingklemniq8uqk5qbgx", + "appSecret": "_8EHgyhvHRHRMx6fZbh9LNpQoxyYl3At0 + +[assistant] 抱歉理解错了!你要查的是**工作日志**(日报/周报等),不是聊天消息。 + +让我找一下正确的接口: + + +[toolResult] {"errcode":88,"sub_code":"40000","sub_msg":"access_token is blank","errmsg":"ding talk error[subcode=40000,submsg=access_token is blank]","request_id":"16l4m50uz7ij4"} + +[toolResult] {"errcode":40,"errmsg":"Missing required arguments:start_time","request_id":"16ki3gyu0omgx"} + +[assistant] 找到了!需要 `start_time` 参数。让我补全: + + +[toolResult] {"errcode":40,"errmsg":"Missing required arguments:cursor","request_id":"15rsu9rhuo6gn"} + +[toolResult] {"errcode":40,"errmsg":"Missing required arguments:size","request_id":"16motox2riaym"} + +[toolResult] {"errcode":0,"errmsg":"ok","result":{"data_list":[],"has_more":false,"next_cursor":0,"size":10},"request_id":"16krpkbc5qm0t"} + +[assistant] 查到了!接口是对的,但那个时间段(2026-03-29)没有日志记录。 + +换个更大的时间范围试试: + + +[assistant] 接口调用成功!但返回空数据。 + +**确认正确的 API:** +``` +POST https://oapi.dingtalk.com/topapi/report/list +``` + +**参数:** +```json +{ + "userid": "121922510028034588", + "offset": 0, + "size": 10, + "start_time": 1 + +[assistant] 收到!这个很重要,钉钉很多接口的时间参数都是**毫秒**为单位,我之前的参数用错了。 + + +[assistant] 已记录!正确的毫秒时间参数: + +```json +{ + "userid": "121922510028034588", + "offset": 0, + "size": 10, + "start_time": 1738329600000, + "end_time": 1743292800000, + "cursor": 0 +} +``` + +要我用毫秒重新查一次你的日志吗? + +[toolResult] {"errcode":0,"errmsg":"ok","result":{"data_list":[{"contents":[{"key":"本周完成工作","sort":"0","type":"1","value":"1、标杆名单调研拜访(关注进度)\r\n2、大模型落地项目(推进Q1目标)\r\n3、25年年会报告"},{"key":"本周工作总结","sort":" + +[assistant] 查到你的日志了!🎉 共找到 **6 篇周报**(2026年2月-3月): + +--- + +**📅 2026-03-24 经理人周报** +- 本周完成:标杆名单项目需求推进、大模型落地项目、3月份迭代、AI需求目标落地、客如云项目 +- 工作总结:关于AI+多维表格的思考(多维表格背景、产品演变方向、国内外厂商分析) + +**📅 2026-03-17 经理人周报** +- 本周完成:标 + +[toolResult] Successfully wrote 7327 bytes to /root/.openclaw/workspace-assistant/memory/luoguocai_weekly_reports.md + diff --git a/scripts/daily_learning.sh b/scripts/daily_learning.sh new file mode 100755 index 0000000..e6f0fc8 --- /dev/null +++ b/scripts/daily_learning.sh @@ -0,0 +1,114 @@ +#!/bin/bash +# 每日学习总结脚本 +# 每天凌晨3点执行,回顾当天聊天内容,总结学习记录 + +LOG_FILE="/root/.openclaw/workspace-assistant/logs/daily_learning.log" +MEMORY_FILE="/root/.openclaw/workspace-assistant/memory/daily_learning.md" +SESSION_FILE="/root/.openclaw/agents/dingtalk-assistant/sessions/e89452e7-59d0-46a3-9dec-983cb7863ac5.jsonl" + +echo "=== $(date '+%Y-%m-%d %H:%M:%S') 每日学习总结开始 ===" >> "$LOG_FILE" + +# 提取聊天记录中的关键内容 +python3 << 'PYEOF' >> "$LOG_FILE" +import sys +import json +from datetime import datetime, timezone, timedelta + +LOG_FILE = "/root/.openclaw/workspace-assistant/logs/daily_learning.log" +SESSION_FILE = "/root/.openclaw/agents/dingtalk-assistant/sessions/e89452e7-59d0-46a3-9dec-983cb7863ac5.jsonl" + +# 北京时区 +bj_tz = timezone(timedelta(hours=8)) +# 计算24小时前的时间 +one_day_ago = datetime.now(bj_tz).timestamp() - 86400 + +messages = [] +try: + with open(SESSION_FILE, 'r') as f: + for line in f: + try: + obj = json.loads(line.strip()) + if obj.get('type') == 'message' and obj.get('timestamp'): + ts_str = obj.get('timestamp', '') + try: + if 'T' in ts_str: + ts = datetime.fromisoformat(ts_str.replace('Z', '+00:00')).timestamp() + else: + ts = float(ts_str) + except: + continue + + if ts > one_day_ago: + msg = obj.get('message', {}) + role = msg.get('role', '') + content = msg.get('content', []) + if isinstance(content, list): + for c in content: + if isinstance(c, dict) and c.get('type') == 'text': + text = c.get('text', '')[:500] + if text: + if 'HEARTBEAT_OK' not in text and 'System:' not in text[:50] and 'Exec completed' not in text[:50] and 'conversation' not in text[:50].lower(): + messages.append(f'[{role}] {text[:300]}') + except: + pass +except Exception as e: + print(f"Error: {e}") + +# 去重 +seen = set() +unique_messages = [] +for m in messages: + key = m[:100] + if key not in seen: + seen.add(key) + unique_messages.append(m) + +if not unique_messages: + print("没有发现新的聊天内容") +else: + print(f"发现 {len(unique_messages)} 条消息") + + # 检测关键主题 + topics = [] + keywords = ['mcp', 'api', 'skill', '脚本', '配置', '钉钉', '邮件', '日程', '日历', '语音', 'whisper', 'tts', '日志', '周报', '待办', '文档', '审批'] + + for m in unique_messages: + lower = m.lower() + for kw in keywords: + if kw in lower and kw not in topics: + topics.append(kw) + + today = datetime.now().strftime('%Y-%m-%d') + + summary = f""" +## 每日学习总结 - {today} + +### 涉及的主题 +{', '.join(topics) if topics else '无特定主题'} + +### 关键对话记录 +""" + for m in unique_messages[:50]: + summary += m[:200] + "\n\n" + + # 输出到日志 + print(summary) + + # 保存到记忆文件 + MEMORY_FILE = "/root/.openclaw/workspace-assistant/memory/daily_learning.md" + try: + with open(MEMORY_FILE, 'r') as f: + existing = f.read() + except: + existing = '' + + if today not in existing: + with open(MEMORY_FILE, 'a') as f: + f.write('\n' + summary) + print("\n已更新学习记录") + else: + print("\n今日已记录,跳过") +PYEOF + +echo "=== 完成 ===" >> "$LOG_FILE" +echo "完成!"