Tutoriales de API

Optimización de latencia API CaptchaAI: resoluciones más rápidas

Una resolución CAPTCHA tiene cuatro componentes de latencia: envío de solicitud, espera en cola, ejecución del solucionador y recuperación de sondeo. No puedes controlar el tiempo de ejecución del solucionador, pero puedes optimizar todo lo demás.


Latencia inicial por tipo CAPTCHA

tipo CAPTCHA Tiempo típico de resolución Lo mejor posible
Imagen/OCR 2-5 segundos 1-3 segundos
reCAPTCHA v2 15-30s 10-20s
reCAPTCHA v3 10-20s 8-15s
Cloudflare Turnstile 10-25 segundos 8-15s
GeeTest v3 15-30s 10-20s

La columna "lo mejor que se puede lograr" refleja lo que se obtiene después de aplicar las optimizaciones siguientes.


1. Optimice los intervalos de consulta

El intervalo de sondeo predeterminado de 5 segundos hace perder tiempo cuando se completa la resolución entre sondeos. Utilice el sondeo adaptativo: comience rápido y luego retroceda:

pitón

import time
import requests

API_KEY = "YOUR_API_KEY"
RESULT_URL = "https://ocr.captchaai.com/res.php"

def adaptive_poll(task_id, timeout=120):
    """Start polling at 3s, increase to 5s after 4 polls."""
    start = time.time()
    interval = 3  # start aggressive
    polls = 0

    while time.time() - start < timeout:
        time.sleep(interval)
        polls += 1

        resp = requests.get(RESULT_URL, params={
            "key": API_KEY, "action": "get",
            "id": task_id, "json": "1"
        }).json()

        if resp["status"] == 1:
            elapsed = time.time() - start
            print(f"Solved in {elapsed:.1f}s ({polls} polls)")
            return resp["request"]

        if resp["request"] != "CAPCHA_NOT_READY":
            raise Exception(resp["request"])

        # Back off after initial fast polls
        if polls >= 4:
            interval = 5

    raise TimeoutError(f"Task {task_id} timed out")

javascript

async function adaptivePoll(taskId, apiKey, timeout = 120000) {
  const start = Date.now();
  let interval = 3000;
  let polls = 0;

  while (Date.now() - start < timeout) {
    await new Promise(r => setTimeout(r, interval));
    polls++;

    const resp = await fetch(
      `https://ocr.captchaai.com/res.php?key=${apiKey}&action=get&id=${taskId}&json=1`
    );
    const data = await resp.json();

    if (data.status === 1) {
      console.log(`Solved in ${((Date.now() - start) / 1000).toFixed(1)}s (${polls} polls)`);
      return data.request;
    }
    if (data.request !== 'CAPCHA_NOT_READY') {
      throw new Error(data.request);
    }

    if (polls >= 4) interval = 5000;
  }
  throw new Error(`Task ${taskId} timed out`);
}

Ahorra entre 1 y 4 segundos en promedio en comparación con un intervalo fijo de 5 segundos.


2. Agrupación de conexiones

Reutilice las conexiones HTTP en lugar de abrir otras nuevas para cada consulta:

pitón

session = requests.Session()
# Use session.get() and session.post() instead of requests.get/post
# The session reuses TCP connections automatically

JavaScript (Node.js)

const { Agent } = require('http');
const axios = require('axios');

const client = axios.create({
  httpAgent: new Agent({ keepAlive: true, maxSockets: 10 }),
  timeout: 10000,
});
// Use client.get() and client.post() for all API calls

Ahorra entre 50 y 100 ms por solicitud omitiendo los apretones de manos TCP/TLS.


3. Captura previa de CAPTCHA

Envíe las tareas CAPTCHA antes de necesitar los tokens. Mientras su raspador procesa la página N, envíe el CAPTCHA para la página N+1:

from concurrent.futures import ThreadPoolExecutor

SUBMIT_URL = "https://ocr.captchaai.com/in.php"

def prefetch_submit(sitekey, page_url):
    resp = session.post(SUBMIT_URL, data={
        "key": API_KEY,
        "method": "userrecaptcha",
        "googlekey": sitekey,
        "pageurl": page_url,
        "json": "1",
    })
    data = resp.json()
    if data["status"] == 1:
        return data["request"]
    raise Exception(data["request"])

