Primeros Pasos

Migrar de CapMonster Cloud a CaptchaAI

CaptchaAI utiliza un formato API compatible que facilita el cambio desde CapMonster Cloud. La mayoría de las migraciones solo requieren cambiar la URL base y la clave API. Esta guía cubre los pasos exactos.


que cambia

Componente CapMonster Cloud CaptchaAI
Enviar URL https://api.capmonster.cloud/createTask https://ocr.captchaai.com/in.php
URL del resultado https://api.capmonster.cloud/getTaskResult https://ocr.captchaai.com/res.php
Parámetro de clave API clientKey key
formato API cuerpo JSON Codificado en formulario (o JSON)
Campo de identificación de tarea taskId request (en respuesta)
Campo de resultado Objeto solution request (cadena de token)

Migración rápida: cambiar dos líneas

Si su código utiliza un contenedor o SDK, la ruta más rápida es reemplazar la URL base y la clave:

# Before (CapMonster Cloud)
API_URL = "https://api.capmonster.cloud"
CLIENT_KEY = "your_capmonster_key"

# After (CaptchaAI)
SUBMIT_URL = "https://ocr.captchaai.com/in.php"
RESULT_URL = "https://ocr.captchaai.com/res.php"
API_KEY = "your_captchaai_key"

Migración completa: reCAPTCHA v2

Nube CapMonster (antes)

import requests
import time

resp = requests.post("https://api.capmonster.cloud/createTask", json={
    "clientKey": "CAPMONSTER_KEY",
    "task": {
        "type": "RecaptchaV2TaskProxyless",
        "websiteURL": "https://example.com",
        "websiteKey": "6Le-SITEKEY",
    }
}).json()
task_id = resp["taskId"]

while True:
    time.sleep(5)
    result = requests.post("https://api.capmonster.cloud/getTaskResult", json={
        "clientKey": "CAPMONSTER_KEY",
        "taskId": task_id,
    }).json()
    if result["status"] == "ready":
        token = result["solution"]["gRecaptchaResponse"]
        break

CaptchaAI (después)

import requests
import time

resp = requests.post("https://ocr.captchaai.com/in.php", data={
    "key": "YOUR_API_KEY",
    "method": "userrecaptcha",
    "googlekey": "6Le-SITEKEY",
    "pageurl": "https://example.com",
    "json": "1",
}).json()
task_id = resp["request"]

while True:
    time.sleep(5)
    result = requests.get("https://ocr.captchaai.com/res.php", params={
        "key": "YOUR_API_KEY",
        "action": "get",
        "id": task_id,
        "json": "1",
    }).json()
    if result["status"] == 1:
        token = result["request"]
        break
    if result["request"] != "CAPCHA_NOT_READY":
        raise Exception(result["request"])

Mapeo de parámetros

reCAPTCHA v2

CapMonster Cloud CaptchaAI
task.type: "RecaptchaV2TaskProxyless" method: "userrecaptcha"
task.websiteKey googlekey
task.websiteURL pageurl
task.isInvisible: true invisible: "1"

Cloudflare Turnstile

CapMonster Cloud CaptchaAI
task.type: "TurnstileTaskProxyless" method: "turnstile"
task.websiteKey sitekey
task.websiteURL pageurl

CAPTCHA de imagen

CapMonster Cloud CaptchaAI
task.type: "ImageToTextTask" method: "base64"
task.body body

Migración de JavaScript

Nube CapMonster (antes)

const axios = require('axios');

const resp = await axios.post('https://api.capmonster.cloud/createTask', {
  clientKey: 'CAPMONSTER_KEY',
  task: {
    type: 'RecaptchaV2TaskProxyless',
    websiteURL: 'https://example.com',
    websiteKey: '6Le-SITEKEY',
  }
});
const taskId = resp.data.taskId;

CaptchaAI (después)

const axios = require('axios');

const resp = await axios.post('https://ocr.captchaai.com/in.php', null, {
  params: {
    key: 'YOUR_API_KEY',
    method: 'userrecaptcha',
    googlekey: '6Le-SITEKEY',
    pageurl: 'https://example.com',
    json: 1,
  }
});
const taskId = resp.data.request;

Mapeo de códigos de error

CapMonster Cloud Equivalente a CaptchaAI
ERROR_KEY_DOES_NOT_EXIST ERROR_KEY_DOES_NOT_EXIST
ERROR_ZERO_BALANCE ERROR_ZERO_BALANCE
ERROR_RECAPTCHA_TIMEOUT ERROR_CAPTCHA_UNSOLVABLE
ERROR_NO_SLOT_AVAILABLE ERROR_NO_SLOT_AVAILABLE
CAPTCHA_NOT_READY CAPCHA_NOT_READY

Tenga en cuenta la diferencia ortográfica: CaptchaAI usa CAPCHA_NOT_READY (sin T).


Verificación de saldo

CapMonster Cloud

resp = requests.post("https://api.capmonster.cloud/getBalance", json={
    "clientKey": "CAPMONSTER_KEY"
}).json()
balance = resp["balance"]

CaptchaAI

