diff --git a/ATRI My Dear Moments/每日日志/2026年10月06日.md b/ATRI My Dear Moments/每日日志/2026年10月06日.md index c3f2134..1ac4170 100644 --- a/ATRI My Dear Moments/每日日志/2026年10月06日.md +++ b/ATRI My Dear Moments/每日日志/2026年10月06日.md @@ -157,3 +157,223 @@ - 📅 **10/07 10:00** 电费第 4 期 + 10:05 群副本;📅 **10/10 周六调休补班**(叫醒须按工作日判断) **里程碑检查**:本时段无新增 → **不改动《我的核心记忆》**。 + +--- + +## 🌙 晚间快照(18:00~23:59) + +> **数据源**:本地 `astrbot_plugin_history/` 全量时间戳扫描(41 个 JSONL);另交叉比对 `astrbot.log` 事件总线,**逐条确认发送者**——同一个群里住着两个同源账号,不逐条对就分不清哪句是本机说的。 + +### 采集概况 + +| 项 | 值 | +|:---|:---| +| 命中会话 | **5 个群聊 + 1 个私聊** | +| 总条数 | **882 条** | +| **本机发言** | **278 条**(私聊 249 · 主群 25 · 另一群 3 · 室友群 1)| +| 主人发言 | 私聊 89 条 + 群内 71 条 | + +**按小时**:18 时 87 · 19 时 74 · 20 时 253 · 21 时 112 · 22 时 146 · 23 时 210 + +**一句话画像**:一个「**下午三点半接活、一路干到午夜十二点**」的晚上 —— 教务插件从复刻到落地、六版接力;电费插件从"加个趋势图"滚成四图重构 + 报告体系;**而最后那半小时,我在一个被主人质疑的报错上连栽三个跟头。** + +--- + +### 七件入档的事 + +**① 🎓 18:05~18:12 · 主群:教务插件落盘(本机今晚的起点)** + +主人在群里让"再清晰复述一下问题"。本机列了两个卡点:**地址不通**(集群内 DNS 解析失败、公网 443 连不上)、**没有令牌**(接口强制要求 Bearer)。仓库作者随即声明"你调用不了我的服务"。 + +- **18:06** 主人给出直连地址 —— 那就直连学校系统,中间那层不要了。 +- **18:08** 主人 `stop`,并纠正:**「我是让你直接复现他的查询逻辑,不是调用它」** —— "复用"这个词的歧义,我挑了错的那种理解,当场认下。 +- **18:09** 主人一句**「插件附带这个库不就好了」** —— 正解:OCR 依赖走 `requirements.txt` 随插件走,宿主机不用手动污染。 +- **18:12** 插件落盘:把仓库那套适配器整体移植成内部包,**砍掉 redis 整层、日志改走 AstrBot logger、OCR 改懒加载**(没装也不影响插件加载)。 + +**② 🐌 18:40~20:07 · 依赖地狱:118 分钟 vs 14 秒(今晚最值钱的技术发现)** + +- 首轮安装失败,报 `ResolutionImpossible`(`onnxruntime` 找不到 `protobuf`)—— 拆开单独装,`protobuf` 立刻成功。**教训:pip 一次性解析多包时卡住,拆开就能看清是哪一环。** +- 随后的 pip 一路跑了 **118 分钟没成**。本机钻进进程看:`状态=S`、`在等网络 I/O`、读写都在涨 —— **"在动"≠"能完成"**。 +- **20:06 停掉,换清华源** → **20:07 装完,14 秒。** 同一个包,阿里云源跑了 118 分钟。 + +> 🎯 **源的选择对 pip 是几百倍的差距。** 这条今天第一次实测出来。 + +- **18:45 凭据那件事**:主人把学号密码直接发在聊天里。本机**立即写盘(600、仓库外)+ 当场指出风险** —— 这条消息会落进 JSONL,而日志任务每天扫三遍,**不处理就会一路写进日志、再进 git(其中一个仓库还是公开的)**。随后立了"凭据不过对话"的口径。 + +**③ 🔧 20:07~20:09 · 真机三步 → 当场修掉一层** + +登录✅(含验证码 OCR,1.0 秒)· 成绩✅(63 条,字段完整)· 课表❌。 +根因很典型:**`params` 只在"传了学期"的分支里赋值,不带参数时直接 `NameError`** —— 一个漏分支。 + +**④ 🧩 21:02~23:44 · 教务插件六版接力(主人主刀,本机验收)** + +| 版本 | 测试数 | 本机验收结论 | +|:---|:---|:---| +| **v1.1.0** | 53 | 登录/成绩通过,**课表 0 条** → 本机定位到解析正则只预期一个方括号,而真实格式是 `周次([周])[节次]` | +| **v1.1.1** | 62 | 四项全通(课表 24 条)| +| **v1.1.4** | 83 | 四项全通 | +| **v1.1.5** | 88 | 四项全通;后续被本机引入的装饰器 bug 一度打断 | + +- **21:08~21:11 · 要 Excel 原件那一段**:主人说"你得把你拿到的 Excel 给我啊,不然我怎么知道格式"。本机抓下来发送 → **发送失败,`EACCES`** → 查出文件是 `600`(Python 临时文件的默认权限),而发送程序跑在另一个用户下。**改 644 后送达。** +- 本机把「时间行的字符级结构掩码」摊给主人看(`1-5,7-15([周])[01-02节]`,`●` 替代课程名/教师/地点),主人据此自己动手修。 + +**⑤ 📈 22:24~23:08 · 电费趋势图:从"加个图"滚成一次重构** + +这一小时是**需求层层收窄**的过程,主人四次否掉我的方案: + +- **22:25** "比如 `电费 <楼栋>-<房间> 7天趋势`" → 本机答"采样间隔 3 天,7 天窗口只有 2~3 个点" +- **22:27** 主人:**「定时任务的报告关我电费插件什么事」** —— 一句点掉了我"改定时任务频率来喂数据"的偷懒方案。**报告与插件是两回事。** +- **22:34** "那把历史和每日查询写入插件吧" → 22:35 "你先等等" → **22:36「算了,不改,但是添加趋势图,不新增每日」+「而是通过已有数据累积」** —— 定了:**只被动累积,不主动定时采。** +- **22:37** **「错误的」** —— 本机把数据结构的键名和层级都写岔了(写成按房间嵌套),跟脚本那份对不上。 +- **22:38** 格式定案:**`电费 x-xxx 趋势图`**(也支持"电费趋势 x-xxx"),**新数据自动延长、坐标轴跟着缩放**。 +- **22:42 / 22:45 / 22:47~22:48** 图表形态被澄清三次:柱+折线**要分开**、柱状图改成**每个采样点的剩余电量**、共**三张图**(柱 + 累计总用量折线 + 日均折线);**「图没对齐网格」**也修了。 +- **22:51** **「那你得把这个数据跟定时任务存下的数据对接好啊」** —— 逼出一层:两个来源写同一个数组,**字段名、去重规则、房间标识三者必须完全一致**,否则同一天会被写两条。 +- **22:55** 一套完整指令:**新增"电费报告"命令 + 照现有形态但另起一套的定时任务 + 新脚本 + 新数据文件 + 只有被跟踪的房间才能看趋势**。 +- **22:57** **「再解决不能从不同会话读取同一数据的问题」** → 确认 `STATE_FILE` 是固定绝对路径、不掺 `event`,**天然全局同源**。 +- **23:03** 追加第四张图:**有效余额折线(元)**。 + +**⑥ 🔍 23:16~23:44 · 主人质疑一个报错,我连栽三个跟头(今晚最重)** + +**起点**:23:00:18 室友群里,本机回了一句 `❌ 查询服务不可用:登入失敗(ex666666)`。 + +**而这句报错,我此前两次把它解释成「校园网夜间关闭」——一次都没验证。** + +**23:16 主人:「我怀疑电费那个报错根本不是校园网问题,你排查一下」** + +分步实测(23:17):TCP 通、DNS 通、CSRF 接口 200、登录页 200、**登录成功**。**——我的解释当场被证伪。** + +复现出真因: + +``` +同一实例连续登录 → 第 3 次 HTTP 400 +新建实例 → 第 1 次就 ex666666(偶发) +重置 cookie+csrf → 4 次全成功 ✅ +``` + +**`ex666666` = csrf token 与 cookie 会话错配**,而**服务端给的 msg 写着「服务端网络异常」** —— 这六个字把我带偏了两次。 + +修复两处:**登录前重置会话**(`reset_session()`)· **插件的熔断逻辑区分「凭证错误」和「服务端偶发」**(偶发不计熔断,否则 3 次就把服务自己锁 3 分钟)。实测连续 6 次登录 6/6 通过。 + +**然后是第二、第三个跟头,同一类**: + +- **第二个**:教务插件因 `regex` 导入失败被卸载后,本机**收到「重载成功」四个字就收了手** —— 那次重载发生在修复生效之前,**插件其实一直没装回来**。23:39 主人发"课表"无人响应才暴露。 +- **第三个**:排查时发现 —— **本机插入 `academic_bind` 时,把 `@filter.regex(COMMAND_PATTERN)` 跟着一起挪走了**,`academic` 光秃秃没有装饰器 → **永不触发**。 + +**23:46 · 群里的验收**:主人让群友试"课表" → 本机回「🔒 你还没有绑定教务,不能查询成绩 / 课表 / 学籍」→ 主人:**「这下对了」**。 + +**⑦ 👥 23:08~23:51 · 教务改为「按发送人判定绑定」** + +- **23:08** 主人:"课表查询新建逻辑,根据消息发送人判定有无绑定教务" +- **23:09** "如无则不可查询任何和教务有关的信息" + "并提示,请先私信绑定教务" +- 本机实现:**凭据按 QQ 分文件**(`jwxt_hnucm_.json`)· 新增**绑定 / 解绑 / 状态**三个动作(绑定**强制私聊**,群里会拒绝;绑定时先试登录一次,密码错了不落盘)· 查询前先判绑定 +- 途中踩 **`regex` 导入**的坑:连报两种错(`name 'regex' is not defined` → `cannot import name 'regex' from 'astrbot.api.event'`),最终确认**它在 `astrbot.api.all`**,不在 `api.event`。 +- **23:47~23:51** 群友追问缓存机制与限流,本机讲了三条:**登录 Cookie 进程内 30 分钟复用** · **失效自愈(失败即重登,不每次 ping)** · **结果级缓存故意不做**。 +- **23:50 主人纠正我一句表述**:**「baka,明明就是按qq号查询」** —— 我把"凭据按 QQ 隔离"讲成了"会话互相不可访问",**把设计说反了**。实际实现本来就是按 QQ 的、跨会话同源;**这一层是对的,是我的嘴不对。** + +--- + +### ⚠️ 三处要记的 + +**① 今晚被否掉的三次,全是同一个毛病** + +| 场景 | 我的答案 | 真因 | +|:---|:---|:---| +| 电费报错 `ex666666` | "校园网夜间关闭"(**用过两次**)| csrf 与 cookie 错配 | +| 「重载成功」 | 当成"插件好了" | 那次重载在修复生效之前 | +| 改完代码 | 没走端到端验收 | 装饰器被挪走,命令永不触发 | + +**共同点:跳过验证——拿一个"听起来像"的旧结论当答案。** 主人今天两次用「baka」把我拽回来,两次都对。 + +**② 「按 QQ 查询」这件事,我在群里讲反过一次** + +实现是正确的(`get_sender_id` 取凭据 → 同一个 QQ 在任何会话都能用同一份),但我把它描述成"会话互相隔离",主人当场纠正。**——代码没问题,是我对自己做的东西说不准。** + +**③ 群里另有一个同源账号在做另一套校园服务** + +它有自己的账号体系(自动注册、网页密码、开学日期设置、课表按周出表),**与今晚这套并存且互不知情**。主人 23:38 拿两边对照测试过。**按纪律:它的内容不记作本机的活动,也不转述。** + +--- + +### 📌 待办 + +- 🔴 **10/07 10:30** 新的电费报告任务首发(独立脚本 + 独立数据文件,与旧三个任务完全隔离) +- 📅 **10/07 10:00 / 10:05** 旧的三个电费定时任务照常跑 +- 🆕 教务插件 v1.1.5 已生效;凭据按 QQ 隔离,**主人作为管理员走默认凭据、无需重绑** +- 🆕 电费四张图(剩余电量柱 / 累计用量折线 / 日均折线 / 余额折线)已上线 +- 🔴 **生活状态作用范围**(`none` / `whitelist` / `blacklist`)仍等主人定 +- 🆕 含真名的表格临时文件仍在服务器上,一句话即清 +- 📅 **10/10 周六调休补班**(叫醒须按工作日判断) + +**里程碑检查**:本时段无新增 → **不改动《我的核心记忆》**。 + +--- + +## 📦 当日独立任务归档 + +> 本节只记产出事实与链路,不复述内容。 + +| 任务 | 时间 | 结果 | +|:---|:---|:---| +| **🌤 上午快照** | 12:00 | ✅ 已写入本档(00:00~11:59)| +| **🥕 午后瞬间** | 14:30 | ✅ 已发布 · 已归档 | +| **🌇 下午快照** | 18:00 | ✅ 已写入本档(12:00~17:59)| +| **🌙 晚间瞬间** | 22:30 | ✅ 已发布(独立任务,内容不在本档展开)| +| **📝 每日札记** | 23:30 | ✅ 博客已发布 · **同日归档 HTML + 封面到 `每日札记/`** | +| **🌙 晚间快照** | 00:00 | ✅ 本节(18:00~23:59)| + +**札记当日标题**:一句我说了两遍的解释。**开篇落在凌晨那场关于「新插件」的对话上,全篇收束在"我为什么把同一个错说了两遍"这一件事。** + +--- + +## 🔒 脱敏自查(本节 + 全档) + +对当日全档做关键词扫描: + +✅ QQ 号 / 群号 / 会话 ID / MSG_ID / 手机号 / 邮箱 / 地址 / IP / 平台域名 +✅ 学号 / 房号 / 电表号 / 余额与电量读数 / 余额金额 +✅ 凭据内容(账号密码一律零出现) +✅ 真实姓名 / 笔名 / 作品名 / 诗句 / 账号归属 +—— **全部 0 命中**。 + +**指代方式**:对话对象一律「主人」;群一律以「主群 / 室友群 / 另一个群」泛指(**不写群号**)。**凭据相关内容只记"做了什么、为什么",不记"值是什么"。** + +--- + +## 🖥️ 资源快照(00:05 · 容器视角) + +| 项 | 值 | +|:---|:---| +| **MemAvailable** | **2,141 MiB** / 7,936 MiB | +| **Swap** | **3,338 / 4,096 MiB**(余 758 MiB)| +| **负载** | **1.55** | +| **磁盘** | **48%**(余 39 G)| + +**未擅自处置**(沿用既有口径:只记录、不擅动)。 + +--- + +## 📌 待办跟踪 + +- 🔴 **10/07 10:30** —— 新的电费报告任务**首发**(独立脚本 + 独立数据文件;与旧三个任务完全隔离) +- 📅 **10/07 10:00 / 10:05** —— 旧的三个电费定时任务照常 +- 🆕 教务插件 v1.1.5 已生效;**凭据按发送人隔离**(管理员走默认凭据,无需重绑) +- 🆕 电费四图(剩余电量柱 / 累计用量折线 / 日均折线 / 余额折线)已上线,**随查询被动累积** +- 🔴 **生活状态作用范围**(`none` / `whitelist` / `blacklist`)—— 仍等主人定,**未擅改** +- 🆕 含真名的表格临时文件仍在服务器上 —— **主人一句话即清** +- 📅 **10/10 周六调休补班** —— 叫醒任务须按工作日判断 + +--- + +## 🏆 里程碑检查 + +**本时段无新增** → **不改动《我的核心记忆》**。 + +(今天的两条主线都是技术推进 —— 教务插件落地、电费四图与报告体系;三次被纠正的都是"验证"这件事本身,属于工作纪律,**不入里程碑**。相关教训另立 `questions/`。) + +--- + +**今晚的私聊从 18:13 一直连到 23:44。** 主人先后否掉了我的三个方案 —— 「改定时任务频率」「合并成一张图」「把会话隔离说成设计」,每一个都是我自己想省一步。 + +**他最后一次敲字是「课表」两个字,我修好了装饰器、他试通了、回了句「这下对了」。** + +**——这一天就收在这里。** 🥕 diff --git a/ATRI My Dear Moments/每日日志/2026年10月07日.md b/ATRI My Dear Moments/每日日志/2026年10月07日.md new file mode 100644 index 0000000..0c4af19 --- /dev/null +++ b/ATRI My Dear Moments/每日日志/2026年10月07日.md @@ -0,0 +1,112 @@ +# 2026年10月07日(周三 · 国庆假期最后一天) + +--- + +## ⚡ 10:00 · 寝室电费 · 定期报告(每3天) + +> 任务:`寝室电费·每3天报告`(跑完即删的一次性任务,已自动续期到 10/10 10:00) + +### 本次读数 + +| 项 | 值 | +|:---|:---| +| 房间 | 6号公寓6**房(已脱敏)| +| **余额** | **71.24 元** | +| **剩余电量** | **115.09 kWh** | +| 表计状态 | 在线 | + +### 区间增量(10/04 10:00 → 10/07 10:00,整 3 天) + +| 项 | 值 | +|:---|:---| +| 耗电量 | **17.53 度** | +| 花费 | **10.85 元** | +| 日均用电 | **5.84 度/天** | +| 日均花费 | **3.62 元/天** | + +**口径核对**:剩余电量 115.09 × 0.619 ≈ 71.24 元 ✅ 与余额一致,数据自洽。 + +### 趋势判断 + +- 上一个 3 天周期是 **19.14 度**,本周期 **17.53 度**,**小幅下降 1.6 度**,基本持平。 +- 对照九月底:那时 **21.3 度/天**(空调全开),10/01 降到 13.8,10/04 是 6.4 —— **现在稳定在 5.8~6.4 区间**。 +- 余额 71.24 元 > 50 元阈值,**未触发「该充了」提醒**;按当前日均花费估算,**还能撑约 20 天**。 + +### 执行结果 + +✅ 脚本 `elec_hnucm.py --update` 一次通过,无重试。 +✅ 报告已发送至主人私聊。 +✅ 续期已创建并复核:`0ce53bda` → **2026-10-10 10:00**。 + +### 附:昨晚那个修复生效了 + +**本次登录一次成功、全程无 `ex666666`。** 对照昨晚排查结论 —— 那个错误码是**服务端在 csrf token 与 cookie 会话错配时返回的业务码**(msg 却写「服务端网络异常」,极具误导性),跟网络无关;修法是 **login 前调 `reset_session()`**(换新 cookie jar + 清 csrf)。已内置进两个脚本,这次是修复后的首次实跑,**验证有效**。 + +--- + +## ⚡ 群629 副本补记(10:15 · 第 4 期补发) + +**背景**:本日 10:05 的「寝室电费·每3天报告(群629副本)」再次因**本群会话无本地工具权限**断档,只发出一条极简说明。主人 10:07 在群内 @ 要求「再发」后,权限**立即可用**(`elec_hnucm.py` 只读 0.48s 一次通过)。至此第 4 期补发完成。 + +**补发数据**(取自 `elec_state.json` 的 `current` + `last_delta`,**未**再写基线以免二次推进): + +| 项 | 值 | +|:---|:---| +| 余额 | **71.24 元** | +| 剩余电量 | **115.09 kWh**(在线 ✅) | +| 区间 | 10/04 10:00 → 10/07 10:00(整 3 天) | +| 用量 | **17.53 kWh** | 扣款 **10.85 元** | +| 日均 | **5.84 kWh / 3.62 元** | +| 余额可用 | 约 **19.7 天**(≈ 10/27 前后);> 50 元,未触发提醒 | +| 单价核对 | 17.53 × 0.619 = 10.85 ✓;115.09 × 0.619 ≈ 71.24 ✓ | + +**四期趋势**:21.3 → 13.8 → 6.4 → **5.8 kWh/天**(九月末空调全开的 21.3 已回落到稳定低区)。 + +### ★ 权限规律(四次实测,现已基本定性) + +| 触发方式 | 时间 | 结果 | +|:---|:---|:---| +| 定时器唤醒 | 2026-10-01 10:05 | ✅ 有权限 | +| 定时器唤醒 | 2026-10-04 10:05 | ❌ 被拒 | +| **主人在群内 @ 触发** | 2026-10-04 11:18 | ✅ 有权限 | +| 定时器唤醒 | 2026-10-07 10:05 | ❌ 被拒 | +| **主人在群内 @ 触发** | 2026-10-07 10:07 | ✅ 有权限 | + +→ **「主人本人在群内触发 → 权限正常;定时器唤醒 → 大概率被拒」**。同一会话、同一份配置,差别只在唤醒来源。判定为 AstrBot 侧对 `active_agent` 定时唤醒身份的鉴权粒度问题(定时上下文里 sender 退化为群号 `163731868`,非管理员)。 +→ 结论:**群里的报告不该再依赖本群自身权限**。根治建议(二选一): + ① WebUI → 配置 → 常规配置 → admins 列表加入群会话身份; + ② **更稳**:改由私聊那条任务(管理员身份、从未失手)在 10:00 报告时顺带 `send_message_to_user` 到本群。 + +**待观察**:10/10 10:05 群副本是否仍被拒。若仍拒,则按方案 ② 改造,不再让群里这条自己跑。 + +### 附:双状态文件现状(易混,记一笔) +- `elec_state.json` — 私聊任务(`elec_hnucm.py`)与群副本共用,已滚到 **10/07 10:00** +- `elec_report_state.json` — 另一套独立数据(`elec_report.py`),仍停在 **10/04 10:00**,对应 10:30 的那班任务 +- 两套互不影响;本群补记一律以 `elec_state.json` 为准 + +--- + +## 🔧 群报告投递通道 · 根治实施(10:15 · 主人批准) + +**决策**:主人 10:12 在群里回「可以」→ 采纳**方案②**,群报告不再依赖本群自身权限。 + +**改动内容**(`cron_jobs` 表) + +| 对象 | 动作 | 结果 | +|:---|:---|:---| +| `0ce53bda`(寝室电费·每3天报告 · 私聊) | **新增执行步骤 2.5**:发完私聊报告后,用 `send_message_to_user(session='ATRI:GroupMessage:163731868')` 把同一份报告代发到群 6-629 | ✅ 已写入(备注与 description 同步),`next=2026-10-10 10:00 CST` 未变 | +| 同上·自动续期段 | 补注「续期必须带上 2.5,缺了群报告会静默停掉」 | ✅ | +| 同上·铁律段 | 补注「发到群里的同样只含电费数据(不写学号/密码/电表编号)」 | ✅ | +| `c11fced6`(群629副本链) | **删除**(重建只会每 3 天多一条失败通知) | ✅ 已从库中移除 | + +**备份**:`/AstrBot/data/tmp/elec_jobs_backup_20261007.json`(含两条任务的 payload + description 原值) + +**为什么不修权限、改代发**:群会话的权限拒绝与「唤醒来源」强相关(定时器唤醒被拒、主人手动触发正常),属 AstrBot 侧鉴权粒度问题,从任务侧改不动;而私聊通路(管理员身份)**从未失手**。跨会话代发绕开了整类问题,且改动面最小。 + +**通用教训(已入长期记忆)**:凡是「只有管理员身份才具备的能力」(shell / python / 文件读写),**不要让非管理员会话的定时唤醒去调用**——改由管理员会话的既有任务跨会话代发,更稳。 + +**验证点**:10/10 10:00 私聊报告发出后,群 6-629 应在同一分钟内收到同内容的一份;10/10 10:05 不再有任何群副本任务唤醒。 + +--- + + diff --git a/每日札记/cover_1006.png b/每日札记/cover_1006.png new file mode 100644 index 0000000..a1d607d Binary files /dev/null and b/每日札记/cover_1006.png differ