Scarnox · Blog

GeeTest 验证码详解:工作原理与求解方法

GeeTest 是一家验证码服务商,其组件要求访客完成一项视觉任务:把拼图块拖入缺口,按指定顺序点击一组图标,或完成一段简短的滑块移动。它在电商网站、登录页面以及许多地区的应用后端都很常见。它也是 Scarnox 目前尚未支持求解的验证码系列之一。本指南解释 GeeTest 的工作原理、为什么它比基于 token 的组件更难自动化、人们在一般情况下采用哪些方法,以及 Scarnox 目前的支持状态。

GeeTest 在页面上做了什么

GeeTest 验证码通常分三步加载:

  1. 页面加载 GeeTest 脚本,并使用验证码 ID 创建组件。在许多集成中,该 ID 作为名为 gt 的参数传入。
  2. 组件向 GeeTest 服务器请求一个新的挑战。挑战包含一个 challenge 值,以及拼图所需的图片或图块位置。
  3. 访客完成任务后,组件把结果回传给网站。随后网站后端会先向验证码服务商核实该结果,然后才接受表单。

第三步至关重要。一个看起来合理的值是不够的,因为服务器检查的是与某次挑战绑定且会过期的结果。这就是为什么从其他会话复制来的值会失败,也是为什么重放旧结果行不通。

为什么 GeeTest 比 token 组件更难

使用 PopularCaptcha 时,页面只需要一个 token 字符串,一次请求即可返回该字符串。GeeTest 在三个方面有所不同:

因此,GeeTest 求解是一个多步骤的工作:获取挑战、在图像中定位目标、生成移动轨迹、提交并读取判定结果。每一步都可能失败,而且如果步骤之间等待太久,挑战就会过期。

通用做法

自动化 GeeTest 页面的人一般会采用以下三种方法之一。它们都不是捷径,各自都有代价:

无论选择哪种方法,都要保持范围清晰:只自动化你拥有的流程、你获准使用的测试环境,或你获准收集的公开数据。

查找验证码 ID

开始工作时不需要代码。打开开发者工具,重新加载页面,并在 Network 面板中搜索 geetest 或 gt。加载组件的第一个请求通常会显示验证码 ID。一个小脚本可以记录它,当你想注意到页面何时更改了组件时,这很有用:

import re
import requests

html = requests.get("https://example.com/login", timeout=30).text
match = re.search(r"gt['\"]?\s*[:=]\s*['\"]([a-f0-9]{32})['\"]", html)
print("captcha id:", match.group(1) if match else "not found")

上面的模式会在 gt 附近查找一个 32 位的十六进制值。服务商会更改其标记,因此请把它当作起点,并将输出与你正在测试的页面进行核对。

Scarnox 的支持现状

规划项目时,请对此保持清醒的认识:

如果你的项目现在就需要 GeeTest,实际可行的路线是:针对你获准测试的页面,自行搭建浏览器和图像步骤;同时让代码做好准备,待 API 支持上线后切换过去。与此同时,你可以注册账户,获取免费试用额度,无需信用卡。这样你就有了一个可以测试的 PopularCaptcha 流程,并为之后接入 GeeTest 留出了位置。当前费率请查看当前定价。

合法的用途

不要利用验证码自动化来注册虚假账户、攻击登录表单或抢购限量商品。这些行为违反大多数网站的规则,也不是 Scarnox 支持的用途。

下一步