Reference

从 NextCaptcha 迁移到 CaptchaAI:实用指南

NextCaptcha 使用基于 JSON 的 REST API 以及 /createTask/getTaskResult 端点。 CaptchaAI 使用广泛采用的 in.php/res.php 格式。本指南涵盖了两个 API 之间的精确映射。

端点映射

行动 下一步验证码 CaptchaAI
提交任务 POST /createTask POST https://ocr.captchaai.com/in.php
得到结果 POST /getTaskResult GET https://ocr.captchaai.com/res.php
检查余额 POST /getBalance GET res.php?action=getbalance&key=KEY

请求结构差异

Next验证码提交(JSON 正文)

{
  "clientKey": "next_captcha_key",
  "task": {
    "type": "RecaptchaV2TaskProxyless",
    "websiteURL": "https://example.com",
    "websiteKey": "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-"
  }
}

CaptchaAI 提交(表单参数)

POST https://ocr.captchaai.com/in.php
key=YOUR_API_KEY&method=userrecaptcha&googlekey=6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-&pageurl=https://example.com&json=1

参数翻译

下一个验证码字段 CaptchaAI 字段 笔记
clientKey key API密钥
task.type method 请参阅下面的类型映射
task.websiteURL pageurl 目标页面网址
task.websiteKey googlekeysitekey 令牌验证码的站点密钥
task.recaptchaDataSValue data-s reCAPTCHA data-s 参数
task.isInvisible invisible=1 不可见的 reCAPTCHA 标志
task.pageAction action reCAPTCHA v3 行动
taskId id 用于轮询的任务/captcha ID

任务类型映射

下一个验证码类型 CaptchaAI 方法 + 参数
RecaptchaV2TaskProxyless method=userrecaptcha
RecaptchaV2Task method=userrecaptcha + proxy, proxytype
HCaptchaTaskProxyless method=hcaptcha
HCaptchaTask method=hcaptcha + proxy, proxytype
ImageToTextTask method=base64 + body
TurnstileTaskProxyless method=turnstile

代码迁移

Python — 之前 (NextCaptcha)

import requests
import time

CLIENT_KEY = "your_nextcaptcha_key"
BASE_URL = "https://api.nextcaptcha.com"

def solve_recaptcha_v2(sitekey, pageurl):
    # Submit
    resp = requests.post(f"{BASE_URL}/createTask", json={
        "clientKey": CLIENT_KEY,
        "task": {
            "type": "RecaptchaV2TaskProxyless",
            "websiteURL": pageurl,
            "websiteKey": sitekey
        }
    })
    data = resp.json()
    if data.get("errorId") != 0:
        return {"error": data.get("errorDescription")}

    task_id = data["taskId"]

    # Poll
    for _ in range(60):
        time.sleep(5)
        result = requests.post(f"{BASE_URL}/getTaskResult", json={
            "clientKey": CLIENT_KEY,
            "taskId": task_id
        }).json()
        if result.get("status") == "ready":
            return {"solution": result["solution"]["gRecaptchaResponse"]}
        if result.get("errorId") != 0:
            return {"error": result.get("errorDescription")}

    return {"error": "TIMEOUT"}

Python — 之后 (CaptchaAI)

import os
import time
import requests

API_KEY = os.environ["CAPTCHAAI_API_KEY"]

def solve_recaptcha_v2(sitekey, pageurl):
    # Submit — different endpoint and format
    resp = requests.post("https://ocr.captchaai.com/in.php", data={
        "key": API_KEY,
        "method": "userrecaptcha",
        "googlekey": sitekey,
        "pageurl": pageurl,
        "json": 1
    })
    data = resp.json()
    if data.get("status") != 1:
        return {"error": data.get("request")}

    captcha_id = data["request"]

    # Poll — GET instead of POST, different response format
    for _ in range(60):
        time.sleep(5)
        result = requests.get("https://ocr.captchaai.com/res.php", params={
            "key": API_KEY,
            "action": "get",
            "id": captcha_id,
            "json": 1
        }).json()
        if result.get("status") == 1:
            return {"solution": result["request"]}
        if result.get("request") != "CAPCHA_NOT_READY":
            return {"error": result.get("request")}

    return {"error": "TIMEOUT"}

JavaScript — 之前 (NextCaptcha)

