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密钥
- 注册于验证码网站
- 向您的账户添加资金
- 从仪表板复制您的 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 使用相同的 proxy 和 proxytype 参数。基于代理的解决方案无需进行任何更改。
迁移需要多长时间?
对于单个代码库,需要 15-30 分钟。其中大部分是使用搜索和替换更新基本 URL,并运行并行测试进行验证。
下一步
切换到更快、更可靠的验证码解决方案 —获取您的 CaptchaAI API 密钥并在几分钟内完成迁移。
相关指南: