Skip to content

Commit aa20bbd

Browse files
authored
fix: align Cloudflare challenge browser flow
1 parent 6097810 commit aa20bbd

1 file changed

Lines changed: 12 additions & 14 deletions

File tree

‎examples/cloudflare_challenge.py‎

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,25 @@
44
import time
55

66
from captcha_solver_api.tasks import TurnstileTaskProxyless
7-
from common import create_client, show_success
7+
from common import create_client, required_env, show_success
88
from selenium.common.exceptions import TimeoutException
99
from selenium.webdriver.support.ui import WebDriverWait
1010
from seleniumbase import Driver
1111

12-
URL = os.getenv("TARGET_URL") or "https://2captcha.com/demo/cloudflare-turnstile-challenge"
12+
URL = required_env("TARGET_URL")
13+
BROWSER_USER_AGENT = os.getenv("BROWSER_USER_AGENT") or (
14+
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
15+
"(KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36"
16+
)
1317

1418
INTERCEPT_SCRIPT = """
1519
window.__turnstileParams = null;
1620
window.__turnstileCallback = null;
1721
const timer = setInterval(() => {
1822
if (!window.turnstile) return;
1923
clearInterval(timer);
20-
window.turnstile.render = (_container, options) => {
24+
const originalRender = window.turnstile.render;
25+
window.turnstile.render = (container, options) => {
2126
window.__turnstileParams = {
2227
websiteKey: options.sitekey,
2328
websiteURL: window.location.href,
@@ -27,7 +32,7 @@
2732
userAgent: navigator.userAgent,
2833
};
2934
window.__turnstileCallback = options.callback;
30-
return undefined;
35+
return originalRender ? originalRender(container, options) : undefined;
3136
};
3237
}, 10);
3338
"""
@@ -61,24 +66,17 @@ def capture_params(driver):
6166
return state["params"]
6267

6368

64-
def normalized_user_agent() -> str:
65-
"""Read Chrome's UA before launching the challenge browser."""
66-
with Driver(browser="chrome", headless=True) as driver:
67-
user_agent = driver.execute_script("return navigator.userAgent")
68-
return user_agent.replace("Headless", "").replace("Chromium", "Chrome")
69-
70-
7169
def main() -> None:
72-
user_agent = normalized_user_agent()
7370
with (
74-
Driver(browser="chrome", headless=False, uc=True, agent=user_agent) as driver,
71+
Driver(browser="chrome", headless=False, agent=BROWSER_USER_AGENT) as driver,
7572
create_client() as client,
7673
):
74+
driver.get(URL)
7775
driver.execute_cdp_cmd(
7876
"Page.addScriptToEvaluateOnNewDocument",
7977
{"source": INTERCEPT_SCRIPT},
8078
)
81-
driver.get(URL)
79+
driver.refresh()
8280
params = capture_params(driver)
8381
if params is None:
8482
return

0 commit comments

Comments
 (0)