No hay reglas para las cadenas de User-Agent, por lo que no hay forma de crear un analizador completamente correcto y preparado para el futuro. Sin embargo, hay un patrón general:
User-Agent: <engine-string> <engine-string> ...
Donde engine-string
tiene forma:
<agent-name> (<comment>; <comment>; ...)
Cada cadena de motor (simplemente lo llamé así, según tengo entendido, puede que no sea correcto) puede tener o no comentarios.
Por ejemplo:
Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) ↲
AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5376e ↲
Safari/8536.25 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)
(Esta es una sola cadena, solo la dividí en líneas). Parece que cada vez que alguien hace una bifurcación de un motor de navegador, simplemente agregan su cosa al final. Así que tenemos un navegador "Mozilla" abstracto (un legado de la "Primera guerra de navegadores") que cree que está en el iPhone. Luego vemos que hay un WebKit (que recuerda que nació como KHTML hace ya bastante tiempo). Luego hay una modificación de la Versión/6.0, que luego se modificó en Mobile/10A5376e, que se convirtió en Safari/8536.25, que finalmente revela el secreto de que en realidad es un bot móvil de Google.
Otro ejemplo:
Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; GTB7.4; ↲
InfoPath.1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.4506.2152; ↲
.NET CLR 3.5.30729; .NET CLR 1.1.4322)
Este es un motor único, pero tiene mucho que decir entre paréntesis.
Así que la observación general es:
- las cadenas del último motor son las más importantes,
- Los últimos comentarios entre paréntesis son menos importantes.
Teniendo eso en mente, mi idea sería analizar la cadena en estos tokens de motor y comentario, luego, desde cada sección del motor, descartar los comentarios a partir de, digamos, el quinto. Luego, si aún no es suficiente, deseche las secciones del motor a partir de la segunda (la primera suele ser un "Mozilla" abstracto, pero a menudo tiene comentarios útiles; también a veces es algo concreto, especialmente para los rastreadores web).
Al analizar, debemos tener en cuenta que ocasionalmente puede haber cadenas que no sigan este formato. Se pueden guardar en un archivo de registro para una inspección posterior y luego simplemente cortarlos a la longitud necesaria para que quepan en la base de datos.