You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 08:30:24