Todos os posts

Por dentro da flag Unblocker: O que `unblocker: true` realmente faz

Uma flag ativa três funções: cabeçalhos de navegador reais, uma assinatura de conexão correspondente e descompressão automática para gzip e brotli. Aqui está o que ela faz e o porquê.

A maioria dos scrapers falha antes que um único cabeçalho seja lido.

O servidor examina a assinatura no nível da conexão que seu cliente coloca na rede e decide se você é um navegador ou uma biblioteca cliente fingindo ser um. O Python requests, o net/http do Go, o curl simples: todos eles entregam uma impressão digital distinta no momento em que dizem olá. Sites que se importam com isso (Datadome, Akamai, Imperva, o lado gerenciado do Cloudflare) interrompem a conexão ou apresentam uma página de desafio antes mesmo que a sua string User-Agent importe.

Isso é o que unblocker: true resolve na FourA. No último mês, identificamos as peças que fazem isso funcionar de forma confiável.

O que há de novo

unblocker: true é uma única flag em qualquer chamada /api/single. Ative-a e fazemos três coisas: injetamos o conjunto de cabeçalhos do navegador, enviamos a requisição por meio de um transporte que corresponde ao que um navegador real coloca na rede, e descomprimimos o que quer que o servidor retorne (gzip, brotli, deflate). As duas primeiras estão disponíveis desde a versão beta. A terceira (descompressão automática do brotli) foi lançada em 25 de março, e o trabalho de fixação de versão chegou no dia seguinte para manter os cabeçalhos e o transporte sincronizados.

Como funciona

Veja como fica uma requisição:

curl -X POST "https://api.foura.ai/api/single" \
  -H "Content-Type: application/json" \
  -H "x-api-key: YOUR_API_KEY" \
  -d '{
    "url": "https://example.com/products",
    "method": "GET",
    "unblocker": true
  }'

Três camadas rodam por baixo.

Injeção de cabeçalho. Nós definimos o pacote completo de cabeçalhos do navegador: User-Agent, Sec-Ch-Ua, Sec-Ch-Ua-Platform, Sec-Fetch-Site, Sec-Fetch-Mode, Sec-Fetch-Dest, Accept, Accept-Language e Accept-Encoding. A ordem importa. Navegadores reais os emitem em uma sequência específica, e bibliotecas de detecção verificam isso.

Assinatura de conexão. Nosso transporte corresponde à forma no nível de byte de uma sessão de navegador atualizada: a mesma ordenação de extensões, as mesmas preferências de cifra, as mesmas peculiaridades de handshake. O curl padrão, o Python requests e o net/http do Go produzem assinaturas que são sinalizadas por máquinas em milissegundos em infraestrutura protegida.

Descompressão automática. Quando unblocker está ativado, definimos Accept-Encoding como gzip, deflate, br e o transporte desempacota o corpo. Você recebe uma string decodificada de volta (ou um Buffer se você passar returnBuffer: true). Sem manuseio manual do brotli, sem incompatibilidades entre cabeçalhos e corpo quando um site escolhe deflate em vez de gzip.

Por que a fixação de versão importa

As assinaturas de conexão são bloqueadas por versão. Os detalhes de nível de rede de um navegador neste mês não são os do mês passado, e um site que rastreia impressões digitais cuidadosamente notará a mudança. Nós fixamos as peças móveis juntas para que os cabeçalhos, objetos navigator e a assinatura de conexão relatem a mesma versão do navegador.

Se isso parece complicado, é mesmo. Fomos prejudicados por uma incompatibilidade durante a migração do monorepo em março, quando uma peça se atualizou automaticamente e o resto ficou fora de sincronia. A correção consistiu em dois commits: fixar a peça móvel, e nunca confiar no gerenciador de pacotes para manter as coisas alinhadas para você.

Impacto

Em testes internos contra alvos com forte rastreamento de impressões digitais (finanças, viagens, comércio eletrônico protegido), a diferença entre unblocker: false e unblocker: true é a diferença entre uma página de desafio e um 200. O curl simples atingindo o Cloudflare gerenciado cai em um 403 na primeira tentativa. A mesma URL com unblocker: true passa porque a conexão parece uma sessão de navegador no nível da rede.

Mas para sites que não fazem rastreamento de impressões digitais (a maioria das APIs públicas, templates CMS mais antigos, qualquer coisa restrita apenas a limites de taxa de IP), deixar unblocker desativado é bom e economiza alguns milissegundos de negociação. Use onde você precisar.

Para usuários avançados

Alguns padrões que vale a pena conhecer.

Combine unblocker com um proxy residencial quando o alvo também verificar a reputação do IP. IPs de data center mais uma assinatura de conexão perfeita ainda sinalizam em ASNs que o site colocou na lista negra. Nosso endpoint de proxy (/api/proxy) rotaciona pelo domínio alvo, então adicionar "proxy": "residential" à requisição geralmente é suficiente.

Pule unblocker ao chamar APIs JSON que não se importam com navegadores. Os cabeçalhos extras podem, na verdade, parecer suspeitos para uma API que espera um cliente programático, por exemplo, um backend chamando seu próprio microsserviço.

Se o site executar anti-bot JavaScript (desafios interativos Turnstile, PerimeterX em seu modo mais estrito, Akamai Bot Manager com heurística elevada), unblocker sozinho não será suficiente. Você precisa do endpoint do navegador, que executa o desafio em um navegador completo. Esse é um produto diferente com preços de créditos diferentes, e escrevemos sobre isso em Browser Tasks: Como fazer scraping de sites com muito JavaScript.

E você pode combinar unblocker com o bloco validate para rejeitar respostas que tecnicamente retornam 200, mas contêm uma página de desafio:

{
  "url": "https://example.com/products",
  "method": "GET",
  "unblocker": true,
  "validate": {
    "data": { "fail": ["captcha", "Access Denied"] }
  }
}

Isso transforma falhas silenciosas em falhas classificadas, o que é importante para o rastreamento da sua taxa de sucesso no dashboard.

O que vem a seguir

Os navegadores lançam uma nova versão estável a cada quatro semanas. Nós atualizamos nossa pilha para corresponder. Você não precisa mexer em nada do seu lado: unblocker: true continua apontando para a versão do navegador que verificamos de ponta a ponta.

O trabalho mais difícil está por vir. O rastreamento de impressões digitais HTTP/3 já está aparecendo em anti-bots gerenciados, o transporte QUIC é mais complicado de corresponder do que o transporte mais antigo, e a migração de pacotes de cabeçalhos estáticos para emulação verdadeiramente dinâmica está começando. Sites protegidos passaram a verificar a ordenação de frames HTTP/2, e a lacuna entre "biblioteca que parece um navegador" e "um navegador" vai diminuir de ambos os lados. Escreveremos sobre isso quando o lançarmos.