Scarnox · Blog

如何在合法的自动化与测试场景中绕过验证码

在合法的前提下绕过验证码,指的是让你自己的自动化工作越过挑战,同时不违反网站的规则,也不伤害网站的用户。实际上这涵盖四种情况:自动化你自己拥有的工作流程、测试你自己的网站、开发无障碍工具,以及在负责任的频率下采集公开数据。最快捷也最诚实的途径,通常是完全避免触发验证码。当你无法避免时,Scarnox 这类验证码求解 API 可以返回页面所期望的 token。

本指南按照你应当尝试的顺序列出各种做法,并标明你不应越过的边界。

先弄清楚验证码为什么出现

验证码本身就是一种信号。网站判断某个请求看起来像自动化或存在风险。在你试图越过挑战之前,先检查是什么触发了它:

消除触发原因,往往能让验证码彻底消失,这比在每次请求时都去求解要好得多。

先尝试避免挑战的做法

  1. 如果存在官方 API,就使用它。 许多网站通过带有自己密钥和限额的 API 发布数据。这条路径更快、更稳定,而且明确获得许可。
  2. 放慢速度,分散请求。 在请求之间加入延迟,限制并发数,并在收到警告时退避。稳定的每分钟几个请求,在网站看来与突发的数百个请求截然不同。
  3. 保持会话。 在一次会话中复用 cookie 和一致的浏览器配置文件,而不是每个页面都重新开始。浏览器指纹指南 解释了这一点为什么重要。
  4. 在开始之前检查 robots.txt 和服务条款,而不是在被封锁之后才检查。尊重网站提出的要求。

在测试中使用测试密钥和测试环境

如果验证码阻碍了你自己的预发布环境,不要为了越过它而把测试指向生产环境。包括 Google 和 Cloudflare 在内的大多数验证码服务商,都为开发提供测试密钥。这些密钥会生成有效的 token,而无需真实的挑战,是自动化测试的正确工具。你也可以请团队在预发布服务器上关闭验证码。端到端测试中的验证码指南 介绍了具体的配置步骤。

合法工作遇到验证码时,通过 API 求解

即使节奏控制得很好,一些合法工作仍然会遇到验证码。例如,一个监控你的供应商门户的任务就是这样。在这种情况下,验证码求解 API 是合适的工具。

Scarnox 是一个验证码求解 API。目前唯一可用的任务类型是无代理的 PopularCaptcha。你的代码发送 sitekey 和页面 URL,然后接收用于随表单提交的 token:

import requests

r = requests.post(
    "https://api.scarnox.com/api/tasks/create",
    headers={"Authorization": "Bearer scarnox_YOURAPIKEY"},
    json={
        "captcha_type": "PopularCaptchaTaskProxyless",
        "site_key": "10000000-ffff-ffff-ffff-000000000001",
        "site_url": "https://example.com/login",
    },
    timeout=185,
)
data = r.json()
token = data["solution"]["token"] if data.get("errorId") == 0 else None

token 约两分钟后过期,因此请立即提交。使用 Python 求解验证码指南 提供了完整示例。其他验证码类型,包括 reCAPTCHA、Cloudflare Turnstile 和 Arkose,即将推出。在它们正式上线之前,不要假设求解器能够处理这些类型。

无障碍访问同样是合法理由

验证码会对使用屏幕阅读器、切换设备或有认知或视觉障碍的人构成障碍。如果你在开发无障碍工具,或者代表无法完成挑战的用户行事,正确的第一步是向网站所有者申请无障碍的替代方案。许多网站都提供这样的方案。自动化处理验证码并不能代替这一沟通。

不合法的用途

无论给出什么理由,某些验证码求解的用途都是越界的。请不要将求解器或任何绕过手段用于以下情况:

这些行为会伤害真实的人,违反网站条款,并使你面临严重的法律风险。Scarnox 不支持这些用途,本指南也不涉及这些内容。

负责任地抓取

如果你的绕过行为是为了采集公开数据,请注意以下几点:

总结

先通过修复原因来避免验证码。测试时使用测试密钥。对于仍然遇到挑战的合法任务,在已上线的任务类型范围内使用求解 API。不要触碰上述禁止的用途,并以网站能够承受的节奏进行抓取。

下一步