重构登录,减少报错
This commit is contained in:
parent
63588e4f27
commit
ac960fae29
@ -11,18 +11,6 @@ from src.entity.database import db
|
|||||||
from src.ui import global_signals
|
from src.ui import global_signals
|
||||||
|
|
||||||
|
|
||||||
def handle_request(request, result_container, response_container):
|
|
||||||
if 'loginFlow' in request.url:
|
|
||||||
response = request.response()
|
|
||||||
if response:
|
|
||||||
data = response.json()
|
|
||||||
response_container['data'] = data
|
|
||||||
if 'banner' in request.url:
|
|
||||||
headers = request.headers
|
|
||||||
result_container['headers'] = headers
|
|
||||||
logger.info(f'Successfully got headers: {headers}')
|
|
||||||
|
|
||||||
|
|
||||||
def playwright_login(account: Account) -> dict:
|
def playwright_login(account: Account) -> dict:
|
||||||
result_container = {'headers': {}}
|
result_container = {'headers': {}}
|
||||||
response_container = {'data': {}}
|
response_container = {'data': {}}
|
||||||
@ -34,6 +22,7 @@ def playwright_login(account: Account) -> dict:
|
|||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f'Error during login for account {account.username}: {e}', exc_info=True)
|
logger.error(f'Error during login for account {account.username}: {e}', exc_info=True)
|
||||||
handle_login_failure(account)
|
handle_login_failure(account)
|
||||||
|
return {}
|
||||||
|
|
||||||
|
|
||||||
def perform_login(playwright, account: Account, request_container: dict, response_container: dict):
|
def perform_login(playwright, account: Account, request_container: dict, response_container: dict):
|
||||||
@ -41,44 +30,61 @@ def perform_login(playwright, account: Account, request_container: dict, respons
|
|||||||
context = browser.new_context()
|
context = browser.new_context()
|
||||||
page = context.new_page()
|
page = context.new_page()
|
||||||
|
|
||||||
page.on("request", lambda request: handle_request(request, request_container, response_container))
|
page.goto(account.url, timeout=120000)
|
||||||
|
|
||||||
page.goto(account.url, timeout=60000)
|
|
||||||
|
|
||||||
# 填充基本的元素
|
# 填充基本的元素
|
||||||
fill_form_common(page, account)
|
fill_form_common(page, account)
|
||||||
|
|
||||||
if account.type == AccountType.jy:
|
if account.type == AccountType.jy:
|
||||||
handle_jy_captcha(page, account)
|
handle_jy_captcha(page, account)
|
||||||
logger.info("验证码处理成功")
|
|
||||||
time.sleep(3)
|
|
||||||
else:
|
else:
|
||||||
max_retries = 3
|
handle_generic_account(page, response_container)
|
||||||
for attempt in range(max_retries):
|
|
||||||
if handle_captcha(page):
|
# 处理 'banner' 请求并获取响应头
|
||||||
page.locator("div").filter(has_text=re.compile(r"^登录$")).get_by_role("button").click()
|
handle_banner_request(page, request_container)
|
||||||
time.sleep(2)
|
|
||||||
try:
|
# 仅当 headers 不为空时才保存到数据库中
|
||||||
if response_container['data'] and response_container['data'].get('status_code') != 6000:
|
if request_container['headers']:
|
||||||
logger.warning(f"登录发生错误, {response_container['data'].get('message', '未知错误')}")
|
persistence(account, request_container['headers'])
|
||||||
close_button = page.locator("button.ant-modal-close")
|
global_signals.user_data_updated.emit()
|
||||||
close_button.wait_for()
|
|
||||||
close_button.click()
|
|
||||||
else:
|
|
||||||
break
|
|
||||||
except TimeoutError:
|
|
||||||
logger.warning(f"等待响应超时,重试 {attempt + 1}/{max_retries}")
|
|
||||||
else:
|
|
||||||
logger.warning(f"验证码输入失败,重试 {attempt + 1}/{max_retries}")
|
|
||||||
else:
|
|
||||||
logger.warning("登录失败,达到最大重试次数")
|
|
||||||
persistence(account, response_container['data'])
|
|
||||||
# 通知app数据更新了
|
|
||||||
global_signals.user_data_updated.emit()
|
|
||||||
page.wait_for_url(f'{account.url}/app/home?showWelcome=false')
|
|
||||||
close_resources(page, context, browser)
|
close_resources(page, context, browser)
|
||||||
|
|
||||||
|
|
||||||
|
def handle_generic_account(page, response_container):
|
||||||
|
max_retries = 3
|
||||||
|
for attempt in range(max_retries):
|
||||||
|
if handle_captcha(page):
|
||||||
|
with page.expect_request(lambda request: 'loginFlow' in request.url, timeout=30000):
|
||||||
|
page.locator("div").filter(has_text=re.compile(r"^登录$")).get_by_role("button").click()
|
||||||
|
|
||||||
|
# 等待 loginFlow 请求的响应
|
||||||
|
with page.expect_response(lambda response: 'loginFlow' in response.url, timeout=30000) as response_info:
|
||||||
|
response = response_info.value
|
||||||
|
data = response.json()
|
||||||
|
response_container['data'] = data
|
||||||
|
if response_container['data'] and response_container['data'].get('status_code') != 6000:
|
||||||
|
logger.warning(f"登录发生错误, {response_container['data'].get('message', '未知错误')}")
|
||||||
|
close_button = page.locator("button.ant-modal-close")
|
||||||
|
close_button.wait_for()
|
||||||
|
close_button.click()
|
||||||
|
else:
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
logger.warning("登录失败,达到最大重试次数")
|
||||||
|
|
||||||
|
|
||||||
|
def handle_banner_request(page, request_container):
|
||||||
|
with page.expect_request(lambda request: 'banner' in request.url, timeout=30000) as request_info:
|
||||||
|
banner_request = request_info.value
|
||||||
|
|
||||||
|
with page.expect_response(lambda response: 'banner' in response.url, timeout=30000) as response_info:
|
||||||
|
banner_response = response_info.value
|
||||||
|
headers = banner_request.headers
|
||||||
|
request_container['headers'] = headers
|
||||||
|
logger.info(f'Successfully got headers: {headers}')
|
||||||
|
|
||||||
|
|
||||||
def fill_form_common(page, account: Account):
|
def fill_form_common(page, account: Account):
|
||||||
username_input = page.get_by_placeholder('用户名')
|
username_input = page.get_by_placeholder('用户名')
|
||||||
password_input = page.get_by_placeholder('密码')
|
password_input = page.get_by_placeholder('密码')
|
||||||
@ -167,7 +173,7 @@ def login(account: Account):
|
|||||||
account.headers = headers
|
account.headers = headers
|
||||||
return account
|
return account
|
||||||
else:
|
else:
|
||||||
pass
|
return account
|
||||||
|
|
||||||
|
|
||||||
def persistence(account: Account, headers: dict):
|
def persistence(account: Account, headers: dict):
|
||||||
|
Loading…
Reference in New Issue
Block a user