Добавлен README.md с списком группы
This commit is contained in:
@@ -0,0 +1,97 @@
|
||||
import os
|
||||
import tempfile
|
||||
|
||||
class ChromeProxy:
|
||||
def __init__(self, host: str, port: int, username: str = "", password: str = ""):
|
||||
self.host = host
|
||||
self.port = port
|
||||
self.username = username
|
||||
self.password = password
|
||||
|
||||
def create_extension(self, name: str = "Chrome Proxy", version="1.0.0") -> str:
|
||||
proxy_folder = tempfile.mkdtemp(prefix="chrome_proxy_")
|
||||
|
||||
self._create_manifest(
|
||||
name=name,
|
||||
version=version,
|
||||
proxy_folder=proxy_folder
|
||||
)
|
||||
|
||||
self._create_background_js(proxy_folder)
|
||||
|
||||
return proxy_folder
|
||||
|
||||
def _create_manifest(self, name, version, proxy_folder):
|
||||
manifest = ChromeProxy.manifest_json
|
||||
manifest = manifest.replace("<ext_name>", name)
|
||||
manifest = manifest.replace("<ext_ver>", version)
|
||||
|
||||
with open(f"{proxy_folder}/manifest.json", "w") as f:
|
||||
f.write(manifest)
|
||||
|
||||
def _create_background_js(self, proxy_folder):
|
||||
js = ChromeProxy.background_js
|
||||
js = js.replace("<proxy_host>", self.host)
|
||||
js = js.replace("<proxy_port>", str(self.port))
|
||||
js = js.replace("<proxy_username>", self.username)
|
||||
js = js.replace("<proxy_password>", self.password)
|
||||
|
||||
with open(f"{proxy_folder}/background.js", "w") as f:
|
||||
f.write(js)
|
||||
|
||||
manifest_json = """
|
||||
{
|
||||
"version": "<ext_ver>",
|
||||
"manifest_version": 3,
|
||||
"name": "<ext_name>",
|
||||
"permissions": [
|
||||
"proxy",
|
||||
"tabs",
|
||||
"storage",
|
||||
"webRequest",
|
||||
"webRequestAuthProvider"
|
||||
],
|
||||
"host_permissions": [
|
||||
"<all_urls>"
|
||||
],
|
||||
"background": {
|
||||
"service_worker": "background.js"
|
||||
},
|
||||
"minimum_chrome_version": "22.0.0"
|
||||
}
|
||||
"""
|
||||
|
||||
background_js = """
|
||||
var config = {
|
||||
mode: "fixed_servers",
|
||||
rules: {
|
||||
singleProxy: {
|
||||
scheme: "http",
|
||||
host: "<proxy_host>",
|
||||
port: parseInt("<proxy_port>")
|
||||
},
|
||||
bypassList: ["localhost"]
|
||||
}
|
||||
};
|
||||
|
||||
chrome.proxy.settings.set({
|
||||
value: config,
|
||||
scope: "regular"
|
||||
}, function() {});
|
||||
|
||||
function callbackFn(details) {
|
||||
return {
|
||||
authCredentials: {
|
||||
username: "<proxy_username>",
|
||||
password: "<proxy_password>"
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
chrome.webRequest.onAuthRequired.addListener(
|
||||
callbackFn, {
|
||||
urls: ["<all_urls>"]
|
||||
},
|
||||
['blocking']
|
||||
);
|
||||
"""
|
||||
@@ -0,0 +1,60 @@
|
||||
import random
|
||||
from driver.chrome_proxy import ChromeProxy
|
||||
from urllib.parse import urlparse
|
||||
import undetected_chromedriver as uc
|
||||
import logging
|
||||
|
||||
|
||||
# В patcher.py библиотеки undetected_chromedriver
|
||||
# import secrets
|
||||
# prefix = 'undetected' ----> prefix = secrets.token_hex(8)
|
||||
# Использование случайного токена в качестве префикса гарантирует,
|
||||
# что каждый процесс будет иметь свою уникальную директорию,
|
||||
# даже если несколько процессов работают одновременн
|
||||
|
||||
class DriverCreator:
|
||||
def __init__(self, proxy_list):
|
||||
self.proxy_list = proxy_list
|
||||
|
||||
def _switch_proxy(self):
|
||||
proxy = random.choice(self.proxy_list)
|
||||
parsed_proxy = urlparse(proxy)
|
||||
return ChromeProxy(
|
||||
parsed_proxy.hostname,
|
||||
parsed_proxy.port,
|
||||
parsed_proxy.username,
|
||||
parsed_proxy.password
|
||||
).create_extension()
|
||||
|
||||
def get_driver(self):
|
||||
'''
|
||||
Отключает JS
|
||||
Каждый запрос получает `сырой` html
|
||||
'''
|
||||
# extension_path = self._switch_proxy()
|
||||
|
||||
options = uc.ChromeOptions()
|
||||
# options.add_argument(f"--load-extension={extension_path}") # временно
|
||||
options.add_argument("--headless=new")
|
||||
options.add_argument("--disable-gpu")
|
||||
options.add_argument("--disable-dev-shm-usage")
|
||||
options.add_argument("--no-sandbox")
|
||||
options.add_argument("--disable-webgl")
|
||||
options.add_argument("--disable-software-rasterizer")
|
||||
# options.add_argument("--disable-extensions")
|
||||
|
||||
prefs = {"profile.managed_default_content_settings.javascript": 2}
|
||||
options.experimental_options["prefs"] = prefs
|
||||
|
||||
driver = uc.Chrome(
|
||||
options=options,
|
||||
version_main=132,
|
||||
# user_multi_procs=True
|
||||
)
|
||||
|
||||
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
|
||||
"source": "Object.defineProperty(navigator, 'javaEnabled', {get: () => false});"
|
||||
})
|
||||
driver.execute_cdp_cmd("Emulation.setScriptExecutionDisabled", {"value": True})
|
||||
|
||||
return driver
|
||||
Reference in New Issue
Block a user