求助:使用Python Selenium+2Captcha API无法破解VFS网站Cloudflare Turnstile验证码
问题分析与解决方法
可行性判断
VFS全球签证网站的Cloudflare Turnstile防护级别确实较高,但结合2Captcha+优化后的Selenium方案是可行的,核心问题在于你的代码存在几处关键缺陷,未满足Cloudflare的验证逻辑。
核心问题与修复方案
1. 代码结构与执行顺序错误
你的getCode函数定义在调用之后,会直接触发NameError;同时硬编码的time.sleep无法保证页面元素加载完成,需改用显式等待。
2. Turnstile验证参数缺失
Cloudflare Turnstile除了cf-turnstile-response,还会校验动态生成的孪生字段(如cf-turnstile-response-xxxxxx),以及action参数,仅赋值单个字段无法通过验证。
3. Selenium被Cloudflare识别为自动化工具
普通ChromeDriver的特征会被Cloudflare检测到,需使用反检测驱动并配置浏览器参数。
修正后的完整代码
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from twocaptcha import TwoCaptcha import time # 初始化2Captcha solver solver = TwoCaptcha('你的API密钥') def get_turnstile_token(url, site_key, action): try: result = solver.turnstile( sitekey=site_key, url=url, action=action, userAgent=driver.execute_script("return navigator.userAgent;") # 保持UA一致 ) return result['code'] except Exception as e: print(f"验证码求解失败: {e}") return None # 初始化反检测ChromeDriver options = webdriver.ChromeOptions() options.add_argument("--disable-blink-features=AutomationControlled") options.add_argument("--start-maximized") options.add_experimental_option("excludeSwitches", ["enable-automation"]) options.add_experimental_option('useAutomationExtension', False) driver = webdriver.Chrome(options=options) driver.execute_script("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})") # 打开目标页面 driver.get("https://visa.vfsglobal.com/ind/en/pol/login") # 显式等待输入框加载 wait = WebDriverWait(driver, 20) email_input = wait.until(EC.presence_of_element_located((By.ID, 'mat-input-0'))) password_input = wait.until(EC.presence_of_element_located((By.ID, 'mat-input-1'))) # 输入账号密码 email_input.send_keys('Appointment.004slots@gmail.com') time.sleep(1) password_input.send_keys('Umar@1234') # 获取Turnstile的sitekey和action参数 site_key = "0x4AAAAAAACYaM3U_Dz-4DN1" action = driver.execute_script("return document.querySelector('.cf-turnstile').getAttribute('data-action')") # 求解验证码 token = get_turnstile_token(driver.current_url, site_key, action) if not token: driver.quit() exit() # 注入所有Turnstile响应字段 driver.execute_script(f""" const responseFields = document.querySelectorAll('[name^="cf-turnstile-response"]'); responseFields.forEach(field => field.value = '{token}'); """) # 等待并点击登录按钮 login_btn = wait.until(EC.element_to_be_clickable((By.XPATH, "//button/span[contains(text(),' Sign In')]"))) login_btn.click() # 后续操作...
额外注意事项
- 可使用
undetected-chromedriver替代普通ChromeDriver,进一步降低被检测概率(安装命令:pip install undetected-chromedriver)。 - 避免频繁请求,VFS网站可能有IP限流,建议添加合理的间隔时间。
- 确保2Captcha账户有足够余额,且API密钥正确。
内容的提问来源于stack exchange,提问作者george bell
相关产品推荐
相关产品推荐

