Comparisons

Sessão fixa ou rotativa: qual proxy usar para resolver CAPTCHA

Se o CAPTCHA aparece a cada login, a causa costuma estar na sessão de proxy, não no navegador: IP rotativo onde o site espera o mesmo IP do início ao fim (ou o contrário) é o erro mais comum. Resposta direta — sessão fixa para autenticação (login, checkout, área logada); sessão rotativa para páginas independentes (scraping em lote, monitoramento de preços, busca). O modo errado não muda o preço do proxy, mas dispara a taxa de CAPTCHA.


Matriz de decisão: qual sessão usar em cada fluxo

Fluxo Recomendado Por quê
Login / cadastro Sessão fixa Token vinculado ao IP
Checkout / pagamento Sessão fixa Cookies de sessão exigem o mesmo IP
Coleta de páginas em lote Sessão rotativa Distribui a carga
Coleta em mecanismos de busca Sessão rotativa Evita rate limit por IP
Navegação em várias páginas Sessão fixa Cookies rastreados por IP
Monitoramento de preços Sessão rotativa Muitas requisições independentes
Gerenciamento de conta Sessão fixa Integridade da sessão
Envio de formulário com CAPTCHA Sessão fixa Vínculo entre token e IP

Cenário comum: uma equipe de QA em São Paulo testa checkout em staging (workers na região sa-east-1 da AWS) com sessão fixa, para não perder o token do reCAPTCHA no meio do fluxo. No mesmo pipeline, o growth monitora preços de concorrentes com sessão rotativa — e observa a LGPD ao decidir o que fica armazenado.


Como cada modo funciona, lado a lado

STICKY SESSION:
  Request 1 ──▶ IP: 192.168.1.50 ──▶ site.com/login
  Request 2 ──▶ IP: 192.168.1.50 ──▶ site.com/dashboard
  Request 3 ──▶ IP: 192.168.1.50 ──▶ site.com/account
  (Same IP for all requests in the session window)

ROTATING SESSION:
  Request 1 ──▶ IP: 192.168.1.50 ──▶ site.com/page1
  Request 2 ──▶ IP: 10.0.0.77   ──▶ site.com/page2
  Request 3 ──▶ IP: 172.16.5.22 ──▶ site.com/page3
  (Different IP per request)
Fator Sessão fixa Sessão rotativa
IP por requisição O mesmo por 1 a 30 minutos Novo a cada requisição
Consistência da sessão Alta Nenhuma
Taxa de CAPTCHA (fluxos em várias etapas) Baixa (5–10%) Alta (30–50%)
Taxa de CAPTCHA (páginas únicas) Média (10–20%) Baixa (5–10%)
Validade do token Maior — mesmo IP Risco de incompatibilidade
Velocidade Mais rápida (reaproveita a conexão) Mais lenta (nova conexão a cada vez)
Risco de bloqueio Maior se o IP for sinalizado Menor — IP novo a cada vez
Custo Igual ou levemente maior Igual
Ideal para Login, checkout, autenticação Scraping em lote, buscas

Sessão fixa na prática

O CAPTCHA valida o token contra o IP que fez a requisição original — se o IP mudar antes do envio, o token pode ser rejeitado mesmo estando correto. No exemplo abaixo, o mesmo IP cobre da carga da página até o envio do login:

import requests
import time

CAPTCHAAI_KEY = "YOUR_API_KEY"
CAPTCHAAI_URL = "https://ocr.captchaai.com"

# Sticky session: same IP for the entire login flow
STICKY_PROXY = {
    "http": "http://user-session-abc123:pass@proxy.example.com:5000",
    "https": "http://user-session-abc123:pass@proxy.example.com:5000",
}

session = requests.Session()
session.proxies = STICKY_PROXY
session.headers.update({
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
    "AppleWebKit/537.36 Chrome/126.0.0.0 Safari/537.36",
})


def login_with_captcha(url, sitekey, username, password):
    """Full login flow — MUST use same IP throughout."""
    # Step 1: Load login page (IP: 192.168.1.50)
    session.get(url)

    # Step 2: Solve CAPTCHA (solved against IP: 192.168.1.50)
    token = solve_recaptcha(sitekey, url)

    # Step 3: Submit login (MUST be IP: 192.168.1.50)
    resp = session.post(url, data={
        "username": username,
        "password": password,
        "g-recaptcha-response": token,
    })

    return resp.status_code == 200


