From b3b57b1cb6e7839a2bed47b5b675640e838d1a3e Mon Sep 17 00:00:00 2001 From: dariyaanis Date: Thu, 1 Oct 2026 17:35:40 +0300 Subject: [PATCH] fix: align Cloudflare challenge browser flow --- examples/cloudflare_challenge.py | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/examples/cloudflare_challenge.py b/examples/cloudflare_challenge.py index 638865c..9a9f813 100644 --- a/examples/cloudflare_challenge.py +++ b/examples/cloudflare_challenge.py @@ -4,12 +4,16 @@ import time from captcha_solver_api.tasks import TurnstileTaskProxyless -from common import create_client, show_success +from common import create_client, required_env, show_success from selenium.common.exceptions import TimeoutException from selenium.webdriver.support.ui import WebDriverWait from seleniumbase import Driver -URL = os.getenv("TARGET_URL") or "https://2captcha.com/demo/cloudflare-turnstile-challenge" +URL = required_env("TARGET_URL") +BROWSER_USER_AGENT = os.getenv("BROWSER_USER_AGENT") or ( + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 " + "(KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36" +) INTERCEPT_SCRIPT = """ window.__turnstileParams = null; @@ -17,7 +21,8 @@ const timer = setInterval(() => { if (!window.turnstile) return; clearInterval(timer); - window.turnstile.render = (_container, options) => { + const originalRender = window.turnstile.render; + window.turnstile.render = (container, options) => { window.__turnstileParams = { websiteKey: options.sitekey, websiteURL: window.location.href, @@ -27,7 +32,7 @@ userAgent: navigator.userAgent, }; window.__turnstileCallback = options.callback; - return undefined; + return originalRender ? originalRender(container, options) : undefined; }; }, 10); """ @@ -61,24 +66,17 @@ def capture_params(driver): return state["params"] -def normalized_user_agent() -> str: - """Read Chrome's UA before launching the challenge browser.""" - with Driver(browser="chrome", headless=True) as driver: - user_agent = driver.execute_script("return navigator.userAgent") - return user_agent.replace("Headless", "").replace("Chromium", "Chrome") - - def main() -> None: - user_agent = normalized_user_agent() with ( - Driver(browser="chrome", headless=False, uc=True, agent=user_agent) as driver, + Driver(browser="chrome", headless=False, agent=BROWSER_USER_AGENT) as driver, create_client() as client, ): + driver.get(URL) driver.execute_cdp_cmd( "Page.addScriptToEvaluateOnNewDocument", {"source": INTERCEPT_SCRIPT}, ) - driver.get(URL) + driver.refresh() params = capture_params(driver) if params is None: return