Werkzeug: Синтаксический анализ агента Werkzeug отключен для телефона Motorola One Macro с ОС Android

Созданный на 3 сент. 2020  ·  8Комментарии  ·  Источник: pallets/werkzeug

Я заметил это в приложении 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

  • Версия Python: 3.7.3
  • Версия Werkzeug: 1.01
bug user-agent

Самый полезный комментарий

Вместо того, чтобы делать это собственными силами, возможно, вы можете рассмотреть возможность добавления зависимости от библиотеки ua-parser . Я сделал обзор проекта, основанного на довольно популярном кросс-языковом ядре с очень большим набором тестов . Версия python поддерживает очень широкий спектр версий python, и сам код должен быть довольно стабильным.

Все 8 Комментарий

Проблема в том, что 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, чтобы обратиться к этой строке платформы, но это далеко не полное исправление для остальной части разговора здесь.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги