¿La API de CaptchaAI te devuelve un token que el sitio de destino rechaza, o errores que no cuadran con tu código? La respuesta suele estar en el cable: ver qué solicitud sale y qué respuesta llega. Charles Proxy se coloca entre tu script y la API, y te deja inspeccionar cada solicitud, respuesta y detalle de timing. Aquí lo configuras y diagnosticas los fallos más comunes sin adivinar. Todo gira en torno a dos endpoints: /in.php (envío) y /res.php (sondeo).
Configurar Charles Proxy para inspeccionar la API
1. Instalar Charles Proxy
Descarga Charles desde charlesproxy.com. Funciona en Windows, macOS y Linux.
2. Activar el proxy SSL para el tráfico HTTPS
La API de CaptchaAI usa HTTPS; sin proxy SSL solo verás bytes cifrados. Para descifrar el tráfico:
- Proxy → SSL Proxying Settings → Add
- Host:
ocr.captchaai.com, puerto:443 - Help → SSL Proxying → Install Charles Root Certificate
- Marca el certificado como de confianza en tu sistema operativo
3. Apuntar tu código al proxy
Charles escucha en localhost:8888 de forma predeterminada. Configura tu cliente HTTP para que salga por ahí:
Python:
import requests
proxies = {
"http": "http://localhost:8888",
"https": "http://localhost:8888",
}
# Disable SSL verification for Charles (development only)
resp = requests.post(
"https://ocr.captchaai.com/in.php",
data={"key": "YOUR_API_KEY", "method": "userrecaptcha", "json": "1"},
proxies=proxies,
verify=False,
)
Node.js:
const axios = require('axios');
const HttpsProxyAgent = require('https-proxy-agent');
const agent = new HttpsProxyAgent('http://localhost:8888');
const resp = await axios.post('https://ocr.captchaai.com/in.php', null, {
params: { key: 'YOUR_API_KEY', method: 'userrecaptcha', json: 1 },
httpsAgent: agent,
});
Descartar los fallos del propio proxy
Antes de culpar a la API, confirma que Charles captura y descifra el tráfico. Los tropiezos de configuración más habituales:
| Problema | Causa | Solución |
|---|---|---|
| Errores SSL en el código | El certificado de Charles no es de confianza | Instala el certificado raíz de Charles; usa verify=False en desarrollo |
| No se ve ninguna solicitud | El código no usa el proxy | Configura el proxy en requests/axios |
| Respuesta HTTPS ilegible | El proxy SSL no está activado | Añade ocr.captchaai.com a SSL Proxying Settings |
| Charles ralentiza las solicitudes | Hay breakpoints activos | Desactiva los breakpoints cuando no los necesites |
Diagnosticar los fallos más frecuentes
ERROR_WRONG_GOOGLEKEY: el sitekey llega vacío
En el cuerpo de la solicitud de envío, busca el campo googlekey:
# What Charles shows:
key=YOUR_API_KEY&method=userrecaptcha&googlekey=&pageurl=https://example.com&json=1
^^^^^^^^ empty!
La causa está aguas arriba: la extracción del sitekey falló y enviaste un valor vacío. Revisa el código que lo obtiene de la página.
Es un caso habitual en QA de portales de cita previa —visados BLS, trámites del SAT o de AFIP—: funciona en local, pero en el servidor el token se rechaza porque el selector del sitekey cambió, y Charles lo revela al instante.
Las solicitudes nunca se resuelven
Usa la vista Sequence para ver el ritmo de las consultas:
POST /in.php → 234ms ✓
GET /res.php → 189ms (CAPCHA_NOT_READY)
GET /res.php → 201ms (CAPCHA_NOT_READY)
GET /res.php → 195ms (CAPCHA_NOT_READY)
... 23 more ...
GET /res.php → 188ms (CAPCHA_NOT_READY) ← never resolves
Si nunca llega el status: 1, revisa que el sitekey y la URL de la página sean los correctos.
El sitio de destino rechaza el token
Compara lo que devolvió CaptchaAI con lo que estás inyectando:
- En Charles, localiza la respuesta de
/res.phpconstatus: 1 - Copia el token completo del campo
request - Busca la solicitud posterior al sitio de destino
- Comprueba que el token viaje en el cuerpo del formulario como
g-recaptcha-response
Referencia: qué debe contener cada solicitud
Cuando un fallo no encaje con los anteriores, contrasta la solicitud campo por campo contra esta referencia.
La solicitud de envío (POST /in.php)
| Pestaña | Qué comprobar |
|---|---|
| Request → Cabeceras | El Content-Type es el correcto |
| Request → Cuerpo | Están todos los parámetros obligatorios |
| Response → Cuerpo | {"status":1,"request":"TASK_ID"} cuando hay éxito |
| Timing | Duración de la solicitud (debe ser <1 s) |
La solicitud de sondeo (GET /res.php)
| Elemento | Qué comprobar |
|---|---|
| Parámetros | key, action=get, id=TASK_ID |
| Respuesta | CAPCHA_NOT_READY (sigue sondeando) o {"status":1,"request":"TOKEN"} |
| Timing | Cada consulta seguida de tu intervalo de espera |
Funciones de Charles útiles para depurar CAPTCHA
Estas tres funciones aceleran la depuración:
| Función | Para qué sirve | Cómo activarla |
|---|---|---|
| Repeat | Reenviar una solicitud sin relanzar el script | Clic derecho en la solicitud → Repeat |
| Breakpoints | Editar los parámetros antes de enviar la solicitud | Proxy → Breakpoint Settings → Add, host ocr.captchaai.com, ruta /in.php, marca Request |
| Throttle | Simular redes lentas y probar tus tiempos de espera | Proxy → Throttle Settings → Enable, elige 3G o EDGE |
Mapa local: simular respuestas sin gastar créditos
Sustituye las respuestas de la API por archivos locales para tus pruebas:
- Tools → Map Local → Add
- Asigna
https://ocr.captchaai.com/res.phpa un archivo JSON local - Crea
mock_response.json:
{"status": 1, "request": "mock_token_for_testing"}
Así pruebas la inyección de token sin consumir créditos de la API.
Alternativas a Charles Proxy
Charles es de pago (con prueba gratuita). Otras opciones cumplen la misma función:
| Herramienta | Plataforma | HTTPS | Costo |
|---|---|---|---|
| Charles Proxy | Win/Mac/Linux | Requiere instalar certificado | De pago (prueba gratuita) |
| mitmproxy | Win/Mac/Linux | Requiere instalar certificado | Gratis |
| Fiddler | Windows | Descifrado HTTPS integrado | Gratis |
| Proxyman | macOS | HTTPS con un clic | Freemium |
Configuración rápida de mitmproxy
# Install
pip install mitmproxy
# Run
mitmproxy --listen-port 8080
# Configure Python
proxies = {"https": "http://localhost:8080"}
Preguntas frecuentes
¿Por qué necesito activar el proxy SSL para ver el tráfico?
Porque la API usa HTTPS. Sin proxy SSL, Charles solo muestra datos cifrados; con el certificado raíz instalado y ocr.captchaai.com en SSL Proxying Settings, ves cada solicitud en claro.
¿Puedo inspeccionar el tráfico de Selenium o Puppeteer, no solo de la API?
Sí. Cualquier cliente que acepte un proxy explícito —requests, axios, Selenium, Puppeteer— se enruta por Charles apuntándolo a localhost:8888.
¿Es seguro dejar verify=False en el código?
No. verify=False desactiva la verificación del certificado TLS; solo tiene sentido mientras depuras en local. En producción, quítalo.
¿Qué alternativa gratuita a Charles me sirve para lo mismo?
mitmproxy y Fiddler. Ambas descifran HTTPS tras instalar su certificado raíz; mitmproxy además corre en Windows, macOS y Linux desde la terminal, ideal para servidores sin interfaz gráfica.
Guías relacionadas
- Registro estructurado para operaciones de CAPTCHA
- Referencia de códigos de error de CaptchaAI
- Colección Postman para probar la API de CaptchaAI