API 教程

如何使用 Node.js 解决 reCAPTCHA v2 Enterprise

reCAPTCHA v2 Enterprise 在标准“我不是机器人”复选框中添加了企业级风险评分。该小部件看起来与标准 v2 相同,但令牌是通过 Google 的企业后端进行更严格的验证的。要使用 CaptchaAI 解决此问题,请将 enterprise=1 添加到您的 v2 请求中。

本指南涵盖了完整的 Node.js 实现 - 检测 Enterprise v2、提交到 CaptchaAI、轮询结果以及注入令牌。


你需要什么

要求 细节
CaptchaAI API 密钥 验证码网站
Node.js 14+ 内置 fetchnode-fetch
站点密钥 来自企业锚点 URL(k= 参数)
页面网址 验证码出现的完整 URL
操作(可选) 来自锚点 URL 中的 sa= 参数

第1步:识别reCAPTCHA v2 Enterprise

打开 DevTools 并在 Network 选项卡中查找 Enterprise 锚点请求:

https://www.google.com/recaptcha/enterprise/anchor?ar=1&k=6LdxxXXxAAAAAAcX...&sa=LOGIN&...

关键指标:

  • 脚本源包括 /recaptcha/enterprise.js/enterprise/anchor
  • k= 参数是 sitekey
  • sa= 参数(如果存在)是 操作

标准 v2 使用 /recaptcha/api2/anchor — 不要为标准 v2 添加 enterprise=1


第二步:向CaptchaAI提交任务

const API_KEY = "YOUR_API_KEY";

async function submitTask(sitekey, pageurl, action) {
  const params = new URLSearchParams({
    key: API_KEY,
    method: "userrecaptcha",
    googlekey: sitekey,
    pageurl: pageurl,
    enterprise: "1",
    json: "1",
  });

  if (action) {
    params.set("action", action);
  }

  const response = await fetch(
    `https://ocr.captchaai.com/in.php?${params}`
  );
  const data = await response.json();

  if (data.status !== 1) {
    throw new Error(`Submit failed: ${data.request}`);
  }

  console.log(`Task submitted. ID: ${data.request}`);
  return data.request;
}

第三步:投票结果

第一次轮询前等待 20 秒,然后每 5 秒检查一次:

function delay(ms) {
  return new Promise((resolve) => setTimeout(resolve, ms));
}

async function pollResult(taskId) {
  await delay(20000);

  for (let attempt = 0; attempt < 30; attempt++) {
    const params = new URLSearchParams({
      key: API_KEY,
      action: "get",
      id: taskId,
      json: "1",
    });

    const response = await fetch(
      `https://ocr.captchaai.com/res.php?${params}`
    );
    const data = await response.json();

    if (data.status === 1) {
      console.log(`Solved. Token: ${data.request.substring(0, 60)}...`);
      return {
        token: data.request,
        userAgent: data.user_agent || "",
      };
    }

    if (data.request !== "CAPCHA_NOT_READY") {
      throw new Error(`Solve failed: ${data.request}`);
    }

    console.log(`Attempt ${attempt + 1}: not ready, waiting 5s...`);
    await delay(5000);
  }

  throw new Error("Solve timed out");
}

第四步:注入token

将解决的代币提交为 g-recaptcha-response。如果 API 返回 user_agent,请在请求标头中使用它:

async function submitForm(token, userAgent) {
  const headers = { "Content-Type": "application/x-www-form-urlencoded" };

  if (userAgent) {
    headers["User-Agent"] = userAgent;
  }

  const response = await fetch("https://example.com/api/login", {
    method: "POST",
    headers,
    body: new URLSearchParams({
      username: "user",
      password: "pass",
      "g-recaptcha-response": token,
    }),
  });

  console.log(`Response status: ${response.status}`);
  return response;
}

完整的工作脚本

const API_KEY = "YOUR_API_KEY";
const SITE_KEY = "6LdxxXXxAAAAAAcXxxXxxX91xxxxxxxx8xxOx7A";
const PAGE_URL = "https://staging.example.com/qa-login";
const ACTION = "LOGIN"; // optional — omit if not in anchor URL

function delay(ms) {
  return new Promise((resolve) => setTimeout(resolve, ms));
}

async function solveRecaptchaV2Enterprise() {
  // Submit task
  const submitParams = new URLSearchParams({
    key: API_KEY,
    method: "userrecaptcha",
    googlekey: SITE_KEY,
    pageurl: PAGE_URL,
    enterprise: "1",
    action: ACTION,
    json: "1",
  });

  const submitRes = await fetch(
    `https://ocr.captchaai.com/in.php?${submitParams}`
  );
  const submitData = await submitRes.json();

  if (submitData.status !== 1) {
    throw new Error(`Submit error: ${submitData.request}`);
  }

  const taskId = submitData.request;
  console.log(`Task ID: ${taskId}`);

  // Poll for result
  await delay(20000);

  for (let i = 0; i < 30; i++) {
    const pollParams = new URLSearchParams({
      key: API_KEY,
      action: "get",
      id: taskId,
      json: "1",
    });

    const pollRes = await fetch(
      `https://ocr.captchaai.com/res.php?${pollParams}`
    );
    const pollData = await pollRes.json();

    if (pollData.status === 1) {
      return {
        token: pollData.request,
        userAgent: pollData.user_agent || "",
      };
    }

    if (pollData.request !== "CAPCHA_NOT_READY") {
      throw new Error(`Solve error: ${pollData.request}`);
    }

    await delay(5000);
  }

  throw new Error("Solve timed out");
}

(async () => {
  const { token, userAgent } = await solveRecaptchaV2Enterprise();
  console.log(`Token: ${token.substring(0, 60)}...`);
  if (userAgent) console.log(`User-Agent: ${userAgent}`);
})();

预期输出:

Task ID: 73849562810
Token: 03AGdBq24PBCqLmOx2V4pGHJjkR2xZ1r...
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)...

故障排除

错误 原因 处理方式
ERROR_WRONG_USER_KEY API 密钥格式无效 检查密钥是仪表板中的 32 个字符
ERROR_KEY_DOES_NOT_EXIST 找不到钥匙 验证密钥位于验证码网站
ERROR_ZERO_BALANCE 余额不足 为您的帐户充值
ERROR_BAD_TOKEN_OR_PAGEURL 站点密钥或 URL 错误 从企业锚点 URL 中提取正确的 k=
ERROR_CAPTCHA_UNSOLVABLE 无法解决 验证 sitekey 是否为 Enterprise v2,然后重试
令牌被网站拒绝 用户代理不匹配 使用求解响应中的 user_agent

常问问题

如何检测 Enterprise v2 与 Standard v2?

Enterprise v2 从脚本或锚点 URL 中的 /recaptcha/enterprise/ 加载。标准 v2 使用 /recaptcha/api2/

动作参数是必需的吗?

仅当锚点 URL 包含 sa= 时。如果不存在,请从您的 CaptchaAI 请求中省略它。

为什么目标站点拒绝我的令牌?

最常见的是:用户代理不匹配。 Enterprise v2 令牌绑定到求解器的用户代理。始终使用轮询响应中返回的 user_agent 值。

我可以将其与 Puppeteer 或 Playwright 一起使用吗?

是的。从页面中提取sitekey,通过API进行解析,然后将token注入到document.getElementById('g-recaptcha-response').innerHTML中。

典型的解决时间是多少?

15–30 秒,具体取决于服务器负载。


开始解决reCAPTCHA v2 Enterprise

获取您的 API 密钥:验证码网站并将 enterprise=1 添加到您的 v2 请求中。


相关指南

该文章已禁用评论。