使用Selenium+2captcha API处理Google reCAPTCHA时遇ERROR_CAPTCHA_UNSOLVABLE求助
解决2captcha API的ERROR_CAPTCHA_UNSOLVABLE问题
核心错误排查
- 硬编码URL问题:你的
solve函数里把url参数硬写成了https://2captcha.com/demo/recaptcha-v2,没有使用传入的目标网站URL。2captcha需要验证对应目标站点的reCAPTCHA,必须传入当前页面的真实URL,否则会直接导致验证失败。 - 无效API密钥:代码里默认密钥是
adsasd,如果环境变量APIKEY_2CAPTCHA没正确设置,用这个无效密钥肯定无法请求服务,要确保密钥是从2captcha后台获取的有效值。
代码修正建议
1. 修复solve函数的URL参数
把硬编码的URL改成传入的参数,同时完善异常返回逻辑:
def solve(siteKey, url): sys.path.append(os.path.dirname(os.path.dirname(os.path.realpath(__file__)))) api_key = os.getenv('APIKEY_2CAPTCHA', '替换为你的有效2captcha密钥') solver = TwoCaptcha(api_key) try: result = solver.recaptcha( sitekey=siteKey, url=url) # 使用传入的目标页面URL,不要硬编码 except Exception as e: print(e) return None # 异常时返回None,避免后续代码报错 else: return result
2. 完善验证码结果的处理逻辑
设置g-recaptcha-response后,需要触发reCAPTCHA的验证回调,否则页面不会识别验证码已完成。同时要处理solve函数返回None的情况:
# 等待单个reCAPTCHA元素出现即可,无需等待所有元素 WebDriverWait(driver,23).until(EC.presence_of_element_located((By.XPATH,'//div[@class="g-recaptcha"]'))) google_recaptcha = driver.find_element(By.XPATH,'//div[@class="g-recaptcha"]').get_attribute('data-sitekey') print("SOLVING CAPTCHA") print(google_recaptcha) result = solve(google_recaptcha, url) if not result: print("验证码求解失败") # 可添加重试逻辑或终止流程 driver.quit() exit() result_code = result['code'] WebDriverWait(driver,10).until(EC.presence_of_element_located((By.ID,'g-recaptcha-response'))) # 设置响应值 driver.execute_script(f"document.getElementById('g-recaptcha-response').innerHTML = '{result_code}'") # 触发reCAPTCHA验证回调,通知页面验证码已完成 driver.execute_script("grecaptcha.getResponse()") # 部分站点需要手动触发验证码区域的验证事件,可尝试添加: # driver.find_element(By.XPATH,'//div[@class="g-recaptcha"]').click()
其他注意事项
- 确保页面URL正确:传入
solve的url必须是当前页面的完整URL(包含http/https、域名和路径),不能是相对路径或错误地址。 - 添加重试机制:如果出现
ERROR_CAPTCHA_UNSOLVABLE,可以添加最多3次的重试逻辑,因为2captcha的识别偶尔会失败。 - 规避自动化检测:确保你的Selenium环境没有被网站检测为自动化工具,比如使用
undetected-chromedriver替代普通ChromeDriver,或在启动浏览器时添加规避检测的参数,否则网站会发送更复杂的验证码,导致2captcha无法识别。
内容的提问来源于stack exchange,提问作者Risen_Star
相关产品推荐
相关产品推荐

