A maioria dos scrapers falha antes que um único header seja lido.
O servidor analisa o TLS handshake (ordem dos cipher suites, ordenação das extensões, preferências de curvas) e decide se você é um navegador ou uma biblioteca de cliente fingindo ser um. Python requests, net/http do Go, curl puro: todos eles entregam um fingerprint característico no momento em que dizem olá. Sites que se importam (Datadome, Akamai, Imperva, o lado gerenciado da Cloudflare) derrubam a conexão ou exibem uma página de desafio antes mesmo que a sua string de User-Agent importe.
É isso que o unblocker: true resolve no FourA. No último mês, ajustamos as peças para fazer com que ele funcione de forma confiável.
O que há de novo
unblocker: true é uma única flag em qualquer chamada de /api/single. Ative-a e faremos três coisas: injetamos o conjunto de headers do navegador, enviamos a request através do curl-impersonate com um TLS fingerprint de navegador real e descomprimimos o que quer que o servidor retorne (gzip, brotli, deflate). Os dois primeiros já estavam disponíveis desde o beta. O terceiro (descompressão automática de brotli) foi lançado em 25 de março, e o trabalho de fixação da versão do navegador chegou no dia seguinte para manter os headers e o TLS em sincronia.
Como funciona
Veja como é uma request:
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 headers. Definimos o pacote completo de headers 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 emitem esses headers em uma sequência específica, e as bibliotecas de detecção verificam isso.
TLS fingerprint. O curl-impersonate 0.8.2 compila a libcurl contra o BoringSSL e reordena as extensões TLS para corresponder ao que a versão do navegador alvo realmente envia na rede. Seus hashes JA3 e JA4 saem idênticos aos de uma sessão de navegador real. O curl padrão, Python requests e o net/http do Go produzem fingerprints que são sinalizados automaticamente em milissegundos em infraestruturas protegidas.
Descompressão automática. Quando o unblocker está ativado, definimos o Accept-Encoding como gzip, deflate, br e deixamos a libcurl descompactar o corpo. Você recebe de volta uma string decodificada (ou um Buffer se passar returnBuffer: true). Sem manipulação manual de brotli, sem inconsistências de headers versus corpo quando um site escolhe deflate em vez de gzip.
Por que a fixação de versão importa
Os TLS fingerprints são travados por versão. A ordem de ciphers de um navegador este mês não é a mesma do mês passado, e um site que analisa fingerprints com cuidado notará esse desvio. O curl-impersonate distribui perfis para builds específicas de navegadores, e nós fixamos o binário do nosso navegador real em qualquer build que o curl-impersonate tenha como alvo no momento. Headers, objetos navigator e TLS relatam todos a mesma versão.
Se isso parece trabalhoso, é porque é. Fomos afetados por uma incompatibilidade durante a migração do monorepo em março, quando o navegador atualizou automaticamente e os headers ficaram dessincronizados com o curl-impersonate. A correção consistiu em dois commits: fixar o binário do navegador e nunca confiar no gerenciador de pacotes para mantê-los alinhados para você.
Impacto
Em testes internos contra alvos com forte análise de fingerprint (finanças, viagens, e-commerce protegido), a diferença entre unblocker: false e unblocker: true é a diferença entre uma página de desafio e um status 200. O curl puro acessando a Cloudflare gerenciada cai em um 403 logo de primeira. A mesma URL com unblocker: true passa porque o TLS hello se parece com o handshake de um navegador real.
But para sites que não fazem análise de fingerprint (a maioria das APIs públicas, templates de CMS mais antigos, qualquer coisa limitada apenas por rate limits de IP), deixar o unblocker desativado é perfeitamente aceitável e economiza alguns milissegundos de negociação TLS. Use-o onde for necessário.
Para usuários avançados
Combine o unblocker com um residential proxy quando o alvo também verificar a reputação do IP. IPs de datacenter somados a um TLS handshake perfeito ainda serão sinalizados em ASNs que o site colocou em blacklist. Nosso endpoint de proxy (/api/proxy) rotaciona por domínio de destino, então adicionar "proxy": "residential" à request geralmente é suficiente.
Ignore o unblocker ao chamar APIs JSON que não se importam com navegadores. Os headers 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 executa anti-bot em JavaScript (desafios interativos do Turnstile, Perimeter X em seu nível mais rigoroso, Akamai Bot Manager com heurísticas no máximo), o unblocker sozinho não será suficiente. Você precisará do endpoint de browser, que executa Chromium real e consegue resolver o desafio. Esse é um produto diferente, com uma precificação de créditos distinta, e nós escrevemos sobre isso em Browser Tasks: Como fazer scraping de sites com uso intenso de JavaScript.
E você pode combinar o unblocker com o bloco validate para rejeitar responses 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 acompanhamento 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. O mantenedor do curl-impersonate geralmente a acompanha um mês depois, e nós atualizamos nossa stack quando isso acontece. Você não precisa mexer em nada do seu lado: o unblocker: true continua apontando para qualquer versão de navegador que tenhamos verificado de ponta a ponta.
O trabalho mais difícil está por vir. A análise de fingerprint de HTTP/3 já está aparecendo em sistemas anti-bot gerenciados, o transporte QUIC é mais complexo de simular do que o TLS 1.3, e a migração de pacotes estáticos de headers para uma emulação verdadeiramente dinâmica está começando. Sites protegidos passaram a verificar a ordenação de frames HTTP/2 e variantes do JA4+, e a lacuna entre "um curl que se parece com um navegador" e "um navegador" vai diminuir de ambos os lados. Escreveremos sobre isso quando lançarmos.