logo
bars

GeeTest CAPTCHA v4
和 CapMonster Cloud

验证码识别、网站接入与测试。
接手一个已经部署 captcha 或其他防护的站点,却无法访问源代码?此时最关心的是使用了哪种方案、配置是否正确以及如何测试。

在本文中,我们尽量回答了所有关键问题。要开始解决问题,第一步是确定当前使用的是哪种防护系统。为此,您可以查看常见验证码与反机器人防护系统列表,其中提供了可视化示例和关键特征,帮助您快速判断自己正在使用哪一种方案。

如果您发现自己的网站使用的是 GeeTest CAPTCHA v4,下一步就是更深入地了解它的特性和具体工作方式。在本文中,您还可以查看 GeeTest CAPTCHA v4 的接入说明,以便彻底弄清它在您的网站上是如何运行的。这样一来,您不仅能更好地理解当前的防护机制,还可以更合理地规划后续的维护和支持。

什么是 GeeTest CAPTCHA v4
什么是 GeeTest CAPTCHA v4
GeeTest CAPTCHA v4(自适应验证码 / 行为验证) 是相比 v3 更加现代的版本,用于保护网站免受可能损害资源的自动化行为攻击。系统会跟踪网站访客的行为和设备特征,并选择合适的挑战任务:对于真实用户,验证过程会尽量简单——通常只需点击一次验证码控件即可;一旦怀疑存在自动化行为,系统则会给出更复杂的任务,需要用户完成。
Background
GeeTest CAPTCHA v4 示例
No CAPTCHA
No CAPTCHA
用户验证主要基于其在网站上的行为和交互过程完成,而不一定需要显式地做题或者解谜。
Icon CAPTCHA
Icon CAPTCHA
按指定顺序选择图片。
IconCrush CAPTCHA
IconCrush CAPTCHA
交换元素位置,使三个相同图标排成一行(类似“三消”类益智游戏)。
Slide CAPTCHA
Slide CAPTCHA
通过滑块来完成拼图或对齐图片中的元素。
Gobang CAPTCHA
Gobang CAPTCHA
通过滑块来完成拼图或对齐图片中的元素。

如何通过 CapMonster Cloud 解决 GeeTest CAPTCHA v4

测试包含 GeeTest CAPTCHA v4 的表单时,常常需要确认 captcha 是否集成正确并工作正常。

你可以手动验证站点上的 captcha。

  • 打开表单页面,确认 captcha 能够显示。
  • 尝试在不解题的情况下提交——服务器应返回错误。
  • 解题成功后,表单应顺利提交。

若想自动解题,可以使用 CapMonster Cloud 等服务,它会接收验证码参数、在服务器中解析并返回可直接使用的 token。把 token 注入表单即可无需人工操作通过验证。

通过 CapMonster Cloud API 工作的一般流程:

创建任务创建任务
arrow
发送 API 请求发送 API 请求
arrow
获取结果获取结果
arrow
将 token 应用到页面将 token 应用到页面
arrow
使用现成库识别 GeeTest CAPTCHA v4
CapMonster Cloud 提供了适用于 PythonJavaScript(Node.js)和 C# 的官方库,方便你快速集成。
Python
JavaScript
C#
完整流程:解题、填入 token 并提交表单
下面是一个在你的网页上完整识别验证码的 Node.js 示例。可能的方案包括:通过 HTTP 请求获取 HTML 和验证码参数,提交答案并处理结果;或者使用自动化工具(如 Playwright)打开页面,等待验证码加载,发送参数(测试时可以同时发送正确和故意错误的参数),然后通过 CapMonster Cloud 客户端获取解题结果,将 token 填入表单并查看返回结果。
// npm install playwright @zennolab_com/capmonstercloud-client

import { chromium } from "playwright";
import {
  CapMonsterCloudClientFactory,
  ClientOptions,
  GeeTestRequest
} from "@zennolab_com/capmonstercloud-client";

const CAPMONSTER_API_KEY = "YOUR_CAPMONSTER_API_KEY";

