From fd2c38fa7f158cc74c6a81165d03108501123927 Mon Sep 17 00:00:00 2001 From: Your Name Date: Fri, 7 Nov 2025 00:29:03 +0800 Subject: [PATCH] =?UTF-8?q?=E7=99=BB=E5=BD=95=E5=A2=9E=E5=8A=A0=E5=88=87?= =?UTF-8?q?=E6=8D=A2=E4=BB=A3=E7=90=86=E9=87=8D=E8=AF=95=EF=BC=8C=E6=9C=89?= =?UTF-8?q?=E4=BA=9B=E4=BB=A3=E7=90=86=E4=BC=9A=E6=98=BE=E7=A4=BA=E8=B4=A6?= =?UTF-8?q?=E5=8F=B7=E6=88=96=E5=AF=86=E7=A0=81=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- spider/task.py | 129 +++++++++++++++++++++++++++---------------------- 1 file changed, 72 insertions(+), 57 deletions(-) diff --git a/spider/task.py b/spider/task.py index 8c32f41..66ce642 100644 --- a/spider/task.py +++ b/spider/task.py @@ -918,69 +918,84 @@ def playwright_m_login(username, password, code_2fa=None): with lock: with sync_playwright() as playwright: update_windows_distinguish() - proxy_url = ProxyChecker(timeout=8).get_valid_proxy_url() - if proxy_url is None: - raise OperationFailed("获取代理失败") - logger.info(f"使用proxy={proxy_url}") + max_proxy_retries = 3 + proxy_retry_count = 0 + while proxy_retry_count < max_proxy_retries: + proxy_url = ProxyChecker(timeout=8).get_valid_proxy_url() + if proxy_url is None: + raise OperationFailed("获取代理失败") + logger.info(f"使用proxy={proxy_url}") - browser = playwright.chromium.launch( - headless=const.HEADLESS, args=['--start-maximized'], executable_path=path, proxy={ - "server": proxy_url, - } - ) - # random_user_agent = UserAgent().getBrowser(["Chrome Mobile iOS"]).get("useragent") - random_user_agent = "Mozilla/5.0 (Linux; Android 12; Pixel 6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.41 Mobile Safari/537.36" - logger.info(f"使用ua={random_user_agent}") - context = browser.new_context(no_viewport=True, user_agent=random_user_agent) - # 设置语言为英文 - context.add_cookies([ - { - "name": "locale", - "value": "en_US", - "domain": ".facebook.com", - "path": "/", - "expires": -1, - "httpOnly": True, - "secure": False, - }, - ]) - page = context.new_page() - url = 'https://m.facebook.com/login' - retry_goto(page, url) - # 概率会跳到首页 - have_account = 'div[role="button"][aria-label="I already have an account"]' - # 用户名输入框框 - input_email = "input#m_login_email" + browser = playwright.chromium.launch( + headless=const.HEADLESS, args=['--start-maximized'], executable_path=path, proxy={ + "server": proxy_url, + } + ) + # random_user_agent = UserAgent().getBrowser(["Chrome Mobile iOS"]).get("useragent") + random_user_agent = "Mozilla/5.0 (Linux; Android 12; Pixel 6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.41 Mobile Safari/537.36" + logger.info(f"使用ua={random_user_agent}") + context = browser.new_context(no_viewport=True, user_agent=random_user_agent) + # 设置语言为英文 + context.add_cookies([ + { + "name": "locale", + "value": "en_US", + "domain": ".facebook.com", + "path": "/", + "expires": -1, + "httpOnly": True, + "secure": False, + }, + ]) + page = context.new_page() + url = 'https://m.facebook.com/login' + retry_goto(page, url) + # 概率会跳到首页 + have_account = 'div[role="button"][aria-label="I already have an account"]' + # 用户名输入框框 + input_email = "input#m_login_email" - try: - page.wait_for_selector(f'{have_account}, {input_email}', timeout=60000) - except Exception as e: - logger.error(f"页面加载异常, 未定位到按钮", exc_info=True) - raise OperationFailed("系统异常") + try: + page.wait_for_selector(f'{have_account}, {input_email}', timeout=60000) + except Exception as e: + logger.error(f"页面加载异常, 未定位到按钮", exc_info=True) + raise OperationFailed("系统异常") - hava_account_btn = page.query_selector(have_account) - if hava_account_btn: - hava_account_btn.click() + hava_account_btn = page.query_selector(have_account) + if hava_account_btn: + hava_account_btn.click() - page.wait_for_selector(f'{input_email}', timeout=60000).type(username, delay=30) - time.sleep(1) - page.wait_for_selector(f'//input[@id="m_login_password"]', timeout=60000).type(password, delay=30) - page.click('div[aria-label="Log in"]') + page.wait_for_selector(f'{input_email}', timeout=60000).type(username, delay=30) + time.sleep(1) + page.wait_for_selector(f'//input[@id="m_login_password"]', timeout=60000).type(password, delay=30) + page.click('div[aria-label="Log in"]') - success_login_selector1 = 'span:has-text("Check your notifications on another device")' - success_login_selector2 = 'span:has-text("Go to your authentication app")' - failed_login_selector = 'div[data-bloks-name="bk.components.dialog.Dialog"] > div[aria-label="Wrong Credentials"] > div:nth-child(1)' - # 等成功或失败 - page.wait_for_selector(f'{success_login_selector1},{success_login_selector2},{failed_login_selector}', - timeout=60000) + success_login_selector1 = 'span:has-text("Check your notifications on another device")' + success_login_selector2 = 'span:has-text("Go to your authentication app")' + failed_login_selector = 'div[data-bloks-name="bk.components.dialog.Dialog"] > div[aria-label="Wrong Credentials"] > div:nth-child(1)' + # 等成功或失败 + page.wait_for_selector(f'{success_login_selector1},{success_login_selector2},{failed_login_selector}', + timeout=60000) - # 判断是否失败 - failed_login = page.query_selector(failed_login_selector) - if failed_login: - # 登录失败, 返回失败信息 - page.screenshot(path=f'./log/screenshot/{username}_{time.strftime("%Y-%m-%d%H-%M-%S", time.localtime())}_login_failed.png') - logger.info(f"用户名:{username} 密码错误 {failed_login.text_content()}") - raise OperationFailed(failed_login.text_content()) + # 判断是否失败 + failed_login = page.query_selector(failed_login_selector) + if failed_login: + # 登录失败, 返回失败信息 + page.screenshot( + path=f'./log/screenshot/{username}_{time.strftime("%Y-%m-%d%H-%M-%S", time.localtime())}_login_failed.png') + logger.info(f"用户名:{username} 密码错误 {failed_login.text_content()}") + # 关闭当前浏览器 + browser.close() + proxy_retry_count += 1 + logger.info(f"代理重试 {proxy_retry_count}/{max_proxy_retries}") + + if proxy_retry_count < max_proxy_retries: + time.sleep(3) # 等待一下再重试 + continue + else: + browser.close() + raise OperationFailed(failed_login.text_content()) + break # 退出代理重试循环 # 判断是否有多重验证 success_login1 = page.query_selector(success_login_selector1)