chrome.py 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. #!/usr/bin/env python
  2. # -*- encoding: utf-8 -*-
  3. '''
  4. @Contact : liuyuqi.gov@msn.cn
  5. @Time : 2022/11/27 13:17:27
  6. @License : Copyright © 2017-2022 liuyuqi. All Rights Reserved.
  7. @Desc :
  8. '''
  9. from importlib.resources import path
  10. import random, string, io, os, shutil, platform, subprocess, sys, zipfile, time
  11. from selenium import webdriver
  12. from selenium.webdriver.chrome.options import Options
  13. import undetected_chromedriver.v2 as uc
  14. from webdriver_manager.chrome import ChromeDriverManager
  15. class Chrome():
  16. driverPath = None
  17. user_dir = None
  18. def __init__(self):
  19. os.makedirs("data") if not os.path.exists("data") else False
  20. os.makedirs("data/driver") if not os.path.exists("data/driver") else False
  21. os.makedirs("data/browser-profiles") if not os.path.exists("data/browser-profiles") else False
  22. download_driver()
  23. self.driverPath = ChromeDriverManager(path="data/driver").install()
  24. # if sys.platform == "win32":
  25. # # shutil.move("chromedriver.exe", "data/driver")
  26. # cd = os.path.abspath("data/driver/chromedriver.exe")
  27. # else:
  28. # # shutil.move("chromedriver", "data/driver")
  29. # time.sleep(2.5)
  30. # #cd = os.path.abspath(path)
  31. # Patcher(executable_path=cd).patch_exe()
  32. @staticmethod
  33. def gen_random_cdc():
  34. '''随机生成字符串'''
  35. cdc = random.choices(string.ascii_lowercase, k=26)
  36. cdc[-6:-4] = map(str.upper, cdc[-6:-4])
  37. cdc[2] = cdc[0]
  38. cdc[3] = "_"
  39. return "".join(cdc).encode()
  40. def monkey_patch_exe(self):
  41. '''添加补丁'''
  42. linect = 0
  43. replacement = self.gen_random_cdc()
  44. replacement = f" var key = '${replacement.decode()}_';\n".encode()
  45. with io.open(self.driverPath, "r+b") as fh:
  46. for line in iter(lambda: fh.readline(), b""):
  47. if b"var key = " in line:
  48. fh.seek(-len(line), 1)
  49. fh.write(replacement)
  50. linect += 1
  51. return linect
  52. def getWebdriver(self, i=None, proxy=False, headless=False, browser_profile=None, proxy_address=None):
  53. '''
  54. get webdriver
  55. :param i: i
  56. :param proxy: 代理
  57. :param headless: 是否无头模式
  58. :param browser_profile: i
  59. :param proxy_address: i
  60. :returns: webdriver
  61. '''
  62. options = self.options(i=i, proxy=proxy, headless=headless, browser_profile=browser_profile, proxy_address=proxy_address)
  63. return webdriver.Chrome(executable_path=self.driverPath, options=options)
  64. def setup_useragent(driver :webdriver.Chrome):
  65. # driver.execute_cdp_cmd("Network.setUserAgentOverride", {"userAgent": f"{random_user_agent}"})
  66. pass
  67. def Proxy(PROXY_HOST, PROXY_PORT, PROXY_USER, PROXY_PASS, i):
  68. try:
  69. manifest_json = """
  70. {
  71. "manifest_version": 2,
  72. "name": "Proxy Manager",
  73. "version": "3.0.11",
  74. "permissions": [
  75. "proxy",
  76. "tabs",
  77. "unlimitedStorage",
  78. "storage",
  79. "<all_urls>",
  80. "webRequest",
  81. "webRequestBlocking"
  82. ],
  83. "background": {
  84. "scripts": ["background.js"]
  85. },
  86. "minimum_chrome_version":"22.0.0"
  87. }
  88. """
  89. background_js = string.Template(
  90. """
  91. var config = {
  92. mode: "fixed_servers",
  93. rules: {
  94. singleProxy: {
  95. scheme: "http",
  96. host: "${PROXY_HOST}",
  97. port: parseInt(${PROXY_PORT})
  98. },
  99. bypassList: ["foobar.com"]
  100. }
  101. };
  102. chrome.proxy.settings.set({value: config, scope: "regular"}, function() {});
  103. function callbackFn(details) {
  104. return {
  105. authCredentials: {
  106. username: "${PROXY_USER}",
  107. password: "${PROXY_PASS}"
  108. }
  109. };
  110. }
  111. chrome.webRequest.onAuthRequired.addListener(
  112. callbackFn,
  113. {urls: ["<all_urls>"]},
  114. ['blocking']
  115. );
  116. """
  117. ).substitute(
  118. PROXY_HOST=PROXY_HOST,
  119. PROXY_PORT=PROXY_PORT,
  120. PROXY_USER=PROXY_USER,
  121. PROXY_PASS=PROXY_PASS)
  122. if not os.path.exists("data/extension"):
  123. os.makedirs("data/extension")
  124. with zipfile.ZipFile(f'data/extension/proxy_auth_plugin_{i}.zip', 'w', zipfile.ZIP_DEFLATED, False) as zp:
  125. zp.writestr('manifest.json', manifest_json)
  126. zp.writestr('background.js', background_js)
  127. return f"data/extension/proxy_auth_plugin_{i}.zip"
  128. except Exception as e:
  129. return False
  130. now = datetime.now().strftime('%H:%M:%S')
  131. print(f'[{now}] - {e}')
  132. class bcolors:
  133. HEADER = '\033[95m'
  134. OKBLUE = '\033[94m'
  135. OKCYAN = '\033[96m'
  136. OKGREEN = '\033[92m'
  137. WARNING = '\033[93m'
  138. FAIL = '\033[91m'
  139. ENDC = '\033[0m'
  140. BOLD = '\033[1m'
  141. UNDERLINE = '\033[4m'
  142. CHROME = ['{8A69D345-D564-463c-AFF1-A69D9E530F96}',
  143. '{8237E44A-0054-442C-B6B6-EA0509993955}',
  144. '{401C381F-E0DE-4B85-8BD8-3F3F14FBDA57}',
  145. '{4ea16ac7-fd5a-47c3-875b-dbf4a2008c20}']
  146. def download_driver():
  147. '''根据系统安装的chrome版本,下载指定版本的 chrome-driver 驱动'''
  148. OSNAME = platform.system()
  149. print(bcolors.WARNING + 'Getting Chrome Driver...' + bcolors.ENDC)
  150. if OSNAME == 'Linux':
  151. OSNAME = 'lin'
  152. EXE_NAME = ""
  153. with subprocess.Popen(['google-chrome', '--version'], stdout=subprocess.PIPE) as proc:
  154. version = proc.stdout.read().decode('utf-8').replace('Google Chrome', '').strip()
  155. elif OSNAME == 'Darwin':
  156. OSNAME = 'mac'
  157. EXE_NAME = ""
  158. process = subprocess.Popen(['/Applications/Google Chrome.app/Contents/MacOS/Google Chrome', '--version'], stdout=subprocess.PIPE)
  159. version = process.communicate()[0].decode('UTF-8').replace('Google Chrome', '').strip()
  160. elif OSNAME == 'Windows':
  161. OSNAME = 'win'
  162. EXE_NAME = ".exe"
  163. version = None
  164. try:
  165. process = subprocess.Popen(['reg', 'query', 'HKEY_CURRENT_USER\\Software\\Google\\Chrome\\BLBeacon', '/v', 'version'], stdout=subprocess.PIPE, stderr=subprocess.DEVNULL, stdin=subprocess.DEVNULL)
  166. version = process.communicate()[0].decode(
  167. 'UTF-8').strip().split()[-1]
  168. except:
  169. for i in CHROME:
  170. for j in ['opv', 'pv']:
  171. try:
  172. command = ['reg', 'query', f'HKEY_LOCAL_MACHINE\\Software\\Google\\Update\\Clients\\{i}', '/v', f'{j}', '/reg:32']
  173. process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.DEVNULL, stdin=subprocess.DEVNULL)
  174. version = process.communicate()[0].decode('UTF-8').strip().split()[-1]
  175. except:
  176. pass
  177. if not version:
  178. print(bcolors.WARNING + "Couldn't find your Google Chrome version automatically!" + bcolors.ENDC)
  179. version = input(bcolors.WARNING + 'Please input your google chrome version (ex: 91.0.4472.114) : ' + bcolors.ENDC)
  180. else:
  181. print('{} OS is not supported.'.format(OSNAME))
  182. sys.exit()
  183. # uc.install()