Selenium 验证码识别工具:适用于 Python 和 WebDriver 脚本
一个 reCAPTCHA、一次 Turnstile 验证、一个极验 v3 滑块或一张扭曲的图片,都不该让 WebDriver 会话就此中断。给浏览器装上 CapSkip 扩展,或在测试中调用 SDK,每次识别都在本地完成,不计次数。
- Python、C# 和 Node.js
- 扩展或 SDK 两种方式
- 兼容 Selenium Grid
- 打开 /signup
- 填写表单
- 识别验证码
- submit
4 项通过0 项被拦截WebDriver 运行迟早会碰上受挑战保护的登录、搜索或注册表单,这时就需要 Selenium 验证码识别工具了。Selenium 能定位元素、点击和输入,却无法生成 reCAPTCHA token,也认不出扭曲的字母,于是测试卡住,报告里满是超时。CapSkip 就在 driver 旁边,运行在同一台 Windows 电脑上,或者脚本能访问到的 VPS 上,在浏览器等待时把答案交回来。
接入方式有两种,适合不同的 Selenium 使用习惯。免代码方式会启动一个已装好 CapSkip 扩展的 Chrome 或 Firefox 配置文件,小组件在页面内自动通过,就像有人亲手勾选了一样。脚本方式则把控制权留在测试中:pip install capskip,用 find_element 读取 sitekey,调用 solver.recaptcha() 或 solver.turnstile(),再用 execute_script 把 token 写回。图片验证码约 0.1 秒即可返回文字。
在 token 类验证码方面,CapSkip 支持 reCAPTCHA v2、v3 和 Enterprise,以及 Cloudflare Turnstile。极验 v3 滑块、Capy 拼图和 CaptchaFox 同样支持,ALTCHA 和 Friendly Captcha 背后的工作量证明验证也包括在内。图片验证码涵盖数千种变体。不支持 hCaptcha、FunCaptcha 和极验 v4。一切都不计量,因此触发数百个挑战的夜间回归测试,和一个都没触发的收费完全相同。
你的 driver 代码可以保持原样。 把 CapSkip 扩展装进一个浏览器配置文件,在应用运行时用这个配置文件启动 Selenium,挑战就会在你的显式等待计时期间自行通过。只有当某个测试需要直接拿到答案时,才改用 SDK。 阅读扩展指南
Selenium 验证码识别工具能为 WebDriver 做什么
Chrome 或 Firefox 专用的识别配置文件
在一个专用的 Chrome 配置文件中安装一次扩展,再通过 user-data-dir 交给 driver;或者通过 install_addon() 加载 Firefox 附加组件。只要应用在运行,Selenium 打开的每个窗口都能识别验证码。
在同一测试文件中获取 token
用 find_element 读取 data-sitekey,把它和 driver.current_url 一起传给 solver.recaptcha(),再通过 execute_script 设置 g-recaptcha-response。应用工作期间,浏览器始终由你的脚本控制。
直接从页面元素读取图片文字
用 screenshot_as_base64 截取图片并发送给 solver.normal()。由于图片不会被请求第二次,你用 send_keys 输入的文字与本次会话显示的内容一致。
可与 undetected-chromedriver 搭配
undetected-chromedriver 和 SeleniumBase UC 模式等隐身 driver 能减少挑战出现的次数。仍然出现的挑战由 CapSkip 来通过,两种工具各自解决问题的一半。
旧的 2Captcha 辅助代码照常运行
你围绕 2Captcha 或 Anti-Captcha 编写的辅助代码无需任何修改。在应用中把该服务选为模拟器,点击 Hosts 文件旁的添加,CapSkip 就会自己响应这些调用。
一份订阅,多个 driver 并行
机器能承载多少 WebDriver 实例,就运行多少。套餐从不限制线程数,即使测试套件遇到数百个挑战,月度账单也不会增加分毫。
选择你的 WebDriver 代码接入 CapSkip 的方式
from selenium import webdriver
from capskip import CapSkip
driver = webdriver.Chrome()
driver.get("https://example.com/login")
solver = CapSkip(host="127.0.0.1", port=8080)
sitekey = driver.find_element("css selector", ".g-recaptcha").get_attribute("data-sitekey")
token = solver.recaptcha(sitekey=sitekey, url=driver.current_url)["code"]
# Inject the token and submit
driver.execute_script(
"document.getElementById('g-recaptcha-response').innerHTML = arguments[0];",
token,
)
driver.find_element("css selector", "button[type=submit]").click()Python Selenium:从小组件读取 sitekey,向 CapSkip 请求 token,将其写入响应字段,然后点击提交。
Selenium 配置文件中的扩展
把 Chrome 或 Firefox 扩展加载到 Selenium 启动的配置文件中。小组件就地识别,你的测试完全不用包含识别代码。
在定位器旁直接调用 SDK
Python、Node.js、PHP 和 C# 客户端返回的 token 和图片文字,可直接用于你所用 WebDriver 绑定中的 execute_script 或 send_keys。
为其他所有绑定提供本地 API
Java 和其他没有 SDK 的绑定可以直接调用 HTTP API,为 2Captcha 类服务编写的 Selenium 代码在开启模拟器后即可使用。
用真实的 reCAPTCHA 测试你的 Selenium 脚本
把你的 WebDriver 指向我们的 reCAPTCHA v2 演示页面,针对真实的 Google 小组件运行识别步骤,看着表单接受 token,然后再把它用于你自己的目标网站。
在 Selenium 测试套件旁准备好 CapSkip
在 Selenium 中:本地识别与按次计费 API 对比
当你的 Selenium 运行每天都会遇到挑战时,CapSkip 与 2Captcha 等服务有何不同。
| 功能 | CapSkip | 2Captcha & API 服务 |
|---|---|---|
| 完整跑一次测试的成本 | 同一个月度套餐,35 美元起,识别次数不限 | 每次识别都计费,套件越大账单越高 |
| 挑战的识别地点 | 在驱动浏览器的那台机器上,或在 VPS 上 | 在远程服务器上,往往由人工完成 |
| 图片验证码返回时间 | 约 0.1 秒,无需跨越互联网传输 | 需要数秒,每张图片还要加一次网络往返 |
| 你已为 2Captcha 写好的代码 | 通过内置模拟器照常运行 | 绑定该厂商的 API 及其余额 |
| 会话截图和挑战数据 | 留在你自己的机器上 | 每次识别都发送给第三方服务 |
| 并行 WebDriver 会话 | 套餐不限线程,只受硬件限制 | 额外并发往往要加钱 |
| 接入 Selenium 的方式 | 扩展配置文件、Python 或 .NET 客户端,或直接 HTTP 调用 | API 密钥、预付点数和其专属客户端 |
想先试用一下?
开始 3 天免费试用,在你自己的目标上识别 500 个任意类型的验证码。
相关验证码识别工具与指南
用 Selenium Python 识别 reCAPTCHA:扩展还是 SDK
当验证码阻断流程时,Selenium 有两种可靠的选择:让浏览器扩展在页面内完成挑战,或者在脚本中识别并注入答案。两者都依赖于在测试能访问到的地方运行的 CapSkip 应用,选哪一种取决于测试需要多少控制权。
扩展方式。创建一个 Chrome 配置文件,在其中安装 CapSkip 扩展,然后通过 user-data-dir 参数用该配置文件启动 webdriver.Chrome;对于 Firefox,用附加组件文件调用 driver.install_addon()。请以有头模式或 --headless=new 运行,因为旧的无头模式不会加载任何扩展。之后 reCAPTCHA、Turnstile 和极验 v3 小组件都会就地处理,你的 WebDriverWait 只需等待表单继续往下走。
SDK 方式。用 pip install capskip 安装客户端(需要 Python 3.10 或更高版本),并为整个会话创建一个 solver,默认指向 127.0.0.1 的 8080 端口。对于 reCAPTCHA,从 .g-recaptcha 元素中获取 data-sitekey;如果小组件由 JavaScript 渲染,则取 reCAPTCHA iframe 的 src 中的 k 值,然后用 driver.current_url 调用 solver.recaptcha()。隐形小组件需要 invisible=1,v3 则需要 version v3 以及页面执行验证时传入的 action 字符串。用 execute_script 设置 g-recaptcha-response,如果小组件指定了 data-callback 就运行它,并在两分钟内提交。对于 Turnstile,换成 solver.turnstile() 和隐藏的 cf-turnstile-response 字段即可,其余流程不变。
在 Python Selenium 中加入图片验证码识别步骤时,从 img 元素读取 screenshot_as_base64,给这个字符串加上 data:image/png;base64 前缀后传给 solver.normal(),再用 send_keys 输入结果。千万不要再次请求图片 URL:大多数图片验证码与会话绑定,第二次请求会生成一张新图片。识别 reCAPTCHA 和 Turnstile 时,把浏览器所用的代理(HTTP、HTTPS、SOCKS5 或 SOCKS5h)交给 CapSkip;图片识别则不需要代理。
相关指南: undetected-chromedriver 验证码 · SeleniumBase 验证码 · Selenium Grid 验证码
在 Python 中用 Selenium 识别 reCAPTCHA,最快的方法是什么?
我的 Selenium 项目该用扩展还是 SDK?
如何把扩展装进 Selenium 打开的浏览器?
Selenium 如何把图片验证码交给 CapSkip?
在 Selenium 中,它能处理 Cloudflare Turnstile 吗?包括整页验证吗?
表单仍然拒绝我注入的 token,通常是哪里出了问题?
我能在 C#、Node.js 或 Java 的 Selenium 中调用 CapSkip 吗?
这款识别工具支持无头 Chrome 和 Selenium Grid 吗?
让你的 Selenium 测试套件每次都能跑完
在 driver 旁安装 CapSkip,登录,然后选择扩展或 SDK。下一次 WebDriver 运行就会在本地通过所有验证码,无论测试套件遇到什么,月度账单都保持不变。
