diff --git a/.gitmodules b/.gitmodules index 6d61431..0457cd2 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 = git@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 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..0489cb9 --- /dev/null +++ b/ua_parser/random_user_agent_strings.txt @@ -0,0 +1,102 @@ +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 +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 +**?ͻ**?Ҫ**?**?ĵ**? +"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 new file mode 100644 index 0000000..f0ba0d9 --- /dev/null +++ b/ua_parser/user_agent_wrapper.py @@ -0,0 +1,103 @@ +""" + 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 +""" + +__author__ = 'viktor.trako@holidayextras.com (Viktor Trako)' + +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) + if delimiter == "tab": + delimiter = '\t' + 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)) + inFileOpen.close() + outFileOpen.close() + + +def parseFromString(uaString, delimiter): + "Parse user agents using a file input" + return parseUaString(uaString, 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. + # 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 = uaString + # 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 = 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 or device == "null": + 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.pyc b/ua_parser/user_agent_wrapper.pyc new file mode 100644 index 0000000..79b6412 Binary files /dev/null and b/ua_parser/user_agent_wrapper.pyc differ diff --git a/ua_parser/user_agent_wrapper_test.py b/ua_parser/user_agent_wrapper_test.py new file mode 100644 index 0000000..825230d --- /dev/null +++ b/ua_parser/user_agent_wrapper_test.py @@ -0,0 +1,76 @@ +"""User Agent Wrapper unit tests +RUN: +python -m user_agent_wrapper_test ParseStringWithGivenDelimiter +or run all: +python -m user_agent_wrapper_test +""" + +__author__ = 'viktor.trako@holidayextras.com (Viktor Trako)' + +import os +import unittest +import json + +import user_agent_wrapper + +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): + 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')) + + def testUserAgentStringFromString(self): + self.runParserUserAgentStringFromStringAsJson() + + def runParserUserAgentStringFromStringAsJson(self): + + userAgentString = "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" + delimiter = "json" + + expected = { + "device":{ + "family":"Samsung GT-I9195" + }, + "os":{ + "major":"4", + "patch_minor": None, + "minor":"2", + "family":"Android", + "patch":"2" + }, + "user_agent":{ + "major":"44", + "minor":"0", + "family":"Chrome Mobile", + "patch":"2403" + }, + "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" + } + + result = json.loads(user_agent_wrapper.parseFromString(userAgentString, delimiter)) + device = expected['device']['family'] + os = expected['os']['family']; + browser = expected['user_agent']['family']; + string = expected['string']; + + self.assertEqual(device, result['device']['family']) + self.assertEqual(os, result['os']['family']) + self.assertEqual(browser, result['user_agent']['family']) + self.assertEqual(string, result['string']) + + def runParseUserAgentStringsFromFile(self, inFilePath, outFilePath): + 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 + + 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, expectedNumLines) + +if __name__ == '__main__': + unittest.main() diff --git a/uap-core b/uap-core index 0adc071..ae9c677 160000 --- a/uap-core +++ b/uap-core @@ -1 +1 @@ -Subproject commit 0adc0716a0976ea0472a43d32e7c7a5f584b4e30 +Subproject commit ae9c6776d6099c5cf2f49b048b1a967b5db6c965