Scarnox · Blog

reCAPTCHA v2 的工作原理与识别方法(即将支持)

reCAPTCHA v2 是 Google 经典的验证码。它显示一个标有“我不是机器人”的复选框,并且当它无法确定访客身份时,会加上一个图片挑战。针对它的识别器,必须生成网站可以向 Google 验证的有效响应 token。Scarnox 对 reCAPTCHA v2 的支持即将推出。本指南说明控件的工作方式、人们目前常用的通用思路,以及基于 token 的识别器能提供什么。

Scarnox 目前还不能实时识别 reCAPTCHA v2。今天唯一上线的任务类型是无代理的 PopularCaptcha。如果你的项目现在就需要 reCAPTCHA v2,下面的方法是现实可行的选择。

控件如何工作

页面嵌入一个带有 data-sitekey 属性的容器元素。这个 sitekey 向 Google 标识该网站。控件加载时,会在浏览器中运行检查,查看访客的行为、Cookie 和历史记录,并把风险评估发送给 Google。

如果评估结果是低风险,复选框会自动勾选,控件会把一个 token 写入名为 g-recaptcha-response 的隐藏字段。如果评估结果是较高风险,访客会看到一个图片挑战,例如选择包含某类物体的方块。通过挑战同样会写入 token。

然后网站的后端会把这个 token 连同网站的密钥一起发送给 Google 的验证接口。Google 返回成功或失败。由于验证发生在服务器端,如果一个表单接受 token 却不向 Google 核实,那么它实际上并没有受到 reCAPTCHA 的保护。

为什么会被标记

复选框是一个风险判断,而不是谜题。常见的触发因素包括:

理解这些触发因素,比理解控件本身更重要。如果你的流量没有触发复选框,你就永远不会看到图片挑战。

目前行之有效的通用方法

这些方法被广泛使用,而且是正当的做法。它们能减少合法工作中出现挑战的频率。

  1. 保持真实的会话。 在一次会话中复用 Cookie 和一致的浏览器配置文件,而不是每个页面都从头开始。
  2. 控制请求节奏。 稳定、缓慢的频率比突发式请求更像真人。
  3. 为控件使用真实的浏览器。 使用正常设置的完整浏览器,比精简的无头配置更不容易被标记。无头浏览器检测指南列出了常见的信号。
  4. 申请例外或使用测试密钥。 如果网站是你自己的,请在预发布环境中使用 Google 公布的测试密钥。如果不是,请向网站所有者申请白名单。
  5. 有人参与其中。 对于低频任务,可以由人工完成复选框,然后把 token 传递下去。这种方式很慢,但可靠。

这些方法并不能保证挑战永远不出现,它们只是降低出现的频率,而这正是让合法工作保持稳定的关键。

基于 token 的识别器会做什么

针对 reCAPTCHA v2 的基于 token 的识别器,与今天的 PopularCaptcha 做的事情相同。它接收 sitekey 和页面 URL,生成有效的 g-recaptcha-response token,并返回给你的代码。然后你的代码把 token 填入表单,并在它过期之前提交。

Scarnox 会在 reCAPTCHA v2 支持上线时,在 API 参考中说明任务类型和任何额外字段。在此之前,请不要基于假设的接口进行开发。请求结构会与 PopularCaptcha 的示例相似,但具体的值请以文档为准。

reCAPTCHA v2 任务的检查清单

规划涉及 reCAPTCHA v2 表单的任务时,请检查以下几点:

常见错误

reCAPTCHA v2 集成最常见的问题,是 token 看起来完全正确,却被网站拒绝。其中大部分来自三个原因。第一是 sitekey 与页面 URL 不匹配:token 绑定在展示控件的那个页面上,所以从一个页面取得的 sitekey 提交到另一个页面,就会失败。第二是 token 过期:token 的有效期很短,如果脚本先识别,然后又执行了一长串其他步骤,最后提交的就是已经过期的值。第三是你这边缺少服务器端的检查:如果你的测试只确认了 token 存在,你就不会注意到验证步骤其实已经失败。

另一类错误来自控件周围的工作流程。在一个会话中登录,却在另一个会话中提交表单,是很常见的一种,因为验证可能依赖于加载控件的那个会话。连续多次重试被拒绝的表单,也会让会话显得可疑,从而可能把一次挑战变成一系列挑战。出现失败时,请暂停,检查页面状态,然后用全新的值再尝试一次。

负责任地抓取

如果表单是抓取任务的一部分,请在开始之前检查 robots.txt 和网站的条款。保持较低的请求频率,并且不要收集你不需要的个人数据。网页抓取合法吗?涵盖了主要的考虑因素。

下一步