
    iE                         d Z ddlZddlZddlZddlmZmZmZ ddlm	Z	m
Z
mZ  ej                  d      Z G d d      Zy)u   
Genesis Superior Browser (GSB) — Stealth Engine (Layer 1)
========================================================
Advanced Playwright wrapper designed to bypass enterprise bot detection
without requiring 'Chrome for Testing'.
    N)AnyDictOptional)async_playwrightPageBrowserContextzgenesis_v2.core.browser.stealthc                   p    e Zd ZddefdZdefdZddee   fdZ	de
fdZd	e
d
efdZd	e
d
edefdZd Zy)StealthEngineheadlessc                 <    || _         d | _        d | _        d | _        y N)r   browsercontext
playwright)selfr   s     G/mnt/e/genesis-system/genesis_v2/core/browser_engines/stealth_engine.py__init__zStealthEngine.__init__   s         returnc                    K   yw)z?Returns JavaScript to override common bot-detection properties.aR  
            // 1. Hide navigator.webdriver
            Object.defineProperty(navigator, 'webdriver', {get: () => undefined});

            // 2. Mock plugins for human-like profile
            Object.defineProperty(navigator, 'plugins', {
                get: () => [
                    { name: 'PDF Viewer', filename: 'internal-pdf-viewer' },
                    { name: 'Chrome PDF Viewer', filename: 'internal-pdf-viewer' }
                ]
            });

            // 3. Realistic screen resolution fallback
            if (!window.screen.width) {
                Object.defineProperty(window.screen, 'width', {get: () => 1920});
                Object.defineProperty(window.screen, 'height', {get: () => 1080});
            }

            // 4. Mock chrome.runtime to look like real Chrome
            window.chrome = {
                runtime: {},
                app: {},
                csi: () => {},
                loadTimes: () => {}
            };

            // 5. Normalizing languages
            Object.defineProperty(navigator, 'languages', {get: () => ['en-US', 'en']});
         r   s    r   _get_stealth_scriptz!StealthEngine._get_stealth_script   s     s   Nproxyc                 B  K   t               j                          d{   | _        g d}	 | j                  j                  j	                  | j
                  ||       d{   | _        | j                  j                  ddddd	d
d       d{   | _        | j                  j                  | j                          d{          d{    t        j                  d       y7 7 # t        $ r}t        j                  d|         d}~ww xY w7 7 V7 Lw)z'Launches the stealthy browser instance.N)z--no-sandboxz--disable-setuid-sandboxz---disable-blink-features=AutomationControlledz--disable-infobarsz--window-position=0,0z--ignore-certifcate-errorsz$--ignore-certifcate-errors-spki-list)r   argsr   zFailed to launch chromium: zoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36i  i8  )widthheightlightg      ?F)
user_agentviewportcolor_schemedevice_scale_factor	has_touchz GSB Stealth Context initialized.)r   startr   chromiumlaunchr   r   	Exceptionloggererrornew_contextr   add_init_scriptr   info)r   r   launch_argses       r   r'   zStealthEngine.launch7   s     0 2 8 8 ::

	!%!9!9!@!@   "A " DL "\\55 I#t4  # 6 
 
 ll**1I1I1K+KLLL67G ;  	LL6qc:;	
 ,LLst   DC+D5C/ "C-#	C/ ,&DD1DDDDD-C/ /	D8DDDDDc                    K   | j                   s| j                          d {    | j                   j                          d {   S 7 &7 wr   )r   r'   new_pager   s    r   get_pagezStealthEngine.get_page^   s;     ||++-\\**,,,  ,s!    AA	!AAAApageselectorc           	      Z  K   |j                  |       d{   }|r |j                          d{   }|r|d   |d   dz  z   t        j                  dd      z   }|d   |d   dz  z   t        j                  d	d      z   }|j                  j                  ||d
       d{    t        j                  t        j                  dd             d{    |j                  j                  ||       d{    t        j                  d| d| d| d       yyy7 	7 7 7 Q7 /w)z-Simulate human-like behavior before clicking.Nxr         yr   
   )stepsg?g?zHuman click on z at (z, ))wait_for_selectorbounding_boxrandomuniformmousemoveasynciosleepclickr)   debug)r   r3   r4   elementboxr6   r:   s          r   human_clickzStealthEngine.human_clickc   s    ..x88,,..CHs7|a//&..Q2GGHs8}q006>>"a3HH jjooa"o555mmFNN3$<===jj&&q!,,,xjaS1#QGH   9. 6=,sV   D+D D+D#A1D+$D%%0D+D'#D+9D):'D+#D+%D+'D+)D+textc                    K   |j                  |       d{    |D ]V  }|j                  j                  |       d{    t        j                  t        j                  dd             d{    X y7 `7 :7 w)z3Type character-by-character with randomized delays.Ng?g333333?)rG   keyboardpressrE   rF   rA   rB   )r   r3   r4   rL   chars        r   
human_typezStealthEngine.human_types   si     jj""" 	<D--%%d+++--tT :;;;	< 	#+;s2   A>A8'A>A: 0A>0A<1A>:A><A>c                 V  K   | j                   r"| j                   j                          d {    | j                  r"| j                  j                          d {    | j                  r"| j                  j	                          d {    t
        j                  d       y 7 v7 J7 w)NzGSB Stealth Engine shut down.)r   closer   r   stopr)   r-   r   s    r   rS   zStealthEngine.close{   sw     <<,,$$&&&<<,,$$&&&??//&&(((34 '&(s3   *B)B#-B)B%-B)B'	B)%B)'B))Tr   )__name__
__module____qualname__boolr   strr   r   r   r'   r   r2   rK   rQ   rS   r   r   r   r
   r
      sm     3 @%8(4. %8N- -
Id Ic I <T <S < <5r   r
   )__doc__rE   loggingrA   typingr   r   r   playwright.async_apir   r   r   	getLoggerr)   r
   r   r   r   <module>r_      s@       & & G G			<	=r5 r5r   