Parseador de UserAgent
Detecta navegador y SO desde cadenas de user agent.
Descripción general
Una cadena User-Agent es la autodescripción del navegador, y es uno de los campos menos fiables de HTTP: en parte porque los clientes mienten a propósito, y en parte porque treinta años de parches de compatibilidad han hecho que toda cadena diga ser varios navegadores a la vez.
Esta herramienta informa del navegador y su versión, del sistema operativo y su versión, de una clase de dispositivo y de si la cadena se identifica como automatizada.
Cómo se usa
- Pega una cadena User-Agent. La tuya se rellena al cargar.
- Lee el navegador, el sistema operativo, el dispositivo y el veredicto de bot.
Por qué el orden de detección es todo el problema
Fíjate en una cadena de 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
Dice ser Mozilla, AppleWebKit, Chrome, Safari y Edge. Un analizador que busca
Chrome primero informa de Chrome, y hay una cantidad enorme de datos de
analítica que está mal exactamente por eso.
La regla es comprobar antes el token más específico. Edg/ antes de Chrome/,
OPR/ antes de Chrome/, SamsungBrowser/ antes de Chrome/, y Chrome/ antes
de Safari, porque Chromium también dice ser Safari mientras que Safari no dice
ser Chrome.
El número de versión también tiene que salir del token específico. El
Chrome/120.0.0.0 de Edge 120 es una versión de Chromium, no una versión de Edge,
y divergen.
Anatomía de la cadena
Leer un UA es más fácil una vez que sabes que casi todos sus tokens están ahí por razones históricas y no descriptivas.
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: todos los navegadores lo declaran. En los noventa, los servidores comprobaban si aparecía «Mozilla» antes de servir marcos, así que todo el mundo empezó a declararlo y nadie ha conseguido dejar de hacerlo.- El bloque entre paréntesis: detalles de plataforma. Nombre y versión del sistema operativo, arquitectura de CPU y, en móvil, el modelo del dispositivo. Esta es la parte que los navegadores están recortando ahora.
AppleWebKit/537.36 (KHTML, like Gecko): congelado en 537.36 en todo Chromium desde 2013. Es una constante, no una versión.KHTML, like Geckoreclama parentesco con dos motores más.Chrome/120.0.0.0: la versión mayor de Chromium. Los componentes menores van a cero a propósito.Safari/537.36: coincide con el token de WebKit. Está ahí para que el código que busca Safari siga funcionando.
La información útil está en uno o dos tokens; el resto es sedimento de compatibilidad. Un analizador que trate la cadena como una descripción, en lugar de como un conjunto de afirmaciones apiladas, se equivocará.
Clasificación de dispositivo
La clase de dispositivo se infiere de los tokens, y las dos señales que importan son contraintuitivas:
- El iPad envía
Mobile. El UA de un iPad contieneMobile/15E148, así que una comprobación deMobilo captura. La comprobación deiPadtiene que ir antes, o todas las tabletas se informan como teléfonos. - Las tabletas Android omiten
Mobile. La convención de Google es que el tokenMobileestá presente en los teléfonos y ausente en las tabletas. Así que una tableta Android esAndroidsinMobile: una comprobación negativa, que es fácil de olvidar.
Esta herramienta comprueba iPad, Tablet y Android-sin-Mobile antes de
comprobar los tokens de teléfono, así que las tabletas se clasifican como
tabletas.
Lo que ningún analizador puede arreglar es el iPad en modo escritorio. Desde
iPadOS 13, Safari en iPad envía una cadena de macOS por omisión; el único
distintivo fiable es navigator.maxTouchPoints, que no está en el UA. Si la
detección de tabletas importa para tu aplicación, lee los puntos táctiles en el
cliente en lugar de analizar la cadena.
La cadena se está encogiendo a propósito
Los navegadores están reduciendo activamente lo que revela el UA, porque el mismo detalle que ayuda a la analítica también habilita el fingerprinting.
Chrome ha congelado la versión menor en 0.0.0 y ha reducido la versión del
sistema operativo. Safari declara una versión de sistema fija desde hace años.
navigator.platform está obsoleto. El recambio son los User-Agent Client Hints
(Sec-CH-UA, Sec-CH-UA-Platform, Sec-CH-UA-Mobile), que envían un conjunto
corto de valores por omisión y obligan al servidor a pedir cualquier cosa
adicional.
La consecuencia práctica es que un analizador de UA es cada vez menos exacto con el tiempo, y eso es intencionado. Trata la versión mayor del navegador y la familia del sistema operativo como la señal duradera, y trata cualquier cosa más precisa como una propina que algún día dejará de llegar. La herramienta de huella del navegador muestra los demás atributos que esa reducción pretende proteger.
Ejemplos
- Analítica que muestra una cuota de Chrome imposible. Comprueba si tu
analizador pone
Chromeantes deEdg. Este único error de orden mueve varios puntos porcentuales de tráfico entre navegadores. - Un ticket de soporte sin forma de reproducirlo. El sistema operativo y la versión de navegador del UA de quien lo reporta suelen bastar para acotarlo.
- Filtrar bots de los registros. Los que se identifican solos son fáciles; deja claro que la cifra es un suelo y no un recuento.
- Auditar una restricción por versión de navegador antigua. Una comparación de versiones escrita contra un UA ya es poco fiable y empeora con cada recorte. Sustitúyela por una comprobación de funcionalidad.
Notas
Los números de versión con guiones bajos —macOS e iOS declaran 10_15_7— se
normalizan a puntos. Esa diferencia de formato es puramente cosmética en el UA y no
significa nada.
Unknown quiere decir que ningún patrón coincidió, que es una respuesta legítima
para la cadena de un navegador minoritario, de un WebView incrustado, de una
biblioteca cliente de HTTP o de una extensión de suplantación que produce una
combinación incoherente.
La comprobación de bot busca bot, crawl, spider, slurp, curl, wget,
python y headless. Es una descripción de lo que el cliente admite ser, no un
control de seguridad. Cualquier cosa que importe debería imponerse con límites de
ritmo y un desafío en el servidor, porque un UA es una cadena que elige el cliente.
La política de privacidad describe cómo lo hace la API de este
sitio.