Reference

Comparando tempos de resolução de CAPTCHA entre tipos com CaptchaAI

Quanto tempo leva para resolver um CAPTCHA pela API da CaptchaAI? Depende do tipo: um Cloudflare Turnstile fecha em menos de 10 segundos, enquanto um reCAPTCHA v2 completo pode chegar ao teto de SLA de 60 segundos. Multiplique essa diferença por milhares de tarefas e ela decide se o seu pipeline fica dentro do orçamento de tempo. Este guia reúne benchmarks reproduzíveis para cada tipo que a CaptchaAI suporta, com mediana, P90, P99 e os scripts para medir no seu próprio ambiente.

Quanto tempo cada tipo de CAPTCHA leva para resolver

Os números vêm de uma amostra interna de 100 soluções consecutivas por tipo, do envio à API até a recuperação do resultado. Teto do SLA é o limite contratual; Mediana, P90 e P99 refletem o comportamento em produção. Os resultados variam conforme ambiente, volume e horário — use como ponto de partida.

Tipo de CAPTCHA Teto do SLA Mediana P90 P99 Taxa de sucesso
reCAPTCHA v2 <60 s 12–18 s 25 s 40 s Alta
reCAPTCHA v2 Invisível <30 s 10–15 s 20 s 28 s Alta
reCAPTCHA v3 <4 s 1–3 s 3 s 4 s Alta
reCAPTCHA Enterprise <60 s 15–25 s 35 s 50 s Alta
Cloudflare Turnstile <10 s 4–8 s 9 s 10 s Alta
GeeTest v3 <12 s 6–10 s 11 s 12 s Alta
Imagem/OCR <0,5 s 0,2–0,4 s 0,5 s 0,8 s Alta
BLS CAPTCHA <1 s 0,3–0,7 s 0,9 s 1 s Alta

Os tempos variam de acordo com a qualidade do proxy, a carga do servidor e a complexidade do desafio. O teto do SLA é o limite contratual — se você observar tempos consistentemente acima dele, abra um chamado de suporte.

Como interpretar mediana, P90 e P99

  • Mediana — a experiência típica; use para planejamento de capacidade.
  • P90 — o "pior caso" em 9 de cada 10 soluções; use como timeout padrão.
  • P99 — o caso extremo; defina o timeout máximo acima desse valor, com um buffer de 20% para variação de rede.

Intervalos de polling recomendados por tipo

Com base nos benchmarks acima, ajuste o polling por tipo de CAPTCHA:

Tipo de CAPTCHA Espera inicial Intervalo de polling Máximo de tentativas
Imagem/OCR 5 s 3 s 15
Cloudflare Turnstile 5 s 3 s 15
BLS CAPTCHA 5 s 3 s 15
reCAPTCHA v2 15 s 5 s 20
reCAPTCHA v3 10 s 5 s 20
GeeTest v3 12 s 5 s 20
reCAPTCHA Enterprise 15 s 5 s 25

O que influencia o tempo de resolução

  • Latência de rede até a API — um RTT de 200 ms adiciona cerca de 1 s ao total (envio + 3–4 consultas de polling × 200 ms). Se sua operação está no Brasil, rodar os workers perto do destino — por exemplo em AWS sa-east-1 (São Paulo) — reduz esse custo fixo.
  • Qualidade do proxy — proxies residenciais costumam produzir soluções com menor latência do que proxies de datacenter, porque disparam menos desafios secundários.
  • Complexidade do desafio — desafios de imagem do reCAPTCHA v2 variam em dificuldade: "selecione os semáforos" com imagens desbotadas leva mais tempo do que uma simples verificação de caixa.
  • Estratégia de polling — polling agressivo (a cada 2 s) detecta o resultado mais rápido, mas aumenta as chamadas à API; polling conservador (a cada 10 s) reduz a carga, mas adiciona latência percebida.

Script Python para medir o tempo de resolução

# benchmark_captchaai.py
import os
import time
import statistics
import requests

API_KEY = os.environ.get("CAPTCHAAI_KEY", "YOUR_API_KEY")

def benchmark_solve(method, params, runs=10):
    """Benchmark a CAPTCHA type over multiple runs."""
    times = []
    successes = 0

    for i in range(runs):
        start = time.time()

        # Submit
        submit_params = {"key": API_KEY, "json": "1", **params}
        resp = requests.get("https://ocr.captchaai.com/in.php",
                            params=submit_params)
        result = resp.json()

        if result.get("status") != 1:
            print(f"  Run {i+1}: Submit failed - {result.get('request')}")
            continue

        task_id = result["request"]

        # Poll
        time.sleep(10)
        solved = False
        for _ in range(30):
            poll = requests.get("https://ocr.captchaai.com/res.php", params={
                "key": API_KEY, "action": "get",
                "id": task_id, "json": "1",
            })
            poll_result = poll.json()

            if poll_result.get("status") == 1:
                elapsed = time.time() - start
                times.append(elapsed)
                successes += 1
                solved = True
                print(f"  Run {i+1}: {elapsed:.1f}s")
                break
            if poll_result.get("request") != "CAPCHA_NOT_READY":
                print(f"  Run {i+1}: Error - {poll_result.get('request')}")
                break

            time.sleep(5)

        if not solved and poll_result.get("request") == "CAPCHA_NOT_READY":
            print(f"  Run {i+1}: Timeout")

    if times:
        return {
            "runs": runs,
            "successes": successes,
            "success_rate": f"{successes/runs*100:.0f}%",
            "median": f"{statistics.median(times):.1f}s",
            "p90": f"{sorted(times)[int(len(times)*0.9)]:.1f}s" if len(times) >= 10 else "N/A",
            "min": f"{min(times):.1f}s",
            "max": f"{max(times):.1f}s",
        }
    return {"error": "No successful solves"}

