# 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("登录成功!")