From bb4438b115d45e9a3296a6067c382e1a0c051d7f Mon Sep 17 00:00:00 2001 From: protokey Date: Mon, 21 Sep 2026 19:47:40 +0400 Subject: [PATCH] =?UTF-8?q?chore:=20=D1=83=D0=BB=D1=83=D1=87=D1=88=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=8B=20?= =?UTF-8?q?=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=D0=B0=20=D0=BE=D1=82=D0=BF=D1=80?= =?UTF-8?q?=D0=B0=D0=B2=D0=BA=D0=B8=20=D0=BA=D0=B0=D0=BF=D1=87=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/antibot/known_providers/recaptcha.py | 51 +++++++++++++----------- 1 file changed, 28 insertions(+), 23 deletions(-) diff --git a/src/antibot/known_providers/recaptcha.py b/src/antibot/known_providers/recaptcha.py index 0c18cf2..62ad0ce 100644 --- a/src/antibot/known_providers/recaptcha.py +++ b/src/antibot/known_providers/recaptcha.py @@ -15,13 +15,38 @@ log.setLevel(logging.DEBUG) log.addHandler(logging.StreamHandler()) +JS_CHALLENGE_SUBMIT = """(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; +}""" + + class ReCaptchaSolver(Solver): + page: Page def __init__(self, captcha_solver: Captcha, **kwargs) -> None: super().__init__(captcha_solver=captcha_solver, **kwargs) self.captcha_solver: Captcha = self._opt["captcha_solver"] + async def form_submit(self, token: str) -> bool: + # noinspection UnnecessaryLabelJS + return await self.page.evaluate(f"mw:({JS_CHALLENGE_SUBMIT})({json.dumps(token)})") + async def solve(self, page: Page, info: ChallengeInfo): + self.page = page log.debug("Начинаю решение recaptcha антибот преграды") if info.stage == Stage.INTERSTITIAL: # TODO: вытащить @@ -48,29 +73,9 @@ class ReCaptchaSolver(Solver): token = await self.captcha_solver.solve(info.detect_locator, page) log.debug("Капча решена. Возбуждаем JS") - try: - async with page.expect_navigation(wait_until='load'): - 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) + async with page.expect_navigation(wait_until='load'): + found = await self.form_submit(token) + assert found, "Recaptcha callback function not found" log.debug("Все готово. Проверяем еще раз.") return