我在flask应用程序中注意到了这一点,但是它使用werkzeug解析用户代理信息,并且在flask请求对象和独立的werkzeug useragent解析器中都看到了相同的行为。
看起来“宏”(设备模型)中存在子字符串“ 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'
我希望此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
。
或者,我们可以在自述文件和/或文档中添加一条消息,以说明我们的UserAgentParser
是基本的,在许多情况下不起作用。
我已经打开#1989来解决这个平台字符串,但是对于其余的对话而言,它还远未达到一个完整的解决方案。
最有用的评论
而不是内部执行此操作,也许您可以考虑添加对ua-parser库的依赖。 我对该项目及其项目进行了审查,该项目基于一个非常流行的跨语言核心,该核心具有非常大的测试集。 python版本支持多种python版本,并且代码本身应该非常稳定。