async function solveGeetestV4(pageUrl) {
  const browser = await chromium.launch({ headless: false });
  const context = await browser.newContext({ viewport: null });
  const page = await context.newPage();

  let detected = null;
  let solutionObj = null;

  // 1. 拦截 /load 响应(获取 captcha_id、challenge 等参数)
  page.on("response", async (response) => {
    const url = response.url();
    if (!url.startsWith("https://gcaptcha4.geetest.com/load?")) return;

    const params = new URLSearchParams(url.split("?")[1] || "");
    const captchaId = params.get("captcha_id");
    const challenge = params.get("challenge");
    const captchaType = params.get("captcha_type");

    if (captchaId && challenge) {
      detected = { captchaId, challenge, captchaType };
      console.log("Detected GeeTest v4 load:", detected);
    }
  });

  // 2. 打开并加载页面
  console.log("Opening page:", pageUrl);
  await page.goto(pageUrl, { waitUntil: "domcontentloaded" });

  // 3. 等待并捕获 /load 请求
  console.log("Waiting for GeeTest /load...");
  while (!detected) {
    await page.waitForTimeout(500);
  }

  // 4. 将任务发送到 CapMonster Cloud
  console.log("Sending task to CapMonster...");
  const cmc = CapMonsterCloudClientFactory.Create(
    new ClientOptions({ clientKey: CAPMONSTER_API_KEY })
  );

  const task = new GeeTestRequest({
    websiteURL: pageUrl,
    gt: detected.captchaId,
    challenge: detected.challenge,
    version: "4",
    initParameters: {
      riskType: detected.captchaType || "slide"
    }
  });

  const solveRes = await cmc.Solve(task);
  const sol = solveRes.solution || solveRes;

  solutionObj = {
    captcha_id: sol.captcha_id || detected.captchaId,
    captcha_output: sol.captcha_output,
    lot_number: sol.lot_number,
    pass_token: sol.pass_token
  };

  console.log("Got solution from CapMonster:", solutionObj);

  // 5./verify 请求中填写对应参数以获得成功响应
  await page.route("https://gcaptcha4.geetest.com/verify*", async (route) => {
    console.log("Intercepted /verify, injecting fake success...");
    const body = `geetest_${Date.now()}(${JSON.stringify({
      status: "success",
      data: {
        result: "success",
        seccode: {
          captcha_id: solutionObj.captcha_id,
          captcha_output: solutionObj.captcha_output,
          lot_number: solutionObj.lot_number,
          pass_token: solutionObj.pass_token
        }
      }
    })})`;

    await route.fulfill({
      status: 200,
      contentType: "application/javascript",
      body
    });
  });

  // 6. 模拟用户操作(例如点击验证码按钮)
  console.log("Waiting for captcha interaction...");
  await page.waitForTimeout(3000);

  // 验证请求示例:
  try {
    await page.click('.geetest_btn'); // 验证码按钮
    console.log("Clicked captcha button");
  } catch {
    console.log("Captcha button not found");
  }

  // 有时需要手动调用 verify()await page.evaluate(() => {
    if (window.initGeetest4 && typeof verify === "function") {
      verify();
    }
  });

  console.log("Waiting for verification request...");
  await page.waitForTimeout(3000);

  await browser.close();

  return { detected, solution: solutionObj };
}
(async () => {
  const url = "https://example.com"; // 替换为实际使用 GeeTest v4 的页面地址
  const res = await solveGeetestV4(url);
  console.log("FINISHED:", res);
})();
如何将 GeeTest CAPTCHA v4 接入你的网站
为了更好地理解验证码在你网站上的工作方式、验证逻辑,以及如何重新接入或重新配置,我们建议你仔细阅读本节内容。这里详细描述了接入保护的步骤,能够帮助你快速理清所有细节。

1. 注册或登录你的 GeeTest 账号

2. 进入 Captcha Dashboard,选择 Behavior Verification v4

HowTo Connect image 1

3. 在控制台中点击 + Create application

