From 2aace40a2607ab987331f7521b84867f10a40b7e Mon Sep 17 00:00:00 2001 From: KenanZhu <3471685733@qq.com> Date: Thu, 28 May 2026 01:36:28 +0800 Subject: [PATCH] =?UTF-8?q?fix(services):=20=E4=BF=AE=E5=A4=8D=E9=AA=8C?= =?UTF-8?q?=E8=AF=81=E7=A0=81=E8=AF=86=E5=88=AB=E9=80=BB=E8=BE=91=E3=80=81?= =?UTF-8?q?=E9=A2=84=E7=BA=A6=E6=97=B6=E9=97=B4=E6=A0=A1=E9=AA=8C=E4=B8=8E?= =?UTF-8?q?=E5=BC=82=E5=B8=B8=E5=A4=84=E7=90=86=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.7 --- src/pages/services/CaptchaSolver.py | 37 +++++++++------------------- src/pages/services/RecordChecker.py | 14 +++++++---- src/pages/services/ReserveChecker.py | 11 +++++++++ 3 files changed, 31 insertions(+), 31 deletions(-) diff --git a/src/pages/services/CaptchaSolver.py b/src/pages/services/CaptchaSolver.py index 1544bee..2a184ff 100644 --- a/src/pages/services/CaptchaSolver.py +++ b/src/pages/services/CaptchaSolver.py @@ -11,11 +11,6 @@ import base64 import queue import ddddocr -from selenium.common.exceptions import ( - NoSuchElementException, - TimeoutException, -) - from base.MsgBase import MsgBase from pages.LoginPage import LoginPage @@ -38,6 +33,9 @@ class CaptchaSolver(MsgBase): try: img_src = login_page.getCaptchaImageSrc() + if img_src is None: + self._showTrace("验证码图片元素定位时发生错误 !", self.TraceLevel.ERROR) + return "" base64_str = img_src.split(',', 1)[1] captcha_img = base64.b64decode(base64_str) captcha_text = self._ocr.classification(captcha_img) @@ -45,15 +43,9 @@ class CaptchaSolver(MsgBase): self._showTrace(f"识别到验证码为 : '{captcha_text}'", 20, no_log=True) if len(captcha_text) != 4: self._showLog("识别到的验证码长度不等于 4 个字符 !", self.TraceLevel.WARNING) - raise Exception("识别到的验证码长度不等于 4 个字符 !") + return "" return captcha_text - except (NoSuchElementException, TimeoutException) as e: - self._showTrace(f"验证码识别失败 ! : {e}", self.TraceLevel.ERROR) - return "" - except (ValueError, OSError) as e: - self._showTrace(f"验证码识别失败 ! : {e}", self.TraceLevel.ERROR) - return "" - except Exception as e: + except ValueError as e: self._showTrace(f"验证码识别失败 ! : {e}", self.TraceLevel.ERROR) return "" @@ -61,20 +53,13 @@ class CaptchaSolver(MsgBase): self, ) -> str: - try: - self._showMsg("请输入验证码:") - captcha_text = self._waitMsg(timeout=15) - self._showTrace(f"输入的验证码为 : '{captcha_text}'", 20, no_log=True) - if len(captcha_text) != 4: - self._showLog("输入的验证码长度不等于 4 个字符 !", self.TraceLevel.WARNING) - raise Exception("输入的验证码长度不等于 4 个字符 !") - return captcha_text - except ValueError as e: - self._showTrace(f"输入验证码失败 ! : {e}", self.TraceLevel.ERROR) - return "" - except Exception as e: - self._showTrace(f"输入验证码失败 ! : {e}", self.TraceLevel.ERROR) + self._showMsg("请输入验证码:") + captcha_text = self._waitMsg(timeout=15) + self._showTrace(f"输入的验证码为 : '{captcha_text}'", 20, no_log=True) + if len(captcha_text) != 4: + self._showLog("输入的验证码长度不等于 4 个字符 !", self.TraceLevel.WARNING) return "" + return captcha_text def solveCaptcha( self, diff --git a/src/pages/services/RecordChecker.py b/src/pages/services/RecordChecker.py index c7cef7f..7151f0b 100644 --- a/src/pages/services/RecordChecker.py +++ b/src/pages/services/RecordChecker.py @@ -112,20 +112,21 @@ class RecordChecker(MsgBase): try: time_element = records_view.getRecordTimeElement(reservation) info_elements = records_view.getRecordInfoElements(reservation) - except (NoSuchElementException, TimeoutException, StaleElementReferenceException): + except (NoSuchElementException, StaleElementReferenceException): return { "date": "", "time": {"begin": "", "end": ""}, "info": {"location": "", "status": ""}, } - except Exception: + try: + time_data = self._decodeReserveTime(time_element) + info_data = self._decodeReserveInfo(info_elements) + except StaleElementReferenceException: return { "date": "", "time": {"begin": "", "end": ""}, "info": {"location": "", "status": ""}, } - time_data = self._decodeReserveTime(time_element) - info_data = self._decodeReserveInfo(info_elements) return { "date": time_data["date"], "time": time_data["time"], @@ -152,7 +153,10 @@ class RecordChecker(MsgBase): records_view = shell.gotoRecordsView() for _ in range(max_check_times): - reservations = records_view.loadRecords() + try: + reservations = records_view.loadRecords() + except TimeoutException: + reservations = None if reservations is None: return None for reservation in reservations[checked_count:]: diff --git a/src/pages/services/ReserveChecker.py b/src/pages/services/ReserveChecker.py index 9be86e2..3d06acd 100644 --- a/src/pages/services/ReserveChecker.py +++ b/src/pages/services/ReserveChecker.py @@ -88,11 +88,22 @@ class ReserveChecker(MsgBase): ) -> bool: cur_time = time.strftime("%H:%M", time.localtime()) + cur_date = time.strftime("%Y-%m-%d", time.localtime()) if reserve_info.get("begin_time") is None: reserve_info["begin_time"] = {} if "time" not in reserve_info["begin_time"]: reserve_info["begin_time"]["time"] = cur_time self._showTrace(f"开始时间未指定, 自动设置为当前时间: {cur_time}") + elif reserve_info.get("date") == cur_date: + begin_mins = timeStrToMins(reserve_info["begin_time"]["time"]) + cur_mins = timeStrToMins(cur_time) + if begin_mins < cur_mins: + self._showTrace( + f"开始时间 {reserve_info['begin_time']['time']} 已过当前时间 {cur_time}, " + f"自动调整为当前时间", + self.TraceLevel.WARNING, + ) + reserve_info["begin_time"]["time"] = cur_time if "max_diff" not in reserve_info["begin_time"]: reserve_info["begin_time"]["max_diff"] = 30 self._showTrace("开始时间最大时间差未指定, 自动设置为 30 分钟")