__init__.py 7.0 KB

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