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 的保护。
为什么会被标记
复选框是一个风险判断,而不是谜题。常见的触发因素包括:
- 同一 IP 地址的请求突增;
- 一个全新的浏览器会话,没有 Cookie 或历史记录;
- 浏览器环境看起来像自动化程序,例如默认的无头配置;
- 输入模式不像人在移动鼠标或打字。
理解这些触发因素,比理解控件本身更重要。如果你的流量没有触发复选框,你就永远不会看到图片挑战。
目前行之有效的通用方法
这些方法被广泛使用,而且是正当的做法。它们能减少合法工作中出现挑战的频率。
- 保持真实的会话。 在一次会话中复用 Cookie 和一致的浏览器配置文件,而不是每个页面都从头开始。
- 控制请求节奏。 稳定、缓慢的频率比突发式请求更像真人。
- 为控件使用真实的浏览器。 使用正常设置的完整浏览器,比精简的无头配置更不容易被标记。无头浏览器检测指南列出了常见的信号。
- 申请例外或使用测试密钥。 如果网站是你自己的,请在预发布环境中使用 Google 公布的测试密钥。如果不是,请向网站所有者申请白名单。
- 有人参与其中。 对于低频任务,可以由人工完成复选框,然后把 token 传递下去。这种方式很慢,但可靠。
这些方法并不能保证挑战永远不出现,它们只是降低出现的频率,而这正是让合法工作保持稳定的关键。
基于 token 的识别器会做什么
针对 reCAPTCHA v2 的基于 token 的识别器,与今天的 PopularCaptcha 做的事情相同。它接收 sitekey 和页面 URL,生成有效的 g-recaptcha-response token,并返回给你的代码。然后你的代码把 token 填入表单,并在它过期之前提交。
Scarnox 会在 reCAPTCHA v2 支持上线时,在 API 参考中说明任务类型和任何额外字段。在此之前,请不要基于假设的接口进行开发。请求结构会与 PopularCaptcha 的示例相似,但具体的值请以文档为准。
reCAPTCHA v2 任务的检查清单
规划涉及 reCAPTCHA v2 表单的任务时,请检查以下几点:
- 网站是你自己的吗?如果是,请在预发布环境中使用测试密钥,并把生产环境的测试控制在最小范围。
- 任务是否正当?公共数据收集和你自己的工作流程是正当的;账户滥用和垃圾信息则不是。
- 请求频率是否足够低,让复选框保持安静?
- 你是否为图片挑战做好了计划,无论是人工,还是支持上线后的识别器?
- 你是否检查了服务器端的验证结果,而不仅仅是 token 是否存在?
常见错误
reCAPTCHA v2 集成最常见的问题,是 token 看起来完全正确,却被网站拒绝。其中大部分来自三个原因。第一是 sitekey 与页面 URL 不匹配:token 绑定在展示控件的那个页面上,所以从一个页面取得的 sitekey 提交到另一个页面,就会失败。第二是 token 过期:token 的有效期很短,如果脚本先识别,然后又执行了一长串其他步骤,最后提交的就是已经过期的值。第三是你这边缺少服务器端的检查:如果你的测试只确认了 token 存在,你就不会注意到验证步骤其实已经失败。
另一类错误来自控件周围的工作流程。在一个会话中登录,却在另一个会话中提交表单,是很常见的一种,因为验证可能依赖于加载控件的那个会话。连续多次重试被拒绝的表单,也会让会话显得可疑,从而可能把一次挑战变成一系列挑战。出现失败时,请暂停,检查页面状态,然后用全新的值再尝试一次。
负责任地抓取
如果表单是抓取任务的一部分,请在开始之前检查 robots.txt 和网站的条款。保持较低的请求频率,并且不要收集你不需要的个人数据。网页抓取合法吗?涵盖了主要的考虑因素。