
    Sj[K                     0   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 d dlm	Z	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mZmZ d dlmZ d dlmZ d dlZd dlmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z& d dl'm(Z( ddgZ)ddgZ*ddgZ+g dZ,dgZ-dZ. e(            Z/d Z0de$fdZ1de#fdZ2de%de&fdZ3de%de&fdZ4de%de&fdZ5de%de&fd Z6de%de&fd!Z7de%de&fd"Z8de%de&fd#Z9de%d$e:de"fd%Z;d.d&ed'e<fd(Z=d&ed)e<fd*Z>de%d&efd+Z?de%d&ed$e:de"fd,Z@de%d&efd-ZAdS )/    N)	timedelta)escape)unquotequote)FunctionTimedOutfunc_timeout)TimeoutException)	WebDriver)By)Keys)presence_of_element_locatedstaleness_oftitle_is)ActionChains)WebDriverWait)STATUS_ERROR	STATUS_OKChallengeResolutionResultTChallengeResolutionTHealthResponseIndexResponseV1RequestBaseV1ResponseBase)SessionsStoragezAccess deniedz Attention Required! | Cloudflarez*div.cf-error-title span.cf-code-label spanz*#cf-error-details div.cf-error-overview h1zJust a moment...z
DDoS-Guard)
z#cf-challenge-runningz.ray_idz.attack-boxz#cf-please-waitz#challenge-spinnerz#trk_jschal_jsz#turnstile-wrapperz	.lds-ringztd.info #js_infozdiv.vc div.text-box h2#input[name='cf-turnstile-response']   c                  ~   t          j        d           t          j        dt          j                    z              t          j                    } | )t          j        d           t          j        d           nt          j        d| z              t          j                    }|dk    r)t          j        d           t          j        d           nt          j        d|z              t          j        d	           t          j	                    }t          j        d
|z              t          j        d           d S )Nz#Testing web browser installation...z
Platform: z,Chrome / Chromium web browser not installed!r   zChrome / Chromium path:  z'Chrome / Chromium version not detected!z!Chrome / Chromium major version: zLaunching web browser...zFlareSolverr User-Agent: zTest successful!)
logginginfoplatformutilsget_chrome_exe_patherrorsysexitget_chrome_major_versionget_user_agent)chrome_exe_pathchrome_major_version
user_agents      /app/flaresolverr_service.pytest_browser_installationr-   <   s   L6777L 1 3 33444/11ODEEE//ABBB 9;;r!!?@@@8;OOPPPL+,,,%''JL,z9:::L#$$$$$    returnc                      t          i           } d| _        t          j                    | _        t          j                    | _        | S )NzFlareSolverr is ready!)r   msgr"   get_flaresolverr_versionversionr(   	userAgentress    r,   index_endpointr7   T   s;    


C&CG022CK(**CMJr.   c                  <    t          i           } t          | _        | S )N)r   r   statusr5   s    r,   health_endpointr:   \   s    


CCJJr.   reqc                    t          t          j                    dz            }t          j        dt	          j        |                       	 t          |           }ni# t          $ r\}t          i           }d|_	        t          |_        dt          |          z   |_        t          j        |j                   Y d }~nd }~ww xY w||_        t          t          j                    dz            |_        t	          j                    |_        t          j        dt	          j        |                      t          j        d|j        |j        z
  dz   d           |S )N  z#Incoming request => POST /v1 body: TzError: zResponse => POST /v1 body: zResponse in z s)inttimer   r    r"   object_to_dict_controller_v1_handler	Exceptionr   __error_500__r   r9   strmessager$   startTimestampendTimestampr2   r3   debug)r;   start_tsr6   es       r,   controller_v1_endpointrK   b   sJ   49;;%&&HLRu7KC7P7PRRSSS#$S)) # # #R   !
