Добавлен README.md с списком группы

This commit is contained in:
2025-03-06 19:25:02 +03:00
commit fe513ea8b0
8 changed files with 584 additions and 0 deletions
View File
+97
View File
@@ -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']
);
"""
+60
View File
@@ -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