chore: добавлена поддержка решения капчи hcaptcha на формах

This commit is contained in:
protokey committed 2026-09-11 22:42:34 +04:00
1 parent 89b4dd2677
commit f5871710ab
9 files changed
+186 -32

No files matched your search

+60
View File
@@ -0,0 +1,60 @@
"""
dl.formRow:nth-child(3) > dd:nth-child(2) > div:nth-child(1)
<div data-xf-init="h-captcha" data-sitekey="83433494-1c9f-446b-85c3-e27b8b7375e1" data-invisible="">
iframe[data-hcaptcha-widget-id="0dm47zf0gn8t"]
textarea[id="g-recaptcha-response-0dm47zf0gn8t"]
textarea[id="h-captcha-response-0dm47zf0gn8t"]
"""
import logging
from .base import Captcha, Page
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
logger.addHandler(logging.StreamHandler())
class SolverHCaptcha(Captcha):
ctype = "hcaptcha"
async def solve(self, selector, page: Page):
div_container = page.locator(selector)
await div_container.wait_for()
if not div_container:
return None
site_key = await div_container.get_attribute("data-sitekey")
is_invisible = bool(await div_container.get_attribute("data-invisible"))
iframe = div_container.locator("iframe:nth-child(1)")
await iframe.wait_for()
textarea_id_postfix = await iframe.get_attribute("data-hcaptcha-widget-id")
textarea_g = await page.query_selector(f"#g-recaptcha-response-{textarea_id_postfix}")
textarea_h = await page.query_selector(f"#h-captcha-response-{textarea_id_postfix}")
code = await self.hcaptcha(page.url, site_key, is_invisible)
await textarea_g.evaluate((
"(el, value) => {"
"el.value = value;"
"el.dispatchEvent(new Event('input', {bubbles: true}));"
"}"
), code)
await textarea_h.evaluate((
"(el, value) => {"
"el.value = value;"
"el.dispatchEvent(new Event('input', {bubbles: true}));"
"}"
), code)
return None
async def hcaptcha(self, url, site_key, is_invisible):
resp = self._solver.hcaptcha(site_key, url, invisible=is_invisible)
logger.debug(f"hcaptcha response: {resp}")
return resp["code"]