#a&&(ck""""""""# "C49;;-..C022CKMK0DS0I0IKKLLLLR!1C4F!F$ NRRRSSSJs   A 
C(AB??Cc                 (   | j         t          d          | j        t          j        d           | j        t          j        d           | j        t          | j                  dk     rd| _        | j         dk    rt          |           }n| j         dk    rt          |           }ni| j         dk    rt          |           }nN| j         d	k    rt          |           }n3| j         d
k    rt          |           }nt          d| j          d          |S )Nz%Request parameter 'cmd' is mandatory.z;Request parameter 'headers' was removed in FlareSolverr v2.z=Request parameter 'userAgent' was removed in FlareSolverr v2.r   i`  zsessions.createzsessions.listzsessions.destroyzrequest.getzrequest.postzRequest parameter 'cmd' = 'z' is invalid.)cmdrB   headersr   warningr4   
maxTimeoutr>   _cmd_sessions_create_cmd_sessions_list_cmd_sessions_destroy_cmd_request_get_cmd_request_post)r;   r6   s     r,   rA   rA   w   s    
w?@@@
{UVVV
} WXXX ~S^!4!4q!8!8 w###"3''	O	#	# %%	&	&	&#C((	M	!	!s##	N	"	"$$LcgLLLMMMJr.   c                 P   | j         t          d          | j        t          d          | j        t	          j        d           | j        t	          j        d           t          | d          }t          i           }|j	        |_	        |j
        |_
        |j        |_        |S )Nz>Request parameter 'url' is mandatory in 'request.get' command.z1Cannot use 'postBody' when sending a GET request.ARequest parameter 'returnRawHtml' was removed in FlareSolverr v2.<Request parameter 'download' was removed in FlareSolverr v2.GET)urlrB   postDatareturnRawHtmlr   rO   download_resolve_challenger   r9   rE   resultsolutionr;   challenge_resr6   s      r,   rT   rT      s    
wXYYY
|KLLL
$[\\\
|VWWW&sE22M


C%CJ'CK 'CLJr.   c                 $   | j         t          d          | j        t          j        d           | j        t          j        d           t          | d          }t          i           }|j        |_        |j	        |_	        |j
        |_        |S )NzDRequest parameter 'postData' is mandatory in 'request.post' command.rW   rX   POST)r[   rB   r\   r   rO   r]   r^   r   r9   rE   r_   r`   ra   s      r,   rU   rU      s    
