import os from pathlib import Path from browser_use import BrowserProfile async def get_storage_state(): """Setup browser storage state for session persistence.""" # Get the script directory to ensure correct path resolution storage_state_path = Path("data/storage_state.json") storage_state_temp_path = Path("data/storage_state_temp.json") print(f"📂 Storage state path: {storage_state_path}") print(f"📂 Temp storage state path: {storage_state_temp_path}") if storage_state_path.exists(): if storage_state_temp_path.exists(): storage_state_temp_path.unlink() storage_state_temp_path.write_text( storage_state_path.read_text(encoding="utf-8"), encoding="utf-8" ) print(f"🔄 Using existing storage state: {storage_state_temp_path}") return str(storage_state_temp_path) print("⚠️ No existing storage state found") return None def get_proxy_url(): """Configure proxy settings from environment variables.""" proxy_host = os.getenv("PROXY_HOST") proxy_port = os.getenv("PROXY_PORT") if proxy_host and proxy_port: proxy_url = f"http://{proxy_host}:{proxy_port}" print(f"🔗 Using proxy: {proxy_host}:{proxy_port}") return proxy_url else: print("🔗 No proxy configured, using direct connection.") return None def get_browser_args(): """Get browser arguments for enhanced compatibility and security.""" return [ # Security and isolation "--disable-web-security", "--disable-site-isolation-trials", "--disable-features=IsolateOrigins,site-per-process", "--ignore-certificate-errors", "--ignore-ssl-errors", "--allow-running-insecure-content", # Performance and rendering "--disable-features=VizDisplayCompositor", "--disable-dev-shm-usage", # Popup and automation "--disable-popup-blocking", "--disable-blink-features=AutomationControlled", # Browser behavior "--no-first-run", "--no-service-autorun", "--no-default-browser-check", "--password-store=basic", "--use-mock-keychain", # Extensions "--disable-extensions-file-access-check", "--disable-extensions-http-throttling", "--disable-component-extensions-with-background-pages", # Language f"--lang={os.getenv('LANG', 'en_US')}", ] async def get_profile(): proxy_url = get_proxy_url() storage_state_path = await get_storage_state() profile = BrowserProfile( # Security settings disable_security=True, stealth=True, # Display settings headless=False, device_scale_factor=1, window_size={"width": 1600, "height": 900}, viewport={"width": 1600, "height": 900}, # Data persistence user_data_dir=None, storage_state=storage_state_path, # Network settings proxy={"server": proxy_url} if proxy_url else None, # Additional arguments args=get_browser_args(), ) return profile