def solve_recaptcha(sitekey, pageurl):
    resp = requests.post(f"{CAPTCHAAI_URL}/in.php", data={
        "key": CAPTCHAAI_KEY,
        "method": "userrecaptcha",
        "googlekey": sitekey,
        "pageurl": pageurl,
        "json": 1,
    })
    task_id = resp.json()["request"]

    for _ in range(60):
        time.sleep(5)
        result = requests.get(f"{CAPTCHAAI_URL}/res.php", params={
            "key": CAPTCHAAI_KEY, "action": "get",
            "id": task_id, "json": 1,
        })
        data = result.json()
        if data["request"] != "CAPCHA_NOT_READY":
            return data["request"]

    raise TimeoutError("CAPTCHA solve timeout")

Com sessão fixa, o token chega ao mesmo IP que o resolveu; com rotativa, o IP pode mudar entre resolver e enviar:

Sticky session:

  1. Browser loads page    → IP: 5.5.5.5
  2. CAPTCHA solved        → Token bound to session
  3. Form submitted        → IP: 5.5.5.5 ✅ Token accepted

Rotating session:

  1. Browser loads page    → IP: 5.5.5.5
  2. CAPTCHA solved        → Token bound to session
  3. Form submitted        → IP: 9.9.9.9 ❌ Token may be rejected

Duração ideal da sessão fixa

Duração Ideal para Risco
1 minuto Envio rápido de formulário Pode expirar no meio do fluxo
5 minutos Login padrão + ações seguintes Bom equilíbrio
10 minutos Fluxos complexos em várias páginas Risco moderado de bloqueio
30 minutos Sessões de navegação mais longas Risco maior de bloqueio

Regra geral: configure a duração para o dobro do tempo esperado do fluxo.


Sessão rotativa na prática

Em páginas independentes, cada requisição não depende da anterior — distribuir o tráfego por mais IPs reduz a chance de um endereço acumular volume suficiente para ser sinalizado. O exemplo varre 500 páginas, cada requisição com IP novo:

import concurrent.futures

ROTATING_PROXY = {
    "http": "http://user:pass@rotating.proxy.example.com:5000",
    "https": "http://user:pass@rotating.proxy.example.com:5000",
}


def scrape_page(url):
    """Each request gets a fresh IP automatically."""
    resp = requests.get(
        url,
        proxies=ROTATING_PROXY,
        headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"},
        timeout=30,
    )
    if resp.status_code == 200:
        return url, resp.text
    return url, None


urls = [f"https://example.com/products?page={i}" for i in range(1, 501)]

with concurrent.futures.ThreadPoolExecutor(max_workers=10) as pool:
    results = list(pool.map(scrape_page, urls))
    success = sum(1 for _, html in results if html)
    print(f"Scraped: {success}/{len(urls)}")

Buscadores acompanham o volume de consultas por IP — a rotação evita o rate limit:

def scrape_search(query, pages=10):
    results = []
    for page in range(pages):
        # Each request → new IP
        resp = requests.get(
            "https://search-engine.example.com/search",
            params={"q": query, "start": page * 10},
            proxies=ROTATING_PROXY,
            timeout=20,
        )
        results.append(resp.text)
        time.sleep(2)
    return results

Combinando os dois modos: híbrido e Node.js

Pipeline híbrido em Python

Nada impede combinar sessão fixa e rotativa no mesmo projeto — a classe abaixo escolhe o modo certo conforme o tipo de requisição:

class HybridProxyManager:
    """Sticky for multi-step flows, rotating for single requests."""

    def __init__(self, provider_host, username, password, port=5000):
        self.host = provider_host
        self.username = username
        self.password = password
        self.port = port

    def get_rotating_proxy(self):
        return {
            "http": f"http://{self.username}:{self.password}@{self.host}:{self.port}",
            "https": f"http://{self.username}:{self.password}@{self.host}:{self.port}",
        }

    def get_sticky_proxy(self, session_id, duration_min=10):
        sticky_user = f"{self.username}-session-{session_id}-ttl-{duration_min}"
        return {
            "http": f"http://{sticky_user}:{self.password}@{self.host}:{self.port}",
            "https": f"http://{sticky_user}:{self.password}@{self.host}:{self.port}",
        }


proxy_mgr = HybridProxyManager("proxy.example.com", "user", "pass")