|^___
$[\\\
|VWWW&sF33M


C%CJ'CK 'CLJr.   c                     t          j        d           t                              | j        | j                  \  }}|j        }|st          t          d|d          S t          t          d|d          S )NzCreating new session...)
session_idproxyzSession already exists.)r9   rE   sessionzSession created successfully.)	r   rH   SESSIONS_STORAGEcreaterh   rg   rf   r   r   )r;   rh   freshrf   s       r,   rQ   rQ      s    M+,,,%,,39,UUNGU#J 0!
 
   	 2    r.   c                 d    t                                           }t          t          d|d          S )Nr   )r9   rE   sessions)ri   session_idsr   r   )r;   rn   s     r,   rR   rR      s8    "..00K    r.   c                     | j         }t                              |          }|st          d          t	          t
          dd          S )NzThe session doesn't exist.zThe session has been removed.)r9   rE   )rh   ri   destroyrB   r   r   )r;   rf   existeds      r,   rS   rS      sU    J&&z22G 645552    r.   methodc           
      X   t          | j                  dz  }d }	 | j        r| j        }| j        rt	          | j                  nd }t
                              ||          \  }}|rt          j        d| d           nJt          j        d| dt          |
                                           dt          |           d           |j        }n-t          j        | j                  }t          j        d           t          |t           | ||f          | j        sO|Nt          j        d	k    r|                                 |                                 t          j        d
           S S S # t(          $ r t+          d| d          t*          $ r8}t+          dt          |                              dd          z             d }~ww xY w# | j        sO|Nt          j        d	k    r|                                 |                                 t          j        d
           w w w xY w)Nr=   )minutesz7new session created to perform the request (session_id=)z<existing session is used to perform the request (session_id=z, lifetime=z, ttl=zANew instance of webdriver has been created to perform the requestntz/A used instance of webdriver has been destroyedz+Error solving the challenge. Timeout after z	 seconds.zError solving the challenge. 
z\n)r>   rP   rh   session_ttl_minutesr   ri   getr   rH   rD   lifetimedriverr"   get_webdriverrg   r   _evil_logicPLATFORM_VERSIONclosequitr   rB   replace)	r;   rr   timeoutr{   rf   ttlrh   rk   rJ   s	            r,   r^   r^      sr   #.!!D(GFM; 	_J@C@Wa)C$;<<<<]aC-11*cBBNGU VeXbeeeffff U]g U U*-g.>.>.@.@*A*AU UILSU U U V V V ^FF(33FM]^^^G[32GHH { 	Mv1%--KKMMMMKLLLL		M1  Z Z ZXgXXXYYY W W W7#a&&..u:U:UUVVVW { 	Mv1%--KKMMMMKLLLL		M1s%   C<E/ /&G3GGG AH)r{   num_tabsc                    	 t          j        d           t          |           }|                    d           t	          |          D ]4}|                    t          j                                      d           5|                    d           |                    t          j                  	                                 t          j        d| d           n$# t          $ r t          j        d           Y nw xY w| j                                         n# | j                                         w xY w	 t          j        d           |                     t          j        d	
          }|rct          |           }|                    |dd           |                    |           |	                                 t          j        d           n$# t          $ r t          j        d           Y nw xY wt%          j        d           d S )Nz-Try to find the Cloudflare verify checkbox...   g?r   z)Cloudflare verify checkbox clicked after z tabs!z1Cloudflare verify checkbox not found on the page.z;Try to find the Cloudflare 'Verify you are human' button...z9//input[@type='button' and @value='Verify you are human'])byvalue   z?The Cloudflare 'Verify you are human' button found and clicked!zCThe Cloudflare 'Verify you are human' button not found on the page.   )r   rH   r   pauserange	send_keysr   TABSPACEperformrB   	switch_todefault_contentfind_elementr   XPATHmove_to_element_with_offsetclickr?   sleep)r{   r   actions_buttons        r,   click_verifyr     s   +EFFFv&&ax 	3 	3Adh''--c2222a$*%%--///R(RRRSSSS K K KIJJJJJK 	((****((****]STTT$$xM % 
 
  	]"6**G//1===MM&!!!OOM[\\\ ] ] ][\\\\\] 	JqMMMMMs=   CC D C>;D =C>>D D6:BG G65G6tabsc                 x   |                      t          j        d          }|                    d          }	 t	          | |           |                    d          }|r||k    rt          j        d|            |S t          j        d           |                     d           t          j
        d           )	Nr   r   T)r   zTurnstile token: z-Failed to extract token possibly click failedz
            let el = document.createElement('button');
            el.style.position='fixed';
            el.style.top='0';
            el.style.left='0';
            document.body.prepend(el);
            el.focus();
        r   )r   r   CSS_SELECTORget_attributer   r   r    rH   execute_scriptr?   r   )r{   r   token_inputcurrent_valueturnstile_tokens        r,   _get_turnstile_tokenr   &  s    %%bo7\]]K--g66MVd++++%33G<< 	'-//BBBCCC&&FGGG 	  	 	 	 	
1%r.   c                    d }| j         t          j        d| j         d           |                    | j                   d}t
          D ]P}|                    t          j        |          }t          |          dk    rd}t          j
        d|z               nQ|rt          || j                   }nt          j        d           |S )	NNavigating to... z) in order to pass the turnstile challengeFr   Tz.Turnstile challenge detected. Selector found: )r{   r   zTurnstile challenge not found)tabs_till_verifyr   rH   rZ   ry   TURNSTILE_SELECTORSfind_elementsr   r   lenr    r   )r;   r{   r   turnstile_challenge_foundselectorfound_elementss         r,   _resolve_turnstile_captchar   =  s    O
'\#'\\\]]]

