1# coding=utf-8 2 3from __future__ import unicode_literals 4 5from datetime import datetime 6 7from .. import BaseProvider 8 9 10class Provider(BaseProvider): 11 user_agents = ( 12 'chrome', 'firefox', 'internet_explorer', 'opera', 'safari', 13 ) 14 15 windows_platform_tokens = ( 16 'Windows 95', 'Windows 98', 'Windows 98; Win 9x 4.90', 'Windows CE', 17 'Windows NT 4.0', 'Windows NT 5.0', 'Windows NT 5.01', 18 'Windows NT 5.1', 'Windows NT 5.2', 'Windows NT 6.0', 'Windows NT 6.1', 19 'Windows NT 6.2', 20 ) 21 22 linux_processors = ('i686', 'x86_64',) 23 24 mac_processors = ('Intel', 'PPC', 'U; Intel', 'U; PPC',) 25 26 def mac_processor(self): 27 return self.random_element(self.mac_processors) 28 29 def linux_processor(self): 30 return self.random_element(self.linux_processors) 31 32 def user_agent(self): 33 name = self.random_element(self.user_agents) 34 return getattr(self, name)() 35 36 def chrome(self, version_from=13, version_to=63, 37 build_from=800, build_to=899): 38 saf = str(self.generator.random.randint(531, 536)) + \ 39 str(self.generator.random.randint(0, 2)) 40 tmplt = '({0}) AppleWebKit/{1} (KHTML, like Gecko)' \ 41 ' Chrome/{2}.0.{3}.0 Safari/{4}' 42 platforms = ( 43 tmplt.format(self.linux_platform_token(), 44 saf, 45 self.generator.random.randint(version_from, version_to), 46 self.generator.random.randint(build_from, build_to), 47 saf), 48 tmplt.format(self.windows_platform_token(), 49 saf, 50 self.generator.random.randint(version_from, version_to), 51 self.generator.random.randint(build_from, build_to), 52 saf), 53 tmplt.format(self.mac_platform_token(), 54 saf, 55 self.generator.random.randint(version_from, version_to), 56 self.generator.random.randint(build_from, build_to), 57 saf), 58 ) 59 60 return 'Mozilla/5.0 ' + self.random_element(platforms) 61 62 def firefox(self): 63 ver = ( 64 'Gecko/{0} Firefox/{1}.0'.format( 65 self.generator.date_time_between( 66 datetime(2011, 1, 1) 67 ), 68 self.generator.random.randint(4, 15) 69 ), 70 'Gecko/{0} Firefox/3.6.{1}'.format( 71 self.generator.date_time_between( 72 datetime(2010, 1, 1) 73 ), 74 self.generator.random.randint(1, 20)), 75 'Gecko/{0} Firefox/3.8'.format( 76 self.generator.date_time_between(datetime(2010, 1, 1)), 77 ), 78 ) 79 tmplt_win = '({0}; {1}; rv:1.9.{2}.20) {3}' 80 tmplt_lin = '({0}; rv:1.9.{1}.20) {2}' 81 tmplt_mac = '({0}; rv:1.9.{1}.20) {2}' 82 platforms = ( 83 tmplt_win.format(self.windows_platform_token(), 84 self.generator.locale().replace('_', '-'), 85 self.generator.random.randint(0, 2), 86 self.generator.random.choice(ver)), 87 tmplt_lin.format(self.linux_platform_token(), 88 self.generator.random.randint(5, 7), 89 self.generator.random.choice(ver)), 90 tmplt_mac.format(self.mac_platform_token(), 91 self.generator.random.randint(2, 6), 92 self.generator.random.choice(ver)), 93 ) 94 95 return 'Mozilla/5.0 ' + self.random_element(platforms) 96 97 def safari(self): 98 saf = "{0}.{1}.{2}".format(self.generator.random.randint(531, 535), 99 self.generator.random.randint(1, 50), 100 self.generator.random.randint(1, 7)) 101 if not self.generator.random.getrandbits(1): 102 ver = "{0}.{1}".format(self.generator.random.randint(4, 5), 103 self.generator.random.randint(0, 1)) 104 else: 105 ver = "{0}.0.{1}".format(self.generator.random.randint(4, 5), 106 self.generator.random.randint(1, 5)) 107 tmplt_win = '(Windows; U; {0}) AppleWebKit/{1} (KHTML, like Gecko)' \ 108 ' Version/{2} Safari/{3}' 109 tmplt_mac = '({0} rv:{1}.0; {2}) AppleWebKit/{3} (KHTML, like Gecko)' \ 110 ' Version/{4} Safari/{5}' 111 tmplt_ipod = '(iPod; U; CPU iPhone OS {0}_{1} like Mac OS X; {2})' \ 112 ' AppleWebKit/{3} (KHTML, like Gecko) Version/{4}.0.5' \ 113 ' Mobile/8B{5} Safari/6{6}' 114 locale = self.generator.locale().replace('_', '-') 115 platforms = ( 116 tmplt_win.format(self.windows_platform_token(), 117 saf, 118 ver, 119 saf), 120 tmplt_mac.format(self.mac_platform_token(), 121 self.generator.random.randint(2, 6), 122 locale, 123 saf, 124 ver, 125 saf), 126 tmplt_ipod.format(self.generator.random.randint(3, 4), 127 self.generator.random.randint(0, 3), 128 locale, 129 saf, 130 self.generator.random.randint(3, 4), 131 self.generator.random.randint(111, 119), 132 saf), 133 ) 134 135 return 'Mozilla/5.0 ' + self.random_element(platforms) 136 137 def opera(self): 138 platform = '({0}; {1}) Presto/2.9.{2} Version/{3}.00'.format( 139 ( 140 self.linux_platform_token() 141 if self.generator.random.getrandbits(1) 142 else self.windows_platform_token() 143 ), 144 self.generator.locale().replace('_', '-'), 145 self.generator.random.randint(160, 190), 146 self.generator.random.randint(10, 12), 147 ) 148 return 'Opera/{0}.{1}.{2}'.format( 149 self.generator.random.randint(8, 9), 150 self.generator.random.randint(10, 99), 151 platform, 152 ) 153 154 def internet_explorer(self): 155 tmplt = 'Mozilla/5.0 (compatible; MSIE {0}.0; {1}; Trident/{2}.{3})' 156 return tmplt.format(self.generator.random.randint(5, 9), 157 self.windows_platform_token(), 158 self.generator.random.randint(3, 5), 159 self.generator.random.randint(0, 1)) 160 161 def windows_platform_token(self): 162 return self.random_element(self.windows_platform_tokens) 163 164 def linux_platform_token(self): 165 return 'X11; Linux {0}'.format( 166 self.random_element(self.linux_processors)) 167 168 def mac_platform_token(self): 169 return 'Macintosh; {0} Mac OS X 10_{1}_{2}'.format( 170 self.random_element(self.mac_processors), 171 self.generator.random.randint(5, 12), 172 self.generator.random.randint(0, 9), 173 ) 174