File size: 2,916 Bytes
e4b63ae a400aef e4b63ae a400aef e4b63ae a400aef | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 | import json
import logging
import os
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
logger = logging.getLogger(__name__)
class CustomBrowserContext:
def __init__(self, browser, config=None):
self.browser = browser
self.config = config or {}
self.driver = None
def create_context(self):
chrome_options = Options()
if self.config.get("browser_window_size"):
chrome_options.add_argument(f"--window-size={self.config['browser_window_size'][0]},{self.config['browser_window_size'][1]}")
if self.config.get("disable_security", False):
chrome_options.add_argument("--disable-web-security")
chrome_options.add_argument("--disable-site-isolation-trials")
chrome_options.add_argument("--disable-features=IsolateOrigins,site-per-process")
user_agent = (
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
"(KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36"
)
chrome_options.add_argument(f"user-agent={user_agent}")
self.driver = webdriver.Chrome(options=chrome_options)
if self.config.get("cookies_file") and os.path.exists(self.config["cookies_file"]):
try:
with open(self.config["cookies_file"], "r") as f:
cookies = json.load(f)
logger.info(f"Loaded {len(cookies)} cookies from {self.config['cookies_file']}")
for cookie in cookies:
self.driver.add_cookie(cookie)
except Exception as e:
logger.error(f"Error loading cookies: {e}")
try:
self.driver.execute_script(
"""
Object.defineProperty(navigator, 'webdriver', {
get: () => undefined
});
Object.defineProperty(navigator, 'languages', {
get: () => ['en-US', 'en']
});
Object.defineProperty(navigator, 'plugins', {
get: () => [1, 2, 3, 4, 5]
});
window.chrome = { runtime: {} };
const originalQuery = window.navigator.permissions.query;
window.navigator.permissions.query = (parameters) => (
parameters.name === 'notifications' ?
Promise.resolve({ state: Notification.permission }) :
originalQuery(parameters)
);
"""
)
except Exception as e:
logger.error(f"Error executing anti-detection scripts: {e}")
return self.driver
def close(self):
if self.driver:
try:
self.driver.quit()
except Exception as e:
logger.error(f"Error closing the browser: {e}")
|