Parseador de UserAgent
Detecta navegador e SO a partir de strings user agent.
Visão geral
Uma string User-Agent é a autodescrição do navegador, e é um dos campos menos confiáveis do HTTP — em parte porque clientes mentem deliberadamente, e em parte porque trinta anos de gambiarras de compatibilidade fizeram com que toda string afirme ser vários navegadores ao mesmo tempo.
Esta ferramenta reporta o navegador e a versão, o sistema operacional e a versão, uma classe de dispositivo e se a string se identifica como automatizada.
Como usar
- Cole uma string User-Agent. A sua própria é preenchida no carregamento.
- Leia o navegador, o SO, o dispositivo e o veredicto de bot.
Por que a ordem de detecção é o problema inteiro
Considere uma string do Microsoft Edge:
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36
(KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0
Ela afirma ser Mozilla, AppleWebKit, Chrome, Safari e Edge. Um parser que verifica
Chrome primeiro reporta Chrome, e uma quantidade enorme de dados de analytics está
errada exatamente por causa disso.
A regra é verificar o token mais específico primeiro. Edg/ antes de Chrome/,
OPR/ antes de Chrome/, SamsungBrowser/ antes de Chrome/, e Chrome/ antes de
Safari — porque o Chromium também afirma ser Safari, enquanto o Safari não afirma
ser Chrome.
O número de versão também tem de vir do token específico. O Chrome/120.0.0.0 do
Edge 120 é uma versão do Chromium, não uma versão do Edge, e as duas divergem.
Anatomia da string
Ler um UA fica mais fácil quando você sabe que quase todo token está ali por razões históricas, e não descritivas.
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36
(KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36
Mozilla/5.0— todo navegador afirma isso. Nos anos 1990, servidores verificavam se havia «Mozilla» antes de servir frames, então todos passaram a afirmar e ninguém nunca conseguiu parar.- O bloco entre parênteses — detalhes de plataforma. Nome e versão do SO, arquitetura de CPU e, no mobile, o modelo do dispositivo. É essa a parte que os navegadores estão truncando agora.
AppleWebKit/537.36 (KHTML, like Gecko)— congelado em 537.36 em todo o Chromium desde 2013. É uma constante, não uma versão.KHTML, like Geckoafirma parentesco com dois outros motores.Chrome/120.0.0.0— a versão maior do Chromium. Os componentes menores são zerados deliberadamente.Safari/537.36— coincide com o token do WebKit. Está presente para que código que verifica Safari continue funcionando.
A informação útil está em um ou dois tokens; o resto é sedimento de compatibilidade. Um parser que trata a string como descrição, e não como um conjunto de afirmações em camadas, vai errar.
Classificação de dispositivo
A classe de dispositivo é inferida a partir de tokens, e os dois sinais que importam são contraintuitivos:
- iPad envia
Mobile. O UA de um iPad contémMobile/15E148, então uma verificação porMobicasa com ele. A verificação poriPadtem de vir primeiro, ou todo tablet é reportado como telefone. - Tablets Android omitem
Mobile. A convenção do Google é que o tokenMobileestá presente em telefones e ausente em tablets. Então um tablet Android éAndroidsemMobile— um teste negativo, que é fácil de esquecer.
Esta ferramenta verifica iPad, Tablet e Android-sem-Mobile antes de verificar os
tokens de telefone, então tablets são classificados como tablets.
O que nenhum parser consegue resolver é o iPad em modo desktop. Desde o iPadOS 13, o
Safari no iPad envia uma string de macOS por padrão; o único distinguidor confiável é
o navigator.maxTouchPoints, que não está no UA. Se detecção de tablet importa para a
sua aplicação, leia os pontos de toque no lado do cliente em vez de analisar a string.
A string está encurtando de propósito
Os navegadores estão reduzindo ativamente o que o UA revela, porque o mesmo detalhe que ajuda o analytics também viabiliza fingerprinting.
O Chrome congelou a versão menor em 0.0.0 e reduziu a versão do SO. O Safari
reporta uma versão fixa de SO há anos. O navigator.platform está obsoleto. A
substituição são os User-Agent Client Hints (Sec-CH-UA, Sec-CH-UA-Platform,
Sec-CH-UA-Mobile), que enviam um conjunto curto de valores por padrão e exigem que
o servidor peça por qualquer coisa a mais.
A consequência prática é que um parser de UA fica menos preciso com o tempo, e isso é intencional. Trate a versão maior do navegador e a família do SO como o sinal durável, e trate qualquer coisa mais precisa que isso como um bônus que em algum momento vai parar de chegar. A ferramenta de impressão digital do navegador mostra os outros atributos que essa redução pretende proteger.
Exemplos
- Analytics que mostram uma fatia impossível de Chrome. Verifique se o seu parser
coloca
Chromeantes deEdg. Esse único erro de ordenação move vários pontos percentuais de tráfego entre navegadores. - Um ticket de suporte sem reprodução. O SO e a versão do navegador extraídos do UA de quem relatou normalmente bastam para estreitar o caso.
- Filtrar bots dos logs. Os que se autoidentificam são fáceis; deixe explícito que o número é um piso, não uma contagem.
- Auditar uma antiga trava por versão de navegador. Uma comparação de versão escrita contra um UA já é pouco confiável e fica pior com cada redução. Substitua-a por uma verificação de recurso.
Observações
Números de versão com sublinhados — macOS e iOS reportam 10_15_7 — são
normalizados para pontos. Essa diferença de formatação é puramente cosmética no UA e
não carrega significado.
Unknown significa que nenhum padrão casou, o que é uma resposta real para uma
string de um navegador de nicho, de um WebView embutido, de uma biblioteca cliente de
HTTP, ou de uma extensão de spoofing produzindo uma combinação inconsistente.
A verificação de bot procura por bot, crawl, spider, slurp, curl, wget,
python e headless. É uma descrição do que o cliente admite ser, não um controle de
segurança. Qualquer coisa que importe deve ser aplicada com limites de taxa e um
desafio no lado do servidor, porque um UA é uma string que o cliente escolhe. A
política de privacidade descreve como a API deste site faz isso.