# Submit next page's CAPTCHA while processing current page
with ThreadPoolExecutor(max_workers=2) as pool:
    # Submit CAPTCHA for page 2 while processing page 1
    future_task = pool.submit(prefetch_submit, "6Le-SITEKEY", "https://example.com/page/2")

    # Process page 1...
    process_page(current_data)

    # Now get the pre-submitted task ID and poll
    task_id = future_task.result()
    token = adaptive_poll(task_id)

Elimina el tiempo de espera total al superponer la resolución con el procesamiento.


4. Utilice el método CAPTCHA correcto

CaptchaAI a veces admite métodos más rápidos para escenarios específicos:

Escenario método lento Alternativa más rápida
reCAPTCHA v2 con devolución de llamada conocida userrecaptcha + consulta userrecaptcha con pingback (URL de devolución de llamada)
CAPTCHA del texto de la imagen base64 con alta resolución base64 con numeric=1 si solo dígitos
reCAPTCHA v3 Predeterminado min_score Establezca min_score en el umbral real necesario (más bajo = más rápido)

5. Omita el proxy cuando no sea necesario

El enrutamiento proxy agrega latencia. Solo envíe parámetros de proxy cuando el sitio de destino requiera solicitudes de IP específicas:

# Without proxy — faster for most use cases
data = {
    "key": API_KEY,
    "method": "userrecaptcha",
    "googlekey": sitekey,
    "pageurl": page_url,
    "json": "1",
}

# With proxy — only when required
data["proxy"] = "user:pass@1.2.3.4:8080"
data["proxytype"] = "HTTP"

6. Utilice URL de devolución de llamada en lugar de consultas

Elimine el sondeo por completo con el parámetro pingback:

resp = session.post(SUBMIT_URL, data={
    "key": API_KEY,
    "method": "userrecaptcha",
    "googlekey": sitekey,
    "pageurl": page_url,
    "json": "1",
    "pingback": "https://your-server.com/captcha-callback",
})

CaptchaAI envía el resultado a su URL cuando se completa la resolución. No se necesita ningún bucle de votación. Este es el método de recuperación más rápido.


7. Compare sus optimizaciones

import statistics

def benchmark(solve_func, iterations=20):
    times = []
    for i in range(iterations):
        start = time.time()
        try:
            solve_func()
            times.append(time.time() - start)
        except Exception:
            pass

    if times:
        print(f"Samples: {len(times)}/{iterations}")
        print(f"Mean:    {statistics.mean(times):.1f}s")
        print(f"Median:  {statistics.median(times):.1f}s")
        print(f"P95:     {sorted(times)[int(len(times)*0.95)]:.1f}s")
        print(f"Min:     {min(times):.1f}s")
        print(f"Max:     {max(times):.1f}s")

Solución de problemas

problema causa Solución
Latencia de consulta sin cambios Sigo usando requests.get() sin sesión Cambiar a session.get()
Los tokens de captación previa caducan antes de su uso El procesamiento lleva demasiado tiempo Reducir la ventana de captación previa o enviar cuando se acerque el uso
La URL de devolución de llamada nunca recibe datos Servidor no accesible desde CaptchaAI Asegúrese de que la URL sea pública y corrija las reglas del firewall
Un sondeo más rápido provoca límites de tarifas Sondeo demasiado agresivo (< 2 s) Mantenga el intervalo mínimo en 3 segundos.

Preguntas frecuentes

¿Cuál es la mayor optimización individual?

Precarga. Superpone el tiempo de resolución con el tiempo de procesamiento, lo que reduce efectivamente la latencia percibida a casi cero para flujos de trabajo secuenciales.

¿Ayuda el sondeo adaptativo para los CAPTCHA de imágenes?

Menos aún. Los CAPTCHA de imágenes se resuelven en 2 a 5 segundos, por lo que la primera consulta a los 3 segundos a menudo los detecta. La mejora es más notable para reCAPTCHA (15-30 segundos).


Obtener las resoluciones CAPTCHA más rápidas con CaptchaAI

Obtén tu clave API en captchaai.com.


Guías relacionadas

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