1
1
mirror of https://github.com/KenanZhu/AutoLibrary.git synced 2026-06-17 23:13:03 +08:00

fix(services): 修复验证码识别逻辑、预约时间校验与异常处理结构

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-05-28 01:36:28 +08:00
parent df7ad92f7f
commit 2aace40a26
3 changed files with 31 additions and 31 deletions
+11 -26
View File
@@ -11,11 +11,6 @@ import base64
import queue import queue
import ddddocr import ddddocr
from selenium.common.exceptions import (
NoSuchElementException,
TimeoutException,
)
from base.MsgBase import MsgBase from base.MsgBase import MsgBase
from pages.LoginPage import LoginPage from pages.LoginPage import LoginPage
@@ -38,6 +33,9 @@ class CaptchaSolver(MsgBase):
try: try:
img_src = login_page.getCaptchaImageSrc() img_src = login_page.getCaptchaImageSrc()
if img_src is None:
self._showTrace("验证码图片元素定位时发生错误 !", self.TraceLevel.ERROR)
return ""
base64_str = img_src.split(',', 1)[1] base64_str = img_src.split(',', 1)[1]
captcha_img = base64.b64decode(base64_str) captcha_img = base64.b64decode(base64_str)
captcha_text = self._ocr.classification(captcha_img) captcha_text = self._ocr.classification(captcha_img)
@@ -45,15 +43,9 @@ class CaptchaSolver(MsgBase):
self._showTrace(f"识别到验证码为 : '{captcha_text}'", 20, no_log=True) self._showTrace(f"识别到验证码为 : '{captcha_text}'", 20, no_log=True)
if len(captcha_text) != 4: if len(captcha_text) != 4:
self._showLog("识别到的验证码长度不等于 4 个字符 !", self.TraceLevel.WARNING) self._showLog("识别到的验证码长度不等于 4 个字符 !", self.TraceLevel.WARNING)
raise Exception("识别到的验证码长度不等于 4 个字符 !") return ""
return captcha_text return captcha_text
except (NoSuchElementException, TimeoutException) as e: except ValueError 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:
self._showTrace(f"验证码识别失败 ! : {e}", self.TraceLevel.ERROR) self._showTrace(f"验证码识别失败 ! : {e}", self.TraceLevel.ERROR)
return "" return ""
@@ -61,20 +53,13 @@ class CaptchaSolver(MsgBase):
self, self,
) -> str: ) -> str:
try: self._showMsg("请输入验证码:")
self._showMsg("请输入验证码:") captcha_text = self._waitMsg(timeout=15)
captcha_text = self._waitMsg(timeout=15) self._showTrace(f"输入的验证码为 : '{captcha_text}'", 20, no_log=True)
self._showTrace(f"输入的验证码为 : '{captcha_text}'", 20, no_log=True) if len(captcha_text) != 4:
if len(captcha_text) != 4: self._showLog("输入的验证码长度不等于 4 个字符 !", self.TraceLevel.WARNING)
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)
return "" return ""
return captcha_text
def solveCaptcha( def solveCaptcha(
self, self,
+9 -5
View File
@@ -112,20 +112,21 @@ class RecordChecker(MsgBase):
try: try:
time_element = records_view.getRecordTimeElement(reservation) time_element = records_view.getRecordTimeElement(reservation)
info_elements = records_view.getRecordInfoElements(reservation) info_elements = records_view.getRecordInfoElements(reservation)
except (NoSuchElementException, TimeoutException, StaleElementReferenceException): except (NoSuchElementException, StaleElementReferenceException):
return { return {
"date": "", "date": "",
"time": {"begin": "", "end": ""}, "time": {"begin": "", "end": ""},
"info": {"location": "", "status": ""}, "info": {"location": "", "status": ""},
} }
except Exception: try:
time_data = self._decodeReserveTime(time_element)
info_data = self._decodeReserveInfo(info_elements)
except StaleElementReferenceException:
return { return {
"date": "", "date": "",
"time": {"begin": "", "end": ""}, "time": {"begin": "", "end": ""},
"info": {"location": "", "status": ""}, "info": {"location": "", "status": ""},
} }
time_data = self._decodeReserveTime(time_element)
info_data = self._decodeReserveInfo(info_elements)
return { return {
"date": time_data["date"], "date": time_data["date"],
"time": time_data["time"], "time": time_data["time"],
@@ -152,7 +153,10 @@ class RecordChecker(MsgBase):
records_view = shell.gotoRecordsView() records_view = shell.gotoRecordsView()
for _ in range(max_check_times): for _ in range(max_check_times):
reservations = records_view.loadRecords() try:
reservations = records_view.loadRecords()
except TimeoutException:
reservations = None
if reservations is None: if reservations is None:
return None return None
for reservation in reservations[checked_count:]: for reservation in reservations[checked_count:]:
+11
View File
@@ -88,11 +88,22 @@ class ReserveChecker(MsgBase):
) -> bool: ) -> bool:
cur_time = time.strftime("%H:%M", time.localtime()) 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: if reserve_info.get("begin_time") is None:
reserve_info["begin_time"] = {} reserve_info["begin_time"] = {}
if "time" not in reserve_info["begin_time"]: if "time" not in reserve_info["begin_time"]:
reserve_info["begin_time"]["time"] = cur_time reserve_info["begin_time"]["time"] = cur_time
self._showTrace(f"开始时间未指定, 自动设置为当前时间: {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"]: if "max_diff" not in reserve_info["begin_time"]:
reserve_info["begin_time"]["max_diff"] = 30 reserve_info["begin_time"]["max_diff"] = 30
self._showTrace("开始时间最大时间差未指定, 自动设置为 30 分钟") self._showTrace("开始时间最大时间差未指定, 自动设置为 30 分钟")