
    hgX                     b   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	 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  ej        e          Z ej        d
          Z ej                    Ze                    e           e                     e            G d d          Z!dS )    N)parse)NoSuchElementExceptionTimeoutException)By)expected_conditions)WebDriverWait   )	Utilities)Scraping_utilitiesz4%(asctime)s - %(name)s - %(levelname)s - %(message)sc                      e Zd ZdZed             Zed             Zed             Zed             Zed             Z	ed             Z
ed             Zed	             Zed
             Zed             Zed             Zed             Zed             Zed             Zed             Zed             Zed             ZdS )Finderzz
    Holds the collections of methods that finds element of the facebook's posts using selenium's webdriver's methods
    c                     d}| D ][}|                     d          }d|v rd|v r|} n9d|v r|} n1d|v r|} n)d|v r|} n!d|v r|} nd|v r|} nd	|v r|} n	d|v r|} n\|S )
N hrefz/posts//groups/z/videos/pcbz/photos/zfbid=z/group/z/videos/get_attribute)	link_liststatuslink
link_values       ]/var/www/fb-scrape/myenv/lib/python3.11/site-packages/facebook_page_scraper/element_finder.py__get_status_linkzFinder.__get_status_link   s     	 	D++F33JJ&&:+C+CJ&&
**z))*$$j((Z''z)) *     c                    	 d}d}d}|dk    rW|                      t          j        d                              d          }t	          d           t          j        |          }n|dk    r|                      t          j        |rdnd          }|4|                    d          }t          j        |          }|s	|r|r|||fS |                     t          j	        d	          }|rGd}d}|D ]#}|                    d          }	|	r
d
|	v r|	}|} n$|r|rt          j        |          }|||fS nS# t          $ r d}Y nEt          $ r9}
t                              d                    |
                     d}Y d}
~
nd}
~
ww xY w|||fS )zFfinds URL of the post, then extracts link from that URL and returns itNold_5pcqr   zold link layouut
newzspan > a[role="link"]z!span > a[aria-label][role="link"]ar   NAz Error at find_status method : {})find_elementr   
CLASS_NAMEr   printr   )_Scraping_utilities__extract_id_from_linkCSS_SELECTORfind_elementsTAG_NAMEr   	Exceptionlogger	exceptionformat)postlayoutisGroupr   status_linkr   linksmatching_link_elementpost_urlr   exs              r   __find_statuszFinder.__find_status>   s   7	DKF #//wGGUU  *++++U  5((O%p%<%<Mp  #"&"4"4V"<"<K/Y# F # ;{ ;v ; &T::**2;<< I,0)#H !& " "#11&99 "J$$6$6'+H481!E   I$9 I!3!]^f!g!g &2GHH% 	 	 	FFF 	 	 	?FFrJJKKKFFFFFF	 T**s%   CD/ A(D/ /E?=	E?/E::E?c                    	 |dk    rH|                      t          j        d                              d          }t	          j        |          }n[|dk    rU|                      t          j        d          }d}|s|S |j                            dd                              d	d          S |S # t          $ r d
}Y nEt          $ r9}t                              d                    |                     d
}Y d}~nd}~ww xY w|S )zKfinds shares count of the facebook post using selenium's webdriver's methodr   z._355t._4vn2textContentr   z0.//div/span/div/span[contains(text(), " share")]0z sharesr   z sharer   zError at Find Share method : {}Nr!   r   r%   r   r   $_Scraping_utilities__extract_numbersXPATHtextreplacer   r(   r)   r*   r+   )r,   r-   shareselementr3   s        r   __find_sharezFinder.__find_share}   s+   	**O^ -..  ,PQWXX5++HP    -|++Ir::BB8RPPPM% 	 	 	FFF 	 	 	>EEbIIJJJFFFFFF	 s*   A9B- <.B- +B- -C=;	C=/C88C=c                     	 |                      t          j        d          }nQ# t          $ r d}Y nCt          $ r7}t
                              d                    |                     Y d}~nd}~ww xY w|S )zKfinds all reaction of the facebook post using selenium's webdriver's methodz&[aria-label="See who reacted to this"]r   z#Error at find_reactions method : {}N)r!   r   r%   r   r(   r)   r*   r+   )r,   reactions_allr3   s      r   __find_reactionszFinder.__find_reactions   s    	O --!I MM & 	 	 	MMM 	O 	O 	OBII"MMNNNNNNNN	Os    # A1	A1-A,,A1c                    	 d}|dk    rH|                      t          j        d                              d          }t	          j        |          }n[|dk    rU|                      t          j        d          }d}||S |j                            d	d                              d
