
    mh)                        d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlmZm	Z	 d dl
mZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d d	lmZ d d
lm Z  ejB                  jE                  d       ejB                  jE                  d       d dl#m$Z$m%Z%m&Z& d dl'm(Z(m)Z) d dl*m+Z+  ejX                  ejZ                  d        ej\                  e/      Z0 G d d      Z1e/dk(  r e1       Z2e2jg                          yy)    N)ListDict)	webdriver)By)WebDriverWait)expected_conditions)Service)Options)ChromeDriverManager)GeckoDriverManagerz/appz/app/shared)SearchEngineRequestSearchResponseSearchResult)KafkaClientTOPICS)RedisClientz4%(asctime)s - %(name)s - %(levelname)s - %(message)s)levelformatc                       e Zd Zd Zdeeef   fdZd Zd Zd Z	dde
dee   fdZd	edefd
ZdededefdZd Zd Zy)GoogleSearchServicec                     d| _         d| _        t               | _        t	               | _        d | _        | j                          y )Ngooglez"https://www.google.com/search?q={})search_engine
search_urlr   kafka_clientr   redis_clientdriversetup_driverselfs     ./services/google-search/main.py__init__zGoogleSearchService.__init__%   s8    %>'M'M    returnc                 X   i }t        j                         }	 |dk(  rt        j                  ddgddd      }n<|dk(  rt        j                  ddgddd      }nt        j                  d	dgddd      }|j                  d
k(  r6t        j                  d|j                        }|r|j                  d      |d	<   	 t        j                  ddgddd      }|j                  d
k(  r6t        j                  d|j                        }|r|j                  d      |d<   |S #  Y gxY w#  Y |S xY w)zDetect installed browsersDarwinz</Applications/Google Chrome.app/Contents/MacOS/Google Chromez	--versionT
   )capture_outputtexttimeoutLinuxzgoogle-chromechromer   z(\d+\.\d+\.\d+)   firefoxz
(\d+\.\d+))	platformsystem
subprocessrun
returncoderesearchstdoutgroup)r    browsersr0   resultversion_matchs        r!   detect_browsersz#GoogleSearchService.detect_browsers-   s>   "	!#RT_)"&T2? 7"#+(F59bR $;(?59bR   A% "		*<fmm L )6)<)<Q)?HX&
	^^Y$<15D"NF  A% "		- G *7*=*=a*@HY' 		s   B"D ;A D$ D!$D)c                     | j                         }d|v r| j                          yd|v r| j                          yt        d      )z1Setup WebDriver with cross-platform compatibilityr,   r.   zNo supported browsers detectedN)r;   setup_chrome_driversetup_firefox_driver	Exception)r    available_browserss     r!   r   z GoogleSearchService.setup_driverS   sG    !113))$$&,,%%'<==r#   c                 *   t               }|j                  d       |j                  d       |j                  d       |j                  d       |j                  d       |j                  d       |j                  ddg       |j                  d	d
       |j                  d       t        t	               j                               }t        j                  ||      | _        | j                  j                  d       t        j                  d       y)zSetup Chrome WebDriverz--headless=newz--no-sandboxz--disable-dev-shm-usagez--disable-gpuz--window-size=1920,1080z---disable-blink-features=AutomationControlledexcludeSwitcheszenable-automationuseAutomationExtensionFz|--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36serviceoptionszEObject.defineProperty(navigator, 'webdriver', {get: () => undefined})zChrome WebDriver initializedN)ChromeOptionsadd_argumentadd_experimental_optionChromeServicer   installr   Chromer   execute_scriptloggerinfor    rF   rE   s      r!   r=   z'GoogleSearchService.setup_chrome_driver^   s    /-.^,67_-67LM''(9<O;PQ''(@%H  \  	] 3 5 = = ?@&&wH""#jk23r#   c                 F   t               }|j                  d       |j                  d       |j                  d       |j                  dd       t        t	               j                               }t        j                  ||      | _        t        j                  d       y)	zSetup Firefox WebDriverz