37$)!+ 	 	H#11"/8LLN>""Q&&,0)MPXXYYY ' % 	<2&sG[\\\OOM:;;;r.   c                    t          i           }t          |_        d|_        t	          j                    }| j        | j        }|rmg d}	 t          j        d|           |	                    di            |	                    dd|i           n$# t          $ r t          j        d           Y nw xY wt          j        d| j                    d }|d	k    rt          | |           n2| j        |                    | j                   nt          | |          }| j        t#          | j                  d
k    rt          j        d           | j        D ]2}|                    |d                    |                    |           3|d	k    rt          | |           n|                    | j                   t	          j                    rt          j        d|j                    |                    t.          j        d          }|j        }	t4          D ]&}
|	                    |
          rt          d          't8          D ]D}|                    t.          j        |          }t#          |          d
k    rt          d          Ed}t>          D ]G}
|
                                 |	                                 k    rd}t          j!        d|	z               nH|sXtD          D ]P}|                    t.          j        |          }t#          |          d
k    rd}t          j!        d|z               nQd
}|r	 	 |dz   }t>          D ]a}
t          j        dtG          |          z   dz   |
z              tI          |tJ                    &                    tO          |
                     btD          D ]m}t          j        dtG          |          z   dz   |z              tI          |tJ                    &                    tQ          t.          j        |f                     nnU# tR          $ rF t          j        d           tU          |           |                    t.          j        d          }Y nw xY w:t          j        d           	 tI          |tJ                    +                    tY          |                     n$# t          $ r t          j        d           Y nw xY wt          j!        d           d|_        nt          j!        d           d|_        t[          i           }|j.        |_        d|_        |/                                |_        t	          j0        |          |_1        ||_2        | j3        sji |_4        | j5        rP| j5        d
k    rEt          j!        dtG          | j5                  z   dz              tm          j7        | j5                   |j        |_8        | j9        r|:                                |_;        ||_<        |S ) Nr   )*z*.pngz*.jpgz*.jpegz*.gifz*.webpz*.bmpz*.svgz*.icoz*.PNGz*.JPGz*.JPEGz*.GIFz*.WEBPz*.BMPz*.SVGz*.ICOz*.tiffz*.tifz*.jpez*.apngz*.avifz*.heicz*.heifz*.TIFFz*.TIFz*.JPEz*.APNGz*.AVIFz*.HEICz*.HEIFz*.cssz*.CSSz*.woffz*.woff2z*.ttfz*.otfz*.eotz*.WOFFz*.WOFF2z*.TTFz*.OTFz*.EOTzNetwork.setBlockedURLs: %szNetwork.enablezNetwork.setBlockedURLsurlsz>Network.setBlockedURLs failed or unsupported on this webdriverr   rd   r   zSetting cookies...namezResponse HTML:
htmlziCloudflare has blocked this request. Probably your IP is banned for this site, check in your web browser.FTz!Challenge detected. Title found: z$Challenge detected. Selector found: r   zWaiting for title (attempt z): zWaiting for selector (attempt zTimeout waiting for selectorzWaiting for redirectzTimeout waiting for redirectzChallenge solved!zChallenge not detected!   zWaiting z) seconds before returning the response...)=r   r   r9   rE   r"   get_config_disable_mediadisableMediar   rH   execute_cdp_cmdrB   rZ   _post_requestr   ry   r   cookiesr   delete_cookie
add_cookieget_config_log_htmlpage_sourcer   r   TAG_NAMEtitleACCESS_DENIED_TITLES
startswithACCESS_DENIED_SELECTORSr   r   CHALLENGE_TITLESlowerr    CHALLENGE_SELECTORSrD   r   SHORT_TIMEOUT	until_notr   r   r	   r   untilr   r   current_urlget_cookiesr(   r4   r   returnOnlyCookiesrN   waitInSecondsr?   r   responsereturnScreenshotget_screenshot_as_base64
screenshotr_   )r;   r{   rr   r6   disable_media
block_urlsr   cookiehtml_element
page_titler   r   r   challenge_foundattemptrb   s                   r,   r}   r}   P  s   
r
"
"CCJCK 244M
#( \
 
 

	\M6
