登录增加切换代理重试,有些代理会显示账号或密码错误
This commit is contained in:
129
spider/task.py
129
spider/task.py
@@ -918,69 +918,84 @@ def playwright_m_login(username, password, code_2fa=None):
|
|||||||
with lock:
|
with lock:
|
||||||
with sync_playwright() as playwright:
|
with sync_playwright() as playwright:
|
||||||
update_windows_distinguish()
|
update_windows_distinguish()
|
||||||
proxy_url = ProxyChecker(timeout=8).get_valid_proxy_url()
|
max_proxy_retries = 3
|
||||||
if proxy_url is None:
|
proxy_retry_count = 0
|
||||||
raise OperationFailed("获取代理失败")
|
while proxy_retry_count < max_proxy_retries:
|
||||||
logger.info(f"使用proxy={proxy_url}")
|
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(
|
browser = playwright.chromium.launch(
|
||||||
headless=const.HEADLESS, args=['--start-maximized'], executable_path=path, proxy={
|
headless=const.HEADLESS, args=['--start-maximized'], executable_path=path, proxy={
|
||||||
"server": proxy_url,
|
"server": proxy_url,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
# random_user_agent = UserAgent().getBrowser(["Chrome Mobile iOS"]).get("useragent")
|
# 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"
|
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}")
|
logger.info(f"使用ua={random_user_agent}")
|
||||||
context = browser.new_context(no_viewport=True, user_agent=random_user_agent)
|
context = browser.new_context(no_viewport=True, user_agent=random_user_agent)
|
||||||
# 设置语言为英文
|
# 设置语言为英文
|
||||||
context.add_cookies([
|
context.add_cookies([
|
||||||
{
|
{
|
||||||
"name": "locale",
|
"name": "locale",
|
||||||
"value": "en_US",
|
"value": "en_US",
|
||||||
"domain": ".facebook.com",
|
"domain": ".facebook.com",
|
||||||
"path": "/",
|
"path": "/",
|
||||||
"expires": -1,
|
"expires": -1,
|
||||||
"httpOnly": True,
|
"httpOnly": True,
|
||||||
"secure": False,
|
"secure": False,
|
||||||
},
|
},
|
||||||
])
|
])
|
||||||
page = context.new_page()
|
page = context.new_page()
|
||||||
url = 'https://m.facebook.com/login'
|
url = 'https://m.facebook.com/login'
|
||||||
retry_goto(page, url)
|
retry_goto(page, url)
|
||||||
# 概率会跳到首页
|
# 概率会跳到首页
|
||||||
have_account = 'div[role="button"][aria-label="I already have an account"]'
|
have_account = 'div[role="button"][aria-label="I already have an account"]'
|
||||||
# 用户名输入框框
|
# 用户名输入框框
|
||||||
input_email = "input#m_login_email"
|
input_email = "input#m_login_email"
|
||||||
|
|
||||||
try:
|
try:
|
||||||
page.wait_for_selector(f'{have_account}, {input_email}', timeout=60000)
|
page.wait_for_selector(f'{have_account}, {input_email}', timeout=60000)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f"页面加载异常, 未定位到按钮", exc_info=True)
|
logger.error(f"页面加载异常, 未定位到按钮", exc_info=True)
|
||||||
raise OperationFailed("系统异常")
|
raise OperationFailed("系统异常")
|
||||||
|
|
||||||
hava_account_btn = page.query_selector(have_account)
|
hava_account_btn = page.query_selector(have_account)
|
||||||
if hava_account_btn:
|
if hava_account_btn:
|
||||||
hava_account_btn.click()
|
hava_account_btn.click()
|
||||||
|
|
||||||
page.wait_for_selector(f'{input_email}', timeout=60000).type(username, delay=30)
|
page.wait_for_selector(f'{input_email}', timeout=60000).type(username, delay=30)
|
||||||
time.sleep(1)
|
time.sleep(1)
|
||||||
page.wait_for_selector(f'//input[@id="m_login_password"]', timeout=60000).type(password, delay=30)
|
page.wait_for_selector(f'//input[@id="m_login_password"]', timeout=60000).type(password, delay=30)
|
||||||
page.click('div[aria-label="Log in"]')
|
page.click('div[aria-label="Log in"]')
|
||||||
|
|
||||||
success_login_selector1 = 'span:has-text("Check your notifications on another device")'
|
success_login_selector1 = 'span:has-text("Check your notifications on another device")'
|
||||||
success_login_selector2 = 'span:has-text("Go to your authentication app")'
|
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)'
|
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}',
|
page.wait_for_selector(f'{success_login_selector1},{success_login_selector2},{failed_login_selector}',
|
||||||
timeout=60000)
|
timeout=60000)
|
||||||
|
|
||||||
# 判断是否失败
|
# 判断是否失败
|
||||||
failed_login = page.query_selector(failed_login_selector)
|
failed_login = page.query_selector(failed_login_selector)
|
||||||
if failed_login:
|
if failed_login:
|
||||||
# 登录失败, 返回失败信息
|
# 登录失败, 返回失败信息
|
||||||
page.screenshot(path=f'./log/screenshot/{username}_{time.strftime("%Y-%m-%d%H-%M-%S", time.localtime())}_login_failed.png')
|
page.screenshot(
|
||||||
logger.info(f"用户名:{username} 密码错误 {failed_login.text_content()}")
|
path=f'./log/screenshot/{username}_{time.strftime("%Y-%m-%d%H-%M-%S", time.localtime())}_login_failed.png')
|
||||||
raise OperationFailed(failed_login.text_content())
|
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)
|
success_login1 = page.query_selector(success_login_selector1)
|
||||||
|
|||||||
Reference in New Issue
Block a user