| 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}") | |