Tutoriais

Conexão Keep-Alive e HTTP/2 para chamadas de API CAPTCHA com menor latência

Cada solução CAPTCHA envolve várias solicitações HTTP: um envio e 3 a 10 pesquisas. Sem a reutilização da conexão, cada solicitação paga o custo de um novo handshake TCP e negociação TLS - 100 a 300 ms por conexão. Este guia mostra como eliminar essa sobrecarga usando conexões keep-alive e multiplexação HTTP/2 comCaptchaAI.

Por que a reutilização de conexões é importante

Uma solução típica de reCAPTCHA v2 requer:

  • 1 enviar solicitação para in.php
  • 4–6 solicitações de enquete para res.php
  • Total: 5 a 7 solicitações HTTP

Sem manter vivo:

  • 5 × (handshake TCP ~50ms + TLS ~100ms) = sobrecarga de 750ms

Com manter vivo:

  • 1 × (TCP + TLS) + 4 × (reutilização de ~5ms) = 170ms de sobrecarga

Economia: ~580 ms por resolução. Com 10.000 soluções/day, isso representa 1,6 horas de latência salva.

Python: usando requests.Session

A biblioteca requests suporta keep-alive por padrão quando você usa um objeto Session:

# keepalive_solver.py
import os
import time
import requests

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

# Create a session — reuses TCP connections across requests
session = requests.Session()
session.headers.update({"Connection": "keep-alive"})

def solve_captcha(sitekey, pageurl):
    """Solve reCAPTCHA v2 using a persistent connection."""
    # Submit — uses existing connection if available
    resp = session.get("https://ocr.captchaai.com/in.php", params={
        "key": API_KEY,
        "method": "userrecaptcha",
        "googlekey": sitekey,
        "pageurl": pageurl,
        "json": "1",
    })
    result = resp.json()

    if result.get("status") != 1:
        raise Exception(f"Submit failed: {result.get('request')}")

    task_id = result["request"]

    # Poll — reuses the same connection
    time.sleep(15)
    for _ in range(25):
        poll = session.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:
            return poll_result["request"]
        if poll_result.get("request") != "CAPCHA_NOT_READY":
            raise Exception(f"Error: {poll_result.get('request')}")

        time.sleep(5)

    raise Exception("Timeout")

# Solve multiple CAPTCHAs reusing the same connection
for i in range(5):
    token = solve_captcha(
        "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-",
        "https://www.google.com/recaptcha/api2/demo"
    )
    print(f"Solve {i+1}: {token[:30]}...")

Python: HTTP/2 com httpx

Para suporte HTTP/2, use httpx:

# http2_solver.py
import os
import time
import httpx

API_KEY = os.environ.get("CAPTCHAAI_KEY", "YOUR_API_KEY")
BASE_URL = "https://ocr.captchaai.com"

# HTTP/2 client with connection pooling
client = httpx.Client(http2=True, timeout=30.0)

def solve_captcha(sitekey, pageurl):
    """Solve using HTTP/2 multiplexed connections."""
    resp = client.get(f"{BASE_URL}/in.php", params={
        "key": API_KEY,
        "method": "userrecaptcha",
        "googlekey": sitekey,
        "pageurl": pageurl,
        "json": "1",
    })
    result = resp.json()

    if result.get("status") != 1:
        raise Exception(f"Submit failed: {result.get('request')}")

    task_id = result["request"]
    time.sleep(15)

    for _ in range(25):
        poll = client.get(f"{BASE_URL}/res.php", params={
            "key": API_KEY, "action": "get",
            "id": task_id, "json": "1",
        })
        poll_result = poll.json()

        if poll_result.get("status") == 1:
            return poll_result["request"]
        if poll_result.get("request") != "CAPCHA_NOT_READY":
            raise Exception(f"Error: {poll_result.get('request')}")

        time.sleep(5)

    raise Exception("Timeout")

# Multiple solves over a single HTTP/2 connection
for i in range(5):
    token = solve_captcha(
        "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-",
        "https://www.google.com/recaptcha/api2/demo"
    )
    print(f"Solve {i+1}: {token[:30]}...")

client.close()

JavaScript: usando uma instância Axios com Keep-Alive

// keepalive_solver.js
const axios = require('axios');
const http = require('http');
const https = require('https');

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