const axios = require("axios");
const CLIENT_KEY = "your_nextcaptcha_key";
const BASE_URL = "https://api.nextcaptcha.com";

async function solveRecaptchaV2(sitekey, pageurl) {
  const submit = await axios.post(`${BASE_URL}/createTask`, {
    clientKey: CLIENT_KEY,
    task: {
      type: "RecaptchaV2TaskProxyless",
      websiteURL: pageurl,
      websiteKey: sitekey,
    },
  });
  if (submit.data.errorId !== 0) return { error: submit.data.errorDescription };

  const taskId = submit.data.taskId;

  for (let i = 0; i < 60; i++) {
    await new Promise((r) => setTimeout(r, 5000));
    const poll = await axios.post(`${BASE_URL}/getTaskResult`, {
      clientKey: CLIENT_KEY,
      taskId,
    });
    if (poll.data.status === "ready") return { solution: poll.data.solution.gRecaptchaResponse };
    if (poll.data.errorId !== 0) return { error: poll.data.errorDescription };
  }
  return { error: "TIMEOUT" };
}

JavaScript — 之后 (CaptchaAI)

const axios = require("axios");
const API_KEY = process.env.CAPTCHAAI_API_KEY;

async function solveRecaptchaV2(sitekey, pageurl) {
  const submit = await axios.post("https://ocr.captchaai.com/in.php", null, {
    params: { key: API_KEY, method: "userrecaptcha", googlekey: sitekey, pageurl, json: 1 },
  });
  if (submit.data.status !== 1) return { error: submit.data.request };

  const captchaId = submit.data.request;

  for (let i = 0; i < 60; i++) {
    await new Promise((r) => setTimeout(r, 5000));
    const poll = await axios.get("https://ocr.captchaai.com/res.php", {
      params: { key: API_KEY, action: "get", id: captchaId, json: 1 },
    });
    if (poll.data.status === 1) return { solution: poll.data.request };
    if (poll.data.request !== "CAPCHA_NOT_READY") return { error: poll.data.request };
  }
  return { error: "TIMEOUT" };
}

响应格式差异

提交回复

场地 下一步验证码 CaptchaAI
成功检查 errorId === 0 status === 1
任务编号 taskId(整数) request(字符串)
错误信息 errorDescription request(错误代码字符串)

民意调查回应

场地 下一步验证码 CaptchaAI
准备好检查 status === "ready" status === 1
还没准备好 status === "processing" request === "CAPCHA_NOT_READY"
解决方案 solution.gRecaptchaResponse request
错误 errorDescription request(错误代码)

迁移清单

地位
创建CaptchaAI账户并充值
将所有 createTask 类型映射到 CaptchaAI 方法
clientKey 替换为 CaptchaAI API 密钥
将 JSON 主体 POST 提交更新为表单 POST
使用查询参数将轮询从 POST 更新为 GET
更新响应解析(status/request格式)
运行并行比较测试
切断生产流量

故障排除

问题 原因 处理方式
ERROR_KEY_DOES_NOT_EXIST 使用 NextCaptcha clientKey 替换为 CaptchaAI API 密钥
响应解析中断 不同的 JSON 结构 更新以检查 status(整数)和 request 字段
ERROR_WRONG_USER_KEY API 密钥格式错误 从 CaptchaAI 仪表板验证密钥格式
无法识别任务类型 使用 NextCaptcha 类型名称 映射到 CaptchaAI method 值(参见上表)

常问问题

NextCaptcha 使用 JSON POST 处理所有事情。 CaptchaAI 是否需要表单编码数据?

CaptchaAI 接受表单编码 (application/x-www-form-urlencoded) 和 JSON 请求。 in.php 端点使用表单数据,轮询使用简单的 GET 参数。

迁移期间如何处理代理任务?

在 NextCaptcha 中,代理任务使用 RecaptchaV2Task 等类型名称。在CaptchaAI中,将proxy=user:pass@host:portproxytype=HTTP参数添加到相同的方法中。

回调/webhook 支持怎么样?

CaptchaAI 支持 pingback 参数 - 提供 URL,CaptchaAI 将在准备好后发布结果,类似于 NextCaptcha 的回调功能。

下一步

使用 CaptchaAI 获得更快的求解时间 —创建您的帐户并在几分钟内切换您的集成。

相关指南:

该文章已禁用评论。