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

Python Selenium+2Captcha无法解决VFSGlobal站点reCaptcha验证问题

解决VFS Global登录reCaptcha验证失败问题

问题说明

尝试用Python+Selenium+2Captcha API处理https://visa.vfsglobal.com/ind/en/ltu/login的reCaptcha验证,已成功获取2Captcha返回的token,但点击登录后仍提示“请验证您不是机器人”,错误截图如下:

验证失败错误截图

问题原因

直接修改g-recaptcha-response元素的内容后,未触发Google reCaptcha的内部验证回调机制,导致网站无法识别reCaptcha已完成验证。

解决方案

调整注入token的逻辑,调用reCaptcha官方回调函数,确保网站能检测到验证完成。以下是修正后的代码:

import time
import requests
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

pageurl = 'https://visa.vfsglobal.com/ind/en/ltu/login'
google_site_key = '6LfDUY8bAAAAAPU5MWGT_w0x5M-8RdzC29SClOfI'
service_key = '你的2CAPTCHA密钥'
driver = webdriver.Chrome()
driver.get(pageurl)

# 等待加载遮罩消失
WebDriverWait(driver, 50).until(
    EC.invisibility_of_element_located((By.XPATH, '/html/body/div[1]')))

# 同意Cookie
try:
    WebDriverWait(driver, 5) \
        .until(EC.element_to_be_clickable((By.CSS_SELECTOR,
                                           "div#onetrust-button-group button#onetrust-accept-btn-handler"))) \
        .click()
except:
    pass

# 输入账号密码(改用显式等待确保元素可交互)
email = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="mat-input-0"]')))
email.send_keys('你的邮箱')

password = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="mat-input-1"]')))
password.send_keys('你的密码')

# 获取2Captcha token
url = f"http://2captcha.com/in.php?key={service_key}&method=userrecaptcha&googlekey={google_site_key}&pageurl={pageurl}"
resp = requests.get(url)
if resp.text[:2] != 'OK':
    raise Exception(f"2Captcha服务错误: {resp.text}")

captcha_id = resp.text[3:]
fetch_url = f"http://2captcha.com/res.php?key={service_key}&action=get&id={captcha_id}"

# 轮询获取验证结果,增加超时判断
token = None
for _ in range(10):
    time.sleep(5)
    resp = requests.get(fetch_url)
    if resp.text[:2] == 'OK':
        token = resp.text[3:]
        break
if not token:
    raise Exception("获取reCaptcha token超时")

# 等待reCaptcha元素加载完成后注入token
WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, 'g-recaptcha-response')))
driver.execute_script("""
    document.getElementById('g-recaptcha-response').innerHTML = arguments[0];
""", token)

# 调用reCaptcha回调函数,通知网站验证完成
driver.execute_script("""
    grecaptcha.execute();
""")

# 等待验证状态更新后点击登录
time.sleep(3)
login = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "//span[contains(text(),'Sign In')]")))
driver.execute_script("arguments[0].scrollIntoView();", login)
login.click()

关键调整点

  • 用WebDriverWait替代直接find_element,确保元素可交互后再操作,避免元素未加载完成的问题。
  • 注入token后调用grecaptcha.execute()触发reCaptcha内部验证回调,让网站识别验证完成状态。
  • 增加token获取超时判断,避免无限等待。

内容的提问来源于stack exchange,提问作者A S M Saief

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 22:13:17