Josedcape commited on
Commit
e4b63ae
verified
1 Parent(s): 65cbdfa

Update src/browser/custom_context.py

Browse files
Files changed (1) hide show
  1. src/browser/custom_context.py +83 -88
src/browser/custom_context.py CHANGED
@@ -1,88 +1,83 @@
1
- import json
2
- import logging
3
- import os
4
-
5
- from browser_use.browser.browser import Browser
6
- from browser_use.browser.context import BrowserContext, BrowserContextConfig
7
- from playwright.async_api import Browser as PlaywrightBrowser
8
- from playwright.async_api import BrowserContext as PlaywrightBrowserContext
9
-
10
- logger = logging.getLogger(__name__)
11
-
12
-
13
- class CustomBrowserContext(BrowserContext):
14
- def __init__(
15
- self,
16
- browser: "Browser",
17
- config: BrowserContextConfig = BrowserContextConfig()
18
- ):
19
- super(CustomBrowserContext, self).__init__(browser=browser, config=config)
20
-
21
- async def _create_context(self, browser: PlaywrightBrowser) -> PlaywrightBrowserContext:
22
- """Creates a new browser context with anti-detection measures and loads cookies if available."""
23
- # If we have a context, return it directly
24
-
25
- # Check if we should use existing context for persistence
26
- if self.browser.config.chrome_instance_path and len(browser.contexts) > 0:
27
- # Connect to existing Chrome instance instead of creating new one
28
- context = browser.contexts[0]
29
- else:
30
- # Original code for creating new context
31
- context = await browser.new_context(
32
- viewport=self.config.browser_window_size,
33
- no_viewport=False,
34
- user_agent=(
35
- "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
36
- "(KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36"
37
- ),
38
- java_script_enabled=True,
39
- bypass_csp=self.config.disable_security,
40
- ignore_https_errors=self.config.disable_security,
41
- record_video_dir=self.config.save_recording_path,
42
- record_video_size=self.config.browser_window_size,
43
- )
44
-
45
- if self.config.trace_path:
46
- await context.tracing.start(screenshots=True, snapshots=True, sources=True)
47
-
48
- # Load cookies if they exist
49
- if self.config.cookies_file and os.path.exists(self.config.cookies_file):
50
- with open(self.config.cookies_file, "r") as f:
51
- cookies = json.load(f)
52
- logger.info(
53
- f"Loaded {len(cookies)} cookies from {self.config.cookies_file}"
54
- )
55
- await context.add_cookies(cookies)
56
-
57
- # Expose anti-detection scripts
58
- await context.add_init_script(
59
- """
60
- // Webdriver property
61
- Object.defineProperty(navigator, 'webdriver', {
62
- get: () => undefined
63
- });
64
-
65
- // Languages
66
- Object.defineProperty(navigator, 'languages', {
67
- get: () => ['en-US', 'en']
68
- });
69
-
70
- // Plugins
71
- Object.defineProperty(navigator, 'plugins', {
72
- get: () => [1, 2, 3, 4, 5]
73
- });
74
-
75
- // Chrome runtime
76
- window.chrome = { runtime: {} };
77
-
78
- // Permissions
79
- const originalQuery = window.navigator.permissions.query;
80
- window.navigator.permissions.query = (parameters) => (
81
- parameters.name === 'notifications' ?
82
- Promise.resolve({ state: Notification.permission }) :
83
- originalQuery(parameters)
84
- );
85
- """
86
- )
87
-
88
- return context
 
1
+ import json
2
+ import logging
3
+ import os
4
+ from selenium import webdriver
5
+ from selenium.webdriver.chrome.options import Options
6
+
7
+ logger = logging.getLogger(__name__)
8
+
9
+ class CustomBrowserContext:
10
+ def __init__(self, browser, config=None):
11
+ self.browser = browser
12
+ self.config = config or {}
13
+ self.driver = None
14
+
15
+ def create_context(self):
16
+ """Crea un nuevo contexto de navegador con medidas anti-detecci贸n y carga cookies si est谩n disponibles."""
17
+ chrome_options = Options()
18
+
19
+ # Configuraci贸n de la ventana del navegador
20
+ if self.config.get("browser_window_size"):
21
+ chrome_options.add_argument(f"--window-size={self.config['browser_window_size'][0]},{self.config['browser_window_size'][1]}")
22
+
23
+ # Configuraci贸n de seguridad
24
+ if self.config.get("disable_security", False):
25
+ chrome_options.add_argument("--disable-web-security")
26
+ chrome_options.add_argument("--disable-site-isolation-trials")
27
+ chrome_options.add_argument("--disable-features=IsolateOrigins,site-per-process")
28
+
29
+ # Configuraci贸n del user-agent
30
+ user_agent = (
31
+ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
32
+ "(KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36"
33
+ )
34
+ chrome_options.add_argument(f"user-agent={user_agent}")
35
+
36
+ # Inicializar el navegador
37
+ self.driver = webdriver.Chrome(options=chrome_options)
38
+
39
+ # Cargar cookies si existen
40
+ if self.config.get("cookies_file") and os.path.exists(self.config["cookies_file"]):
41
+ with open(self.config["cookies_file"], "r") as f:
42
+ cookies = json.load(f)
43
+ logger.info(f"Loaded {len(cookies)} cookies from {self.config['cookies_file']}")
44
+ for cookie in cookies:
45
+ self.driver.add_cookie(cookie)
46
+
47
+ # Ejecutar scripts anti-detecci贸n
48
+ self.driver.execute_script(
49
+ """
50
+ // Webdriver property
51
+ Object.defineProperty(navigator, 'webdriver', {
52
+ get: () => undefined
53
+ });
54
+
55
+ // Languages
56
+ Object.defineProperty(navigator, 'languages', {
57
+ get: () => ['en-US', 'en']
58
+ });
59
+
60
+ // Plugins
61
+ Object.defineProperty(navigator, 'plugins', {
62
+ get: () => [1, 2, 3, 4, 5]
63
+ });
64
+
65
+ // Chrome runtime
66
+ window.chrome = { runtime: {} };
67
+
68
+ // Permissions
69
+ const originalQuery = window.navigator.permissions.query;
70
+ window.navigator.permissions.query = (parameters) => (
71
+ parameters.name === 'notifications' ?
72
+ Promise.resolve({ state: Notification.permission }) :
73
+ originalQuery(parameters)
74
+ );
75
+ """
76
+ )
77
+
78
+ return self.driver
79
+
80
+ def close(self):
81
+ """Cierra el contexto del navegador."""
82
+ if self.driver:
83
+ self.driver.quit()