def scrape_with_auto_strategy(url, needs_login=False):
    if needs_login:
        # Multi-step → sticky
        import uuid
        session_id = uuid.uuid4().hex[:8]
        proxy = proxy_mgr.get_sticky_proxy(session_id)
    else:
        # Single page → rotating
        proxy = proxy_mgr.get_rotating_proxy()

    return requests.get(url, proxies=proxy, timeout=30)

A mesma lógica em Node.js

Sessão rotativa para scraping em lote, sessão fixa para o login com CAPTCHA, com axios:

const axios = require("axios");

const CAPTCHAAI_KEY = "YOUR_API_KEY";
const PROXY_HOST = "proxy.example.com";
const PROXY_PORT = 5000;

function getProxy(mode, sessionId = null) {
  const user =
    mode === "sticky" ? `user-session-${sessionId}` : "user";

  return {
    proxy: {
      host: PROXY_HOST,
      port: PROXY_PORT,
      auth: { username: user, password: "pass" },
    },
  };
}

// Rotating: bulk scrape
async function scrapePages(urls) {
  const results = [];
  for (const url of urls) {
    const config = getProxy("rotating");
    const resp = await axios.get(url, { ...config, timeout: 30000 });
    results.push({ url, data: resp.data });
  }
  return results;
}

// Sticky: login flow
async function loginFlow(loginUrl, sitekey, credentials) {
  const sessionId = Date.now().toString(36);
  const config = getProxy("sticky", sessionId);

  // Step 1: Load page
  await axios.get(loginUrl, config);

  // Step 2: Solve CAPTCHA
  const submitResp = await axios.post(
    "https://ocr.captchaai.com/in.php",
    null,
    {
      params: {
        key: CAPTCHAAI_KEY,
        method: "userrecaptcha",
        googlekey: sitekey,
        pageurl: loginUrl,
        json: 1,
      },
    }
  );
  const taskId = submitResp.data.request;

  let token;
  for (let i = 0; i < 60; i++) {
    await new Promise((r) => setTimeout(r, 5000));
    const res = await axios.get("https://ocr.captchaai.com/res.php", {
      params: { key: CAPTCHAAI_KEY, action: "get", id: taskId, json: 1 },
    });
    if (res.data.request !== "CAPCHA_NOT_READY") {
      token = res.data.request;
      break;
    }
  }

  // Step 3: Submit with same IP
  return axios.post(
    loginUrl,
    {
      ...credentials,
      "g-recaptcha-response": token,
    },
    config
  );
}

Problemas comuns e como resolver

Problema Causa Correção
Token do CAPTCHA rejeitado após a resolução O IP mudou entre resolver e enviar Trocar para sessão fixa
Taxa alta de CAPTCHA em páginas únicas O mesmo IP fixo concentrando muitas páginas Trocar para sessão rotativa
Cookies de sessão perdidos A sessão fixa expirou Aumentar o TTL
IP bloqueado na sessão fixa Todas as requisições compartilham o IP sinalizado Reduzir o TTL ou adicionar atrasos entre requisições

Configurar a sessão fixa depende do provedor: a maioria embute um identificador no nome de usuário (user-session-abc123), com o TTL à parte — confira sempre a documentação oficial. Já cobrimos a sintaxe de três provedores em guias dedicados: Bright Data, Smartproxy e Oxylabs.


Perguntas frequentes

O IP fixo aumenta o risco de bloqueio no CAPTCHA?

Pode aumentar, sim, se o mesmo IP concentrar muitas requisições. Reduza o TTL ou troque de IP assim que o fluxo autenticado terminar.

Sessão rotativa reduz mesmo a taxa de CAPTCHA em scraping?

Em páginas independentes, sim — vários IPs evitam que um endereço acumule volume suficiente para ser sinalizado. Em login o efeito é o oposto.

Quanto tempo deve durar uma sessão fixa antes de trocar de IP?

Sem número único — use o dobro do tempo esperado do fluxo.

Posso combinar sessão fixa e rotativa no mesmo projeto?

Sim, é comum: sessão fixa nos trechos autenticados, rotativa na coleta de dados. A maioria dos provedores oferece os dois modos no mesmo plano.

A sessão fixa mantém o mesmo IP durante toda a sessão?

Na maioria dos casos, sim, dentro do TTL contratado — mas o provedor pode reatribuir o IP antes disso.


Guias relacionados


Escolha o modo de sessão certo para cada etapa do seu fluxo — pegue sua chave da CaptchaAI e resolva o CAPTCHA independentemente da estratégia de proxy que você usar.

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