Werkzeug: L'analyse de l'agent utilisateur Werkzeug est désactivée pour le téléphone Android Motorola One Macro

Créé le 3 sept. 2020  ·  8Commentaires  ·  Source: pallets/werkzeug

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

  • Version Python: 3.7.3
  • Version de Werkzeug: 1.01
bug user-agent

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.

Tous les 8 commentaires

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.

Cette page vous a été utile?
0 / 5 - 0 notes