diff --git a/lib/httpagentparser/__init__.py b/lib/httpagentparser/__init__.py index bba1e436..9bac5148 100644 --- a/lib/httpagentparser/__init__.py +++ b/lib/httpagentparser/__init__.py @@ -8,7 +8,7 @@ Tries to * assist python web apps to detect clients. """ -__version__ = '1.7.8' +__version__ = '1.9.1' class DetectorsHub(dict): @@ -31,7 +31,7 @@ class DetectorsHub(dict): return iter(self._known_types) def registerDetectors(self): - detectors = [v() for v in globals().values() if DetectorBase in getattr(v, '__mro__', [])] + detectors = [v() for v in list(globals().values()) if DetectorBase in getattr(v, '__mro__', [])] for d in detectors: if d.can_register: self.register(d) @@ -123,17 +123,6 @@ class Browser(DetectorBase): can_register = False -class Firefox(Browser): - look_for = "Firefox" - version_markers = [('/', '')] - skip_if_found = ["SeaMonkey", "web/snippet"] - - -class SeaMonkey(Browser): - look_for = "SeaMonkey" - version_markers = [('/', '')] - - class Konqueror(Browser): look_for = "Konqueror" version_markers = ["/", ";"] @@ -154,6 +143,7 @@ class OperaMobile(Browser): class Opera(Browser): look_for = "Opera" + skip_if_found = ['Opera Mobi'] def getVersion(self, agent, word): try: @@ -171,6 +161,7 @@ class OperaNew(Browser): """ name = "Opera" look_for = "OPR" + skip_if_found = ["Build/OPR"] version_markers = [('/', '')] @@ -206,6 +197,14 @@ class MSEdge(Browser): skip_if_found = ["MSIE"] version_markers = ["/", ""] +class ChromiumEdge(Browser): + look_for = "Edg/" + + def getVersion(self, agent, word): + if "Edg/" in agent: + return agent.split('Edg/')[-1].strip() + + class Galeon(Browser): look_for = "Galeon" @@ -219,10 +218,10 @@ class WOSBrowser(Browser): class Safari(Browser): look_for = "Safari" - skip_if_found = ["Edge"] + skip_if_found = ["Edge", "YaBrowser"] def checkWords(self, agent): - unless_list = ["Chrome", "OmniWeb", "wOSBrowser", "Android"] + unless_list = ["Chrome", "OmniWeb", "wOSBrowser", "Android", "CriOS"] if self.look_for in agent: for word in unless_list: if word in agent: @@ -274,6 +273,10 @@ class TwitterBot(Browser): look_for = "Twitterbot" bot = True +class TelegramBot(Browser): + look_for = "TelegramBot" + bot = True + class MJ12Bot(Browser): look_for = "MJ12bot" bot = True @@ -397,13 +400,24 @@ class NintendoBrowser(Browser): class AndroidBrowser(Browser): look_for = "Android" - skip_if_found = ['Chrome', 'Windows Phone'] + skip_if_found = ['Chrome', 'Windows Phone', 'Opera', 'Firefox'] # http://decadecity.net/blog/2013/11/21/android-browser-versions def getVersion(self, agent, word): pass +class Firefox(Browser): + look_for = "Firefox" + version_markers = [('/', '')] + skip_if_found = ["SeaMonkey", "web/snippet"] + + +class SeaMonkey(Browser): + look_for = "SeaMonkey" + version_markers = [('/', '')] + + class Linux(OS): look_for = 'Linux' platform = 'Linux' @@ -534,11 +548,10 @@ class Debian(Dist): look_for = 'Debian' version_markers = ["/", " "] - class Chrome(Browser): look_for = "Chrome" version_markers = ["/", " "] - skip_if_found = ["OPR", "Edge"] + skip_if_found = [" OPR", "Edge", "YaBrowser", "Edg/"] def getVersion(self, agent, word): part = agent.split(word + self.version_markers[0])[-1] @@ -547,6 +560,17 @@ class Chrome(Browser): version = part.split('+')[0] return version.strip() +class YaBrowser(Browser): + look_for = "YaBrowser" + name = "Yandex.Browser" + version_markers = ["/", " "] + + def getVersion(self, agent, word): + part = agent.split(word + self.version_markers[0])[-1] + version = part.split(self.version_markers[1])[0] + if '+' in version: + version = part.split('+')[0] + return version.strip() class ChromeiOS(Browser): look_for = "CriOS" @@ -571,7 +595,7 @@ class Android(Dist): skip_if_found = ['Windows Phone'] def getVersion(self, agent, word): - return agent.split(word)[-1].split(';')[0].strip() + return agent.split(word)[-1].replace(')', ';').split(';')[0].strip() class WebOS(Dist): @@ -639,13 +663,10 @@ def detect(agent, fill_none=False): pass if fill_none: - attrs_d = {'name': None, 'version': None} - for key in ('os', 'browser'): - if key not in result: - result[key] = attrs_d - else: - for k, v in attrs_d.items(): - result[k] = v + for outer_key in ('os', 'browser'): + outer_value = result.setdefault(outer_key, dict()) + for inner_key in ('name', 'version'): + outer_value.setdefault(inner_key, None) return result