chore: настроен обход антибот защиты

This commit is contained in:
protokey committed 2026-09-21 19:33:49 +04:00
1 parent 4cc068a616
commit 1cfd9bafef
6 files changed
+118 -66

No files matched your search

+24 -17
View File
@@ -1,3 +1,4 @@
import json
import logging
from playwright.async_api import Page
@@ -23,13 +24,14 @@ class ReCaptchaSolver(Solver):
async def solve(self, page: Page, info: ChallengeInfo):
log.debug("Начинаю решение recaptcha антибот преграды")
if info.stage == Stage.INTERSTITIAL:
# TODO: вытащить
await page.wait_for_timeout(15)
return
elif info.stage == Stage.CHECKBOX:
log.debug("Нужно тыкнуть чекбокс")
checkbox_selector = "#recaptcha-anchor"
element = page.frame_locator("iframe[title='reCAPTCHA']").locator(checkbox_selector)
interactive_marker_selector = "xpath=//div[@class='g-recaptcha-bubble-arrow'][1]"
interactive_marker_selector = "//div[@class='g-recaptcha-bubble-arrow']/..//iframe"
challenge_locator = page.locator(interactive_marker_selector)
result = await click_and_race(page, element, challenge_locator)
log.debug(f"Ожидание завершено: {result}")
@@ -48,24 +50,29 @@ class ReCaptchaSolver(Solver):
log.debug("Капча решена. Возбуждаем JS")
try:
async with page.expect_navigation(wait_until='load'):
await page.evaluate("""
try {
const clients = window.___grecaptcha_cfg && window.___grecaptcha_cfg.clients;
for (const cid in clients) {
for (const key in clients[cid]) {
const obj = clients[cid][key];
for (const prop in obj) {
const cb = obj[prop] && obj[prop].callback;
if (typeof cb === 'function') { cb(token); return; }
if (typeof cb === 'string' && typeof window[cb] === 'function') {
window[cb](token); return;
}
}
}
}
} catch (e) {}""", token)
js = """(token) => {
const clients = window.___grecaptcha_cfg && window.___grecaptcha_cfg.clients;
if (!clients) return false;
for (const cid in clients) {
for (const key in clients[cid]) {
const obj = clients[cid][key];
for (const prop in obj) {
const cb = obj[prop] && obj[prop].callback;
if (typeof cb === 'function') { cb(token); return true; }
if (typeof cb === 'string' && typeof window[cb] === 'function') {
window[cb](token); return true;
}
}
}
}
return false;
}"""
found = await page.evaluate(f"mw:({js})({json.dumps(token)})")
assert found, "Recaptcha callback function not found"
except Exception as e:
log.warning("JS navigation error", exc_info=True)
else:
self.captcha_solver.recaptcha._clear_cache()
log.debug("Все готово. Проверяем еще раз.")
return