Script PHP pour déchiffrer les chaînes User-Agent

Il est toujours bon de rappeler que le browser-sniffing, utilisé pour faire de la négociation de contenu est stupide.

Ceci dit la chaîne User-Agent est la seule source d’information à la disposition des webmasters pour générer des statistiques.

Ne me satisfaisant pas des outils statistiques existants, et voulant apprendre par moi-même, je me suis penché sur ces chaînes et sur la façon d’exploiter les renseignements qu’elles recèlent.

Voici le résultat de la détection de la chaîne User-Agent actuelle :

,

Vous pouvez également consulter le résultat appliqué à la liste des agents utilisateur sur sebastienguillon.com (j’ai laissé la chaîne User-Agent originale pour référence).

Une chaîne User-Agent peut contenir un nombre variable d’éléments, relatifs à la plateforme (et sa version), au nom de l’agent (et sa version), aux plug-ins ou extensions installés, à la capacité d’encryption, etc. Parce qu’il n’y a pas de norme, il existe des dizaines de milliers de chaînes User-Agent différentes. De plus, de nouveaux agents ou de nouvelles versions apparaissent quotidiennement, ce qui rend l’établissement d’une liste complète absolument impossible.

C’est pourquoi un script de détection des navigateurs et systèmes d’exploitation est toujours inachevé : le relatif degré de précision qu’il offre au moment de sa réalisation nécessitera un entretien régulier pour rester à jour.

Le script PHP

Ce script PHP utilise uniquement le contenu de la chaîne User-Agent envoyée au serveur. Il ne peut donc pas détecter les fonctionnalités du navigateur (version JavaScript, taille de la fenêtre, objets supportés, etc.) comme on le ferait en JavaScript. Mais c’est précisemment le but : ce script ne sert en aucun cas à faire de la négociation de contenu à quelque niveau que ce soit. Il devrait me servir à terme à générer des statistiques mensuelles.

télécharger le script

Notez bien que la version du script en téléchargement ne reflète pas systématiquement toutes les mises à jour du script actif.

Descripton du script

Le script fonctione sur une structure if ... elseif qui recherche des mots-clés. Il est donc plus efficace de mettre les mots-clés correspondants aux agents les plus fréquents au début. Mais parce que de nombreux agents se font passer pour ce qu'ils ne sont pas, ou utilisent un mot clé particulier pour indiquer une compatibilité avec un autre moteur (Gecko, KHTML, Mozilla), cela n'est pas toujours possible. Il faut filtrer en fonction des usages déjà rencontrés : c’est un travail sans fin.

Utilisation : $ua = get_ua_info($_SERVER['HTTP_USER_AGENT']);

La fonction principale (get_ua_info) prend en argument une chaîne User Agent quelconque et retourne un tableau nommé $ua comprenant les clés suivantes :

name

Description : Nom générique de l’agent ou nom du produit

Valeur par défaut : "" (chaîne vide)

ua_version

Description : Version déduite de la chaîne agent utilisateur

Valeur par défaut : "" (chaîne vide)

ua_class

Description : Classe qui pourra être utilisée avec CSS

Valeur par défaut : "Unknown"

ua_type

Description : Type d’agent

Valeurs possibles : "Browser" / "Robot" / "FeedReader" / "Validator"

Valeur par défaut : "UnknownUA"

os

Description : Nom générique de la plateforme ou de l’OS

Valeur par défaut : "" (chaîne vide)

os_version

Description : Version de la plateforme ou de l’OS

Valeur par défaut : "" (chaîne vide)

os_class

Description : Classe qui pourra être utilisée avec CSS

Valeur par défaut : "Unknown"

Le paramètre optionnel $detailed prend une valeur boléenne. Si la valeur est 0 les versions du navigateur et du système d’exploitation ne sont pas calculées ni retournées. La valeur par défaut est 1.

Je ne suis pas un spécialiste des expressions régulières, alors n’hésitez pas à proposer de meilleures solutions. Notez également que le script n’en est pas encore à sa version finale et qu’il se base sur une expérience de la détection des navigateurs datant de deux semaines…

Ressources

Les ressources ci-dessous m’ont été indispensables pour l’élaboration de la logique du script.

Listes d’Agents Utilisateur

Je me suis basé principalement sur les chaînes User-Agent récoltées sur mon site, ce qui représente un très petit échantillon de l’ensemble des agents utilisateur existants. Il est possible que des navigateurs et des systèmes très représentés sur d’autres sites soient absents de mon script. Si vous l’utilisez et que vous y ajoutez des éléments, merci de me les signaler.

← article précédentarticle suivant →

2 commentaires

1. z720 a écrit :

Si ça c'est pas formidable... Je suis en train de me dire que mon outil pour suivre mes stats n'est pas du tout pratique et je me posais la problématique de tout redévelopper dans un plugin pour mon outil de weblog. Jusque là, ça ne posait pas de problème particulier, sauf que justement, il faut analyser la chaine User-Agent et je ne me sentais pas le courage de faire ce que tu viens de faire.

Tu viens de lever un gros blocage, en tout cas si tu permets l'intégration de ton script dans un plugin distribué sous GPL.

Bref Merci pour ce superbe travail.

jeudi 13 octobre 2005 à 10h06

2. Sébastien a écrit :

Aucun problème z720, la licence GPL me plaît bien.

Du moment que mon nom apparaît toujours dans le script.

Je te conseille quand même de bien revoir la logique du script et de comparer avec les UA qui visitent ton site pour ne rien oublier d'important.

jeudi 13 octobre 2005 à 10h40

Les commentaires pour cet article sont fermés.