"""
Кликабельный чекбокс Cloudflare рендерит в закрытом shadow DOM — туда лезть не нужно и бессмысленно. sitekey и поле для ответа лежат в обычном DOM контейнера, поэтому решаем через API 2captcha и просто подставляем токен. """ import logging from .base import Captcha, Page logger = logging.getLogger(__name__) class SolverTurnstile(Captcha): ctype = "cloudflare" async def solve(self, selector, page: Page): container = page.locator(selector) await container.wait_for() site_key = await container.get_attribute("data-sitekey") response_input = container.locator('input[name="cf-turnstile-response"]') await response_input.wait_for(state="attached") code = await self.turnstile(page.url, site_key) await response_input.evaluate(( "(el, value) => {" "el.value = value;" "el.dispatchEvent(new Event('input', {bubbles: true}));" "el.dispatchEvent(new Event('change', {bubbles: true}));" "}" ), code) return code