参考文档

从 AZCaptcha 迁移到 CaptchaAI:实用指南

AZCaptcha 和 CaptchaAI 均使用 2Captcha 兼容的 API 格式,使迁移变得简单。您将主要更改基本 URL 和 API 密钥 - 请求格式保持不变。

端点映射

行动 AZ验证码 CaptchaAI
提交任务 https://azcaptcha.com/in.php https://ocr.captchaai.com/in.php
得到结果 https://azcaptcha.com/res.php https://ocr.captchaai.com/res.php
检查余额 res.php?action=getbalance res.php?action=getbalance
报告不正确 res.php?action=reportbad res.php?action=reportbad

参数兼容性

大多数参数是相同的。主要区别:

范围 AZ验证码 CaptchaAI 笔记
key API密钥 API密钥 不同的密钥 — 在 captchaai.com 获取您的密钥
method userrecaptcha userrecaptcha 相同的
googlekey 站点密钥 站点密钥 相同的
pageurl 页面网址 页面网址 相同的
json 1 1 相同的
proxy user:pass@host:port user:pass@host:port 格式相同
proxytype HTTP/res.php HTTP/res.php 相同的

迁移步骤

第1步:获取CaptchaAI API密钥

  1. 注册于验证码网站
  2. 向您的账户添加资金
  3. 从仪表板复制您的 API 密钥

第 2 步:更新您的代码

Python — 之前 (AZCaptcha)

import requests

API_KEY = "your_azcaptcha_key"

def solve_recaptcha(sitekey, pageurl):
    # Submit
    resp = requests.post("https://azcaptcha.com/in.php", data={
        "key": API_KEY,
        "method": "userrecaptcha",
        "googlekey": sitekey,
        "pageurl": pageurl,
        "json": 1
    })
    data = resp.json()
    if data["status"] != 1:
        return {"error": data["request"]}

    captcha_id = data["request"]

    # Poll
    import time
    for _ in range(60):
        time.sleep(5)
        result = requests.get("https://azcaptcha.com/res.php", params={
            "key": API_KEY, "action": "get", "id": captcha_id, "json": 1
        }).json()
        if result["status"] == 1:
            return {"solution": result["request"]}
        if result["request"] != "CAPCHA_NOT_READY":
            return {"error": result["request"]}

    return {"error": "TIMEOUT"}

Python — 之后 (CaptchaAI)

import os
import time
import requests

API_KEY = os.environ["CAPTCHAAI_API_KEY"]  # Changed: use env var

def solve_recaptcha(sitekey, pageurl):
    # Submit — only URL changed
    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 — only URL changed
    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 — 之前 (AZCaptcha)

const axios = require("axios");
const API_KEY = "your_azcaptcha_key";

async function solveRecaptcha(sitekey, pageurl) {
  const submit = await axios.post("https://azcaptcha.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://azcaptcha.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" };
}

JavaScript — 之后 (CaptchaAI)

const axios = require("axios");
const API_KEY = process.env.CAPTCHAAI_API_KEY;  // Changed: env var

async function solveRecaptcha(sitekey, pageurl) {
  // Only URLs changed
  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" };
}

第 3 步:抽象提供者

为了更安全地迁移,请创建一个与提供者无关的包装器:

import os
import time
import requests


class CaptchaProvider:
    def __init__(self, base_url, api_key):
        self.submit_url = f"{base_url}/in.php"
        self.result_url = f"{base_url}/res.php"
        self.api_key = api_key
        self.session = requests.Session()

    def solve(self, sitekey, pageurl, method="userrecaptcha"):
        resp = self.session.post(self.submit_url, data={
            "key": self.api_key,
            "method": method,
            "googlekey": sitekey,
            "pageurl": pageurl,
            "json": 1
        })
        data = resp.json()
        if data.get("status") != 1:
            return {"error": data.get("request")}

        captcha_id = data["request"]
        for _ in range(60):
            time.sleep(5)
            result = self.session.get(self.result_url, params={
                "key": self.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"}


# Switch by changing one line:
# provider = CaptchaProvider("https://azcaptcha.com", "old_key")
provider = CaptchaProvider(
    "https://ocr.captchaai.com",
    os.environ["CAPTCHAAI_API_KEY"]
)

第四步:并行测试

同时运行两个提供程序进行比较:

def parallel_test(sitekey, pageurl, runs=10):
    azcaptcha = CaptchaProvider("https://azcaptcha.com", "old_key")
    captchaai = CaptchaProvider(
        "https://ocr.captchaai.com",
        os.environ["CAPTCHAAI_API_KEY"]
    )

    results = {"azcaptcha": [], "captchaai": []}

    for i in range(runs):
        start = time.time()
        az_result = azcaptcha.solve(sitekey, pageurl)
        results["azcaptcha"].append({
            "success": "solution" in az_result,
            "time": time.time() - start
        })

        start = time.time()
        cai_result = captchaai.solve(sitekey, pageurl)
        results["captchaai"].append({
            "success": "solution" in cai_result,
            "time": time.time() - start
        })

    for provider, data in results.items():
        successes = sum(1 for r in data if r["success"])
        avg_time = sum(r["time"] for r in data) / len(data)
        print(f"{provider}: {successes}/{runs} success, {avg_time:.1f}s avg")

迁移清单

地位
创建 CaptchaAI 账户并为其注入资金
替换所有文件中的基本 URL
更新 API 密钥(使用环境变量)
运行并行测试(10+ 解决方案)
比较成功率
比较求解时间
更新新端点的监控/alerting
切换生产流量
24小时监控
停用 AZCaptcha 密钥

故障排除

问题 原因 处理方式
ERROR_KEY_DOES_NOT_EXIST API 密钥错误 从仪表板验证 CaptchaAI API 密钥
ERROR_ZERO_BALANCE 新账户没有资金 在 captchaai.com 添加资金
不同的错误代码 错误代码的细微差别 地图错误代码;大多数是相同的
解决率不同 不同的求解器池 运行 50 多个测试解决方案以进行统计上有效的比较

常问问题

CaptchaAI 是 AZCaptcha 的直接替代品吗?

几乎。两者都使用兼容 2Captcha 的 API 格式。更改基本 URL 和 API 密钥 — 参数和响应格式相同。

我现有的代理配置可以工作吗?

是的。 CaptchaAI 使用相同的 proxyproxytype 参数。基于代理的解决方案无需进行任何更改。

迁移需要多长时间?

对于单个代码库,需要 15-30 分钟。其中大部分是使用搜索和替换更新基本 URL,并运行并行测试进行验证。

下一步

切换到更快、更可靠的验证码解决方案 —获取您的 CaptchaAI API 密钥并在几分钟内完成迁移。

相关指南:

该文章已禁用评论。