
    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)BingSearchServicec                     d| _         d| _        t               | _        t	               | _        d | _        | j                          y )Nbingz https://www.bing.com/search?q={})search_engine
search_urlr   kafka_clientr   redis_clientdriversetup_driverselfs    ./services/bing-search/main.py__init__zBingSearchService.__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!BingSearchService.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BingSearchService.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%BingSearchService.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&BingSearchService.setup_firefox_driverp   s     "\*^,_-;o	q !!3!5!=!=!?@''I34r#   max_resultsc                    g }| j                   j                  t        j                  d      }t	        |d|       D ]  \  }}	 t        |dz         }	 |j                  t        j                  d      }|j                  |_        |j                  d      |_
        	 |j                  t        j                  d      }|j                  |_        	 |j                  t        j                  d      }	|	j                  |_        |j                  r|j                  |        |S #  Y xY w#  Y ^xY w#  Y 3xY w# t        $ r&}
t        j!                  d	| d
|
        Y d}
~
"d}
~
ww xY w)z Extract search results from Bingz.b_algoNr-   )rankzh2 ahrefz.b_caption pz.b_attribution citezError extracting Bing result z: )r   find_elementsr   CSS_SELECTOR	enumerater   find_elementr)   titleget_attributeurlsnippetdisplayed_urlappendr?   rN   debug)r    rV   resultsresult_elementsielementr9   
title_linkra   cite_elementes              r!   extract_bing_resultsz&BingSearchService.extract_bing_results}   sC   ++33BOOYO#OL[$AB 	JAw%1q51!(!5!5boov!NJ#-??FL!+!9!9&!AFJ
%222??NSG%,\\FN
#*#7#7I^#_L+7+<+<F( ::NN6*7	B 1
  <QCr!EFs[   D3AD1D%1D,=D3D" D3"D3%D)'D3,D0.D33	E"<EE"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 Bing search +zSearching Bing for: )
request_idr   queryre   total_resultsprocessing_timezBing search completed for 'z': z results in z.2fszError performing Bing search: r   )rq   r   rr   re   rs   errorrt   N)timer   r   rr   replacerN   rO   r   getsleepdelayrl   rV   r   rq   r   lenr?   rv   str)r    rm   
start_timer   re   rt   responserk   s           r!   perform_searchz BingSearchService.perform_search   sf   YY[
$	//0E0Ec30OPJKK.w}}o>? KKOOJ'JJw}}% //0C0CDG"iikJ6O%"--"00mm!'l /H KK5gmm_CG~UabqruavvwxyO 
	LL9!=>!"--"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 Bing search request: SEARCH_RESULTS)r   r   r   z'Bing search response sent for request: z$Error handling Bing search request: N )r   rN   rO   rq   r   r   send_messager   dictr?   rv   )r    r   r   r   rm   r   rk   s          r!   handle_search_requestz'BingSearchService.handle_search_request   s    	E)4G4GKK:7;M;M:NOP **73H **-. && +  KKA'BTBTAUVW 	ELL?sCDD	E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 Bing Search Service...BING_SEARCH_REQUESTSzbing-search-service)topicsgroup_idmessage_handlerz#Bing Search Service stopped by userzError in Bing Search Service: N)
rN   rO   r   consume_messagesr   r   KeyboardInterruptr?   rv   cleanup)r    rk   s     r!   start_consumingz!BingSearchService.start_consuming   s    56	..567. $ : : /  LLN ! 	?KK=> 	?LL9!=>>	? 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BingSearchService.cleanup   sa    ;;KKKK*+##%##% r#   N)r'   )__name__
__module____qualname__r"   r   r}   r;   r   r=   r>   intr   r   rl   r   r   r   r   r   r   r   r   r#   r!   r   r   $   s    $c3h $L	>4$5' 'T,=O 'R(&9 (n (TE3 E EC E*"
&r#   r   __main__)4ossysrw   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   pathrc   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	$\& \&| z!G r#   