在 Selenium 中使用 CAPTCHA 求解服务
使用 solvethree 获取 reCAPTCHA Enterprise 令牌,再使用 Selenium 将 solution.token 填入应用表单并提交。SDK 负责求解任务,不会替您填写浏览器表单。
示例使用包含令牌字段和提交按钮的 HTTPS 表单。请根据您正在测试的应用调整这些选择器。
本页内容
准备表单和 Python 环境
- 1.
安装依赖
使用 Python 3.10 或更高版本以及 Chrome。通过 pip 安装
selenium包,再通过可下载的 wheel 包安装官方 solvethree Python SDK。请遵循 Python 集成中的直接下载安装说明;不要改用您假定可行的包注册表安装方式。 - 2.
配置目标配置文件
在 solvethree 控制台中设置您拥有的表单的主机名,并确保其配置已在您的工作区启用。在任务中发送主机名不会创建该配置。示例请求的是
login操作;如果您的应用使用其他操作,请相应修改。 - 3.
设置环境变量
将
TARGET_URL设置为完整的 HTTPS 表单 URL,将SOLVETHREE_PROXY设置为 HTTP 或 HTTPS 代理 URL,将SOLVETHREE_API_KEY设置为工作区 API 密钥。将密钥保留在 Python 进程中,不要放入页面 JavaScript。
先求解,再使用返回的身份信息启动 Chrome
此 Chrome 示例要求使用通过 IP 白名单授权且不含用户名或密码的代理。 它会拒绝包含凭据的代理 URL,也未实现需要身份验证的代理设置。
任务使用从 TARGET_URL 提取的主机名、login 操作和一个代理。solve 返回就绪结果后,Chrome 会使用同一个代理和返回的 userAgent 启动。在导航之前,示例还会设置返回的 secChUa 请求头。
# Install selenium and the official solvethree Python SDK first.
import os
from urllib.parse import urlsplit
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from solvethree import Solvethree
target = os.environ["TARGET_URL"] # Your configured HTTPS form page.
proxy_url = os.environ["SOLVETHREE_PROXY"]
proxy = urlsplit(proxy_url)
if proxy.username or proxy.password:
raise ValueError("This Chrome example requires an IP-allowlisted proxy without URL credentials")
client = Solvethree(os.environ["SOLVETHREE_API_KEY"])
result = client.solve({"site": urlsplit(target).hostname, "action": "login", "proxy": proxy_url})
solution = result["solution"]
options = webdriver.ChromeOptions()
options.add_argument("--proxy-server=" + proxy_url)
options.add_argument("--user-agent=" + solution["userAgent"])
driver = webdriver.Chrome(options=options)
try:
driver.execute_cdp_cmd("Network.enable", {})
driver.execute_cdp_cmd("Network.setExtraHTTPHeaders", {
"headers": {"sec-ch-ua": solution["secChUa"]}
})
driver.get(target)
# Adapt the field and button to your application's form contract.
field = WebDriverWait(driver, 20).until(
lambda browser: browser.find_element(By.NAME, "g-recaptcha-response")
)
driver.execute_script("""
arguments[0].value = arguments[1];
arguments[0].dispatchEvent(new Event('input', {bubbles:true}));
""", field, solution["token"])
driver.find_element(By.CSS_SELECTOR, 'button[type="submit"]').click()
# Check your application's success response here.
finally:
driver.quit()Solvethree.solve 只创建一次任务,并持续轮询,直到任务就绪或抛出异常。只有此后,浏览器才会导航到表单。脚本会等待令牌字段,为其赋予 solution.token,派发输入事件,然后点击提交按钮。Chrome 会在 finally 块中关闭。
替换演示中的表单假设
TARGET_URL是应用的表单页面。任务的site是其主机名,而不是完整 URL;reCAPTCHA 请求不使用url或type字段。login是示例操作。请将其替换为应用及其配置文件所使用的操作。By.NAME配合g-recaptcha-response用于定位演示文本区域。请使用应用实际读取的字段或提交参数。赋值并派发输入事件是演示中的交接方式,并非通用的 reCAPTCHA 回调。button[type="submit"]用于标识演示提交按钮。请将其替换为能够明确定位您表单按钮的选择器,并保留应用所需的会话、CSRF 和回调行为。
示例中的 20 秒显式等待仅检查文本区域是否存在。点击提交按钮后,请添加条件等待,以检查应用的实际结果,例如成功状态或验证错误。为整个浏览器流程设置独立于求解超时的总时限;不要用固定时长的休眠代替状态检查,也不要随意混用隐式等待和显式等待。
在付费进行下一次求解前,检查失败步骤
- 求解任务在 Chrome 启动前失败。
检查已进入终态的任务的 errorCode 和 error。区分任务失败与 HTTP 请求错误。
试试这样做: 重试前,请修正报告的输入、配置或连接问题。停止轮询失败任务;未经修改的无效输入不会因为再发一次请求就变得有效。
- Selenium 查找文本区域超时。
确认 Chrome 已到达预期表单,且页面确实包含演示中指定名称的字段。
试试这样做: 将演示定位器替换为应用实际的令牌交接方式,并等待其可用状态。延长超时时间无法修复错误的选择器。
- 令牌已就绪,但应用拒绝提交。
首先检查应用发出的请求。确认其中包含 solution.token,而不是任务 ID 或旧值,并确认操作、代理、浏览器身份信息和会话与预期流程一致。
试试这样做: 请求另一个令牌之前,请先修正提交的参数或应用要求。就绪的任务会提供解决结果;是否接受提交则由应用的响应决定。
来源与 API 参考
运行您的第一个任务。
使用 $5 工作区额度开始体验。