d          S nS# t          $ r d}Y nEt          $ r9}t                              d                    |                     d}Y d}~nd}~ww xY w|S )zMfinds comments count of the facebook post using selenium's webdriver's methodr   r   za._3hg-r6   r   z2.//div/span/div/span[contains(text(), " comment")]r   Nz	 commentsz commentz"Error at find_comments method : {}r8   )r,   r-   commentsr>   r3   s        r   __find_commentszFinder.__find_comments   s.   	H,,R_iHHVV!  .R  5++HR  ?#O|++K<<DDZQSTTT% 	 	 	HHH 	 	 	AHHLLMMMHHHHHH	 s$   A;B. >.B. .C><	C>/C99C>c                    t           j                            |           }|                                                    d          }d}t          j        ||          }d}t          j        |d|                    d                    }|S )Nzutf-8zF<div data-testid="post_message" class=".*?" data-ft=".*?">(.*?)<\/div>z<[^<>]+>r   r   )	urllibrequesturlopenreaddecoderesearchsubgroup)r   responser;   post_message_div_finder_regexpost_messagereplace_html_tags_regexmessages          r   __fetch_post_passagezFinder.__fetch_post_passage   s     >))$//}}%%g.. U 	& y!>EE",&0"l6H6H6K6KLLr   c                 j    	 |                      t          j        |          }dS # t          $ r Y dS w xY w)NTF)r!   r   r%   r   )r>   css_selectorfounds      r   __element_existszFinder.__element_exists   sE    	((,GGE4% 	 	 	55	s    $ 
22c                    	 |dk    r|                      t          j        d          }t                              |d          r|                     t          j        d          }|                    d          r+t          j        ||           t          j
        |          }nU|                    d          r/t                              |                    d                    }n|                    d          }n|                    d          }n|dk    r|                      t          j        d	          }t                              |d
          r|                     t          j        d
          }|                    d          r.t                              |                    d                    }nAt          j        ||d
           |                    d          }n|                    d          }nS# t          $ r d}Y nEt          $ r9}t                              d                    |                     d}Y d}~nd}~ww xY w|S )zvfinds content of the facebook post using selenium's webdriver's method and returns string containing text of the postsr   userContentzspan.text_exposed_link > aonclicktargetr   r6   r   z[data-ad-preview="message"]zdiv[dir="auto"] > div[role]r   z!Error at find_content method : {}N)r!   r   r"   r   _Finder__element_existsr%   r   r
   _Utilities__click_see_morer   $_Scraping_utilities__extract_content_Finder__fetch_post_passager   r(   r)   r*   r+   )r,   driverr-   post_contentr>   contentr3   s          r   __find_contentzFinder.__find_content   s   ?	#00NN11 ">  H +77)E G ,,Y77 L!<V\RRR.S ,    !..x88 L #)"D"D#11&99# # #/"<"<]"K"K +88GGGG5#00O%B    11 "?  H +77)F G ,,X66 
"("D"D#11&99# # "<"L2O   #/"<"<)# #
 +88GGG% 	 	 	GGG 	 	 	@GGKKLLLGGGGGG	 s   G7G: :I
	I
/II
c                    	 |dk    rq|                      t          j        d                              d          }t          j                            t          |                                                    S |dk    r|r8d}|                    ||          }t          dt          |          z              n_|s]|                    d          }t          |          dk    r!t          |                                          nt          j        |          }|S dS # t          $ r d	}Y dS t           $ r;}	t"                              d
                    |	                     d	}|cY d}	~	S d}	~	ww xY w)zJfinds posted time of the facebook post using selenium's webdriver's methodr   abbrz
data-utimer   a  
                        // Starting from the provided element, find the SVG using querySelector
                        var svgElement = arguments[0].querySelector('svg');

                        // Assuming we're looking for a shadow DOM inside or related to the <use> tag, which is unconventional
                        // var useElement = svgElement.querySelector('use');

                        // Placeholder for accessing the shadow DOM, which is not directly applicable to <use> tags.
                        // This step assumes there's some unconventional method to access related shadow content
                        var shadowContent;

                        // Hypothetically accessing shadow DOM or related content. This part needs adjustment based on actual structure or intent
                        // As <use> tags don't host shadow DOMs, this is speculative and might represent a different approach in practice
                        if (svgElement.shadowRoot) {
                            shadowContent = svgElement.shadowRoot.querySelector('some-element').textContent;
                        } else {
                            // Fallback or alternative method to access intended content, as direct shadow DOM access on <use> is not standard
                            shadowContent = 'Fallback or alternative content access method needed';
                        }

                        return shadowContent;
                    zTIMESTAMP: z
