如何在Python中按时注入JS获取Cloudflare Turnstile参数对接2captcha API
解决方案:在Python环境中提前注入脚本拦截Cloudflare Turnstile参数
方法一:Selenium + Chrome DevTools Protocol(CDP)
核心思路是利用Chrome DevTools的Page.addScriptToEvaluateOnNewDocument接口,在页面所有资源加载前注入拦截脚本,确保脚本在Turnstile组件初始化前生效。
代码示例
from selenium import webdriver from selenium.webdriver.chrome.options import Options # 配置Chrome选项 chrome_options = Options() chrome_options.add_argument("--disable-blink-features=AutomationControlled") chrome_options.add_argument("--start-maximized") # 初始化浏览器 driver = webdriver.Chrome(options=chrome_options) # 通过CDP注入预加载脚本 driver.execute_cdp_cmd( "Page.addScriptToEvaluateOnNewDocument", { "source": """ window.interceptedTurnstileParams = null; const interval = setInterval(() => { if (window.turnstile) { clearInterval(interval); // 覆盖render方法,拦截参数 const originalRender = window.turnstile.render; window.turnstile.render = (container, params) => { window.interceptedTurnstileParams = params; // 调用原始render方法,保证验证码正常加载 return originalRender(container, params); }; } }, 50); """ } ) # 访问目标页面 driver.get("https://your-target-url.com") # 等待验证码加载完成后,获取拦截到的参数 params = driver.execute_script("return window.interceptedTurnstileParams;") if params: cdata = params.get('cdata') pagedata = params.get('pagedata') print(f"cdata: {cdata}") print(f"pagedata: {pagedata}") # 后续可将参数传给2captcha API driver.quit()
关键说明
Page.addScriptToEvaluateOnNewDocument会在document创建后、任何页面脚本执行前注入代码,完美解决时机问题。- 保留原始
turnstile.render调用,确保验证码能正常加载;若不需要加载验证码,可替换为官方示例的return 'foo'。
方法二:Playwright(更简洁高效)
Playwright内置add_init_script方法,专门用于注入页面初始化前的脚本,无需手动操作CDP,代码更简洁。
代码示例
from playwright.sync_api import sync_playwright with sync_playwright() as p: browser = p.chromium.launch(headless=False) page = browser.new_page() # 注入预加载脚本 page.add_init_script(""" window.interceptedTurnstileParams = null; const interval = setInterval(() => { if (window.turnstile) { clearInterval(interval); const originalRender = window.turnstile.render; window.turnstile.render = (container, params) => { window.interceptedTurnstileParams = params; return originalRender(container, params); }; } }, 50); """) # 访问目标页面 page.goto("https://your-target-url.com") # 获取参数 params = page.evaluate("return window.interceptedTurnstileParams;") if params: cdata = params.get('cdata') pagedata = params.get('pagedata') print(f"cdata: {cdata}") print(f"pagedata: {pagedata}") browser.close()
关键说明
add_init_script自动处理脚本注入时机,无需担心执行顺序问题。- 支持Chromium、Firefox、WebKit等多种浏览器,兼容性更强。
内容的提问来源于stack exchange,提问作者parsa
相关产品推荐
相关产品推荐