--headlessz--width=1920z--height=1080zgeneral.useragent.overridezPMozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/109.0rD   zFirefox WebDriver initializedN)FirefoxOptionsrH   set_preferenceFirefoxServicer   rK   r   Firefoxr   rN   rO   rP   s      r!   r>   z(GoogleSearchService.setup_firefox_driverp   s     "\*^,_-;o	q !!3!5!=!=!?@''I34r#   max_resultsc                 R   g }g d}g }|D ]2  }| j                   j                  t        j                  |      }|s0|} n t	        |d|       D ]  \  }}	 t        |dz         }		 |j                  t        j                  d      }
|
rG|
j                  |	_        |
j                  t        j                  d      }|j                  d      |	_        g d}|D ]5  }	 |j                  t        j                  |      }|j                  |	_         n 	 |j                  t        j                  d	      }|j                  |	_        |	j                  r|j                  |	        |S #  Y xY w#  Y xY w#  Y 5xY w# t        $ r&}t         j#                  d
| d|        Y d}~Sd}~ww xY w)z"Extract search results from Google)zdiv.gz!div[data-sokoban-container] div.gz
div.tF2CxcNr-   )rankh3z./..href)z.VwiC3bz.s3v9rdz.stcitezError extracting Google result z: )r   find_elementsr   CSS_SELECTOR	enumerater   find_elementr)   titleXPATHget_attributeurlsnippetdisplayed_urlappendr?   rN   debug)r    rV   resultsresult_selectorsresult_elementsselectorelementsielementr9   
title_linklink_elementsnippet_selectorsrd   cite_elementes                   r!   extract_google_resultsz*GoogleSearchService.extract_google_results}   s   
 ( 	H{{00(KH"*		 $OL[$AB $	JAw#%1q51!(!5!5boot!LJ!'1'1'>'>rxx'P%1%?%?%G

 %B! 1 !H!")"6"6r"Q)0	!#*#7#7#PL+7+<+<F( ::NN6*A$	L 7! 
  >qcA3GHsg   E7&A)E!	E71E)
E71E0?E7!E&#E7&E7)E-+E70E42E77	F& F!!F&requestc                    t        j                          }	 | j                  j                  |j                  j	                  dd            }t
        j                  d|j                          | j                  j                  |       t        j                  |j                         | j                  |j                        }t        j                          |z
  }t        |j                  | j                  |j                  |t!        |      |      }t
        j                  d|j                   dt!        |       d|dd	       |S # t"        $ rp}t
        j%                  d
|        t        |j                  | j                  |j                  g dt'        |      t        j                          |z
        cY d}~S d}~ww xY w)zPerform Google search +zSearching Google for: )
request_idr   queryrh   total_resultsprocessing_timezGoogle search completed for 'z': z results in z.2fsz Error performing Google search: r   )ry   r   rz   rh   r{   errorr|   N)timer   r   rz   replacerN   rO   r   getsleepdelayrt   rV   r   ry   r   lenr?   r~   str)r    ru   
start_timer   rh   r|   responsers   s           r!   perform_searchz"GoogleSearchService.perform_search   sf   YY[
$	//0E0Ec30OPJKK0@A KKOOJ'JJw}}% 11'2E2EFG"iikJ6O%"--"00mm!'l /H KK7c#g,Wcdstwcxxyz{O 
	LL;A3?@!"--"00mm!f $		j 8 
	s   D/E 	F?A%F:4F?:F?topicmessagekeyc                    	 t        di |}t        j                  d|j                          | j	                  |      }| j
                  j                  t        d   |j                         |j                         t        j                  d|j                          y# t        $ r"}t        j                  d|        Y d}~yd}~ww xY w)zHandle incoming search requestsz"Processing Google search request: SEARCH_RESULTS)r   r   r   z)Google search response sent for request: z&Error handling Google search request: N )r   rN   rO   ry   r   r   send_messager   dictr?   r~   )r    r   r   r   ru   r   rs   s          r!   handle_search_requestz)GoogleSearchService.handle_search_request   s    	G)4G4GKK<W=O=O<PQR **73H **-. && +  KKCGDVDVCWXY 	GLLA!EFF	Gs   BB   	C)CCc                 t   t         j                  d       	 | j                  j                  t        d   gd| j
                         | j                          y# t        $ r t         j                  d       Y 1t        $ r"}t         j                  d|        Y d}~Vd}~ww xY w# | j                          w xY w)z#Start consuming messages from Kafkaz!Starting Google Search Service...GOOGLE_SEARCH_REQUESTSzgoogle-search-service)topicsgroup_idmessage_handlerz%Google Search Service stopped by userz Error in Google Search Service: N)
rN   rO   r   consume_messagesr   r   KeyboardInterruptr?   r~   cleanup)r    rs   s     r!   start_consumingz#GoogleSearchService.start_consuming   s    78	..7890 $ : : /  LLN ! 	AKK?@ 	ALL;A3?@@	A LLNs5   0A B"6B% 8B" BB% B""B% %B7c                    | j                   r/| j                   j                          t        j                  d       | j                  r| j                  j                          | j                  r| j                  j                          yy)zClean up resourceszWebDriver closedN)r   quitrN   rO   r   closer   r   s    r!   r   zGoogleSearchService.cleanup  sa    ;;KKKK*+##%##% r#   N)r'   )__name__
__module____qualname__r"   r   r   r;   r   r=   r>   intr   r   rt   r   r   r   r   r   r   r   r   r#   r!   r   r   $   s    $c3h $L	>4$58# 8tL?Q 8t(&9 (n (TG3 G GC G*"
&r#   r   __main__)4ossysr   loggingr/   r1   r4   typingr   r   seleniumr   selenium.webdriver.common.byr   selenium.webdriver.support.uir   selenium.webdriver.supportr   EC!selenium.webdriver.chrome.servicer	   rJ   !selenium.webdriver.chrome.optionsr
   rG   "selenium.webdriver.firefox.servicerT   "selenium.webdriver.firefox.optionsrR   webdriver_manager.chromer   webdriver_manager.firefoxr   pathrf   shared.models.schemasr   r   r   shared.utils.kafka_utilsr   r   shared.utils.redis_utilsr   basicConfigINFO	getLoggerr   rN   r   rE   r   r   r#   r!   <module>r      s    	 
     	   + 7 @ F F H H 8 8     S S 8 0   
,,A 
		8	$m& m&^ z!#G r#   