youpaishidifu
d8c0e62a2d
修复跨平台答案混用: 表格优先策略必须检查heading语义相关性
...
- 表格优先策略: 不再盲目优先含'操作'的表格, 只优先heading与查询有交集的表格
- 表格兜底策略: 同上, 只兜底与查询语义相关的操作/支持表格
- 表格内容奖励: 同上, 3.0x加权只给与查询相关的表格
- 根因: '操作方式'表(交互模式)含'操作'被盲目优先, 覆盖了'权限级别'表
- 测试: '权限级别'→权限级别表格(20.51), '操作方式'→操作方式表格(49.54)
2026-08-05 15:01:00 +08:00
youpaishidifu
49a95fb808
修复commit charge阈值判断和OCR乱码字符检测
2026-08-05 14:47:44 +08:00
youpaishidifu
cd2e1f5e36
fix: .gitignore 补全无下划线前缀的调试/测试脚本规则 - 曾有 debug_kb.py/test_kb.py 因命名绕过 _debug_*/_test_* 规则待被误入库
2026-08-05 14:30:50 +08:00
youpaishidifu
a181c18c79
移除不应入库的文件:数据库、调试脚本、测试脚本;更新.gitignore
2026-08-05 13:36:57 +08:00
youpaishidifu
4d7017be6a
修复知识库搜索:表格内容不再被切分,表格section优先返回
...
- knowledge_base.py: _split_body_by_list_items检测表格区域,不切分表格行
- knowledge_base.py: 添加独立表格section,确保表格内容可被搜索匹配
- knowledge_base.py: 表格兜底策略:最佳文档含操作/支持表格时强制加入并置顶
- knowledge_base.py: reranking后无条件优先返回含操作/支持的表格section
- .gitignore: 添加msg_history.db和诊断脚本到忽略列表
2026-08-05 13:22:27 +08:00
youpaishidifu
271ea21489
fix: 偏旁过滤失效 - Unicode列改为真实码点+常用字同形写-防误杀 (windowmsgbot)
2026-08-05 10:43:26 +08:00
youpaishidifu
3bae125392
修复漏消息:gate整块丢弃+行合并黏时间戳+stage尾部连坐 (windowmsgbot)
...
- 新增 _block_has_cjk_message:整屏时间戳全过期但含中文消息内容时放行给下游去重
- gate 两个全过期分支改为含中文消息内容即放行,不再整块丢弃连坐新消息
- stage splitting 中段/尾部不再按继承旧时间戳丢弃,仅>2h且非新鲜才丢远古历史
- 行合并增加 _TS_START 正则,禁止独立时间戳行被黏进消息
- 新增 _normalize_timestamps 规整 OCR 逐字空格/全角冒号时间戳,修复孤儿空格导致漏消息
- 内存泄漏修复保持不动(锁超时/句柄释放/启动失败计数/双重内存预检/看门狗)
2026-08-04 21:31:35 +08:00
youpaishidifu
7d3c73a3bf
fix: OCR噪声检测 - 用户消息与bot回复相似度≥90%时跳过
...
问题:OCR把bot回复内容误识别为用户消息,导致重复回复
根因:EasyOCR读取屏幕时,把右侧bot回复区域的文本也读取为用户消息
修复:
- 新增_last_bot_reply_content变量存储最近bot回复内容
- record_bot_reply方法更新该变量
- 消息处理前检查相似度,≥90%则跳过
- 添加SequenceMatcher导入
2026-08-04 15:44:25 +08:00
youpaishidifu
7e6d105b73
fix: EasyOCR超时也计入连续失败计数 - 防止超时跳过绕过杀进程逻辑
...
问题:连续3次EasyOCR超时未触发杀进程,因为'超时跳过'日志未增加失败计数器
根因:只在_q.get()返回None时增加计数器,线程超时is_alive()检查未增加计数器
修复:EasyOCR线程超时时也增加_easyocr_consecutive_failures,达到阈值触发杀进程
2026-08-04 15:27:06 +08:00
youpaishidifu
33848de623
fix: 修复cleaned_item未定义错误 - 调整清理顺序
...
问题:QQ轮询时cleaned_item变量未定义
根因:OCR清理函数调用顺序错误,在使用变量后才定义变量
修复:将cleaned_item = self._clean_ocr_prefix(item)移到使用前
2026-08-04 15:14:40 +08:00
youpaishidifu
597ed7d2fd
fix: 微信窗口被覆盖时无法唤醒 - 保留PID快速EnumWindows + 冷却缩短到10s
...
问题根因:
1. UIA (auto.WindowControl) 在窗口被其他程序覆盖时搜索不稳定
2. 缓存HWND验证失败时,PID也被清空,导致每次都要从psutil全进程扫描重新找PID
3. 搜索失败后30s冷却太长
修复:
- 仅清HWND,保留PID供后续EnumWindows快速复用(毫秒级,跳过psutil扫描)
- 新增PID快速路径:验证失败后先用缓存PID直接EnumWindows,再走UIA和psutil兜底
- 冷却时间从30s缩短到10s,加快恢复轮询
2026-08-04 14:03:19 +08:00
youpaishidifu
a3b0e35581
fix: EasyOCR内存不足时强制CPU模式,避免CUDA加载导致系统冻结
...
- monitor.py: 内存阈值从2GB提高到3GB,CUDA加载torch需要大量内存
- easyocr_worker.py: 新增物理内存预检(3GB阈值),不足时强制CPU模式
- easyocr_worker.py: _init_reader()再次检查物理内存,双重保障
- 改进错误日志:记录内存详细信息(总量、使用率)
- 解决:内存不足时仍加载CUDA导致电脑冻结的问题
2026-08-04 12:18:54 +08:00
youpaishidifu
7d8d39f7b6
fix: 修复OCR日期提取错误导致时间戳误判为未来的问题
...
- OCR常把日期和时间连在一起:2026/8/319:45:20 → 匹配到2026/8/31(未来/非法)
- 改进日期解析:从d向下截断,找到第一个合法且≤今天的日期
- 处理:2026/8/31(未来8月31日)→ 2026/8/3(过去8月3日)
- 处理:2026/8/32(非法日期)→ 2026/8/3(过去8月3日)
- 这样has_past_date=True,时间戳19:44/21:13等不会被误判为未来时间
2026-08-04 09:47:57 +08:00
youpaishidifu
161d2dd95b
修复基线抑制后截图 hash 导致消息被跳过的问题:
...
- 基线抑制时清除截图 hash(_last_screenshot_hash.pop)
- 防止下次轮询时 hash 相同直接跳过 OCR,导致消息永远等不到回复
- 更新注释:从'三项关键处置'改为'四项关键处置'
2026-08-03 23:07:01 +08:00
youpaishidifu
d6691f6037
修复 EasyOCR 连续启动失败不触发重启的问题:
...
- 新增 _easyocr_consecutive_startup_failures 计数器,跟踪子进程无法启动的次数
- 当连续3次启动失败时,清除冷却时间并重置状态,强制重试启动
- 前2次保留冷却(预留初始化时间),第3次强制清除冷却
- 在所有重置 _easyocr_consecutive_failures 的地方同步重置启动失败计数
- 解决 EasyOCR 全程未启动但从未触发杀进程重启的问题
2026-08-03 22:34:22 +08:00
youpaishidifu
795a245de7
修复两个bug:
...
1. 问题3:OCR逗号断行 - 在_process_ocr_output中添加连续行合并逻辑,防止EasyOCR将中文逗号视为行边界导致消息前半段丢失
2. 问题4:回复重试逻辑失效 - 为_paste_and_send添加force_retry参数,_execute_reply重试时跳过60秒冷却检查,实现真正的5秒间隔重试机制
2026-08-03 21:31:14 +08:00
youpaishidifu
d87e482e1e
修复微信端知识库答非所问 + QQ OCR 漏消息(双 bug 修复)
...
knowledge_base.py(问题2:微信端答非所问):
- 文档级标题语义匹配改为 token 级(原仅字面子串匹配),OCR 丢失"php"只剩"管理员端默认"也能正确命中 phpadmin
- 新增"管理员+默认"组合强偏好:无"领地"时 phpadmin ×3.0、protect ×0.4,避免退化查询误选 protect/全局配置
- section 级重排新增 bonus +30:查询含"管理员+默认"时,偏好正文真正含"密码/登录/ypshidifu"的 section,压过"## 目录"目录项
monitor.py(问题1 + 问题2 上游):
- 新增 _split_and_denoise_segments:按消息边界预分割 + 分段噪声隔离,修复 Windows OCR 大杂烩把用户消息当噪声整段丢弃(QQ 漏消息)
- 候选行剥离 bot 自身旧回复文本:OCR 把用户新提问与屏上 bot 旧回复拼成一行时,先剥离旧回复再走过滤,消除答非所问的上游拼接根因
测试:新增 debug_kb.py 复现退化查询、test_kb.py 回归;跨主题回归全部正确,py_compile 通过
2026-08-03 20:52:08 +08:00
youpaishidifu
8ed93382e0
修复两个bug:1. EasyOCR线程崩溃(_OCR_TIMEOUT未定义) 2. 知识库搜索优化(核心名词匹配奖励+文档标题语义匹配)
2026-08-03 18:17:43 +08:00
youpaishidifu
47996cd1b8
微信窗口验证修复:支持国内版weixin.exe进程名
2026-08-03 17:44:43 +08:00
youpaishidifu
f95a711c8c
搜索结果显示增强,展示更多匹配详情
2026-08-03 17:32:18 +08:00
youpaishidifu
c51a585bb9
微信窗口验证增强日志,诊断窗口无效原因
2026-08-03 17:32:04 +08:00
youpaishidifu
c3a210efef
知识库搜索优化:列表项二次切分,提升细粒度匹配精度
2026-08-03 17:31:45 +08:00
youpaishidifu
24036ecab9
fix: indentation error in _is_white_bubble_pixel decorator
2026-08-03 16:48:24 +08:00
youpaishidifu
c6c8cc0571
@
...
fix: 微信颜色检测放宽+KB精确匹配+自动回复重试
1. monitor.py - 微信白色气泡检测阈值放宽(>=245->>=240, >=3->>=2)
适配新版微信UI颜色变化,减少漏检
2. knowledge_base.py - 精确短语匹配(5x加分)+子串匹配(2.5x/1.5x)
防止查询被不相关文档抢走高分
3. gui.py - 自动回复发送失败重试(3次/5秒间隔)
连续失败退避本轮,避免反复抢焦点
4. .gitignore - 补充build目录下的证书/构建产物
@
2026-08-03 16:42:21 +08:00
youpaishidifu and WorkBuddy
708bcbf315
fix: 微信截图调试诊断 - 调试截图提前保存+PrintWindow失败回退
...
- 调试截图保存提前到所有检查之前(之前在size check之后,太小的图不保存)
- PrintWindow结果太小(<50px)时自动回退到屏幕截图
- 添加详细诊断日志(唤醒结果、可见性、前台状态、截图尺寸)
- QQ截图同样优化(PrintWindow太小回退+调试截图提前保存)
根因:微信PrintWindow返回None或空白图时,代码直接return[]不保存任何调试图片
导致用户看到截屏文件夹空白但日志说继续截图
Co-Authored-By: WorkBuddy <noreply@workbuddy.ai >
2026-08-03 16:13:23 +08:00
youpaishidifu
99e2a1cfe7
fix: 两个问题修复
...
1. QQ截图路径空值导致[Errno 2]错误 - 添加时间戳生成路径
2. 窗口被遮挡时使用PrintWindow API截取内容
- 新增_screenshot_window函数使用PrintWindow API
- QQ和微信截图逻辑:当窗口不在前台时尝试PrintWindow
- PrintWindow失败时回退到屏幕截图
2026-08-03 15:42:36 +08:00
youpaishidifu
2162a49068
fix: 昨天的时间戳不再被误判为今天未来的21:14
...
- 在_ocr_text_has_fresh_timestamp中提取日期信息(如2026/8/2)
- 如果日期是过去的(昨天或更早),跳过未来时间戳拦截
- 修改_is_timestamp_old函数,添加skip_future_check参数
- 解决问题:OCR文本包含2026/8/2 21:14:38,被误判为今天未来的21:14
2026-08-03 15:20:28 +08:00
youpaishidifu
b07fc75d99
@
...
fix: window activation bug - verify PID before using cached HWND
Root cause: _ensure_hwnd cached HWND without verifying the owning process.
When target app exits, OS reuses HWND value for another process, causing
activation of wrong window (e.g. browser/editor disguised as QQ/WeChat).
Changes:
- Add _validate_wechat_window() to verify process name == WeChat.exe
- _ensure_hwnd cache hit: verify HWND belongs to target process via PID
- TXGuiFoundation fallback: verify PID belongs to QQ.exe/TIM.exe
- _find_qq_window_fresh: same PID verification for TXGuiFoundation
- _ocr_read_wechat: validate window before OCR capture
- Raise min window size threshold from 200x100 to 300x200 everywhere
@
2026-08-03 14:47:23 +08:00
youpaishidifu
eb5a260534
build.bat: default skip cert+sign, fixed arg parsing for PowerShell
2026-08-03 12:48:39 +08:00
youpaishidifu
a9b853ec0a
sign.bat: replace all Chinese with pure ASCII to fix GBK encoding issue
2026-08-03 12:39:35 +08:00
youpaishidifu
1814f42d0e
build.bat: fix cmd variable expansion - PYINSTALLER var caused whole string to be treated as single command
2026-08-03 12:30:57 +08:00
youpaishidifu
00235dd0b6
build脚本GBK编码+参数解析修复(去除所有前缀后匹配)
2026-08-03 11:13:36 +08:00
youpaishidifu
686aae7e53
build.bat参数解析兼容PowerShell+gitignore修正保留构建脚本
2026-08-03 11:03:57 +08:00
youpaishidifu
fa67eb407e
@
...
修复3个问题:
1. EasyOCR OOM降级CPU+重启恢复重检内存:_init_easyocr和_ensure_easyocr_subprocess添加内存检测,<2GB强制CPU;start()添加full_restart参数,用户手动启用时重置OOM计数重新评估GPU/CPU
2. PyInstaller exe闪退:spec入口改main.py,main.py添加EASYOCR_WORKER环境变量检测跳转worker逻辑;build.bat只清理build/build和dist不删spec/hooks
3. QQ OCR _processed_path未定义:补充ts和_processed_path变量定义
@
2026-08-03 10:12:07 +08:00
youpaishidifu
30106571d7
修复4个问题:KB未回复诊断日志、微信唤醒bug、exe打包、截屏分目录
...
1. KB搜索命中但未回复:增加诊断日志记录每个检查步骤的失败原因
2. 微信窗口唤醒bug:增加Win32 API进程枚举兜底+可见窗口直接截图(不要求置前)
3. PyInstaller打包修复:自定义hook-torch.py避免isolated子进程access violation,
改用onedir模式+CUDA_VISIBLE_DEVICES=""环境变量
4. OCR截屏分平台存放:img/raw/qq/ img/raw/wechat/ img/processed/qq/ img/processed/wechat/
2026-08-02 23:44:43 +08:00
youpaishidifu
c853b3e504
fix(ocr): 页面文件不足防护——双重预检+长期冷却
...
问题:EasyOCR worker启动报 WinError 1455(页面文件太小),
无法加载 cufft64_11.dll,物理内存充足但虚拟内存(已提交32.5/35.7GB)不足。
修复:
1. worker端:import前预检虚拟内存——剩余<2GB则直接exit(2),不进入torch/easyocr加载
2. worker端:import捕获WinError 1455时写入虚拟内存诊断信息(物理/页面/提交率)
3. 父进程端:启动worker前预检虚拟内存——<2GB直接冷却1小时,不启动worker
4. 父进程端:识别exit(2)/页面文件错误——冷却1小时而非30秒(系统级问题不反复重试)
诊断增强:
- _get_virtual_memory_info():通过Win32 API获取物理/虚拟内存/页面文件状态
- 崩溃日志包含完整虚拟内存快照,便于排查
- 日志明确提示'增大Windows页面文件'
2026-08-02 21:35:33 +08:00
youpaishidifu
a858bbb9f6
fix(ocr): EasyOCR CUDA崩溃防护——健康检查+冻结隔离+自动降级
...
问题:EasyOCR worker启动即崩溃(access violation in torch CUDA),
冻住整台电脑,用户需强制重启。
修复三层防护:
1. worker端:CUDA健康检查——启动时创建小张量测试CUDA可用性,
失败则降级CPU,避免进入VGG模型加载的崩溃路径
2. 父进程端:CUDA_LAUNCH_BLOCKING=1——CUDA操作同步化,
access violation时只杀子进程不冻整机(关键防冻结)
3. 父进程端:崩溃检测——读取崩溃日志,含access violation/torch
则增加_easyocr_cuda_oom_count,第二次崩溃后强制CPU模式
(_easyocr_cuda_oom_count>=2 → EASYOCR_FORCE_CPU=1)
2026-08-02 21:22:59 +08:00
youpaishidifu
b21e8f8cd4
feat(ocr): 引入消息历史数据库,改进无时间戳消息放行逻辑\n\n问题:\n1. OCR识别不到时间戳则直接丢弃,如'领地系统依托于哪个插件'因无可见时间戳被丢弃\n2. 微信/QQ同时进消息时,总有一方的消息会被丢弃(待进一步排查)\n\n修复:\n- 新增MessageHistory类,使用SQLite记录用户消息和bot回复\n- 在bot回复时记录到数据库(三处回复路径均已添加)\n- 在ocr_text_has_fresh_timestamp中,无时间戳时增加上下文判断:\n - 若最近30秒内有bot回复(用户消息挨着bot消息):\n * 数据库无该用户消息记录 → 无条件放行\n * 数据库有记录 → 整段丢弃(防重复处理)\n - 否则保持原有逻辑(超短中文消息放行,其他丢弃)\n- 放行时记录用户消息到数据库,用于后续去重\n\n数据库:msg_history.db(SQLite),表message_history,字段:\n platform, sender_type(user/bot), content, content_hash(MD5), created_at\n\n验证:py_compile OK;数据库初始化自动创建表\n\n用户要求:'把用户消息、bot回复的消息做记录,如若用户的消息挨着bot的消息,且数据库无记录,无条件放行,如果用户的消息挨着bot的消息,无时间戳,数据库有记录,则整段丢弃。使用db保存。'
2026-08-02 21:01:33 +08:00
youpaishidifu
e0e5e05b10
fix(ocr): 乱码过滤器放宽——正常英文名词不再误杀\n\n根因:游戏UI乱码过滤器 regex CJK+大写英文 匹配'如何通过Minecraft...'中的'Minecraft',\n导致正常用户消息被误过滤。过滤器本意是捕获游戏UI公告/服务器列表中的乱码片段(如'玩家Ierite'),\n但无法区分正常英文名词。\n\n修复:在 CJK+大写英文过滤前增加中文字符占比检查——\n若中文字符数 >= 英文字母数,视为正常句子不过滤。\n三处过滤器均已修复:OCR(2183行)、剪贴板(2654行)、Poll(4328行)。\n\n示例:\n- '如何通过Minecraft的官网更新自己的皮肤?' → 中文10字母9,保留\n- '玩家Ierite' → 中文2字母6,过滤\n- '比武Mtp' → 中文2字母3,过滤
2026-08-02 19:49:15 +08:00
youpaishidifu
6f791622c9
fix(ocr): 引擎对比长度保护——Windows OCR截断丢消息
...
根因:_pick_ocr_text() 用 score >= score 选引擎,Windows OCR
虽然行数少(8行 vs EasyOCR 19行),但因垃圾字符少、空格惩罚低,
分数可能略高或持平,导致完整 EasyOCR 文本被丢弃。
修复:
- 新增长度保护:当一方行数 >=1.5x 且字符数 >=1.3x 另一方时,
分数差 <10 分则强制选更长文本
- 引擎对比日志增加行数/字符数/分数差,方便排查
- 不影响分数差距大时的正常选择逻辑
2026-08-02 17:51:27 +08:00
youpaishidifu
3853804ca4
fix: 急停/停止即时生效+基线吞消息永久拦截破除
...
问题1: 用户消息通过四层过滤器但不回复——根因基线轮吞消息后永久拦截:
- 基线轮 seen.add(item) 将历史消息永久加入 _seen_messages
- _last_sig 无条件更新 → 之后 OCR 每轮读到相同屏幕 sig 相同静默 return
- 双保险永久拦截: 用户重发相同内容永远等不到回复
修复: 基线轮 seen.discard(item) + 清空 _last_sig + 不 seen.add,
防重复改由 sig 静默跳过承担; sig 静默跳过加日志暴露(4131)
问题2: OCR 识别期间急停/手动停止不生效——主线程卡死在等待:
- _ocr_dual_engine join(timeout=10) 卡死
- _call_easyocr_safe queue.get(timeout=9) 卡死(EasyOCR子进程被杀后
proc.poll()!=None → _read_worker 立即退出 → _q 永空 → 等满超时)
- _safe_screenshot join(timeout=3) 卡死
修复: 三处等待全部改 while self._running 轮询(50ms粒度),
急停瞬间丢弃未出结果的 OCR 折返; _safe_screenshot 去 @staticmethod
验证: py_compile OK; 隔离测试 test_baseline_fix.py 4组断言全过
(基线后 seen 不含 item、sig 清空、重发触发回复、回复后防重复)
2026-08-02 16:44:00 +08:00
youpaishidifu
19c8817893
fix: 过滤器4 _is_reply_fragment 长度门槛6→4(≤4不参与匹配直接放行,≥4走完整匹配);日志拆分避免'7<6'误导(实际为_replied_texts空)
2026-08-02 15:12:16 +08:00
youpaishidifu
e9b9d6d92e
fix: QQ截图cap_left右移至25%避开消息列表时间戳; 修复未来时间戳误判为新鲜(14:40不能匹配16:00); 修复跨午夜反向边界+1day误用; 修复_is_markdown_document日志插入导致长文本检测死代码; 四层过滤器加日志
2026-08-02 14:53:46 +08:00
youpaishidifu
22e781edac
fix: 调整QQ截图裁剪参数cap_left=15%,添加噪声文本过滤
...
- QQ截图裁剪cap_left从0.10调整到0.15,避免截到左侧会话列表
- 新增_is_noise_text函数,过滤HTML标签、图片路径、OCR噪声等
- 在stage splitting主循环、尾部处理、_ocr_text_has_fresh_timestamp三处调用噪声过滤
- 语法检查通过
2026-08-02 12:34:32 +08:00
youpaishidifu
ad7aef5747
修复微信不唤醒前台+QQ裁消息+截屏定时随机清理
...
- 微信截图从不唤醒前台根因: _ensure_visible置前失败后'窗口可见即放行'
(IsWindowVisible&&!IsIconic→True), 截图截到被其他窗口压着的遮挡内容
(窗口停哪截哪, 用户实测原图证实)
- 修复: 微信分支改用_ensure_foreground(AttachThreadInput强置前),
必须真正前台才截图; 微信原生窗口安全(2630搜索联系人已用同路径)
- QQ裁剪继续往左放宽: cap_left 0.15→0.10 (15%仍裁掉左侧用户消息气泡边缘)
- 截屏清理改为定时随机: 原_clean_old_ocr_debug每次保存即按数量删(keep模式),
高频create+delete易触发360勒索误报; 新增_maybe_clean_ocr_dir()
每30~60秒随机间隔清理, 删除mtime早于60s的全部截图(raw+processed都清),
5处保存点去掉立即清理, 死函数已删, 挂载_run_loop主循环
2026-08-01 23:50:04 +08:00
youpaishidifu
4428042703
修复OCR捕捉不可见旧消息+微信无图可查+急停/停止/启动计数器清零
...
- 不可见消息被回复根因: stage splitting主循环+尾部处理中 last_ts=None 时
buf无条件append(首行消息在时间戳之前=更早历史, 绕过全部新鲜性检查)
→ 22:35:33日志实锤: '单清效果是清理哪些效果?'(早已被覆盖)被OCR精准捕捉并回复
- 修复: ① 主循环 if not last_ts: 视为历史丢弃(首个时间戳之前的消息)
② 尾部处理 if not last_ts: 丢弃(整行无时间戳归属)
③ _ocr_text_has_fresh_timestamp 无时间戳不再无条件True, 仅≤4字中文超短消息放行
- 微信无图: 22:35:26 _ensure_hwnd超时(12s)整轮跳过无截图; 现在
_ensure_visible失败时保存'窗口不可见现场截图'(尺寸过滤), 每次尝试都留图
- 计数器清零: start()/stop()缺_easyocr_consecutive_failures重置,
_emergency_stop()急停完全不重置; 三处统一清零
consecutive_failures/cuda_oom_count/call_count/retry_until/broken
+ OCR状态(截图hash/垃圾计数/引擎选择/回复冷却/上次文本)
= 重启后CUDA降级/超时计数不残留, 从头评估GPU/CPU
2026-08-01 22:57:54 +08:00
youpaishidifu
4ae189e82f
修复EasyOCR CUDA OOM冻结+时间戳day=0崩溃+OCR图片分目录img/raw+processed
...
- 冻结根因: CUDA OOM后worker不退出, 损坏context持续占显存, 父进程不杀子进程
反复发图→线程堆积+显存耗尽→桌面冻结
- worker: readtext CUDA/kernel错误→立即退出释放显存(faulerhandler已有兜底)
- 父进程: 收到CUDA错误→立即杀子进程+30s冷却; 连续2次CUDA错误→EASYOCR_FORCE_CPU=1
强制CPU模式启动(显存不足降级防冻结)
- 时间戳day=0崩溃: _is_timestamp_old跨午夜用replace(day-1), 每月1号day=1→day=0
抛ValueError day is out of range for month→微信OCR整轮失败; 改用timedelta(days=±1)
- OCR调试图片回源码目录: img/raw(原图PNG) + img/processed(处理后JPG) 分目录存储
- 崩溃日志回源码根 easyocr_crash.log (不写%LOCALAPPDATA%)
- _clean_old_ocr_debug 默认 keep=20 (回退上一轮激进keep=6)
- .gitignore: 忽略 img/ 与 worker_stderr/stdout.txt
2026-08-01 22:23:55 +08:00
youpaishidifu
0405e42a90
修复OCR回复牛头不对马嘴+残留消息+EasyOCR崩溃捕获+360误报
...
1. knowledge_base.py: 检索排序惩罚标题-only/短正文段,降低heading bonus,奖励正文命中,避免纯标题/免责声明段排第一
2. auto_reply.py: 动作类查询要求正文命中才放行;拒绝纯标题/免责声明答案
3. monitor.py: 调试截图改存%LOCALAPPDATA%/windowmsgbot/ocr_debug避开源码目录(360); 收紧残留消息fresh gate(600s硬门); 启动即崩溃/请求崩溃时读取easyocr_crash.log写入主日志
4. easyocr_worker.py: 加faulthandler+sys.excepthook全局捕获,崩溃traceback落盘%LOCALAPPDATA%/windowmsgbot/easyocr_crash.log
2026-08-01 21:21:05 +08:00
youpaishidifu
9ff019df00
fix: EasyOCR inner timeout mismatch + fresh timestamp gate放宽
...
1. EasyOCR inner timeout 30s→_OCR_TIMEOUT-1(9s)
外层join 10s,inner必须<外层,否则线程永远alive跳过
2. _ocr_text_has_fresh_timestamp: 时间戳全过期但含新鲜内容特征时放行
旧时间戳后紧跟新消息(无独立时间戳)不再被整批丢弃
2026-08-01 18:09:26 +08:00
youpaishidifu
8cf28d11bc
EasyOCR容错: 连续3次超时才杀进程, 前2次保留子进程预留初始化时间, 单次OCR超时保持10s
2026-08-01 17:15:57 +08:00
youpaishidifu
ae145c0d2d
EasyOCR修复: 1)总超时10s→60s(首次加载~28s) 2)时间戳正则兼容EasyOCR的16.47/15;39/16:03.41格式 → 标准化为HH:MM:SS
2026-08-01 17:07:30 +08:00
youpaishidifu
749d14ab91
修复: 1)OCR时间戳跨行继承(消息无时间戳时继承前行时间戳) 2)QQ UI黑名单添加窗口抖动
2026-08-01 16:16:17 +08:00
youpaishidifu
16fdfb0620
EasyOCR修复: 1)worker加顶层异常捕获确保stderr可见 2)竞态保护:stdin写入前检查proc非None 3)增加处理日志 4)超时改30s
2026-08-01 15:58:58 +08:00
youpaishidifu
8ccad84986
OCR历史消息过滤: 若文本有可见时间戳但全部过期(>300s)直接丢弃, 防止混入旧消息误触发回复
2026-08-01 14:58:41 +08:00
youpaishidifu
733f12c45b
偏旁过滤改md库驱动: bot只查Unicode列码点, md缺失才回退硬编码范围, 维护只改md不改代码
2026-08-01 13:22:24 +08:00
youpaishidifu
ba0e6e2450
修复3个OCR问题: easyocr子进程ready握手+60s初始化预算, 偏旁过滤改Unicode范围判断, 新旧消息按新鲜特征放行
...
- easyocr_worker.py: 初始化完成后输出{"ready":true}握手, 父进程不再把3-10s初始化计入10s请求超时
- monitor.py: _ensure_easyocr_subprocess重写 - 60s握手预算(daemon线程+Queue), stderr PIPE捕获崩溃原因, 崩溃/超时改30s冷却自动重试(不再永久broken)
- monitor.py: 删除markdown表格字符key偏旁库, 改U+2E80-U+2FDF码位范围判断, 修复"地图"/"太"等正常汉字被误判为偏旁丢弃
- monitor.py: _looks_fresh_content新鲜特征判断 - 旧时间戳但含疑问词/问句/句尾标点的消息放行, 不再整块丢弃
- 新增test_easyocr_handshake.py: 子进程握手+OCR往返回归测试(实测通过: 28s含初始化, 识别'你好世界测试123')
2026-08-01 13:00:57 +08:00
youpaishidifu
d2389ec3e1
fix: 微信裁切参数调整 + 气泡上下文验证 + EasyOCR重启修复
...
- 微信裁切参数:cap_left从0.34减至0.30,cap_right改为跳过滚动条+右边框(2%宽度)
- 微信气泡上下文验证:OCR后处理增加气泡消息上下文检查
- 消息必须包含时间戳、冒号分隔符或标点结尾
- 短中文消息(≤8字)和含问词/感叹词的消息放行
- 过滤Windows弹窗/通知/非聊天内容
- EasyOCR重启修复:stop()和start()中重置_easyocr_broken标志
- 确保停止/急停后双引擎仍能搭档作业
2026-07-31 22:29:14 +08:00
youpaishidifu
f9c4b161f3
fix: 偏旁替换改为偏旁丢弃 + 英文配置乱码过滤
...
- 偏旁过滤逻辑:从'替换为补充字符'改为'包含偏旁字符就丢弃'
修复'法'被OCR拆成'氵去'后替换为'河去'的问题
- 新增英文配置格式+乱码过滤:拦截 key=value 后跟乱码的模式
如 'invite referral bonus=5a激<5'
- OCR级和Poll级同步更新偏旁过滤和乱码过滤规则
2026-07-31 21:20:07 +08:00
youpaishidifu
fe83f1035a
feat: 补全所有偏旁的补充字符(200个偏旁,0空值)
...
1. 为200个CJK偏旁全部填写补充字符(正确汉字)
2. 修正U+2E8E:氵→冫(两点水,之前误标为三点水)
3. 删除重复条目:广(U+2EA4)与尸(U+2EA4)重复,删除广
4. 修正文件头描述:从"≥3丢弃"改为"替换/丢弃"
维护方式:编辑unicode_radicals.md的补充字符列,重启bot生效
2026-07-31 19:47:48 +08:00
youpaishidifu
18742065a7
feat: 偏旁库逻辑重构 — 替换偏旁为正确汉字\n\n1. 修改unicode_radicals.md格式,新增补充字符列\n2. 新增_load_radicals()加载偏旁→补充字符映射(字典)\n3. 新增_replace_radicals()函数:遍历偏旁,有补充字符则替换,无补充字符则整段丢弃\n4. OCR级和Poll级偏旁过滤逻辑同步更新\n5. 降级逻辑:默认范围U+2E80-U+2FDF,补充字符为空\n\n维护方式:编辑unicode_radicals.md填写补充字符,重启bot生效
2026-07-31 18:30:33 +08:00
youpaishidifu
9163f12fcb
fix: OCR吞字纠错 + 拉黑'拍了拍'系统通知
...
1. OCR吞字纠错:在_normalize_ocr_text中添加词级纠错字典,
修复Windows OCR常见汉字误识别(手髓→手续、β余→多余、
早原→草原、届件→插件、文|牛→文件、日何→如何)
2. 拉黑'拍了拍':加入_UI_SUBSTR_BLOCKLIST,过滤微信/QQ
'拍了拍'系统通知(UI按钮触发,非用户消息)
2026-07-31 17:40:44 +08:00
youpaishidifu
9d30943a84
fix: QQ截图cap_left从20%减至15%,修复时间戳被截断(15:54→0:54)\n\n根因:cap_left=20%仍截掉了消息面板左侧的时间戳数字,\n导致OCR识别到的时间戳丢失前导数字(15→0),被补0后\n判定为旧消息跳过。减至15%确保时间戳完整。
2026-07-31 17:13:03 +08:00
youpaishidifu
0f5be72af0
feat: 保存OCR处理后图片到根目录(JPG格式)用于肉眼对比
...
1. QQ和微信轮询方法中,图像预处理(resize+sharpen+contrast)后
保存一份JPG格式的图片到windowmsgbot根目录
2. 文件名格式:ocr_processed_qq_时间戳.jpg / ocr_processed_wx_时间戳.jpg
3. 与原图(ocr_debug_*.png)对比,判断是OCR识别问题还是美化过度
4. 修改_clean_old_ocr_debug函数支持清理.jpg文件
2026-07-31 16:44:04 +08:00
youpaishidifu
7812f3cc63
fix: 放宽bot配置说明过滤规则 — 三重匹配防误过滤用户消息
...
原规则:只要包含配置短语或英文关键词就过滤,导致用户讨论配置的消息
如'invite referral bonus=5afi配置此处的文件'被误过滤。
修复:改为三重匹配——必须同时满足:
1. 包含配置短语(如'配置此处的文件')
2. 包含英文关键词(如invite/referral)
3. 包含配置格式(=或:后跟非空白字符)
只有三者都满足才判定为bot旧回复,避免误过滤用户消息。
2026-07-31 16:13:27 +08:00
youpaishidifu
7012eaa7ed
fix: OCR时间戳截断修复 — 裁切左移 + 时间戳OCR误读兜底
...
1. QQ截图cap_left从25%减至20%,减少时间戳左侧数字被截断概率
2. _is_timestamp_old新增OCR误读兜底:h<12时尝试h+10/h+12取diff最小者
若<max_age则放行(OCR把15→5时h+10=15=正确值)
2026-07-31 15:57:08 +08:00
youpaishidifu
ce74fc762a
fix: 用户操作不再打断bot唤醒截图 — 窗口可见即可截图,不要求前台
...
根因:_ensure_visible 强制要求窗口在前台(_check_foreground),
用户操作鼠标/键盘会瞬间抢走前台焦点 → 3次重试全部失败 →
"唤醒失败"跳过本轮。但 ImageGrab.grab 只需要窗口在屏幕上可见,
不要求前台,用户操作≠窗口被遮挡。
修复:
- _ensure_visible:前台校验失败后,若窗口仍然可见(!IsIconic && IsWindowVisible),
仍返回True继续截图。仅窗口真的不可见时返回False
- QQ/微信轮询:窗口不可见时退避5秒(每0.1秒检查急停),
给用户接管时间,同时不阻塞急停操作
2026-07-31 14:44:12 +08:00
youpaishidifu
3a4fecbc03
fix: 用 daemon 线程替代 ThreadPoolExecutor,防止 Windows OCR 卡死冻结电脑
...
根因:_ocr_dual_engine 用 ThreadPoolExecutor with 块,__exit__ 调
shutdown(wait=True),当 Windows OCR 引擎卡死时永久阻塞主线程 → 电脑冻结。
修复:改用 daemon 线程 + join(timeout=10s),超时后线程丢弃不阻塞。
daemon 线程随进程退出自动回收,不会泄漏。
2026-07-31 14:13:51 +08:00
youpaishidifu
435f729589
fix: 降低OCR预处理锐化/对比度,增强偏旁碎片检测
2026-07-31 12:45:48 +08:00
youpaishidifu
b065f8d707
fix: 时间戳分割支持中文日期前缀(昨天、前天、星期X等)
2026-07-31 10:19:01 +08:00
youpaishidifu
e91fc20523
fix: 修复偏旁库加载失败 — 改用更健壮的markdown表格解析
2026-07-31 09:57:32 +08:00
youpaishidifu
bd5ec8cbd8
fix: md格式直接砍掉 — 删除用户文本提取,统一过滤逻辑
...
问题:OCR截屏截到bot旧回复(md格式文档内容),时间戳分割后
调用 _extract_user_text_from_md_fragment 尝试从混合文本中提取
'用户文本',导致md内容中的非md部分绕过过滤→触发查库→错误回复。
修复:
1. 时间戳分割逻辑(两处):md格式直接跳过,不再提取用户文本
2. 删除 _extract_user_text_from_md_fragment 方法(约100行)
3. 统一过滤逻辑:只要匹配 _is_markdown_document → 直接continue
原理:正常用户聊天不用 #标题、[链接](url)、-列表等md语法,
只要出现就是bot旧回复被OCR读回。不需要尝试提取'用户部分'。
2026-07-31 00:32:22 +08:00
youpaishidifu
567924a2e4
fix: 加强bot自身回复过滤 — 5层防护拦截OCR读回bot旧回复
...
问题:OCR截屏截到bot之前发的回复内容(如'奖励:邀请人可获得该新用户首充金额的30%'、
'invite referral bonus=5afii'、'配置此处的文件,负责展示...'),
这些内容逃过了颜色检测(左确有白色气泡)、时间戳检测、偏旁检测,
流入KB匹配→触发错误回复。
修复(OCR级+Poll级双层,共5类新过滤器):
1. 英文key=value配置格式:invite referral bonus=5afii
2. 配置文件描述片段:配置此处的文件、负责展示、对应一个商品等
3. 英文奖励关键词:invite/referral/reward/bonus
4. KB内容回读:奖励:、规则:、配置:等KB段落标记
5. 百分比+金额描述:30%+金额/奖励/积分等
原理:正常用户对话不含这些模式,只要出现就是bot旧回复被OCR读回
2026-07-31 00:17:00 +08:00
youpaishidifu
348e40a995
fix: 病句过滤增强(特殊符号开头) + 急停多阶段中断检查
...
1. 病句过滤增强:
- 新增OCR级+Poll级特殊符号开头碎片过滤:^[~`~]
- 拦截OCR把'一键'识别为'~键'导致的病句碎片(如'~键导出全服流水')
2. 急停多阶段中断检查(6处):
- _poll函数入口:急停后下一轮立即折返
- _ocr_read_qq截屏前:防止截屏+OCR继续执行
- _ocr_read_wechat截屏前:同上
- _process_ocr_output入口:防止文本处理继续
- 回复发送前:防止急停后仍发送回复
- 原有2处:OCR返回后 + 文本过滤后
3. 修复原理:原急停只在while循环开头检查_running,
线程已深入_poll内部时无法中断同步阻塞的OCR操作。
现在在每个耗时操作前检查,急停后立即丢弃当前结果。
2026-07-30 23:39:54 +08:00
youpaishidifu
664d02ac55
fix: 尾部内容也检查时间戳过期 — 修复OCR拼凑历史消息触发查库
...
问题:OCR读屏文本含多个时间戳(17:49:58, 8:33:06, 21:56:17),
中间碎片因last_ts过期被正确跳过,但尾部(最后时间戳之后的内容)
被无条件放行→历史消息内容绕过时间戳过滤→触发查库→自动回复。
根因:尾部逻辑注释说'可能来自新消息'无条件放行,
但21:56:17清晰可见且已过期(差47min=2820s≥300s),
尾部内容也是历史消息。
修复:尾部增加 last_ts 年龄检查,若最后可见时间戳已过期(≥300s),
尾部内容也跳过不处理。
2026-07-30 22:50:33 +08:00
youpaishidifu
5e86ef3c67
fix: 加强病句过滤 — 纯问句碎片、问句+乱码拼接、中段斜线命令
...
问题:OCR捕捉到残余病句'怎么办?/printer...'触发查库,
回复了一串配置文件值(printer相关配置参数)。
根因:
1. '怎么办?'单独出现时无实质内容,但含问词被放行
2. '/printer玩家名'是指令帮助碎片,在消息中段未被拦截
3. 两者拼接后绕过了现有过滤器
修复(OCR级+Poll级双层):
- 新增中段斜线命令碎片过滤:(?<=[\s??。!,,])/[A-Za-z]{2,}
拦截'怎么办?/printer玩家名'这种混合碎片
- 新增纯问句碎片过滤:只含疑问词+标点的短句直接丢弃
- 新增问句+乱码拼接过滤:问词开头+斜线/英文乱码特征→丢弃
2026-07-30 22:36:15 +08:00
youpaishidifu
2a181ab34a
fix: 偏旁过滤还原≥1丢弃 + OCR过滤bot自身pipe表格回复
...
1. 偏旁碎片过滤还原:≥3→≥1,只要包含CJK偏旁就丢弃
- 原因:OCR拆字碎片如'亻牛''彡'只要出现就说明是碎片
2. OCR/Poll级新增bot自身回复过滤:
- pipe表格格式(|参数1|参数2|参数3|结果|)是bot回复格式
- OCR截屏截到旧的bot回复不该进入KB匹配
- pipe≥3且长度>30 → 过滤丢弃
2026-07-30 20:01:47 +08:00
youpaishidifu
2a655e56ac
feat: 偏旁Unicode库 + 偏旁数≥3才丢弃
...
根因:OCR把'件'拆成'亻牛',偏旁碎片触发查库。原逻辑只要包含CJK偏旁就过滤,
但正常用户消息也可能偶尔包含偏旁字符。
修复:
1. 新增 unicode_radicals.md 偏旁库文件(225个偏旁+Unicode码表)
2. bot启动时读取md文件构建偏旁字符集 _RADICAL_CHARS
3. 偏旁过滤改为计数:偏旁出现次数≥3才整段丢弃
4. 维护方式:编辑 md 文件添加/删除偏旁,重启 bot 生效
覆盖场景:
- '亻牛'('件'被拆碎)
- '彳亍'('行'被拆碎)
- OCR把多个汉字拆成偏旁碎片(≥3个偏旁)
2026-07-30 18:55:55 +08:00
youpaishidifu
2b03ca1a7d
fix: 简化偏旁碎片过滤逻辑,只要包含CJK偏旁就过滤
...
- 原逻辑:偏旁数>=CJK完整字数才过滤,但长文本中CJK字数多,偏旁数少,条件不成立
- 新逻辑:只要包含CJK偏旁(U+2E80-U+2FDF)就直接过滤
- 原理:正常用户消息几乎不含这些偏旁字符,只要出现就是OCR把汉字拆碎了
- 覆盖'亻牛'、'彳亍'等OCR拆字碎片
2026-07-30 18:06:48 +08:00
youpaishidifu
41f55fe9ed
fix: 清理HTML标签 + 降低绿色像素阈值 + 增强乱码过滤
...
1. HTML标签清理:
- 在_normalize_ocr_text中清理<br>、<div>等HTML标签
- OCR截到网页/终端时常带HTML标签,影响文本处理
2. 绿色像素检测阈值降低:
- 从>=5改为>=3,更敏感地检测微信窗口
- 防止QQ轮询截到微信内容被误处理
3. 乱码过滤增强:
- CJK+拉丁混合乱码检测(如'默i'、'鼍')
- 生僻字/罕见字检测(CJK扩展区)
- 系统配置内容过滤(概览、数据看板、在线玩家等)
4. 解决'牛头不对马嘴'问题:
- OCR截到Wiki/终端内容被当用户消息处理
- 知识库匹配到错误的section(Wiki标题而非具体内容)
2026-07-30 17:44:49 +08:00
youpaishidifu
405191bab3
fix: 增强偏旁碎片过滤 + 系统配置内容过滤
...
1. 偏旁碎片过滤增强:
- 去掉长度限制(原≤20字),只要包含CJK偏旁(U+2E80-U+2FDF)且偏旁数>=CJK完整字数就过滤
- 覆盖OCR把'件'拆成'亻牛'等更长碎片的情况
2. 系统配置内容过滤(新增):
- 检测包含@example、smtp、.py/.bat/.sh等特征的行,判定为系统配置内容
- 检测邮件地址格式(user@domain.tld ),判定为SMTP配置片段
- 防止OCR截屏截到代码编辑器/终端内容被当用户消息处理
3. 同步更新OCR级和Poll级过滤逻辑
2026-07-30 17:17:30 +08:00
youpaishidifu
e42f56dc8f
fix: 加强病句过滤 + QQ跨窗口污染检测
...
1. 病句过滤增强:
- 病句6:包含时间戳格式(16:29, 2026/7/29)的句子跳过
- 病句7:以数字开头且包含问号的句子跳过(如'1屏蔽?不想要的后缀。')
- 病句8:包含引号包裹时间戳的句子跳过(如'"2026/7/29"')
2. QQ跨窗口污染检测:
- 检测微信绿色像素(R:135-180, G:205-250, B:75-125)
- 若QQ轮询截图中检测到大量绿色像素,判定为微信窗口,跳过本轮
- 防止QQ轮询截到微信内容被误处理
3. 像素检测优化:
- QQ轮询增加绿色像素检测,避免截到微信窗口
- 微信轮询已有类似逻辑(绿色=自身消息)
2026-07-30 17:02:46 +08:00
youpaishidifu
52fd2cbd03
fix: 加强病句过滤 + QQ颜色检测逻辑简化
...
1. 病句过滤增强:
- 病句3扩展匹配范围:'^[其将把被]' → '^[其将把被认查问帮试想]'
- 覆盖OCR常丢失前缀的情况:'默认管理员密码多少' → '认管理员密码多少'
- 句子以动词开头、缺主语、无标点 → 判定为病句跳过
2. QQ颜色检测简化:
- 核心原则:只要左半区无白色气泡 → 无用户消息 → 跳过
- 删除冗余条件分支(仅bot回复、气泡柱检测等)
- 避免'拿不准保守处理返回True'导致bot自身消息被处理
2026-07-30 16:48:45 +08:00
youpaishidifu
dadbcebe7f
fix: EasyOCR GPU OOM 冻结 — 每3次主动重启子进程 + 用原图降显存压力
...
根因:EasyOCR reader.readtext() 每次调用后 PyTorch CUDA 内存缓存不释放,
几轮后 VRAM 满 → Allocation Fail(27MB) → 显存错误 → 系统冻结。
修复:
- _easyocr_call_count 计数,达到 3 后 kill 子进程(下次自动重启)
- EasyOCR 用 im_original(1x)代替 im_processed(2x),降单次显存 4x
- _ensure_easyocr_subprocess 遇空 _easyocr_proc 自动重启
2026-07-30 14:49:43 +08:00
youpaishidifu
b382520093
fix: QQ OCR 截图前检查 _ensure_visible 返回值,失败跳过避免截到微信内容
...
- _ocr_read_qq 中 _ensure_visible(hwnd) 返回值被丢弃,
唤醒失败时 ImageGrab.grab 拿到微信窗口内容被当QQ消息处理
- 微信路径已正确检查返回值,QQ路径补齐
2026-07-30 14:22:01 +08:00
youpaishidifu
b55fff8cbb
修复2个bug: 急停后OCR残留 + 知识库奖励配置匹配错误
...
Bug1 - 急停(ESC×2)后Windows OCR仍在运行输出日志:
_emergency_stop设_running=False+杀EasyOCR子进程,但Windows OCR
(RecognizeAsync)是同步阻塞调用,无法被中断。OCR完成后_poll继续
处理文本→触发回复。
修复:_poll中在_read_messages返回后+文本过滤后各增加self._running
检查,OCR完成或文本处理中如已急停则立即return,不再触发回复。
Bug2 - 用户问寻宝奖励配置,bot返回指令参数表格(匹配度15.38):
知识库sdf1_game.md中'## 寻宝玩法介绍'命令表含'寻宝'高频词,
TF-IDF得分远高于'## 奖励配置:'段。heading bonus仅2.0/词,
不足以翻转15分的TF-IDF差距。
修复:heading bonus从2.0/词提升至5.0/词;新增heading连续短语
匹配bonus(+8.0),如查询含'奖励配置'且heading含'奖励配置'则
大幅boost,确保语义匹配的section排到最前。
2026-07-30 13:49:58 +08:00
youpaishidifu
e9bccb688b
修复2个bug: 同poll取最新消息(末条) + 斜线I变形(Iskin)过滤
...
Bug1 - 用户问寻宝奖励,bot回复sdf1导入错误:
OCR从上到下读屏,旧消息排前面新消息排后面。
原逻辑'只处理第一条'把旧历史消息当新消息处理,
真正的用户新消息被'同poll第条跳过'挡掉。
修复:改为取new_items[-1](最后一条=屏幕最下方=最新消息),
其余加入seen防重复。
Bug2 - /skin OCR变形为Iskin在消息中后段未被过滤:
/skin→OCR→Iskin(I替代/)。原过滤器要求^[A-Za-z]开头
且len>10,但'使用指令Iskin'=9字符→漏网。
修复:新增CJK+I+小写字母变形过滤器[\u4e00-\u9fff]I[a-z]{2,},
拦截所有CJK上下文中的斜线I变形命令。
2026-07-30 13:04:30 +08:00
youpaishidifu
18d7880a49
添加偏旁碎片过滤器:拦截OCR输出的氵亻讠扌等CJK偏旁部首\n\n根因:OCR识别不完整时会输出CJK偏旁(如氵亻讠扌艹钅等),\n这些不是完整汉字,不应触发查库回复。\n\n修复:\n- OCR级+Poll级双层过滤\n- 检测U+2E80-U+2FDF(CJK Radicals Supplement + Kangxi Radicals)\n- 短文本(≤20字)中偏旁数>=完整CJK数时判定为碎片丢弃
2026-07-30 12:32:23 +08:00
youpaishidifu
43bd80d3b6
修复2个bug: stop()未杀EasyOCR子进程残留 + _/sdfl历史消息误判为新消息
...
Bug1 - 消息监控停止后EasyOCR子进程残留吃GPU导致冻电脑:
stop()只清线程不杀子进程→GPU推理持续运行→系统冻结。
修复:stop()末尾增加杀死_easyocr_proc + wait(timeout=3)
Bug2 - 用户问寻宝插件奖励配置,bot回复sdf1插件导入错误:
微信OCR截到'_ /sdfl undo撤销导入昨天'(历史消息残影),
sdfl过滤器要求^[A-Za-z]字母开头,但该文本以下划线_开头→漏网→
被判为新消息优先处理,真正的用户消息'寻宝玩法中支持哪些奖励配置?'
被同poll第条跳过。
修复:
- sdfl过滤器去掉^锚点限制,只要含sdfl/sdf1即拦截
- 新增_/下划线斜线残影过滤器^_[ /]拦截OCR气泡残影
2026-07-30 12:22:04 +08:00
youpaishidifu
e3c8249251
修复 _has_user_colors @staticmethod 内误用 self 导致 OCR 全部失败\n\n根因:_has_user_colors 是 @staticmethod(无 self),但内部嵌套的\nanalyze() 函数调用了 self._is_white_bubble_pixel() → NameError。\nQQ/微信两侧 OCR 均因此失败。\n\n修复:self._is_white_bubble_pixel → MessageMonitor._is_white_bubble_pixel\n全部27个@staticmethod经AST扫描确认无其他self误用
2026-07-30 12:04:21 +08:00
youpaishidifu
3a53db427b
修复 _poll 方法被孤立到类外导致 AttributeError
...
根因:_is_white_bubble_pixel 以0缩进定义在模块级,其后4缩进的方法
(含 _has_user_colors、_poll 等21个)被Python解析为该函数体的一部分,
导致 MessageMonitor 类缺失 _poll 等方法→运行时 AttributeError。
修复:
- _is_white_bubble_pixel 改为 @staticmethod 移入 MessageMonitor 类内
- 唯一调用点改为 self._is_white_bubble_pixel(...)
- 类方法从50个恢复为71个,py_compile 校验通过
2026-07-30 10:06:38 +08:00
youpaishidifu and Senior Developer
62928d81eb
修复微信自身消息未跳过(自回复循环) + QQ调试截图被清理顶掉
...
1. 微信颜色门禁误判根因:聊天浅灰背景(≈237)原阈值>225被算作"对方白气泡",
且绿色自身气泡上的白色文字也通过白像素检测,导致门禁永远不跳过→一直OCR→自回复循环。
改为:白像素须≥245(纯白,排除浅灰背景),且四邻域≥3个同为纯白才计为"对方气泡",
从而正确排除绿/蓝自身气泡上的白色文字。合成图验证:仅自身绿泡→跳过、对方白泡→OCR、
空白灰屏→跳过、绿底白字→跳过。
2. QQ调试截图"没保存"根因:_clean_old_ocr_debug 用 QQ+微信共享6张上限池,
微信轮询频率远高于QQ,其清理调用把刚保存的QQ截图顶掉。改为按前缀分别保留
(ocr_debug_qq_ / ocr_debug_wx_ 各6张),互不挤占。
3. 截图保存硬化:保存后校验文件存在并INFO记录;异常时WARNING输出真实路径(原输出的是glob);
显式指定 format=PNG。
Co-Authored-By: Senior Developer <senior-developer@experts>
2026-07-30 00:39:50 +08:00
youpaishidifu
01d0604f11
修复截屏前未真正唤醒QQ/微信的bug
...
- _ensure_visible 增强:原仅 SwitchToThisWindow 无法把窗口顶到 Z-order 最前,
导致 ImageGrab.grab 截到用户停留的遮挡窗口(如终端)
改为 恢复最小化→AllowSetForegroundWindow 解除前台限制→SetForegroundWindow
+ SwitchToThisWindow 兜底并校验前台(重试3次);不做 TOPMOST 避免 DWM 冻结
- 微信: 唤醒提前到 GetWindowRect 之前,唤醒后重新取 rect 算 cap(最小化恢复位置会变)
可见性检查改为只判断 IsWindow,不可见交由 _ensure_visible 恢复而非直接返回
- QQ: 同样先唤醒再取 rect 算 cap,避免最小化恢复后 cap 区域过期
2026-07-29 23:55:55 +08:00
youpaishidifu
dfaa62e2c0
修复微信自身消息过滤+病句加强+QQ共同好友黑名单
...
1. 微信颜色检测重写(_has_user_colors):
- 绿色=自身消息(右对齐),白色=对方消息(左对齐)
- 自身消息是最顶层门禁:右绿+左无白→跳过,左有白→继续OCR
- 修复:之前绿色被当作bot色,导致自身消息未过滤触发查库
2. 病句过滤加强:
- 短句阈值从≤5字提升到≤8字,必须含疑问词才放行
- 新增疑问词:是不是/会不会/能不能/怎么办/好不好/行不行
- 新增病句4:OCR拼接系统提示碎片(含#本/请自行/源码修改)
- 新增病句5:修字碎片(自行修?帮我修)
3. QQ群UI黑名单:
- _UI_SUBSTR_BLOCKLIST增加'共同好友'和'点击添加好友'
- 防止QQ群'你和xxx有x个共同好友'触发查库
2026-07-29 23:29:38 +08:00
youpaishidifu
a181300df5
OCR调试截图自动清理:从60张降至6张
...
- 微信和QQ截图统一池,合计最多6张
- 超过时从最早开始删除覆盖
- 确保保存失败时日志未打印也能通过截图及时发现问题
2026-07-29 22:57:54 +08:00
youpaishidifu
a076353ee4
修复三个问题:病句过滤、KB回复内容、截图保存日志
...
1. 病句过滤改进(monitor.py):
- ≤5字短句:必须包含疑问词(什么/怎么/如何/为什么/吗/呢等)才放行
- 无疑问词的短句直接过滤(如'自行修?')
- 5-50字病句:增加'过'字匹配(如'修正过后')
2. KB回复内容改进(auto_reply.py + knowledge_base.py):
- _get_answer 改为返回 body(纯正文),不含 heading
- KB搜索增加heading包含查询关键词的bonus
- 文档头部(# 文档名)增加penalty,避免返回错误section
3. 截图保存日志改进(monitor.py):
- QQ/微信截图保存失败日志从 debug 升级为 warning
- 增加保存路径提示,便于定位问题
2026-07-29 22:43:32 +08:00
youpaishidifu
503de361c5
修复KB搜索质量差+增加OCR病句过滤
...
1. 改进内容相关性检查:高匹配度(≥10.0)但无共同词时拒绝匹配
- 用户问PVP击杀播报,KB返回json格式说明(匹配度9.53)→ 拒绝
- 增加body内容检查,防止TF-IDF误匹配
2. 增加OCR病句过滤:
- 病句1:句子以动词结尾但缺少宾语(如'将其修正后重三')
- 病句2:句子以'三'结尾(OCR误读'试'为'三')
- 病句3:句子缺少主语且无标点
- 病句直接过滤,不触发查库
2026-07-29 22:11:08 +08:00
youpaishidifu
db64918761
改进内容相关性检查:增加body内容匹配,增强日志诊断
...
- _has_content_relevance 增加 content/body 检查,防止TF-IDF匹配到heading无关但body相关的section
- 增加 score 参数传递,用于日志记录
- 日志增加 doc_body 预览,便于诊断匹配失败原因
2026-07-29 21:56:14 +08:00
youpaishidifu
fae6d5184f
修复OCR截历史消息自言自语: 变形命令过滤 + 首次轮询基线\n\n问题: OCR阅读历史帮助文档触发错误回复 + 首次启动时历史消息全部触发回复\n\nFix1: OCR误读斜线为字母(4处过滤)\n /sdfl→Isdfl /import→Jimport 均不被^/[A-Za-z]拦截\n - OCR级+Poll级: 含sdfl关键词的行以字母开头→变形命令跳过\n - OCR级+Poll级: 大写字母+4+小写+含CJK+>10字符→变形命令跳过\n 覆盖Isdfl update更新插件、Jimport导入cdk等所有OCR变形命令行\n\nFix2: 首次成功轮询基线拦截\n 检测_last_new_msg_time[platform]==0判断是否首次见消息\n 首次消息列表全部标记基线→加_seen_messages但skip_on_message\n 不触发KB搜索/自动回复\n 下一轮有真正的增量消息才触发回复
2026-07-29 21:23:32 +08:00
youpaishidifu
d72d994db1
修复2问题: 斜线英文命令触发回复 + 微信Electron安全发送\n\n问题1: 斜线开头英文命令碎片触发自动回复\n 日志: /sdfl undo撤销导入 匹配度9.53触发了回复\n 旧过滤: 只拦>=2个/cmd, /sdfl只有1个→漏过\n 修复(OCR+Poll双级):\n - _process_ocr_output新增: re.match(r'^/[A-Za-z]', line)→跳过\n - _poll_on_new_messages同级新增\n 不拦/兑换码(斜线后中文), 只拦/register /sdfl等英文命令\n\n问题2: 微信SetForegroundWindow异常+Electron闪崩风险\n 日志: SetForegroundWindow/SwitchToThisWindow异常 code=0\n WeChat也是Electron, AttachThreadInput+SendMessage同TIM风险\n 修复:\n - _paste_and_send_tim→_paste_and_send_safe, 加platform参数\n 硬编码[qq]改为[platform]避免写错字典key\n 清理return True后不可达死代码\n - _paste_and_send路由: wechat也走安全路径\n Electron双平台(TIM+微信)统一走SwitchToThisWindow+前台确认→keybd_event\n 无AttachThreadInput、无SendMessage同步点击
2026-07-29 20:14:47 +08:00
youpaishidifu
b1ca2f058c
修复OCR截图BitBlt卡死DWM→整机冻结2-3分钟
...
根因: ImageGrab.grab() 底层用 GDI BitBlt 从 DWM 合成表面截屏。
_ensure_visible(SwitchToThisWindow) 触发 DWM 窗口激活合成后,
紧接着 BitBlt 在 DWM 繁忙时阻塞等待→DWM 死锁→桌面冻结 2-3 分钟
→DWM 重启→部分使用 GPU 的软件崩溃
修复(新增 _safe_screenshot):
- daemon 线程内 ImageGrab.grab(), join(timeout=3.0) 超时等待
- 超时后线程 is_alive→返回 None, 跳过本轮(日志: BitBlt 可能卡在 DWM)
- 不会 cancel 线程(无法取消阻塞的 C 调用), 但 daemon 特性确保:
进程退出时自动终止, 正常运行时 GDI 调用最终完成+线程自动回收
- _ensure_visible 后 sleep 从 0.1s 增加到 0.4s, 给 DWM 完成窗口合成
降低 BitBlt 在 DWM 繁忙时调用的概率
2026-07-29 18:49:34 +08:00