CCC""#3R888""#;fj=QRRRR 	\ 	\ 	\MZ[[[[[	\
 M/cg//000Oc6""""'JJsw8fEEO {3s{#3#3a#7#7+,,,k 	& 	&F  000f%%%%V#v&&&&JJsw  "" ?=);==>>>&&r{F;;LJ & d d  '' 	d c d d d	d , d d--boxHH~"" c d d d #
 O!  ;;==J,,...."OL<zIJJJE /  + 	 	H#11"/8LLN>""Q&&"&ChNOOO '
 G &0	HH!A+- T TEM"?#g,,"NQV"VY^"^___!&-88BB8E??SSSS !4 R RHM"BS\\"QTY"Y\d"deee!&-88BB3R_h4OPPR R R R # H H H<===V$$$  &222;GGH#	H4 	,---	:&-0066|L7Q7QRRRR 	: 	: 	:M899999	: 	()))).////.r22M*MM"..00M#26::M$3M!  4 " 	*!2Q!6!6Lc#*;&<&<<?jjkkkJs()))!'!3
 E#)#B#B#D#D CJJs9   AB B0/B0:C#P AQ.-Q.5R> >SSc           
         d| j          d}| j        r| j        d         dk    r| j        n| j        r| j        dd          nd}|                    d          }|D ]}|                    dd          }	 t          |d                   }n# t          $ r |d         }Y nw xY w|d	k    rN	 t          |          dk    rt          |d                   nd}n-# t          $ r  t          |          dk    r|d         nd}Y nw xY w|                    d
d          }|dt          t          |                     dt          t          |                     dz  }|dz  }d| d}	|	                    d
                    |	                     d S )Nz<form id="hackForm" action="z" method="POST">r   ?r   r   &=submit"z&quot;z<input type="text" name="z	" value="z"><br>z</form>zC
        <!DOCTYPE html>
        <html>
        <body>
            zk
            <script>document.getElementById('hackForm').submit();</script>
        </body>
        </html>z+data:text/html;charset=utf-8,{html_content})html_content)rZ   r[   splitr   rB   r   r   r   r   ry   format)
r;   r{   	post_formquery_stringpairspairpartsr   r   r   s
             r,   r   r     s   HswHHHI#&<xCLOs4J4J3<<dgdpPxPSP\]^]_]_P`P`vxLs##E l l

3""	58$$DD 	 	 	8DDD	8	7),UaGE!H%%%REE 	7 	7 	7 #E

QE!HHBEEE	7 mmC))kd1D1DkkvV[\aVbVbOcOckkkk		I 	  L JJ<CCQ]C^^_____s$   3B		BB)*C'C>=C>)r   )Br   r!   r%   r?   datetimer   r   r   urllib.parser   r   r   r   selenium.commonr	   #selenium.webdriver.chrome.webdriverr
   selenium.webdriver.common.byr   selenium.webdriver.common.keysr   .selenium.webdriver.support.expected_conditionsr   r   r   'selenium.webdriver.common.action_chainsr   selenium.webdriver.support.waitr   r"   dtosr   r   r   r   r   r   r   r   rm   r   r   r   r   r   r   r   ri   r-   r7   r:   rK   rA   rT   rU   rQ   rR   rS   rD   r^   r>   r   r   r   r}   r    r.   r,   <module>r      s?     



              ' ' ' ' ' ' ' ' 7 7 7 7 7 7 7 7 , , , , , , 9 9 9 9 9 9 + + + + + + / / / / / /9 9 9 9 9 9 9 9 9 9 @ @ @ @ @ @ 9 9 9 9 9 9 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 % $ $ $ $ $ &	  10	  	     *  "?$$ % % %0         .    * .    >- N    &= ^    "m     (M n    
} 
 
 
 
 
MM M3 M;O M M M M@  c    B #    .M 9    &V] VI Vs VG[ V V V Vr`} `i ` ` ` ` ` `r.   