4. 填写 APP/website name(将使用验证码的网站或应用名称)、Address(将部署验证码的网站主域名,例如 https://example.com)、Industry(网站所属行业,如 “E-commerce”、“Social Media” 等),然后点击 Confirm

5. 在刚创建的应用右侧点击 Add events。设置 Event——验证码实际使用场景的名称,如 login、register 等;Device——使用平台(如 Web/Wap);Business types——验证码应用场景类型(例如 Sign-up / Sign-in —— 注册 / 登录)。然后点击 Add

6. 此时,你将在控制台中看到该验证码的 ID(在前端和后端均会用到)以及 Key(在后端用于验证):

HowTo Connect image 2

7. 接入前端部分

先引入脚本:

<script src="https://static.geetest.com/v4/gt4.js"></script>

然后初始化 CAPTCHA:

initGeetest4(
  { captchaId: "Your CaptchaId" },
  function (captcha) {
    captcha.appendTo("#captcha"); // 插入到页面元素中
  }
);

重要提示:

  • CAPTCHA 需要在页面加载时进行初始化,否则无法正确跟踪用户行为。
  • 如果同一页面上存在多个 CAPTCHA,需要分别调用 initGeetest4 进行初始化。
  • 如果在 iframe 中使用 CAPTCHA,请为 iframe 添加 sandbox="allow-scripts allow-popups" 属性。

代码示例代码示例
arrow

8. 配置后端逻辑。

当前端用户通过 CAPTCHA 后,会生成一组参数。你需要将这些参数发送到后端,并通过 GeeTest 提供的二次验证 API 进行校验,以确认本次验证是有效的。

二次验证 API:

url
http://gcaptcha4.geetest.com/validate

  • 方法:GET/POST
  • Content-Type: application/x-www-form-urlencoded
  • 响应格式:JSON

主要请求参数

  • lot_number - 本次验证的序列号
  • captcha_output - 验证数据
  • pass_token - 验证 token
  • gen_time - 验证生成时间
  • captcha_id - CAPTCHA 的 ID
  • sign_token - 用于二次验证的签名

成功响应示例成功响应示例
arrow

PHP 中的 CAPTCHA 验证示例PHP 中的 CAPTCHA 验证示例
arrow

Background
可能的错误与调试
Bug Icon
参数错误
验证码未显示,或返回 invalid-captcha-id / invalid-challenge 等错误。请检查你使用的 captcha_idchallenge 是否为当前页面对应的最新值——这些参数会在每次 /load 请求时动态生成。
Bug Icon
解决超时
在设定时间内未收到验证码解决结果。请在使用自动识别服务(例如 CapMonster Cloud)时适当增加超时时间,并确保与 API 的网络连接稳定。
Bug Icon
字段为空
captcha_outputpass_tokenlot_number 没有被传到页面或验证请求中。请检查这些值是否被正确写入表单中的隐藏字段,或包含在发送给服务器的请求体中。
Bug Icon
返回 success=false
token 已过期、被重复使用或为伪造值。请开启对所有验证请求与响应的日志记录,以便跟踪 error_codeerror_msg 等字段,定位问题。
验证防护的可靠性
集成完成后,务必确认系统确实能够抵御自动化行为。
安全与优化建议
务必将 <b>验证码密钥(Secret KEY)仅保存在服务器端</b>,不要在前端暴露。
在验证过程中记录错误代码(<b>error-codes</b> 或响应中的相关字段),便于分析失败原因和排查问题。
如许可证或内部合规要求,请在表单底部添加 <b>隐私政策</b> 和 <b>GeeTest 使用条款</b> 的链接。
结论

如果你接手了一个已经集成了验证码或其他防护系统的网站,但又无法访问其代码,也不用担心!要判断实际使用了哪种技术其实并不难。为了核实其是否正常工作,你可以在隔离的测试环境中使用CapMonster Cloud识别服务,确保令牌处理机制和校验逻辑都运行正常。

对于GeeTest CAPTCHA v4,只需识别出所用的系统,观察其行为,并确认防护是否正常工作即可。本文演示了如何识别 GeeTest CAPTCHA v4,以及到哪里查找其接入或重新配置的说明文档,从而帮助你自信地维护防护方案并掌控其运行情况。

Conclusion