フラスコアプリでこれに気づきましたが、werkzeugを使用してユーザーエージェント情報を解析し、フラスコリクエストオブジェクトとスタンドアロンのwerkzeugユーザーエージェントパーサーの両方で同じ動作が見られました。
「macro」(デバイスモデル)の部分文字列「mac」の存在がそれを捨てているように見えます。 ただし、それは明確な「Linux」や「Android9」で上書きする必要があると思います。
>>> 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'
このuseragent文字列のplatform
は「android」であると思います。
環境:Linux
問題は、 UserAgentParser
がキーワードを素朴に検索してプラットフォームを見つけることです。
関連するコードスニペットは次のとおりです。
platforms: Any = (
(" cros ", "chromeos"),
("iphone|ios", "iphone"),
("ipad", "ipad"),
(r"darwin|mac|os\s*x", "macos"),
("win", "windows"),
(r"android", "android"),
...
あなたの場合、 "darwin|mac|os\s*x"
は、 "android"
が検索される前に、一致するものを見つけます。 私がユーザーエージェントヘッダーについて見てきたことから、それらは大きく異なる可能性があります。 おそらく、より多くの経験を持っている人は、より良い正規表現パターンを提案することができます。 私たちの単純なキーワード検索では不十分であり、あなたのような見過ごされているバグがもっとあるのではないかと心配しています。
あなたがそれをクラックしたくないのでなければ、私はPRを提供します。 良い解決策のようです。
ひびを入れたいと思います。 ありがとう!
ラッド! ありがとう!
このエージェントのマッチング方法を修正するためにマッチングルールを調整するPRを検討できてうれしいですが、これに対する依存関係は追加しません。
ua-parser
パッケージは、正規表現パターンを使用して適切なユーザーエージェントを見つけます(私たちのアプローチに似ていますが、明らかにより徹底的です)。 それらの正規表現パターンは、最大5500行のコードを使用します。
ua-parser
を依存関係として追加するか、コードの一部をWerkzeugに含めることなく、完全なUserAgentParser
を提供できないことは明らかだと思います。
または、readmeやドキュメントにメッセージを追加して、 UserAgentParser
が基本的であり、多くのシナリオで機能しないことを説明することもできます。
このプラットフォーム文字列に対処するために#1989を開きましたが、ここでの残りの会話の完全な修正にはほど遠いです。
最も参考になるコメント
これを社内で行うのではなく、 ua-parserライブラリへの依存関係を追加することを検討できます。 私はプロジェクトのレビューを行い、非常に大きなテストセットを持つ非常に人気のあるクロスランゲージコアに基づいています。 Pythonバージョンは非常に幅広いPythonバージョンをサポートしており、コード自体はかなり安定しているはずです。