使用2Captcha绕过Cloudflare时无法获取Sitekey等信息的问题
问题描述
我尝试用2Captcha绕过Cloudflare Turnstile验证,但无法捕获Sitekey及相关验证信息,执行代码后提示未获取到数据。以下是我的实现代码:
import os from selenium import webdriver from selenium.webdriver.chrome.service import Service import time from twocaptcha import TwoCaptcha api_key = os.getenv('APIKEY_2CAPTCHA', '1b92b965478994ab9539b21b18236d94') solver = TwoCaptcha(api_key) chrome_driver_path = r'C:\Program Files (x86)\chromedriver.exe' driver = webdriver.Chrome(service=Service(chrome_driver_path)) driver.get('https://www.truepeoplesearch.com/') time.sleep(2) script = ''' const i = setInterval(() => { if (window.turnstile) { clearInterval(i); window.turnstile.render = (a, b) => { let p = { method: "turnstile", key: "YOUR_API_KEY", sitekey: b.sitekey, pageurl: window.location.href, data: b.cData, pagedata: b.chlPageData, action: b.action, userAgent: navigator.userAgent, json: 1 }; window.turnstileData = { sitekey: b.sitekey, data: b.cData, pagedata: b.chlPageData }; console.log(JSON.stringify(p)); window.tsCallback = b.callback; return 'foo'; }; } }, 50); ''' driver.execute_script(script) time.sleep(5) # Wait for the script to execute and capture the data turnstile_data = driver.execute_script("return window.turnstileData;") if turnstile_data: print("Sitekey:", turnstile_data['sitekey']) print("Data:", turnstile_data['data']) print("Pagedata:", turnstile_data['pagedata']) else: print("Turnstile data not captured.")
问题原因分析
- Hook方法不适用:多数网站的Turnstile是自动渲染的,不需要手动调用
window.turnstile.render,你的hook逻辑根本不会触发。 - 脚本注入时机太晚:页面加载完成后Turnstile已经初始化完成,
setInterval还没检测到window.turnstile,render方法已经执行过了。 - 被Cloudflare检测:普通ChromeDriver自带自动化特征,页面可能未正常加载Turnstile组件,或阻止了你的脚本修改Turnstile方法。
- 字段名不匹配:脚本里的
b.cData、b.chlPageData不是Turnstile的标准参数名,实际参数可能是b.data或其他名称,导致window.turnstileData赋值失败。
解决方案
1. 直接从DOM提取Sitekey(最简单有效)
Turnstile的容器元素通常带有data-sitekey属性,或可从其iframe的URL中提取sitekey,无需hook任何方法:
import os from undetected_chromedriver import Chrome, ChromeOptions import time from twocaptcha import TwoCaptcha api_key = os.getenv('APIKEY_2CAPTCHA', '1b92b965478994ab9539b21b18236d94') solver = TwoCaptcha(api_key) options = ChromeOptions() driver = Chrome(options=options) driver.get('https://www.truepeoplesearch.com/') time.sleep(3) # 方法1:从容器元素提取data-sitekey try: turnstile_element = driver.find_element("css selector", '[data-sitekey]') sitekey = turnstile_element.get_attribute('data-sitekey') print(f"Sitekey: {sitekey}") except: # 方法2:从Turnstile的iframe提取sitekey iframes = driver.find_elements("css selector", 'iframe[src*="turnstile"]') for iframe in iframes: src = iframe.get_attribute('src') if 'sitekey' in src: sitekey = src.split('sitekey=')[1].split('&')[0] print(f"Sitekey: {sitekey}") break
2. 提前注入Hook脚本(需捕获额外参数场景)
如果需要捕获action、data等参数,要在页面加载前注入hook脚本,通过Chrome DevTools协议实现:
import os from undetected_chromedriver import Chrome, ChromeOptions import time api_key = os.getenv('APIKEY_2CAPTCHA', '1b92b965478994ab9539b21b18236d94') solver = TwoCaptcha(api_key) options = ChromeOptions() driver = Chrome(options=options) # 页面加载前注入hook脚本 driver.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument', { 'source': ''' Object.defineProperty(window, 'turnstile', { get: function() { return _turnstile; }, set: function(val) { _turnstile = val; // 覆盖原始render方法 const originalRender = val.render; val.render = function(a, b) { window.turnstileData = { sitekey: b.sitekey, action: b.action || 'verify', data: b.data || b.cData, pagedata: b.chlPageData || b.pageData }; return originalRender(a, b); } } }); let _turnstile; ''' }) driver.get('https://www.truepeoplesearch.com/') time.sleep(3) turnstile_data = driver.execute_script("return window.turnstileData;") if turnstile_data: print(turnstile_data) else: print("未捕获到Turnstile数据")
3. 避免Cloudflare检测
替换普通ChromeDriver为undetected-chromedriver,它会自动屏蔽Selenium的自动化特征,确保页面正常加载Turnstile:
pip install undetected-chromedriver
关键注意点
- 不要依赖固定的
time.sleep,改用WebDriverWait等待元素出现,提升稳定性。 - 向2Captcha请求验证时,必须传递正确的
sitekey、pageurl,如果页面有action参数也要一并传入,否则验证会失败。
内容的提问来源于stack exchange,提问作者Arslan Aziz
相关产品推荐
相关产品推荐

