AZCaptcha y CaptchaAI utilizan un formato API compatible con 2Captcha, lo que facilita la migración. Básicamente, cambiará la URL base y la clave API; el formato de solicitud sigue siendo el mismo.
Mapeo de puntos finales
| acción | AZCaptcha | CaptchaAI |
|---|---|---|
| Enviar tarea | https://azcaptcha.com/in.php |
https://ocr.captchaai.com/in.php |
| Obtener resultado | https://azcaptcha.com/res.php |
https://ocr.captchaai.com/res.php |
| Consultar saldo | res.php?action=getbalance |
res.php?action=getbalance |
| Informe incorrecto | res.php?action=reportbad |
res.php?action=reportbad |
Compatibilidad de parámetros
La mayoría de los parámetros son idénticos. Diferencias clave:
| Parámetro | AZCaptcha | CaptchaAI | Notas |
|---|---|---|---|
key |
clave API | clave API | Clave diferente: consigue la tuya en captchaai.com |
method |
userrecaptcha |
userrecaptcha |
Lo mismo |
googlekey |
Clave del sitio | Clave del sitio | Lo mismo |
pageurl |
URL de la página | URL de la página | Lo mismo |
json |
1 |
1 |
Lo mismo |
proxy |
user:pass@host:port |
user:pass@host:port |
Mismo formato |
proxytype |
HTTP/SOCKS5 |
HTTP/SOCKS5 |
Lo mismo |
Pasos de migración
Paso 1: Obtenga la clave API CaptchaAI
- Regístrese encaptchaai.com
- Agregue fondos a su cuenta
- Copie su clave API desde el panel
Paso 2: actualice su código
Python - Antes (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 - Después (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: antes (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: después (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" };
}
Paso 3: abstraer al proveedor
Para una migración más segura, cree un contenedor independiente del proveedor:
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"]
)
Paso 4: prueba paralela
Ejecute ambos proveedores simultáneamente para comparar:
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")
Lista de verificación de migración
| paso | Estado |
|---|---|
| Cree una cuenta CaptchaAI y deposite fondos | ☐ |
| Reemplazar la URL base en todos los archivos | ☐ |
| Actualizar clave API (use env var) | ☐ |
| Ejecutar prueba paralela (más de 10 soluciones) | ☐ |
| Comparar tasas de éxito | ☐ |
| Comparar tiempos de resolución | ☐ |
| Actualizar el monitoreo/alerting para nuevos puntos finales | ☐ |
| Cambiar el tráfico de producción | ☐ |
| Monitorear durante 24 horas | ☐ |
| Clave AZCaptcha de desmantelamiento | ☐ |
Solución de problemas
| Problema | causa | Solución |
|---|---|---|
ERROR_KEY_DOES_NOT_EXIST |
Clave API incorrecta | Verifique la clave API CaptchaAI desde el panel |
ERROR_ZERO_BALANCE |
No hay fondos en la cuenta nueva | Agregue fondos en captchaai.com |
| Diferentes códigos de error | Diferencias menores de códigos de error | Códigos de error del mapa; la mayoría son idénticas |
| La tasa de resolución difiere | Diferentes grupos de solucionadores | Ejecute más de 50 soluciones de prueba para una comparación estadísticamente válida |
Preguntas frecuentes
¿Es CaptchaAI un reemplazo directo de AZCaptcha?
Casi. Ambos utilizan el formato API compatible con 2Captcha. Cambie la URL base y la clave API: los parámetros y el formato de respuesta son los mismos.
¿Funcionará mi configuración de proxy existente?
Sí. CaptchaAI utiliza los mismos parámetros proxy y proxytype. No se necesitan cambios para la resolución basada en proxy.
¿Cuánto tiempo dura la migración?
Para una única base de código, entre 15 y 30 minutos. La mayor parte consiste en actualizar la URL base con búsqueda y reemplazo, además de ejecutar una prueba paralela para verificar.
Próximos pasos
Cambie a una resolución CAPTCHA más rápida y confiable:obtenga su clave API CaptchaAIy migrar en minutos.
Guías relacionadas:
- Mapeo de puntos finales API
- Pruebas de ejecución paralela
- Por qué Teams cambia de proveedor