pressione ⌘K para trocar de ferramenta
NETWORK · HTTP

Parseador de UserAgent

Detecta navegador e SO a partir de strings user agent.

local
user-agent-parser
§01 SOBRE ESTA FERRAMENTA

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

  1. Cole uma string User-Agent. A sua própria é preenchida no carregamento.
  2. 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 Gecko afirma 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ém Mobile/15E148, então uma verificação por Mobi casa com ele. A verificação por iPad tem de vir primeiro, ou todo tablet é reportado como telefone.
  • Tablets Android omitem Mobile. A convenção do Google é que o token Mobile está presente em telefones e ausente em tablets. Então um tablet Android é Android sem Mobile — 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 Chrome antes de Edg. 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.

FAQ
A string é enviada para algum lugar?
Não. A detecção é comparação com expressões regulares dentro da página. Nada sai do seu navegador, e a ferramenta funciona offline depois de carregada.
Por que o UA do meu Chrome também menciona Safari e Mozilla?
Compatibilidade histórica. Todo navegador afirma ser Mozilla/5.0, navegadores baseados em Chromium afirmam ser Safari por causa da detecção de recursos da era WebKit, e Edge, Opera e Samsung Internet afirmam ser Chrome em cima disso. A string é uma pilha de mentiras de compatibilidade, e é por isso que a ordem de análise importa mais que os padrões.
Por que um iPad moderno é reportado como macOS?
Porque é isso que ele envia. Desde o iPadOS 13, o Safari no iPad pede sites de desktop por padrão e o UA dele é indistinguível do de um Mac. O que denuncia é o maxTouchPoints, que não está no UA de jeito nenhum — logo, nenhum parser de UA consegue acertar isso.
Devo usar isso para detecção de recursos em produção?
Não. Detecte o recurso, não o navegador — `if ('share' in navigator)` em vez de uma comparação de versão. Análise de UA serve para analytics, triagem de suporte e análise de logs, onde você está descrevendo tráfego, e não decidindo comportamento.
Quão confiável é a marcação de bot?
Ela pega bots honestos e nada além disso. Googlebot, curl e python-requests todos se identificam. Um crawler que quer se misturar copia a string de um navegador real com exatidão, e nenhuma verificação baseada em UA jamais vai vê-lo.