123 lines
4.6 KiB
Python
123 lines
4.6 KiB
Python
# file: tool/aiqicha_login.py
|
||
|
||
from tool.web_browser import WebBrowser
|
||
import time
|
||
|
||
|
||
class AiqichaLoginManager:
|
||
def __init__(self, browser: WebBrowser):
|
||
self.browser = browser
|
||
|
||
def check_and_login(self):
|
||
"""启动后检测登录状态并自动登录"""
|
||
if not self.browser.load_cookies():
|
||
print("未找到有效Cookie,开始登录流程...")
|
||
return self.login()
|
||
else:
|
||
print("已加载Cookie,验证登录状态...")
|
||
# 加载cookie后访问页面验证是否真正登录
|
||
self.browser.page.goto("https://aiqicha.baidu.com")
|
||
# 等待页面加载完成
|
||
self.browser.page.wait_for_load_state("networkidle")
|
||
|
||
# 验证登录状态
|
||
if not self.check_login_status():
|
||
print("Cookie已过期或无效,重新登录...")
|
||
return self.login()
|
||
else:
|
||
print("Cookie有效,已登录")
|
||
return True
|
||
|
||
def check_login_status(self):
|
||
"""检测登录状态,返回True表示已登录"""
|
||
try:
|
||
# 先关闭可能的功能上新弹窗
|
||
self.close_feature_popup()
|
||
|
||
# 等待页面加载完成
|
||
self.browser.page.wait_for_load_state("networkidle")
|
||
|
||
# 优先检查 .header-user-center-menu 元素判断是否已登录
|
||
logged_in_elements = self.browser.page.query_selector_all('.header-user-center-menu, .user-center')
|
||
for element in logged_in_elements:
|
||
if element and element.is_visible():
|
||
print("检测到已登录状态")
|
||
return True
|
||
|
||
# 检测用户中心元素判断已登录
|
||
user_center = self.browser.page.query_selector('.user-center')
|
||
if user_center and user_center.is_visible():
|
||
print("检测到已登录状态")
|
||
return True
|
||
|
||
# 检测登录相关元素
|
||
login_element = self.browser.page.query_selector('.login')
|
||
if login_element and login_element.is_visible():
|
||
print("检测到未登录状态")
|
||
return False
|
||
except:
|
||
try:
|
||
# 检测用户中心元素判断已登录
|
||
self.browser.page.wait_for_selector('.user-center', timeout=3000)
|
||
print("检测到已登录状态")
|
||
return True
|
||
except:
|
||
print("登录状态检测异常")
|
||
return False
|
||
|
||
def close_feature_popup(self):
|
||
"""关闭功能上新弹窗"""
|
||
try:
|
||
# 查找并点击关闭按钮
|
||
close_buttons = self.browser.page.query_selector_all('.close-icon.ivu-icon-ios-close')
|
||
for close_button in close_buttons:
|
||
if close_button.is_visible():
|
||
close_button.click()
|
||
print("已关闭功能上新弹窗")
|
||
# 等待弹窗消失
|
||
time.sleep(1)
|
||
break
|
||
except Exception as e:
|
||
# 如果没有找到弹窗,继续执行
|
||
pass
|
||
|
||
def login(self):
|
||
"""带状态检测的登录流程"""
|
||
self.browser.page.goto("https://aiqicha.baidu.com")
|
||
# 页面加载后执行反检测
|
||
self.browser.page.evaluate("""
|
||
delete navigator.__proto__.webdriver;
|
||
""")
|
||
|
||
# 等待页面加载完成
|
||
self.browser.page.wait_for_load_state("networkidle")
|
||
|
||
# 关闭可能的功能上新弹窗
|
||
self.close_feature_popup()
|
||
|
||
if not self.check_login_status():
|
||
print("开始执行登录流程...")
|
||
# 点击登录按钮
|
||
login_btn = self.browser.page.wait_for_selector('.login', timeout=20000)
|
||
login_btn.click()
|
||
print("请扫描页面二维码登录...")
|
||
time.sleep(3) # 给一些时间让二维码完全加载
|
||
|
||
# 等待登录完成,通过元素检测
|
||
try:
|
||
# 检测用户中心元素判断已登录
|
||
self.page.wait_for_selector('.header-user-center-menu', timeout=30000)
|
||
self.browser.save_cookies()
|
||
print("检测到已登录状态")
|
||
return True
|
||
except:
|
||
self.browser.save_cookies()
|
||
print("登录状态检测异常")
|
||
return False
|
||
## self.browser.page.wait_for_selector('.header-user-center-menu, .user-center', timeout=10000)
|
||
|
||
return True
|
||
|
||
if __name__ == '__main__':
|
||
print("登录成功!")
|