aria-label   r   z%Error at find_posted_time method : {}N)r!   r   r'   r   datetimefromtimestampfloat	isoformatexecute_scriptr#   strlenr   r   #_Scraping_utilities__convert_to_iso	TypeErrorr(   r)   r*   r+   )
r,   r-   link_elementrb   r.   posted_time	js_script	timestamparia_label_valuer3   s
             r   __find_posted_timezFinder.__find_posted_time$  s   7	 "//VDDRR    (66u[7I7IJJTTVVV5 &
!I. !' 5 5i N NI-#i..89999  '3'A'A,'O'O$ /00144 .//99;;;/S,   ! Q !T  	 	 	IIII 	 	 	DKKBOOPPPI	s+   A6D 9B D E/+	E/40E*$E/*E/c                 N   	 |                      t          j        d          }g }|D ]*}|                    |                    d                     +nS# t
          $ r g }Y nEt          $ r9}g }t                              d	                    |                     Y d}~nd}~ww xY w|S )zDfinds video of the facebook post using selenium's webdriver's methodvideosrcz#Error at find_video_url method : {}N)
r&   r   r'   appendr   r   r(   r)   r*   r+   )r,   video_elementsrcsry   r3   s        r   __find_video_urlzFinder.__find_video_url`  s    	O ..r{GDDMD& 8 8E//6677778% 	 	 	ED 	O 	O 	OEBII"MMNNNNNNNN	O s   AA B" 	B")/BB"c                    	 |dk    r!|                      t          j        d          }n&|dk    r |                      t          j        d          }t          |          dk    rd |D             ng }nS# t          $ r g }Y nEt
          $ r9}t                              d                    |                     g }Y d}~nd}~ww xY w|S )	zHfinds all image of the facebook post using selenium's webdriver's methodr   zimg.scaledImageFitWidth.imgr   zdiv > img[referrerpolicy]r   c                 8    g | ]}|                     d           S )rz   r   ).0images     r   
<listcomp>z+Finder.__find_image_url.<locals>.<listcomp>  s&    @@@$$U++@@@r   z#Error at find_image_url method : {}N)	r&   r   r%   ro   r   r(   r)   r*   r+   )r,   r-   imagessourcesr3   s        r   __find_image_urlzFinder.__find_image_urlr  s    	++O%B  5++O%@ 
 v;;?? A@@@@@ G
 & 	 	 	GD 	 	 	BII"MMNNNGGGGGG	 s   A.A1 1C?	C/B<<Cc                     	 |dk    r!|                      t          j        d          }n*|dk    r$|                      t          j        |rdnd          }|S # t          $ rF t                              d           t          j        |            t          j	        d           Y d	S t          $ r`}t                              d                    |                     t          j        |            t          j	        d           Y d	}~d	S d	}~ww xY w)
zHfinds all posts of the facebook page using selenium's webdriver's methodr   zdiv.userContentWrapperr   zdiv[role='feed'] > divzdiv[role="article"]zCannot find any posts! Exiting!r	   z#Error at find_all_posts method : {}N)r&   r   r%   r   r)   errorr
   _Finder__close_driversysexitr(   r*   r+   )rb   r-   r.   	all_postsr3   s        r   __find_all_postszFinder.__find_all_posts  s)   	"00O%= 		 5 #00^e  CABZBZ  lA  B  B	% 	 	 	LL:;;;$V,,,HQKKKKKK 	 	 	BII"MMNNN$V,,,HQKKKKKKKKK	s    AA AD$	D-ADDc                 x   	 |dk    r4|                      t          j        d                              d          }n9|dk    r3|                      t          j        d                              d          }|S # t
          $ r8}t                              d                    |                     Y d}~dS d}~ww xY w)zKfinds name of the facebook page or post using selenium's webdriver's methodr   za._64-fr6   r   strongz Error at __find_name method : {}N)	r!   r   r%   r   r'   r(   r)   r*   r+   )driverOrPostr-   namer3   s       r   __find_namezFinder.__find_name  s    
	L#00)LLZZ!  5#00hGGUU!  K 	L 	L 	L?FFrJJKKKKKKKKK	Ls   A4A7 7
