pulsa ⌘K para cambiar de herramienta
NETWORK · HTTP

Parseador de UserAgent

Detecta navegador y SO desde cadenas de user agent.

local
user-agent-parser
§01 ACERCA DE ESTA HERRAMIENTA

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

  1. Pega una cadena User-Agent. La tuya se rellena al cargar.
  2. 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 Gecko reclama 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 contiene Mobile/15E148, así que una comprobación de Mobi lo captura. La comprobación de iPad tiene 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 token Mobile está presente en los teléfonos y ausente en las tabletas. Así que una tableta Android es Android sin Mobile: 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 Chrome antes de Edg. 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.

FAQ
¿Se envía la cadena a algún sitio?
No. La detección son expresiones regulares que se evalúan dentro de la página. Nada sale de tu navegador y, una vez cargada, la herramienta funciona sin conexión.
¿Por qué mi UA de Chrome menciona también Safari y Mozilla?
Compatibilidad histórica. Todos los navegadores dicen ser Mozilla/5.0, los basados en Chromium dicen ser Safari para la detección de funciones de la era WebKit, y Edge, Opera y Samsung Internet dicen además ser Chrome. La cadena es un montón de mentiras de compatibilidad apiladas, y por eso el orden en que se analiza importa más que los patrones.
¿Por qué un iPad moderno se informa como macOS?
Porque es lo que envía. Desde iPadOS 13, Safari en iPad pide los sitios de escritorio por omisión y su UA es indistinguible del de un Mac. La pista es maxTouchPoints, que no está en el UA en absoluto, así que ningún analizador de UA puede acertar aquí.
¿Debería usar esto para detectar funcionalidades en producción?
No. Detecta la funcionalidad, no el navegador: `if ('share' in navigator)` en lugar de una comparación de versiones. Analizar el UA sirve para analítica, para triaje de soporte y para análisis de registros, donde estás describiendo el tráfico y no decidiendo un comportamiento.
¿Hasta qué punto es fiable la marca de bot?
Pilla a los bots honestos y a nadie más. Googlebot, curl y python-requests se identifican todos. Un rastreador que quiera pasar desapercibido copia exactamente la cadena de un navegador real, y ninguna comprobación basada en el UA lo verá nunca.