diff --git a/CLAUDE.md b/CLAUDE.md index e763570..0dd7b1f 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -42,6 +42,7 @@ wechat_clicker/ - 可见性检查基于元素**中心点**是否在消息列表可见区域内(30px margin) - 状态检测基于窗口计数 + **AXMinimized 属性**:区分窗口存在但最小化 vs 真正可见 - **窗口恢复策略**:NSRunningApplication.unhide(隐藏)→ AX API 设置 AXMinimized=False(最小化)→ activate(前台);AppleScript 不可靠(微信不支持 miniaturized 属性) +- **UNKNOWN 状态恢复**:先 Escape + Cmd+W 关闭可能的弹窗/多余窗口,再 activate + 点击侧边栏;外层循环连续恢复失败时指数退避(10s → 20s → 40s → ... → 120s 封顶),避免无效高频重试 ## 使用方法 diff --git a/project.md b/project.md index 3a47be4..c15525a 100644 --- a/project.md +++ b/project.md @@ -97,6 +97,11 @@ - [x] **新增: 每聊天图片处理上限** — `MAX_IMAGES_PER_CHAT = 30`,防止单个高活跃群聊垄断处理时间(30张×10s = 5分钟/聊天) - [x] **简化: `_process_media_with_scroll`** — 不再负责滚动和锚点查找(移入 `_process_images_with_arrow` 内部),代码更清晰 +### v0.9.2 UNKNOWN 状态恢复加固 (2026/04/24) + +- [x] **修复: UNKNOWN 状态长时间无法恢复** — 原恢复逻辑只做 activate + 点侧边栏,遇到弹窗/多余窗口无法清理。改为先 Escape + Cmd+W 关闭可能的弹窗,再 activate + 点侧边栏 +- [x] **改进: 恢复失败指数退避** — 外层循环连续恢复失败时退避等待:10s → 20s → 40s → 80s → 120s(封顶),避免每 13 秒重复无效尝试。恢复成功后计数器归零 + ### 待验证 - [x] ~~验证最小化窗口自动恢复功能(需手动最小化微信窗口测试)~~ diff --git a/wechat_clicker/automator.py b/wechat_clicker/automator.py index 8e46298..7be4cac 100644 --- a/wechat_clicker/automator.py +++ b/wechat_clicker/automator.py @@ -39,6 +39,7 @@ class WeChatAutomator: self._scan_count = 0 self._total_chats_processed = 0 self._total_media_clicked = 0 + self._consecutive_recover_failures = 0 # ---------------------------------------------------------------- # 启动检查 @@ -114,10 +115,17 @@ class WeChatAutomator: time.sleep(0.5) if not self.state.recover_to_chat_list(): - logger.warning("无法恢复到聊天列表,跳过本次循环") - time.sleep(10) + self._consecutive_recover_failures += 1 + backoff = min(10 * (2 ** (self._consecutive_recover_failures - 1)), 120) + logger.warning( + f"无法恢复到聊天列表 (连续失败 {self._consecutive_recover_failures}), " + f"等待 {backoff}s" + ) + time.sleep(backoff) return + self._consecutive_recover_failures = 0 + self._scan_count += 1 global_unread = self.ui.get_global_unread_count() diff --git a/wechat_clicker/state_machine.py b/wechat_clicker/state_machine.py index 3d7c61d..93dae08 100644 --- a/wechat_clicker/state_machine.py +++ b/wechat_clicker/state_machine.py @@ -154,7 +154,12 @@ class StateMachine: time.sleep(0.5) if state == UIState.UNKNOWN: - # 尝试激活微信并点击侧边栏聊天按钮 + # 先尝试关闭可能的弹窗/多余窗口 + self.ax.send_escape_key() + time.sleep(0.3) + self.ax.send_cmd_w() + time.sleep(0.3) + # 重新激活微信并点击侧边栏聊天按钮 self.ui.ensure_wechat_frontmost() time.sleep(0.5) self.ui.click_sidebar_chat_tab()