B9-B44B9c                 :   	 |                      t          j        d           dS # t          $ r Y dS t          $ r`}t
                              d                    |                     t          j	        |            t          j        d           Y d }~d S d }~ww xY w)Npagelet_bluebarr   r   zError art __detect_ui: {}r	   )r!   r   IDr   r(   r)   r*   r+   r
   r   r   r   )rb   r3   s     r   __detect_uizFinder.__detect_ui  s    	'89995% 	 	 	55 	 	 	8??CCDDD$V,,,HQKKKKKKKKK	s    $ 
B	BABBc                 *   	 | dk    r |                     t          j        d          S | dk    r |                     t          j        d          S d S # t          $ r8}t                              d                    |                     Y d }~dS d }~ww xY w)Nr   r   r   divzError at find_reaction : {}r   )r&   r   r'   r(   r)   r*   r+   )r-   rA   r3   s      r   __find_reactionzFinder.__find_reaction  s    	$222;DDD5$222;FFF !  	 	 	:AA"EEFFF22222	s   %A %A 
B-BBc                 T   	 |                      t          j        d          }|d                                          d S # t          t
          f$ r Y d S t          $ rL}t                              d	                    |                     t          j        d           Y d }~d S d }~ww xY w)Nz3[aria-label="Allow essential and optional cookies"]zError at accept_cookies: {}r	   )r&   r   r%   clickr   
IndexErrorr(   r)   r*   r+   r   r   )rb   buttonr3   s      r   __accept_cookieszFinder.__accept_cookies  s    		))!V F 2J&
3 	 	 	DD 	 	 	:AA"EEFFFHQKKKKKKKKK	s   :> B'	B'AB""B'c                 *   	 t          | d          }	 |                    t          j        t          j        df                    }|                                 n&# t          $ r}t          d           Y d }~nd }~ww xY wt          j
        d           t          | d                              t          j        t          j        df                    }t          | d                              t          j        t          j        df                    }|                                 |                    t          |                     |                                 |                    t          |                     	 t          | d                              t          j        t          j        d	f                                                     d S # t          $ rW t          | d                              t          j        t          j        d
f                                                     Y d S w xY w# t           t"          f$ r Y d S t          $ r8}t$                              d                    |                     Y d }~d S d }~ww xY w)N   z[aria-label="Close"]z	no pop-upr	   
   zinput[name='email']zinput[name='pass']   zbutton[type='submit']r   zError at login: {})r   untilECpresence_of_element_locatedr   r%   r   r(   r#   timesleepelement_to_be_clickableclear	send_keysrn   r   r   r   r)   r*   r+   )rb   usernamepasswordwaitr>   r3   username_elementpassword_elements           r   __loginzFinder.__login  s    	> ++D$**R%CR_VlDm%n%noo $ $ $l########$ JqMMM,VR88>>r?Y[][j  mB  [C  @D  @D   E   E,VR88>>r?Y[][j  mA  [B  @C  @C   D   D ""$$$&&s8}}555""$$$&&s8}}555pfa((..r/I2?\sJt/u/uvv||~~~~~# p p pfa((..r/I2?\dJe/f/fggmmoooooop '
3 	 	 	DD 	> 	> 	>188<<=========	>sh   H= AA H= 
A>%A94H= 9A>>DH= AG AH:6H= 9H::H= =J	J-JJN)__name__
__module____qualname____doc__staticmethod_Finder__get_status_link_Finder__find_status_Finder__find_share_Finder__find_reactions_Finder__find_commentsra   r^   _Finder__find_content_Finder__find_posted_time_Finder__find_video_url_Finder__find_image_url_Finder__find_all_posts_Finder__find_name_Finder__detect_ui_Finder__find_reaction_Finder__accept_cookies_Finder__login r   r   r   r      s           \< :+ :+ \:+|   \8   \   \8   \"   \ B B \BH 9 9 \9v   \"   \6   \. L L \L$ 	 	 \	 	 	 \	 
 
 \
 !> !> \!> !> !>r   r   )"ri   loggingrL   r   r   urllib.requestrG   dateutildateutil.parserr   selenium.common.exceptionsr   r   selenium.webdriver.common.byr   selenium.webdriver.supportr   r   selenium.webdriver.support.uir   driver_utilitiesr
   scraping_utilitiesr   	getLoggerr   r)   	Formatterr+   StreamHandlerchsetFormatter
addHandlerr   r   r   r   <module>r      sb     				 



       ! ! ! ! ! ! O O O O O O O O + + + + + + @ @ @ @ @ @ 7 7 7 7 7 7 ' ' ' ' ' ' 2 2 2 2 2 2		8	$	$		Q	R	RW       "   f> f> f> f> f> f> f> f> f> f>r   