// Create agents with keep-alive enabled
const httpAgent = new http.Agent({ keepAlive: true, maxSockets: 10 });
const httpsAgent = new https.Agent({ keepAlive: true, maxSockets: 10 });

// Axios instance with persistent connections
const api = axios.create({
  baseURL: 'https://ocr.captchaai.com',
  httpAgent,
  httpsAgent,
  timeout: 30000,
});

async function solveCaptcha(sitekey, pageurl) {
  // Submit — reuses connection
  const submit = await api.get('/in.php', {
    params: {
      key: API_KEY, method: 'userrecaptcha',
      googlekey: sitekey, pageurl, json: '1',
    },
  });

  if (submit.data.status !== 1) throw new Error(submit.data.request);
  const taskId = submit.data.request;

  // Poll — reuses same connection
  await new Promise(r => setTimeout(r, 15000));
  for (let i = 0; i < 25; i++) {
    const poll = await api.get('/res.php', {
      params: { key: API_KEY, action: 'get', id: taskId, json: '1' },
    });

    if (poll.data.status === 1) return poll.data.request;
    if (poll.data.request !== 'CAPCHA_NOT_READY') throw new Error(poll.data.request);
    await new Promise(r => setTimeout(r, 5000));
  }
  throw new Error('Timeout');
}

(async () => {
  for (let i = 0; i < 5; i++) {
    const token = await solveCaptcha(
      '6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-',
      'https://www.google.com/recaptcha/api2/demo'
    );
    console.log(`Solve ${i + 1}: ${token.slice(0, 30)}...`);
  }

  // Clean up agents
  httpAgent.destroy();
  httpsAgent.destroy();
})();

HTTP/2 vs HTTP/1.1 para resolução de CAPTCHA

Recurso HTTP/1.1 Keep-Alive HTTP/2
Reutilização de conexão Sim (sequencial) Sim (multiplexado)
Fluxos simultâneos 1 por conexão Até 100+ por conexão
Compressão de cabeçalho Não Compressão HPACK
Redução de latência ~60% ~70%
Suporte ao navegador necessário Não Não (chamadas de API)
mais adequado para Soluções sequenciais Soluções paralelas

Para resolução sequencial (um CAPTCHA por vez), o keep-alive HTTP/1.1 é suficiente. Para resolução paralela (vários CAPTCHAs simultaneamente), a multiplexação HTTP/2 oferece benefícios adicionais ao compartilhar uma única conexão.

Dimensionamento do pool de conexões

Combine o tamanho do seu pool com o seu nível de simultaneidade:

Soluções simultâneas Tamanho recomendado da piscina
1–5 5 conexões
5–20 10 conexões
20–50 25 conexões
50–100 50 conexões
Mais de 100 Usar HTTP/2 (1 conexão)

Pools superdimensionados desperdiçam memória. Pools subdimensionados forçam novas conexões, anulando os benefícios de manutenção.

Solução de problemas

Problema Causa Correção
Conexões fechando entre pesquisas Tempo limite do servidor ou proxy Defina o tempo limite de keep-alive> 30s na configuração do cliente
Sem aprimoramento de desempenho Já usando keep-alive (padrão em algumas bibliotecas) Verifique com ferramentas de monitoramento de rede
Erros de conexão recusada Piscina esgotada Aumente maxSockets ou reduza a simultaneidade
HTTP/2 não negociado Servidor não suporta h2 Volte para HTTP/1.1 keep-alive

Perguntas frequentes

CaptchaAI suporta HTTP/2?

Teste com curl --http2 https://ocr.captchaai.com/res.php para verificar. Se o servidor negociar h2, seu cliente HTTP/2 será beneficiado. Caso contrário, volte para HTTP/1.1 keep-alive.

Devo encerrar as sessões após cada lote?

Não. Mantenha a sessão aberta entre lotes se estiver executando soluções periódicas. Feche somente quando seu aplicativo for encerrado.

Isso funciona com servidores proxy?

Sim, mas seu proxy também deve suportar keep-alive e HTTP/2.. Alguns proxies SOCKS5 não mantêm conexões persistentes.

Artigos relacionados

Próximas etapas

Reduza a sobrecarga de conexão em cada solução -obtenha sua chave API CaptchaAI.

Guias relacionados:

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