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
相关产品推荐
相关产品推荐

