| | import json
|
| | import logging
|
| | import os
|
| |
|
| | from browser_use.browser.browser import Browser
|
| | from browser_use.browser.context import BrowserContext, BrowserContextConfig
|
| | from playwright.async_api import Browser as PlaywrightBrowser
|
| | from playwright.async_api import BrowserContext as PlaywrightBrowserContext
|
| |
|
| | logger = logging.getLogger(__name__)
|
| |
|
| |
|
| | class CustomBrowserContext(BrowserContext):
|
| | def __init__(
|
| | self,
|
| | browser: "Browser",
|
| | config: BrowserContextConfig = BrowserContextConfig()
|
| | ):
|
| | super(CustomBrowserContext, self).__init__(browser=browser, config=config)
|
| |
|
| | async def _create_context(self, browser: PlaywrightBrowser) -> PlaywrightBrowserContext:
|
| | """Creates a new browser context with anti-detection measures and loads cookies if available."""
|
| |
|
| |
|
| |
|
| | if self.browser.config.chrome_instance_path and len(browser.contexts) > 0:
|
| |
|
| | context = browser.contexts[0]
|
| | else:
|
| |
|
| | context = await browser.new_context(
|
| | viewport=self.config.browser_window_size,
|
| | no_viewport=False,
|
| | 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"
|
| | ),
|
| | java_script_enabled=True,
|
| | bypass_csp=self.config.disable_security,
|
| | ignore_https_errors=self.config.disable_security,
|
| | record_video_dir=self.config.save_recording_path,
|
| | record_video_size=self.config.browser_window_size,
|
| | )
|
| |
|
| | if self.config.trace_path:
|
| | await context.tracing.start(screenshots=True, snapshots=True, sources=True)
|
| |
|
| |
|
| | if self.config.cookies_file and os.path.exists(self.config.cookies_file):
|
| | 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}"
|
| | )
|
| | await context.add_cookies(cookies)
|
| |
|
| |
|
| | await context.add_init_script(
|
| | """
|
| | // Webdriver property
|
| | Object.defineProperty(navigator, 'webdriver', {
|
| | get: () => undefined
|
| | });
|
| |
|
| | // Languages
|
| | Object.defineProperty(navigator, 'languages', {
|
| | get: () => ['en-US', 'en']
|
| | });
|
| |
|
| | // Plugins
|
| | Object.defineProperty(navigator, 'plugins', {
|
| | get: () => [1, 2, 3, 4, 5]
|
| | });
|
| |
|
| | // Chrome runtime
|
| | window.chrome = { runtime: {} };
|
| |
|
| | // Permissions
|
| | const originalQuery = window.navigator.permissions.query;
|
| | window.navigator.permissions.query = (parameters) => (
|
| | parameters.name === 'notifications' ?
|
| | Promise.resolve({ state: Notification.permission }) :
|
| | originalQuery(parameters)
|
| | );
|
| | """
|
| | )
|
| |
|
| | return context
|
| |
|