From fbffecde758e19d9376826d42b42baa4af9c8e12 Mon Sep 17 00:00:00 2001 From: Viktor Trako Date: Thu, 3 Sep 2015 12:11:41 +0100 Subject: [PATCH 01/14] tidy it --- ua_parser/main.py | 37 +++++++++ ua_parser/random_user_agent_strings.txt | 99 ++++++++++++++++++++++++ ua_parser/user_agent_wrapper.py | 99 ++++++++++++++++++++++++ ua_parser/user_agent_wrapper.pyc | Bin 0 -> 2700 bytes ua_parser/user_agent_wrapper_test.py | 72 +++++++++++++++++ 5 files changed, 307 insertions(+) create mode 100644 ua_parser/main.py create mode 100644 ua_parser/random_user_agent_strings.txt create mode 100644 ua_parser/user_agent_wrapper.py create mode 100644 ua_parser/user_agent_wrapper.pyc create mode 100644 ua_parser/user_agent_wrapper_test.py diff --git a/ua_parser/main.py b/ua_parser/main.py new file mode 100644 index 0000000..c3b657d --- /dev/null +++ b/ua_parser/main.py @@ -0,0 +1,37 @@ +""" + Wrapper around the python lib - pass in a string or a file of user agent strings + Run: + # python main.py + + E.g. from file woth : + python main.py file ./random_user_agent_strings.txt , ./something_nice + + from user agent string: + python main.py string "Mozilla/5.0 (Linux; Android 4.2.2; GT-I9195 Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.133 Mobile Safari/537.36" , +""" + +__author__ = 'viktor.trako@holidayextras.com (Viktor Trako)' + +import sys +import user_agent_wrapper +# print 'Number of arguments:', len(sys.argv), 'arguments.' +# print 'Argument List:', str(sys.argv) + +if len(sys.argv) >= 4: + inputType = sys.argv[1] + inputFormat = sys.argv[2] + delimiter = sys.argv[3] + if len(sys.argv) == 5: + inFilePath = inputFormat + outFilePath = sys.argv[4] + if inputType == 'string': + parsedUaString = user_agent_wrapper.parseFromString(inputFormat, delimiter) + print parsedUaString + # pass it to string parser + if inputType == 'file': + user_agent_wrapper.parseFromFile(inFilePath, outFilePath, delimiter) + else: + sys.exit(1) +else: + print 'Usage: main.py ' + sys.exit(1) diff --git a/ua_parser/random_user_agent_strings.txt b/ua_parser/random_user_agent_strings.txt new file mode 100644 index 0000000..2ed96eb --- /dev/null +++ b/ua_parser/random_user_agent_strings.txt @@ -0,0 +1,99 @@ +Kinder-Tablet-1.0-Weltbild-Mozilla/5.0 (Linux; U; Android 4.2.2; en-US; EOS10 Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30 +LG-D213 Mozilla/5.0 (Linux; U; Android 4.4.2; en-gb; LG-D213 Build/KOT49I.A1409142547) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.1599.103 Mobile Safari/537.36 +LG-D802 Mozilla/5.0 (Linux; U; Android 4.4.2; en-gb; LG-D802 Build/KOT49I.D80220h) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.1599.103 Mobile Safari/537.36 +LG-D855/Mozilla/5.0 (Linux; U; Android 5.0; en-gb; LG-D855 Build/LRX21R.A1422018487) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/34.0.1847.118 Mobile Safari/537.36 +LG-H815/Mozilla/5.0 (Linux; Android 5.1; LG-H815 Build/LMY47D) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/38.0.2125.102 Mobile Safari/537.36 +Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Trident/5.0; SLCC1; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; AskTbORJ/5.15.9.29495; .NET4.0C; McAfee; .NET4.0E) +Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 1.1.4322; .NET4.0C; .NET4.0E) +Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E) +Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; InfoPath.3; .NET4.0E; .NET CLR 1.1.4322) +Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E) +Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; Tablet PC 2.0; InfoPath.3) +Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/6.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C; .NET4.0E; InfoPath.3) +Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/6.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C; .NET4.0E) +Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; InfoPath.3) +Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; BRI/2; .NET4.0E; MALC) +Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 2.0.50727; SLCC2; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C; .NET4.0E; HK) +Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.2; WOW64; Trident/7.0; .NET4.0E; .NET4.0C; .NET CLR 3.5.30729; .NET CLR 2.0.50727; .NET CLR 3.0.30729; Tablet PC 2.0; InfoPath.2; GWX:RESERVED; MASEJS) +Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.3; WOW64; Trident/7.0; .NET4.0E; .NET4.0C; .NET CLR 3.5.30729; .NET CLR 2.0.50727; .NET CLR 3.0.30729; BRI/2; Media Center PC 6.0; GWX:DOWNLOADED; MAARJS) +Mozilla/5.0 (AOL 9.7; AOLBuild 4343.1023; Windows NT 5.1; WOW64; Trident/7.0; rv:11.0) like Gecko +Mozilla/5.0 (AOL 9.7; AOLBuild 4343.1028; Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko +Mozilla/5.0 (AOL 9.7; AOLBuild 4343.27; Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko +Mozilla/5.0 (AOL 9.7; AOLBuild 4343.30; Windows NT 6.1; WOW64; Trident/7.0; NP06; rv:11.0) like Gecko +Mozilla/5.0 (AOL 9.7; AOLBuild 4343.30; Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko +Mozilla/5.0 (AOL 9.7; AOLBuild 4343.55; Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko +Mozilla/5.0 (Android; Mobile; rv:34.0) Gecko/34.0 Firefox/34.0 +Mozilla/5.0 (Android; Mobile; rv:38.0) Gecko/38.0 Firefox/38.0 +Mozilla/5.0 (Android; Mobile; rv:39.0) Gecko/39.0 Firefox/39.0 +Mozilla/5.0 (Android; Mobile; rv:40.0) Gecko/40.0 Firefox/40.0 +Mozilla/5.0 (Android; Tablet; rv:23.0) Gecko/23.0 Firefox/23.0 +Mozilla/5.0 (Android; Tablet; rv:34.0) Gecko/34.0 Firefox/34.0 +Mozilla/5.0 (Android; Tablet; rv:39.0) Gecko/39.0 Firefox/39.0 +Mozilla/5.0 (Android; Tablet; rv:40.0) Gecko/40.0 Firefox/40.0 +Mozilla/5.0 (BB10; Kbd) AppleWebKit/537.35+ (KHTML, like Gecko) Version/10.2.1.3442 Mobile Safari/537.35+ +Mozilla/5.0 (BB10; Kbd) AppleWebKit/537.35+ (KHTML, like Gecko) Version/10.3.1.2576 Mobile Safari/537.35+ +Mozilla/5.0 (BB10; Touch) AppleWebKit/537.35+ (KHTML, like Gecko) Version/10.3.1.2576 Mobile Safari/537.35+ +Mozilla/5.0 (Linux; Android 4.0.3; A500 Build/IML74K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.111 Safari/537.36 +Mozilla/5.0 (Linux; Android 4.0.3; GT-I9100 Build/IML74K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.111 Mobile Safari/537.36 +Mozilla/5.0 (Linux; Android 4.0.3; KFTT Build/IML74K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.94 Mobile Safari/537.36 +Mozilla/5.0 (Linux; Android 4.0.3; Sony Tablet S Build/TISU0143) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.111 Safari/537.36 +Mozilla/5.0 (Linux; Android 4.0.4; BNTV400 Build/IMM76L) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.111 Safari/537.36 +Mozilla/5.0 (Linux; Android 4.0.4; BNTV600 Build/IMM76L) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.111 Safari/537.36 +Mozilla/5.0 (Linux; Android 4.0.4; GT-P7510 Build/IMM76D) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.111 Safari/537.36 +Mozilla/5.0 (Linux; Android 4.0.4; MZ604 Build/I.7.1-45) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.111 Safari/537.36 +Mozilla/5.0 (Linux; Android 4.1.1; A210 Build/JRO03H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.133 Safari/537.36 +Mozilla/5.0 (Linux; Android 4.1.1; Archos 97 Cobalt Build/JRO03H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.94 Safari/537.36 +Mozilla/5.0 (Linux; Android 4.1.1; C1505 Build/11.3.A.2.13) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19 +Mozilla/5.0 (Linux; Android 4.1.1; C1505 Build/11.3.A.2.33) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.94 Mobile Safari/537.36 +Mozilla/5.0 (Linux; Android 4.1.1; GT-P5110 Build/JRO03C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.133 Safari/537.36 +Mozilla/5.0 (Linux; Android 4.1.1; HP Slate 7 Build/JRO03H) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19 +Mozilla/5.0 (Linux; Android 4.1.1; HP Slate 7 Build/JRO03H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.133 Safari/537.36 +Mozilla/5.0 (Linux; Android 4.1.1; HP Slate 7 Build/JRO03H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.84 Safari/537.36 +Mozilla/5.0 (Linux; Android 4.1.1; HTC One S Build/JRO03C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.111 Mobile Safari/537.36 +Mozilla/5.0 (Linux; Android 4.1.1; HTC One S Build/JRO03C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.133 Mobile Safari/537.36 +Mozilla/5.0 (Linux; Android 4.1.1; ME172V Build/JRO03H) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19 +Mozilla/5.0 (Linux; Android 4.1.1; SGPT12 Build/TJDSU0177) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.133 Safari/537.36 +Mozilla/5.0 (Linux; Android 4.1.1; Vodafone 875 Build/JRO03C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.133 Mobile Safari/537.36 +Mozilla/5.0 (Linux; Android 4.1.2; C1905 Build/15.1.C.2.8) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.111 Mobile Safari/537.36 +Mozilla/5.0 (Linux; Android 4.1.2; C5303 Build/12.0.A.2.254) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.133 Mobile Safari/537.36 +Mozilla/5.0 (Linux; Android 4.1.2; GT-I8190 Build/JZO54K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.133 Mobile Safari/537.36 +Mozilla/5.0 (Linux; Android 4.1.2; GT-I8190N Build/JZO54K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.94 Mobile Safari/537.36 +Mozilla/5.0 (Linux; Android 4.1.2; GT-I8190N Build/JZO54K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.133 Mobile Safari/537.36 +Mozilla/5.0 (Linux; Android 4.1.2; GT-I9100 Build/JZO54K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.111 Mobile Safari/537.36 +Mozilla/5.0 (Linux; Android 4.1.2; GT-I9100 Build/JZO54K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.133 Mobile Safari/537.36 +Mozilla/5.0 (Linux; Android 4.1.2; GT-I9300 Build/JZO54K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.133 Mobile Safari/537.36 +Mozilla/5.0 (Linux; Android 4.1.2; GT-N8010 Build/JZO54K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.133 Safari/537.36 +Mozilla/5.0 (Linux; Android 4.1.2; GT-N8013 Build/JZO54K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.133 Safari/537.36 +Mozilla/5.0 (Linux; Android 4.1.2; GT-P3110 Build/JZO54K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.93 Safari/537.36 +Mozilla/5.0 (Linux; Android 4.1.2; HTC Desire 500 Build/JZO54K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Mobile Safari/537.36 +Mozilla/5.0 (Linux; Android 4.1.2; HTC Desire 500 Build/JZO54K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.94 Mobile Safari/537.36 +Mozilla/5.0 (Linux; Android 4.1.2; LT26i Build/6.2.B.1.96) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.114 Mobile Safari/537.36 +Mozilla/5.0 (Linux; Android 4.1.2; SGP321 Build/10.1.1.A.1.307) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.133 Safari/537.36 +Mozilla/5.0 (Linux; Android 4.1.2; ST26i Build/11.2.A.0.31) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.99 Mobile Safari/537.36 +Mozilla/5.0 (Linux; Android 4.1.2; XT890 Build/9.8.2I-50_SMI-29) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.133 Mobile Safari/537.36 +Mozilla/5.0 (Linux; Android 4.2.1; AT10-A Build/JOP40D) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.133 Safari/537.36 +Mozilla/5.0 (Linux; Android 4.2.1; AT10LE-A Build/JOP40D) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.92 Safari/537.36 +Mozilla/5.0 (Linux; Android 4.2.1; AT10LE-A Build/JOP40D) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.133 Safari/537.36 +Mozilla/5.0 (Linux; Android 4.2.1; M470BSE Build/JOP40D) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.133 Safari/537.36 +Mozilla/5.0 (Linux; Android 4.2.1; Nexus 7 Build/JOP40D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19 +Mozilla/5.0 (Linux; Android 4.2.2; A1-810 Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.133 Safari/537.36 +Mozilla/5.0 (Linux; Android 4.2.2; A3-A10 Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.133 Safari/537.36 +Mozilla/5.0 (Linux; Android 4.2.2; Archos 101 Neon Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.96 Safari/537.36 +Mozilla/5.0 (Linux; Android 4.2.2; Archos 101 Neon Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.133 Safari/537.36 +Mozilla/5.0 (Linux; Android 4.2.2; B1-730HD Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.133 Safari/537.36 +Mozilla/5.0 (Linux; Android 4.2.2; BN NookHD+ Build/JDQ39E) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.133 Safari/537.36 +Mozilla/5.0 (Linux; Android 4.2.2; Bush Mytablet 2 Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.133 Safari/537.36 +Mozilla/5.0 (Linux; Android 4.2.2; C2105 Build/15.3.A.0.26) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.111 Mobile Safari/537.36 +Mozilla/5.0 (Linux; Android 4.2.2; C2105 Build/15.3.A.1.14) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.89 Mobile Safari/537.36 +Mozilla/5.0 (Linux; Android 4.2.2; C2105 Build/15.3.A.1.14) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.133 Mobile Safari/537.36 +Mozilla/5.0 (Linux; Android 4.2.2; GT-I8200N Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.109 Mobile Safari/537.36 +Mozilla/5.0 (Linux; Android 4.2.2; GT-I8200N Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.133 Mobile Safari/537.36 +Mozilla/5.0 (Linux; Android 4.2.2; GT-I9060 Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.133 Mobile Safari/537.36 +Mozilla/5.0 (Linux; Android 4.2.2; GT-I9192 Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.133 Mobile Safari/537.36 +Mozilla/5.0 (Linux; Android 4.2.2; GT-I9195 Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.92 Mobile Safari/537.36 +Mozilla/5.0 (Linux; Android 4.2.2; GT-I9195 Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.93 Mobile Safari/537.36 +Mozilla/5.0 (Linux; Android 4.2.2; GT-I9195 Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.133 Mobile Safari/537.36 +Mozilla/5.0 (Linux; Android 4.2.2; GT-I9505 Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.93 Mobile Safari/537.36 +Mozilla/5.0 (Linux; Android 4.2.2; GT-P3110 Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.133 Safari/537.36 +Mozilla/5.0 (Linux; Android 4.2.2; GT-P5100 Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.93 Safari/537.36 +Mozilla/5.0 (Linux; Android 4.2.2; GT-P5110 Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.133 Safari/537.36 \ No newline at end of file diff --git a/ua_parser/user_agent_wrapper.py b/ua_parser/user_agent_wrapper.py new file mode 100644 index 0000000..dd536a9 --- /dev/null +++ b/ua_parser/user_agent_wrapper.py @@ -0,0 +1,99 @@ +""" + Wrapper around the python lib - pass in a string or a file of user agent strings + Run: + # python main.py + When running from file, the output file with generate a file with the following headers: + user_agent,device,os,os_major,os_minor,os_patch_minor,os_patch,browser,browser_major,browser_minor,browser_patch +""" +from numpy.lib.arraysetops import in1d + +__author__ = 'viktor.trako@holidayextras.com (Viktor Trako)' + +from ua_parser import user_agent_parser +import json +# print 'Number of arguments:', len(sys.argv), 'arguments.' +# print 'Argument List:', str(sys.argv) + + +def parseFromFile(inFilePath, outFilePath, delimiter): + "Parse user agents using a file input" + # return parseUaString(filePath, delimiter) + inFileOpen = open(inFilePath, "r") + outFileOpen = open(outFilePath, "wb") + outFileOpen.write("user_agent"+delimiter+\ + "device"+delimiter+\ + "os"+delimiter+\ + "os_major"+delimiter+\ + "os_minor"+delimiter+\ + "os_patch_minor"+delimiter+\ + "os_patch"+delimiter+\ + "browser"+ delimiter+\ + "browser_major"+ delimiter+\ + "browser_minor"+delimiter+\ + "browser_patch\n") + for line in inFileOpen: + parsedUaString = parseUaString(line, delimiter) + outFileOpen.write(str(parsedUaString+'\n')) + inFileOpen.close() + outFileOpen.close() + + +def parseFromString(uaString, delimiter): + "Parse user agents using a file input" + return parseUaString(uaString, delimiter) + + +def parseUaString(str, delimiter): + "Use the provided lib to parse the user agent string" + # print 'UA String to Parse =', sys.argv[1] + # On the server, you could use a WebOB request object. + # user_agent_string = request.META.get('HTTP_USER_AGENT') + + # def main(argv): + + # For demonstration purposes, though an iPhone ... + # user_agent_string = 'Mozilla/5.0 (iPhone; CPU iPhone OS 5_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9B179 Safari/7534.48.3' + user_agent_string = str + # Get back a big dictionary of all the goodies. + result_dict = user_agent_parser.Parse(user_agent_string) + + uaJson = json.dumps(result_dict, separators="," ":") + + # print json.dumps(result_dict['user_agent'], separators="," ":") + # {'major': '5', 'minor': '1', 'family': 'Mobile Safari', 'patch': None} + + # print json.dumps(result_dict['os'], separators="," ":") + # {'major': '5', 'patch_minor': None, 'minor': '1', 'family': 'iOS', 'patch': None} + + # print json.dumps(result_dict['device'], separators="," ":") + # {'family': 'iPhone'} + # print '__name__ = ', __name__ + if delimiter == "json": + return uaJson + if delimiter == "\\t" or delimiter == ",": + user_agent = json.dumps(result_dict['string'], separators="," ":") + device = json.dumps(result_dict['device']['family'], separators="," ":") + os = json.dumps(result_dict['os']['family'], separators="," ":") + os_major = json.dumps(result_dict['os']['major'], separators="," ":") + os_minor = json.dumps(result_dict['os']['minor'], separators="," ":") + os_patch_minor = json.dumps(result_dict['os']['patch_minor'], separators="," ":") + os_patch = json.dumps(result_dict['os']['patch'], separators="," ":") + browser = json.dumps(result_dict['user_agent']['family'], separators="," ":") + browser_major = json.dumps(result_dict['user_agent']['major'], separators="," ":") + browser_minor = json.dumps(result_dict['user_agent']['minor'], separators="," ":") + browser_patch = json.dumps(result_dict['user_agent']['patch'], separators="," ":") + + return user_agent+delimiter+\ + device + delimiter+\ + os+ delimiter+\ + os_major+ delimiter+\ + os_minor+ delimiter+\ + os_patch_minor+ delimiter+\ + os_patch+ delimiter+\ + browser+ delimiter+\ + browser_major+ delimiter+\ + browser_minor+ delimiter+\ + browser_patch + + else: + return "Unknown delimiter" diff --git a/ua_parser/user_agent_wrapper.pyc b/ua_parser/user_agent_wrapper.pyc new file mode 100644 index 0000000000000000000000000000000000000000..79b641217adb2b42155f041ee8252d2dd160dd45 GIT binary patch literal 2700 zcma)8OK&4Z5Uw7-?IaFJt892_Bsdu1jX>N&v|1@Bi#Tke2_aG>WKBGi^(5nI)7=xV zCFer8^ZPh*gBub*0P3q5C$_m{?CGlRs;;i;uKIc^|7^DZ-u?4zNaf=(eZ{Xm=O!Y$ z;8s!OQL1R{(S=7Us?bG6Myr%oXyCZGJq1!L#&0+DSe~^c#vW)ak zLO0^EC{B}c;$pM!x90u%wbj|n!uL^}`6kaY_;qFUSp4cs5IT3fNa5%-aU-9dj7{j` zh4(UuaIbWl>M2Z&;xLMhEnG)v0|~7k#ka{Y?rY2c!8p9uMwlckm`Uh{qrrHk+rKn= z$`%&1oK}vO%8Q;DXea;j)8lg?SLG(jzKZM%W^R)kr_G)-;f;PZ(rFTfv-ll%?cR_> z?)@lo{|CrFFXq3;(;odFOhUu1yct$_xWR9Y-$Q=w@7y?|xun^>M|TzJO3I;IrFoUE zxm%&RM>|oKc7)bSS}$p%q|K7HO4=@Ir=%Mt-K3p+Me5xl%`5cnPv6j8jhsjG8kWJr zoW)!8+VQe=V$Ijz6@C;0QCFtJ!q30ZIh(ky(mj!aQpph~`ZhxRjGGh0zm%(%d7O8d z$C8c?8*kVNqUoh;GkM%VSLbe#1frm=Yx2k<86G;w0Jl|0mXcy2mm!A(C=cFkKJrC^ ztd78*g}v28u?S4gH1hLBU0V3x?%`-9ee{Hj61}P6(h<8d<*Y0)-b&sbXGCY1Y8&_9 znM9ssM_i33Tz#&?V_ZrPeSpV9JuWF9W4R?|=_8HPB#UKF3WpcV_gF;I*k{Z=?)6|= z01^Ymqti!R+i>B1R<+MDwbE5xRc{@urrKn#t3Fh1{ta<{coE$pzZP3ur1)GRwN9l% zo}3n<9bm(IFe^v7z^DM8KPiwdD@yzbqyV@tc*w#edEzvdc&N+2_%OLB?>xB9^@plZ zQk@=Mb5Rr*00tFmR0{OQBeRcsJw?At+_!(ns8;! zt{{_Q@B-k00`Ncqc%T40Pyik%01p&^2g-mabgQI{V5baYr_nYiB+%M^&CMC3lw80@ z-zHHU$rbE0-@(8yNKhv$_pOwmjaeh)OTtP<_4fqg*QFO0=dbce**V|PnZ+KQ9hnn z0p|eIrHb6zja9fQfMQ~sr*04>LnjgB;rASvEH7b*?*XtY04N7Qr~vpK!1rJSjex*1 z*h&abDP1Z3FWH6_?RMSkde1r=s;Zu=UG?$*f1P7htMstGApKwv>EU4D02LVrKHKBZ zs=d&daAsqtCtRXXh5ld==KSGhSQ|0qVR>)MM#}aDAMkka5gI`xW}b#W*qDQ{j&lCS V!cNJhQdiqv-P=|hwbpK{_8 Date: Thu, 3 Sep 2015 14:56:50 +0100 Subject: [PATCH 02/14] change submodule to point to our forked repo so that we can add our own test cases --- .gitmodules | 2 +- Makefile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitmodules b/.gitmodules index 6d61431..2b85eb7 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,4 +1,4 @@ [submodule "uap-core"] path = uap-core - url = https://github.com/ua-parser/uap-core.git + url = https://github.com/holidayextras/uap-core.git branch = master diff --git a/Makefile b/Makefile index ae741a8..515c476 100644 --- a/Makefile +++ b/Makefile @@ -4,7 +4,7 @@ all: prep test prep: #git submodule update --init - #sudo apt-get install python-yaml + sudo apt-get install python-yaml test: @#test ! -d tmp && mkdir tmp From 5c9f64e73843562cacef5b20c4765d939f6d9474 Mon Sep 17 00:00:00 2001 From: Viktor Trako Date: Thu, 3 Sep 2015 15:08:55 +0100 Subject: [PATCH 03/14] repoint submodule to our forked repo --- uap-core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/uap-core b/uap-core index 0adc071..b09df94 160000 --- a/uap-core +++ b/uap-core @@ -1 +1 @@ -Subproject commit 0adc0716a0976ea0472a43d32e7c7a5f584b4e30 +Subproject commit b09df94e238a4ae24e3c07d93d164b60932b2a1a From c31f22d01a58984eb93f97b5aef3fa6709c9d14d Mon Sep 17 00:00:00 2001 From: Viktor Trako Date: Thu, 3 Sep 2015 15:34:26 +0100 Subject: [PATCH 04/14] remove print result from unit test now that write to file is happening nothing is returned - test around data in the outfile --- ua_parser/user_agent_wrapper_test.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/ua_parser/user_agent_wrapper_test.py b/ua_parser/user_agent_wrapper_test.py index 821a62d..ab6c534 100644 --- a/ua_parser/user_agent_wrapper_test.py +++ b/ua_parser/user_agent_wrapper_test.py @@ -65,8 +65,7 @@ def runParserUserAgentStringFromStringAsJson(self): def runParseUserAgentStringsFromFile(self, inFilePath, outFilePath): delimiter = "," - result = user_agent_wrapper.parseFromFile(inFilePath, outFilePath, delimiter) - print result + user_agent_wrapper.parseFromFile(inFilePath, outFilePath, delimiter) if __name__ == '__main__': unittest.main() From 556eedb89ca4ff37c5c919432907478e9039f87a Mon Sep 17 00:00:00 2001 From: Viktor Trako Date: Thu, 3 Sep 2015 16:05:57 +0100 Subject: [PATCH 05/14] remove \n chars from the user agent string when it is writen to file --- ua_parser/user_agent_wrapper.py | 14 +++++++------- ua_parser/user_agent_wrapper_test.py | 1 - 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/ua_parser/user_agent_wrapper.py b/ua_parser/user_agent_wrapper.py index dd536a9..0214ce2 100644 --- a/ua_parser/user_agent_wrapper.py +++ b/ua_parser/user_agent_wrapper.py @@ -33,7 +33,7 @@ def parseFromFile(inFilePath, outFilePath, delimiter): "browser_patch\n") for line in inFileOpen: parsedUaString = parseUaString(line, delimiter) - outFileOpen.write(str(parsedUaString+'\n')) + outFileOpen.write(str(parsedUaString)) inFileOpen.close() outFileOpen.close() @@ -43,7 +43,7 @@ def parseFromString(uaString, delimiter): return parseUaString(uaString, delimiter) -def parseUaString(str, delimiter): +def parseUaString(uaString, delimiter): "Use the provided lib to parse the user agent string" # print 'UA String to Parse =', sys.argv[1] # On the server, you could use a WebOB request object. @@ -53,7 +53,7 @@ def parseUaString(str, delimiter): # For demonstration purposes, though an iPhone ... # user_agent_string = 'Mozilla/5.0 (iPhone; CPU iPhone OS 5_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9B179 Safari/7534.48.3' - user_agent_string = str + user_agent_string = uaString # Get back a big dictionary of all the goodies. result_dict = user_agent_parser.Parse(user_agent_string) @@ -73,7 +73,7 @@ def parseUaString(str, delimiter): if delimiter == "\\t" or delimiter == ",": user_agent = json.dumps(result_dict['string'], separators="," ":") device = json.dumps(result_dict['device']['family'], separators="," ":") - os = json.dumps(result_dict['os']['family'], separators="," ":") + os_family = json.dumps(result_dict['os']['family'], separators="," ":") os_major = json.dumps(result_dict['os']['major'], separators="," ":") os_minor = json.dumps(result_dict['os']['minor'], separators="," ":") os_patch_minor = json.dumps(result_dict['os']['patch_minor'], separators="," ":") @@ -83,9 +83,9 @@ def parseUaString(str, delimiter): browser_minor = json.dumps(result_dict['user_agent']['minor'], separators="," ":") browser_patch = json.dumps(result_dict['user_agent']['patch'], separators="," ":") - return user_agent+delimiter+\ + return user_agent.replace("\\n", "")+delimiter+\ device + delimiter+\ - os+ delimiter+\ + os_family+ delimiter+\ os_major+ delimiter+\ os_minor+ delimiter+\ os_patch_minor+ delimiter+\ @@ -93,7 +93,7 @@ def parseUaString(str, delimiter): browser+ delimiter+\ browser_major+ delimiter+\ browser_minor+ delimiter+\ - browser_patch + browser_patch+'\n' else: return "Unknown delimiter" diff --git a/ua_parser/user_agent_wrapper_test.py b/ua_parser/user_agent_wrapper_test.py index ab6c534..16be5cd 100644 --- a/ua_parser/user_agent_wrapper_test.py +++ b/ua_parser/user_agent_wrapper_test.py @@ -18,7 +18,6 @@ class ParseStringWithGivenDelimiter(unittest.TestCase): def testUserAgentStringsFromFile(self): - # self.runParseUserAgentStringsFromFile() self.runParseUserAgentStringsFromFile(os.path.join( TEST_RESOURCES_DIR, 'random_user_agent_strings.txt'), os.path.join( os.path.abspath(os.path.dirname(__file__)), './ua_out_file')) From 8fabfdaa575aeca48f471d4931700b8d9aebc3fe Mon Sep 17 00:00:00 2001 From: Viktor Trako Date: Thu, 3 Sep 2015 16:16:57 +0100 Subject: [PATCH 06/14] add test to check that the out file exists and is not empty --- ua_parser/user_agent_wrapper_test.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ua_parser/user_agent_wrapper_test.py b/ua_parser/user_agent_wrapper_test.py index 16be5cd..25fdf08 100644 --- a/ua_parser/user_agent_wrapper_test.py +++ b/ua_parser/user_agent_wrapper_test.py @@ -15,6 +15,7 @@ TEST_RESOURCES_DIR = os.path.join(os.path.abspath(os.path.dirname(__file__)), '../uap-core/test_resources') +ROOT_DIR = os.path.join(os.path.abspath(os.path.dirname(__file__))) class ParseStringWithGivenDelimiter(unittest.TestCase): def testUserAgentStringsFromFile(self): @@ -66,5 +67,7 @@ def runParseUserAgentStringsFromFile(self, inFilePath, outFilePath): user_agent_wrapper.parseFromFile(inFilePath, outFilePath, delimiter) + self.assertTrue(os.path.isfile(os.path.join(ROOT_DIR, 'ua_out_file'))) + self.assertTrue(os.stat(os.path.join(ROOT_DIR, 'ua_out_file')).st_size > 0) if __name__ == '__main__': unittest.main() From 7d266f9958e44328ca730d1e0eda355d6f67ce64 Mon Sep 17 00:00:00 2001 From: Viktor Trako Date: Thu, 3 Sep 2015 16:24:17 +0100 Subject: [PATCH 07/14] check that the file produced contains expected number of lines --- ua_parser/user_agent_wrapper_test.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ua_parser/user_agent_wrapper_test.py b/ua_parser/user_agent_wrapper_test.py index 25fdf08..6464837 100644 --- a/ua_parser/user_agent_wrapper_test.py +++ b/ua_parser/user_agent_wrapper_test.py @@ -64,10 +64,12 @@ def runParserUserAgentStringFromStringAsJson(self): def runParseUserAgentStringsFromFile(self, inFilePath, outFilePath): delimiter = "," - user_agent_wrapper.parseFromFile(inFilePath, outFilePath, delimiter) + numLines = sum(1 for line in open(os.path.join(ROOT_DIR, 'ua_out_file'))) self.assertTrue(os.path.isfile(os.path.join(ROOT_DIR, 'ua_out_file'))) self.assertTrue(os.stat(os.path.join(ROOT_DIR, 'ua_out_file')).st_size > 0) + self.assertEqual(numLines, 100) + if __name__ == '__main__': unittest.main() From adfa6b9f8468258440374aa812e3c9af9299bc49 Mon Sep 17 00:00:00 2001 From: Viktor Trako Date: Thu, 3 Sep 2015 16:25:29 +0100 Subject: [PATCH 08/14] mage it nice --- ua_parser/user_agent_wrapper_test.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ua_parser/user_agent_wrapper_test.py b/ua_parser/user_agent_wrapper_test.py index 6464837..107975b 100644 --- a/ua_parser/user_agent_wrapper_test.py +++ b/ua_parser/user_agent_wrapper_test.py @@ -66,10 +66,11 @@ def runParseUserAgentStringsFromFile(self, inFilePath, outFilePath): delimiter = "," user_agent_wrapper.parseFromFile(inFilePath, outFilePath, delimiter) numLines = sum(1 for line in open(os.path.join(ROOT_DIR, 'ua_out_file'))) + expectedNumLines = 100 self.assertTrue(os.path.isfile(os.path.join(ROOT_DIR, 'ua_out_file'))) self.assertTrue(os.stat(os.path.join(ROOT_DIR, 'ua_out_file')).st_size > 0) - self.assertEqual(numLines, 100) + self.assertEqual(numLines, expectedNumLines) if __name__ == '__main__': unittest.main() From 2d1b10d6f7747fd1d43679055b816fe1664be0b9 Mon Sep 17 00:00:00 2001 From: Viktor Trako Date: Fri, 4 Sep 2015 13:42:36 +0100 Subject: [PATCH 09/14] remove unused import --- ua_parser/user_agent_wrapper.py | 1 - 1 file changed, 1 deletion(-) diff --git a/ua_parser/user_agent_wrapper.py b/ua_parser/user_agent_wrapper.py index 0214ce2..09dbfe5 100644 --- a/ua_parser/user_agent_wrapper.py +++ b/ua_parser/user_agent_wrapper.py @@ -5,7 +5,6 @@ When running from file, the output file with generate a file with the following headers: user_agent,device,os,os_major,os_minor,os_patch_minor,os_patch,browser,browser_major,browser_minor,browser_patch """ -from numpy.lib.arraysetops import in1d __author__ = 'viktor.trako@holidayextras.com (Viktor Trako)' From 6546fc740ffdf2b640ca841994afaa2e6d65de6a Mon Sep 17 00:00:00 2001 From: Viktor Trako Date: Fri, 4 Sep 2015 17:58:15 +0100 Subject: [PATCH 10/14] use actual tab for separating --- ua_parser/random_user_agent_strings.txt | 4 +- ua_parser/user_agent_wrapper.py | 55 ++++++++++++++----------- ua_parser/user_agent_wrapper_test.py | 2 +- 3 files changed, 34 insertions(+), 27 deletions(-) diff --git a/ua_parser/random_user_agent_strings.txt b/ua_parser/random_user_agent_strings.txt index 2ed96eb..961b537 100644 --- a/ua_parser/random_user_agent_strings.txt +++ b/ua_parser/random_user_agent_strings.txt @@ -96,4 +96,6 @@ Mozilla/5.0 (Linux; Android 4.2.2; GT-I9195 Build/JDQ39) AppleWebKit/537.36 (KHT Mozilla/5.0 (Linux; Android 4.2.2; GT-I9505 Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.93 Mobile Safari/537.36 Mozilla/5.0 (Linux; Android 4.2.2; GT-P3110 Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.133 Safari/537.36 Mozilla/5.0 (Linux; Android 4.2.2; GT-P5100 Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.93 Safari/537.36 -Mozilla/5.0 (Linux; Android 4.2.2; GT-P5110 Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.133 Safari/537.36 \ No newline at end of file +Mozilla/5.0 (Linux; Android 4.2.2; GT-P5110 Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.133 Safari/537.36 +Mozilla\/5.0 (iPad; CPU OS 7_1_2 like Mac OS X) AppleWebKit\/537.51.2 (KHTML, like Gecko) Version\/7.0 Mobile\/11D257 Safari\/9537.53 +**?ͻ**?Ҫ**?**?ĵ**? \ No newline at end of file diff --git a/ua_parser/user_agent_wrapper.py b/ua_parser/user_agent_wrapper.py index 09dbfe5..7711fa7 100644 --- a/ua_parser/user_agent_wrapper.py +++ b/ua_parser/user_agent_wrapper.py @@ -8,7 +8,7 @@ __author__ = 'viktor.trako@holidayextras.com (Viktor Trako)' -from ua_parser import user_agent_parser +import user_agent_parser import json # print 'Number of arguments:', len(sys.argv), 'arguments.' # print 'Argument List:', str(sys.argv) @@ -17,6 +17,8 @@ def parseFromFile(inFilePath, outFilePath, delimiter): "Parse user agents using a file input" # return parseUaString(filePath, delimiter) + if delimiter == "tab": + delimiter = '\t' inFileOpen = open(inFilePath, "r") outFileOpen = open(outFilePath, "wb") outFileOpen.write("user_agent"+delimiter+\ @@ -69,30 +71,33 @@ def parseUaString(uaString, delimiter): # print '__name__ = ', __name__ if delimiter == "json": return uaJson - if delimiter == "\\t" or delimiter == ",": - user_agent = json.dumps(result_dict['string'], separators="," ":") - device = json.dumps(result_dict['device']['family'], separators="," ":") - os_family = json.dumps(result_dict['os']['family'], separators="," ":") - os_major = json.dumps(result_dict['os']['major'], separators="," ":") - os_minor = json.dumps(result_dict['os']['minor'], separators="," ":") - os_patch_minor = json.dumps(result_dict['os']['patch_minor'], separators="," ":") - os_patch = json.dumps(result_dict['os']['patch'], separators="," ":") - browser = json.dumps(result_dict['user_agent']['family'], separators="," ":") - browser_major = json.dumps(result_dict['user_agent']['major'], separators="," ":") - browser_minor = json.dumps(result_dict['user_agent']['minor'], separators="," ":") - browser_patch = json.dumps(result_dict['user_agent']['patch'], separators="," ":") - - return user_agent.replace("\\n", "")+delimiter+\ - device + delimiter+\ - os_family+ delimiter+\ - os_major+ delimiter+\ - os_minor+ delimiter+\ - os_patch_minor+ delimiter+\ - os_patch+ delimiter+\ - browser+ delimiter+\ - browser_major+ delimiter+\ - browser_minor+ delimiter+\ - browser_patch+'\n' + if delimiter == "\t" or delimiter == ",": + user_agent = result_dict['string'].rstrip("\r\n") + device = json.dumps(result_dict['device']['family'], separators="," ":").rstrip("\r\n") + os_family = json.dumps(result_dict['os']['family'], separators="," ":").rstrip("\r\n") + os_major = json.dumps(result_dict['os']['major'], separators="," ":").rstrip("\r\n") + os_minor = json.dumps(result_dict['os']['minor'], separators="," ":").rstrip("\r\n") + os_patch_minor = json.dumps(result_dict['os']['patch_minor'], separators="," ":").rstrip("\r\n") + os_patch = json.dumps(result_dict['os']['patch'], separators="," ":").rstrip("\r\n") + browser = json.dumps(result_dict['user_agent']['family'], separators="," ":").rstrip("\r\n") + browser_major = json.dumps(result_dict['user_agent']['major'], separators="," ":").rstrip("\r\n") + browser_minor = json.dumps(result_dict['user_agent']['minor'], separators="," ":").rstrip("\r\n") + browser_patch = json.dumps(result_dict['user_agent']['patch'], separators="," ":").rstrip("\r\n") + + if device == "" or device is None: + device = "Unkown" + + return user_agent+delimiter+\ + device+delimiter+\ + os_family+delimiter+\ + os_major+delimiter+\ + os_minor+delimiter+\ + os_patch_minor+delimiter+\ + os_patch+delimiter+\ + browser+delimiter+\ + browser_major+delimiter+\ + browser_minor+delimiter+\ + browser_patch+"\n" else: return "Unknown delimiter" diff --git a/ua_parser/user_agent_wrapper_test.py b/ua_parser/user_agent_wrapper_test.py index 107975b..825230d 100644 --- a/ua_parser/user_agent_wrapper_test.py +++ b/ua_parser/user_agent_wrapper_test.py @@ -63,7 +63,7 @@ def runParserUserAgentStringFromStringAsJson(self): self.assertEqual(string, result['string']) def runParseUserAgentStringsFromFile(self, inFilePath, outFilePath): - delimiter = "," + delimiter = "tab" user_agent_wrapper.parseFromFile(inFilePath, outFilePath, delimiter) numLines = sum(1 for line in open(os.path.join(ROOT_DIR, 'ua_out_file'))) expectedNumLines = 100 From 644ab2b93dbc8db2f6f3ca7cbaf8021b37f7191d Mon Sep 17 00:00:00 2001 From: Viktor Trako Date: Mon, 7 Sep 2015 10:35:17 +0100 Subject: [PATCH 11/14] if device is null set device string as "Unknown" --- ua_parser/user_agent_wrapper.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ua_parser/user_agent_wrapper.py b/ua_parser/user_agent_wrapper.py index 7711fa7..0802a72 100644 --- a/ua_parser/user_agent_wrapper.py +++ b/ua_parser/user_agent_wrapper.py @@ -84,7 +84,7 @@ def parseUaString(uaString, delimiter): browser_minor = json.dumps(result_dict['user_agent']['minor'], separators="," ":").rstrip("\r\n") browser_patch = json.dumps(result_dict['user_agent']['patch'], separators="," ":").rstrip("\r\n") - if device == "" or device is None: + if device == "" or device is None or device == "null": device = "Unkown" return user_agent+delimiter+\ From cbc3f56a000e823ddf07d59035afd9e47aa89235 Mon Sep 17 00:00:00 2001 From: Viktor Trako Date: Tue, 8 Sep 2015 09:45:10 +0100 Subject: [PATCH 12/14] wrap Unknown in double quotes --- ua_parser/random_user_agent_strings.txt | 5 +++-- ua_parser/user_agent_wrapper.py | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/ua_parser/random_user_agent_strings.txt b/ua_parser/random_user_agent_strings.txt index 961b537..0489cb9 100644 --- a/ua_parser/random_user_agent_strings.txt +++ b/ua_parser/random_user_agent_strings.txt @@ -91,11 +91,12 @@ Mozilla/5.0 (Linux; Android 4.2.2; GT-I8200N Build/JDQ39) AppleWebKit/537.36 (KH Mozilla/5.0 (Linux; Android 4.2.2; GT-I9060 Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.133 Mobile Safari/537.36 Mozilla/5.0 (Linux; Android 4.2.2; GT-I9192 Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.133 Mobile Safari/537.36 Mozilla/5.0 (Linux; Android 4.2.2; GT-I9195 Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.92 Mobile Safari/537.36 -Mozilla/5.0 (Linux; Android 4.2.2; GT-I9195 Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.93 Mobile Safari/537.36 +"Mozilla/5.0 (Linux; Android 4.2.2; GT-I9195 Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.93 Mobile Safari/537.36" Mozilla/5.0 (Linux; Android 4.2.2; GT-I9195 Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.133 Mobile Safari/537.36 Mozilla/5.0 (Linux; Android 4.2.2; GT-I9505 Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.93 Mobile Safari/537.36 Mozilla/5.0 (Linux; Android 4.2.2; GT-P3110 Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.133 Safari/537.36 Mozilla/5.0 (Linux; Android 4.2.2; GT-P5100 Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.93 Safari/537.36 Mozilla/5.0 (Linux; Android 4.2.2; GT-P5110 Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.133 Safari/537.36 Mozilla\/5.0 (iPad; CPU OS 7_1_2 like Mac OS X) AppleWebKit\/537.51.2 (KHTML, like Gecko) Version\/7.0 Mobile\/11D257 Safari\/9537.53 -**?ͻ**?Ҫ**?**?ĵ**? \ No newline at end of file +**?ͻ**?Ҫ**?**?ĵ**? +"Mozilla/5.0 (Linux; U; Android 2.3.5; en-us; Micromax A27 Build/IML74K) AppleWebKit/534.30(KHTML,like Gecko) Version/4.0 Mobile Safari/534.30" \ No newline at end of file diff --git a/ua_parser/user_agent_wrapper.py b/ua_parser/user_agent_wrapper.py index 0802a72..f0ba0d9 100644 --- a/ua_parser/user_agent_wrapper.py +++ b/ua_parser/user_agent_wrapper.py @@ -85,7 +85,7 @@ def parseUaString(uaString, delimiter): browser_patch = json.dumps(result_dict['user_agent']['patch'], separators="," ":").rstrip("\r\n") if device == "" or device is None or device == "null": - device = "Unkown" + device = '"Unkown"' return user_agent+delimiter+\ device+delimiter+\ From 29217276c6e64ec0d6570f8fbf729004fa696300 Mon Sep 17 00:00:00 2001 From: Viktor Trako Date: Wed, 29 Jun 2016 15:35:53 +0100 Subject: [PATCH 13/14] submodule update --- uap-core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/uap-core b/uap-core index b09df94..ae9c677 160000 --- a/uap-core +++ b/uap-core @@ -1 +1 @@ -Subproject commit b09df94e238a4ae24e3c07d93d164b60932b2a1a +Subproject commit ae9c6776d6099c5cf2f49b048b1a967b5db6c965 From 3399d294eec8e6dcc0348a7b59a9adadd747d8ab Mon Sep 17 00:00:00 2001 From: James Smith Date: Mon, 30 Apr 2018 14:36:25 +0100 Subject: [PATCH 14/14] Update .gitmodules --- .gitmodules | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitmodules b/.gitmodules index 2b85eb7..0457cd2 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,4 +1,4 @@ [submodule "uap-core"] path = uap-core - url = https://github.com/holidayextras/uap-core.git + url = git@github.com:holidayextras/uap-core.git branch = master