feat: Install Python dependencies into virtual environment and add get_code.py script.
This commit is contained in:
@@ -3025,6 +3025,102 @@ def perform_s2a_authorization(page, email: str, password: str) -> bool:
|
|||||||
|
|
||||||
log_current_url(page, "S2A-密码步骤完成后")
|
log_current_url(page, "S2A-密码步骤完成后")
|
||||||
|
|
||||||
|
# 检查是否需要邮箱验证码
|
||||||
|
time.sleep(1)
|
||||||
|
current_url = page.url
|
||||||
|
if "/email-verification" in current_url:
|
||||||
|
log.step("检测到邮箱验证码页面,开始获取验证码...")
|
||||||
|
progress_update(phase="授权", step="等待验证码...")
|
||||||
|
|
||||||
|
# 获取验证码
|
||||||
|
verification_code, error, email_time = unified_get_verification_code(email)
|
||||||
|
|
||||||
|
if not verification_code:
|
||||||
|
log.warning(f"自动获取验证码失败: {error}")
|
||||||
|
verification_code = input(" ⚠️ 请手动输入验证码: ").strip()
|
||||||
|
|
||||||
|
if not verification_code:
|
||||||
|
log.error("S2A 无法获取邮箱验证码")
|
||||||
|
return False
|
||||||
|
|
||||||
|
# 验证码重试循环 (最多重试 3 次)
|
||||||
|
max_code_retries = 3
|
||||||
|
for code_attempt in range(max_code_retries):
|
||||||
|
log.step(f"输入验证码: {verification_code}")
|
||||||
|
|
||||||
|
# 查找验证码输入框
|
||||||
|
code_input = wait_for_element(page, 'css:input[name="code"]', timeout=10)
|
||||||
|
if not code_input:
|
||||||
|
code_input = wait_for_element(page, 'css:input[autocomplete="one-time-code"]', timeout=5)
|
||||||
|
if not code_input:
|
||||||
|
code_input = wait_for_element(page, 'css:input[inputmode="numeric"]', timeout=5)
|
||||||
|
|
||||||
|
if not code_input:
|
||||||
|
log.error("S2A 无法找到验证码输入框")
|
||||||
|
return False
|
||||||
|
|
||||||
|
# 清空并输入验证码
|
||||||
|
try:
|
||||||
|
code_input.clear()
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
type_slowly(page, 'css:input[name="code"], input[autocomplete="one-time-code"], input[inputmode="numeric"]', verification_code, base_delay=0.08)
|
||||||
|
time.sleep(0.5)
|
||||||
|
|
||||||
|
# 点击继续
|
||||||
|
log.step("点击继续...")
|
||||||
|
continue_btn = wait_for_element(page, 'css:button[type="submit"]', timeout=10)
|
||||||
|
if continue_btn:
|
||||||
|
old_url = page.url
|
||||||
|
continue_btn.click()
|
||||||
|
time.sleep(2)
|
||||||
|
|
||||||
|
# 检查是否出现验证码错误
|
||||||
|
try:
|
||||||
|
error_text = page.ele('text:代码不正确', timeout=1)
|
||||||
|
if not error_text:
|
||||||
|
error_text = page.ele('text:incorrect', timeout=1)
|
||||||
|
if not error_text:
|
||||||
|
error_text = page.ele('text:Invalid code', timeout=1)
|
||||||
|
|
||||||
|
if error_text and error_text.states.is_displayed:
|
||||||
|
if code_attempt < max_code_retries - 1:
|
||||||
|
log.warning(f"S2A 验证码错误,尝试重新获取 ({code_attempt + 1}/{max_code_retries})...")
|
||||||
|
|
||||||
|
# 点击重新发送
|
||||||
|
resend_btn = page.ele('text:重新发送电子邮件', timeout=3)
|
||||||
|
if not resend_btn:
|
||||||
|
resend_btn = page.ele('text:Resend email', timeout=2)
|
||||||
|
if not resend_btn:
|
||||||
|
resend_btn = page.ele('text:resend', timeout=2)
|
||||||
|
|
||||||
|
if resend_btn:
|
||||||
|
resend_btn.click()
|
||||||
|
log.info("已点击重新发送,等待新验证码...")
|
||||||
|
time.sleep(3)
|
||||||
|
|
||||||
|
verification_code, error, email_time = unified_get_verification_code(email)
|
||||||
|
if not verification_code:
|
||||||
|
verification_code = input(" ⚠️ 请手动输入验证码: ").strip()
|
||||||
|
if verification_code:
|
||||||
|
continue
|
||||||
|
log.warning("S2A 无法重新发送验证码")
|
||||||
|
else:
|
||||||
|
log.error("S2A 验证码多次错误,放弃")
|
||||||
|
return False
|
||||||
|
else:
|
||||||
|
# 没有错误,验证码正确
|
||||||
|
break
|
||||||
|
except Exception:
|
||||||
|
# 没有检测到错误元素,说明验证码正确
|
||||||
|
break
|
||||||
|
|
||||||
|
# 等待 URL 变化
|
||||||
|
wait_for_url_change(page, old_url, timeout=5)
|
||||||
|
log_url_change(page, old_url, "S2A-输入验证码后")
|
||||||
|
|
||||||
|
log_current_url(page, "S2A-验证码步骤完成后")
|
||||||
|
|
||||||
# 检查是否在授权确认页面,如果是则点击授权按钮
|
# 检查是否在授权确认页面,如果是则点击授权按钮
|
||||||
time.sleep(1)
|
time.sleep(1)
|
||||||
current_url = page.url
|
current_url = page.url
|
||||||
@@ -3096,6 +3192,52 @@ def perform_s2a_authorization(page, email: str, password: str) -> bool:
|
|||||||
# 检测错误
|
# 检测错误
|
||||||
check_and_handle_error(page)
|
check_and_handle_error(page)
|
||||||
|
|
||||||
|
# 检查是否在邮箱验证码页面 (有几率出现)
|
||||||
|
if "/email-verification" in current_url:
|
||||||
|
if progress_shown:
|
||||||
|
log.progress_clear()
|
||||||
|
progress_shown = False
|
||||||
|
log.step("回调等待中检测到邮箱验证码页面...")
|
||||||
|
progress_update(phase="授权", step="等待验证码...")
|
||||||
|
|
||||||
|
verification_code, error, email_time = unified_get_verification_code(email)
|
||||||
|
if not verification_code:
|
||||||
|
log.warning(f"自动获取验证码失败: {error}")
|
||||||
|
verification_code = input(" ⚠️ 请手动输入验证码: ").strip()
|
||||||
|
if not verification_code:
|
||||||
|
log.error("S2A 无法获取邮箱验证码")
|
||||||
|
return False
|
||||||
|
|
||||||
|
# 查找验证码输入框
|
||||||
|
code_input = wait_for_element(page, 'css:input[name="code"]', timeout=5)
|
||||||
|
if not code_input:
|
||||||
|
code_input = wait_for_element(page, 'css:input[autocomplete="one-time-code"]', timeout=3)
|
||||||
|
if not code_input:
|
||||||
|
code_input = wait_for_element(page, 'css:input[inputmode="numeric"]', timeout=3)
|
||||||
|
|
||||||
|
if code_input:
|
||||||
|
try:
|
||||||
|
code_input.clear()
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
type_slowly(page, 'css:input[name="code"], input[autocomplete="one-time-code"], input[inputmode="numeric"]', verification_code, base_delay=0.08)
|
||||||
|
time.sleep(0.5)
|
||||||
|
|
||||||
|
submit_btn = wait_for_element(page, 'css:button[type="submit"]', timeout=5)
|
||||||
|
if submit_btn:
|
||||||
|
old_url = page.url
|
||||||
|
submit_btn.click()
|
||||||
|
log.step("已提交验证码,等待页面跳转...")
|
||||||
|
wait_for_url_change(page, old_url, timeout=10)
|
||||||
|
log_url_change(page, old_url, "S2A-回调循环中输入验证码后")
|
||||||
|
else:
|
||||||
|
log.warning("S2A 回调循环中未找到验证码输入框")
|
||||||
|
|
||||||
|
# 重置标记,让循环重新检测新页面状态
|
||||||
|
auth_btn_clicked = False
|
||||||
|
error_detected = False
|
||||||
|
continue
|
||||||
|
|
||||||
# 检查是否需要点击 Authorize (只点击一次)
|
# 检查是否需要点击 Authorize (只点击一次)
|
||||||
if not auth_btn_clicked:
|
if not auth_btn_clicked:
|
||||||
try:
|
try:
|
||||||
|
|||||||
Reference in New Issue
Block a user