Я заметил это в приложении flask, но оно использует werkzeug для синтаксического анализа информации о пользователе и видел такое же поведение как в объекте запроса флакона, так и в автономном парсере пользовательского агента werkzeug.
Похоже наличие подстроки «mac» в «макросе» (модель устройства) ее отбрасывает. Однако я считаю, что это должно быть отменено ясным «Linux» и / или «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'
Я ожидал, что 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"
. Судя по тому, что я видел в заголовках пользовательских агентов, они могут сильно различаться. Возможно, кто-то, у кого больше опыта, сможет предложить лучшие шаблоны регулярных выражений. Я обеспокоен тем, что наш простой поиск по ключевым словам неадекватен и что может быть больше незамеченных ошибок, подобных вашей.
Вместо того, чтобы делать это собственными силами, возможно, вы можете рассмотреть возможность добавления зависимости от библиотеки ua-parser . Я сделал обзор проекта, основанного на довольно популярном кросс-языковом ядре с очень большим набором тестов . Версия python поддерживает очень широкий спектр версий python, и сам код должен быть довольно стабильным.
Я предлагаю PR, если вы не хотите взломать его. Похоже, хорошее решение.
Я хотел бы попробовать это. Спасибо!
Рад! Спасибо!
Я рад рассмотреть вопрос о PR, который регулирует правила сопоставления, чтобы исправить то, как сопоставляется этот агент, но мы не будем добавлять для этого зависимость.
Пакет ua-parser
находит соответствующий пользовательский агент с помощью шаблонов регулярных выражений (аналогично нашему подходу, но, очевидно, более тщательно). Их шаблоны регулярных выражений занимают ~ 5500 строк кода .
Я думаю, ясно, что мы не можем предложить полный UserAgentParser
без добавления ua-parser
в качестве зависимости или включения частей их кода в Werkzeug.
В качестве альтернативы мы можем добавить сообщение в readme и / или документацию, чтобы объяснить, что наш UserAgentParser
является базовым и не будет работать во многих сценариях.
Я открыл # 1989, чтобы обратиться к этой строке платформы, но это далеко не полное исправление для остальной части разговора здесь.
Самый полезный комментарий
Вместо того, чтобы делать это собственными силами, возможно, вы можете рассмотреть возможность добавления зависимости от библиотеки ua-parser . Я сделал обзор проекта, основанного на довольно популярном кросс-языковом ядре с очень большим набором тестов . Версия python поддерживает очень широкий спектр версий python, и сам код должен быть довольно стабильным.