resp = requests.get("https://ocr.captchaai.com/res.php", params={
    "key": "YOUR_API_KEY",
    "action": "getbalance",
    "json": "1",
}).json()
balance = float(resp["request"])

Lista de verificación de migración

  • [] Obtenga la clave API CaptchaAI decaptchaai.com
  • [] Reemplazar URL de envío: api.capmonster.cloud/createTaskocr.captchaai.com/in.php
  • [] Reemplazar URL del resultado: api.capmonster.cloud/getTaskResultocr.captchaai.com/res.php
  • [] Cambiar autenticación: clientKeykey
  • [] Cambiar formato de solicitud: objeto de tarea JSON parámetros codificados en formulario →
  • [] Actualizar análisis de respuesta: taskIdrequest, solution.gRecaptchaResponserequest
  • [] Manejo de errores de actualización: CAPTCHA_NOT_READYCAPCHA_NOT_READY
  • [] Pruebe con una única solución antes de cambiar el tráfico de producción

Preguntas frecuentes

¿Es CaptchaAI un reemplazo directo de CapMonster Cloud?

El formato de API difiere (codificado en formulario frente a JSON), pero los conceptos son los mismos. La migración suele tardar entre 15 y 30 minutos.

¿Puedo ejecutar ambos servicios simultáneamente durante la migración?

Sí. Enrute un porcentaje del tráfico a CaptchaAI mientras mantiene CapMonster Cloud como respaldo, luego cambie completamente una vez que haya validado los resultados.


Cambie a CaptchaAI y comience a resolver en minutos

Obtenga su clave API encaptchaai.com.


Guías relacionadas

Configuración recomendada para su pipeline

Use exactamente la misma configuración de navegador en todos sus entornos de QA, staging y CI. Esto evita que un test funcione en local y falle en CI sin razón aparente.

from selenium import webdriver

def make_driver(headless: bool = True) -> webdriver.Chrome:
    options = webdriver.ChromeOptions()
    if headless:
        options.add_argument('--headless=new')
    options.add_argument('--window-size=1280,800')
    options.add_argument('--lang=es-ES')
    return webdriver.Chrome(options=options)

Mantener viewport, idioma y user-agent por defecto idénticos en todos los runners reduce la varianza y facilita comparar resultados entre ejecuciones de su propio QA.

Cómo se integra CaptchaAI en su pipeline propio

El patrón de integración con CaptchaAI siempre es el mismo, independientemente del lenguaje o framework de pruebas que use:

  1. Su test detecta el widget de CAPTCHA en la página de su propia aplicación (formulario de QA, landing de staging, endpoint de preproducción).
  2. Su test envía a CaptchaAI los datos públicos del widget (sitekey, URL de la página, tipo de CAPTCHA).
  3. CaptchaAI devuelve un token válido para esa página.
  4. Su test inyecta ese token en el campo correspondiente y envía el formulario.
  5. Su backend verifica el token con el proveedor de CAPTCHA, exactamente igual que con un usuario real.

Este flujo se aplica únicamente a integraciones que usted controla. No se utiliza para sortear protecciones de sitios de terceros.

Métricas y observabilidad

Incluya métricas específicas para los pasos relacionados con CAPTCHA en sus pipelines de QA. Esto le permite detectar regresiones en su propia integración antes de que lleguen a producción:

  • Tiempo de resolución por intento — desde la solicitud a CaptchaAI hasta la entrega del token.
  • Tasa de éxito por endpoint propio — cuántas verificaciones backend pasan respecto al total de intentos.
  • Distribución de errores — agrupados por código (ERROR_*, timeouts internos, fallos de red).
  • Latencia extremo a extremo — incluyendo render de la página, resolución de CAPTCHA y respuesta de su backend.

Conserve trazas (logs, capturas, HAR) durante un período razonable para poder reproducir incidentes en su entorno QA cuando un test falle de forma intermitente.

Buenas prácticas en su entorno QA

  • Pruebe siempre sobre su propia aplicación o sobre entornos explícitamente autorizados.
  • Mantenga una API key de CaptchaAI separada para QA, distinta de la de producción, para no mezclar métricas.
  • Defina timeouts y reintentos razonables (backoff exponencial) para no acumular trabajos pendientes en CaptchaAI durante caídas.
  • Versione sus snapshots de configuración (sitekey, action, umbrales) junto al código de los tests.
  • Revise periódicamente el changelog de su proveedor de CAPTCHA para anticipar cambios que afecten a su propia integración.

Solución de problemas

Síntoma Acción recomendada
El test no detecta el widget Revise selectores y tiempos en su entorno staging
CaptchaAI devuelve ERROR_NO_SLOT_AVAILABLE Reintente con backoff en su pipeline interna
La validación backend rechaza el token Compare action/sitekey con su configuración real
El test funciona en local pero falla en CI Iguale viewport, idioma y user-agent en ambos entornos
Tiempos de resolución muy variables Revise concurrencia y límites de su API key de CaptchaAI

Valide sus integraciones CAPTCHA en entornos propios con CaptchaAI.

Los comentarios están deshabilitados para este artículo.