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:
@@ -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,
|
||||||
|
|||||||
@@ -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:]:
|
||||||
|
|||||||
@@ -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 分钟")
|
||||||
|
|||||||
Reference in New Issue
Block a user