J'ai remarqué cela dans une application flask mais qui utilise werkzeug pour analyser les informations de l'agent utilisateur et j'ai vu le même comportement à la fois dans l'objet de requête flask et dans l'analyseur utilisateur werkzeug autonome.
Il semble que la présence de la sous-chaîne "mac" dans "macro" (le modèle de périphérique) la rejette. Cependant, je pense que cela devrait être remplacé par le clair "Linux" et / ou "Android 9".
>>> from werkzeug.useragents import UserAgent
>>> UserAgent("Mozilla/5.0 (Linux; Android 9; motorola one macro) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.111 Mobile Safari/537.36").platform
'macos'
Je m'attendrais à ce que le platform
pour cette chaîne useragent soit "android".
Environnement: Linux
Le problème est que UserAgentParser
trouve la plate-forme en recherchant naïvement des mots-clés.
Voici l'extrait de code pertinent:
platforms: Any = (
(" cros ", "chromeos"),
("iphone|ios", "iphone"),
("ipad", "ipad"),
(r"darwin|mac|os\s*x", "macos"),
("win", "windows"),
(r"android", "android"),
...
Dans votre cas, "darwin|mac|os\s*x"
trouve une correspondance avant la recherche de "android"
. D'après ce que j'ai vu des en-têtes d'agent utilisateur, ils peuvent varier énormément. Peut-être que quelqu'un qui a plus d'expérience peut suggérer de meilleurs modèles de regex. Je crains que notre simple recherche par mot-clé soit inadéquate et qu'il puisse y avoir plus de bogues inaperçus comme le vôtre.
Plutôt que de le faire en interne, vous pouvez peut-être envisager d'ajouter une dépendance à la bibliothèque ua-parser . J'ai fait un examen du projet et de son basé sur un noyau croisé assez populaire qui a un très grand ensemble de tests . La version python prend en charge un très large éventail de versions python et le code lui-même devrait être assez stable.
Je vais vous proposer un PR à moins que vous ne vouliez vous y mettre. Cela semble être une bonne solution.
Je voudrais tenter ma chance. Merci!
Rad! Merci!
Je suis heureux d'envisager un PR qui ajuste les règles de correspondance pour déterminer comment cet agent est mis en correspondance, mais nous n'ajouterons pas de dépendance pour cela.
Le package ua-parser
trouve l'agent utilisateur approprié en utilisant des modèles d'expression régulière (similaire à notre approche, mais évidemment plus approfondie). Leurs modèles d'expression régulière occupent environ 5500 lignes de code .
Je pense qu'il est clair que nous ne pouvons pas offrir un UserAgentParser
complet sans ajouter ua-parser
tant que dépendance ou inclure des parties de leur code dans Werkzeug.
Alternativement, nous pouvons ajouter un message dans le readme et / ou la documentation pour expliquer que notre UserAgentParser
est basique et ne fonctionnera pas dans de nombreux scénarios.
J'ai ouvert # 1989 pour traiter cette chaîne de plate-forme, mais c'est loin d'être une solution complète pour le reste de la conversation ici.
Commentaire le plus utile
Plutôt que de le faire en interne, vous pouvez peut-être envisager d'ajouter une dépendance à la bibliothèque ua-parser . J'ai fait un examen du projet et de son basé sur un noyau croisé assez populaire qui a un très grand ensemble de tests . La version python prend en charge un très large éventail de versions python et le code lui-même devrait être assez stable.