# Benchmark reCAPTCHA v2
print("=== reCAPTCHA v2 ===")
recaptcha_v2 = benchmark_solve("userrecaptcha", {
    "method": "userrecaptcha",
    "googlekey": "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-",
    "pageurl": "https://www.google.com/recaptcha/api2/demo",
})
print(recaptcha_v2)

# Benchmark Image/OCR
print("\n=== Image CAPTCHA ===")
# Submit a base64-encoded test image
import base64
# Use a test image for benchmarking
image_result = benchmark_solve("post", {
    "method": "base64",
    "body": "BASE64_ENCODED_CAPTCHA_IMAGE",
})
print(image_result)

Script Node.js para medir o tempo de resolução

// benchmark_captchaai.js
const axios = require('axios');

const API_KEY = process.env.CAPTCHAAI_KEY || 'YOUR_API_KEY';

async function benchmarkSolve(params, runs = 10) {
  const times = [];
  let successes = 0;

  for (let i = 0; i < runs; i++) {
    const start = Date.now();

    // Submit
    const submit = await axios.get('https://ocr.captchaai.com/in.php', {
      params: { key: API_KEY, json: '1', ...params },
    });

    if (submit.data.status !== 1) {
      console.log(`  Run ${i + 1}: Submit failed - ${submit.data.request}`);
      continue;
    }

    // Poll
    await new Promise(r => setTimeout(r, 10000));
    let solved = false;

    for (let j = 0; j < 30; j++) {
      const poll = await axios.get('https://ocr.captchaai.com/res.php', {
        params: { key: API_KEY, action: 'get', id: submit.data.request, json: '1' },
      });

      if (poll.data.status === 1) {
        const elapsed = (Date.now() - start) / 1000;
        times.push(elapsed);
        successes++;
        solved = true;
        console.log(`  Run ${i + 1}: ${elapsed.toFixed(1)}s`);
        break;
      }
      if (poll.data.request !== 'CAPCHA_NOT_READY') {
        console.log(`  Run ${i + 1}: Error - ${poll.data.request}`);
        break;
      }
      await new Promise(r => setTimeout(r, 5000));
    }

    if (!solved) console.log(`  Run ${i + 1}: Timeout`);
  }

  if (times.length === 0) return { error: 'No successful solves' };

  times.sort((a, b) => a - b);
  return {
    runs, successes,
    successRate: `${((successes / runs) * 100).toFixed(0)}%`,
    median: `${times[Math.floor(times.length / 2)].toFixed(1)}s`,
    min: `${times[0].toFixed(1)}s`,
    max: `${times[times.length - 1].toFixed(1)}s`,
  };
}

(async () => {
  console.log('=== reCAPTCHA v2 ===');
  const v2 = await benchmarkSolve({
    method: 'userrecaptcha',
    googlekey: '6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-',
    pageurl: 'https://www.google.com/recaptcha/api2/demo',
  });
  console.log(v2);

  console.log('\n=== Cloudflare Turnstile ===');
  const turnstile = await benchmarkSolve({
    method: 'turnstile',
    sitekey: 'YOUR_TURNSTILE_SITEKEY',
    pageurl: 'https://example.com',
  });
  console.log(turnstile);
})();

Problemas comuns no benchmark

Problema Causa Correção
Tempos acima dos listados Latência de rede ou proxy Teste a partir de uma região mais próxima dos servidores da CaptchaAI
Resultados inconsistentes entre execuções Variação natural de dificuldade Aumente a amostra para 50+ execuções
Muitos timeouts Sitekey ou URL inválidos Confira os parâmetros com um teste manual
ERROR_ZERO_BALANCE no benchmark Saldo insuficiente Recarregue antes de rodar benchmarks grandes

Perguntas frequentes

O reCAPTCHA v3 é sempre mais rápido que o v2?

Sim, por design: roda em segundo plano sem desafio visual, com teto de SLA de 4 s contra 60 s do v2 completo.

Os tempos de resolução variam conforme o horário do dia?

Sim, um pouco, nos horários de pico (horário comercial nos EUA). Rode o benchmark em horários diferentes antes de fixar timeouts definitivos.

Que intervalo de polling evita estourar o rate limit da API?

Espera inicial de 5–15 s com consultas a cada 3–5 s (tabela acima) equilibra latência e volume de chamadas. Abaixo de 2 s por task, o ganho de latência raramente compensa o excesso de requisições.

Rodar os workers em sa-east-1 (São Paulo) reduz a latência?

Sim, se sua base está no Brasil. Aproximar os workers do endpoint corta o RTT somado a cada polling — o ganho é mais visível em tipos rápidos, como Turnstile, do que no reCAPTCHA v2, cuja mediana já é dominada pelo próprio desafio.

Artigos relacionados

Como começar

Rode os scripts contra seus próprios alvos — obtenha sua chave de API da CaptchaAI.

Guias relacionados:

Os comentários estão desativados para este artigo.