
    ^jX>                        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	 	 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
Z G d de      Z G d de      Zej4                  dk  r edej8                   d       ej:                  Zej:                  Zej>                  Zej@                  Z y# e$ r Y w xY w# e$ r d dlZY w xY w# e$ r	 d dlmZ Y w xY w)    N)HTTPAdapter)Session)dump)urlparse   )CloudflareLoopProtectionCloudflareIUAMError)
Cloudflare)
User_Agentz1.2.71c                   @     e Zd Zg dZ fdZd Z fdZ fdZ xZS )CipherSuiteAdapter)ssl_contextmax_retriesconfig_pool_connections_pool_maxsize_pool_blocksource_addressc                 R   |j                  dd       | _        |j                  dd       | _        |j                  dd       | _        |j                  dd       | _        |j                  dd      | _        | j                  rRt        | j                  t              r| j                  df| _        t        | j                  t              st        d      | j                  s5t        j                  t        j                  j                        | _        | j                  j                  | j                  _        | j                  | j                  _        | j                  r| j                  | j                  _        | j                  j!                  | j                         | j                  j#                  | j
                         t        j$                  j&                  | j                  _        t        j$                  j*                  | j                  _        t/        t0        | f  d	i | y )
Nr   cipherSuiter   server_hostname	ecdhCurve
prime256v1r   z<source_address must be IP address string or (ip, port) tuple )popr   r   r   r   r   
isinstancestrtuple	TypeErrorsslcreate_default_contextPurposeSERVER_AUTHwrap_socketorig_wrap_socketset_ciphersset_ecdh_curve
TLSVersionTLSv1_2minimum_versionTLSv1_3maximum_versionsuperr   __init__selfargskwargs	__class__s      P/var/www/lego-monitor/venv/lib/python3.12/site-packages/cloudscraper/__init__.pyr.   zCipherSuiteAdapter.__init__:   s   !::mT:!::mT:$jj)94@%zz*;TBK>$--s3'+':':A&>#d1159R  "99#++:Q:QRD040@0@0L0LD-+/+;+;D(##373G3G  0(()9)9:++DNN;/2~~/E/ED,/2~~/E/ED, $0:6:    c                 
   t        | j                  d      rA| j                  j                  r+| j                  j                  |d<   d| j                  _        nd| j                  _         | j                  j                  |i |S )Nr   FT)hasattrr   r   check_hostnamer%   )r0   r1   r2   s      r4   r$   zCipherSuiteAdapter.wrap_socket]   sr    4##%67D<L<L<\<\(,(8(8(H(HF$%.3D+.2D+0t00$A&AAr5   c                 f    | j                   |d<   | j                  |d<   t        t        |   |i |S Nr   r   )r   r   r-   r   init_poolmanagerr/   s      r4   r;   z#CipherSuiteAdapter.init_poolmanagerh   s<     $ 0 0}#'#6#6 '?PPPr5   c                 f    | j                   |d<   | j                  |d<   t        t        |   |i |S r:   )r   r   r-   r   proxy_manager_forr/   s      r4   r=   z$CipherSuiteAdapter.proxy_manager_foro   s<     $ 0 0}#'#6#6 '@$Q&QQr5   )	__name__
__module____qualname__	__attrs__r.   r$   r;   r=   __classcell__r3   s   @r4   r   r   .   s(    I;FBQR Rr5   r   c                        e Zd Z fdZd Z fdZd Zed        Zd Z	d Z
edd       Zed	        Zed
        Z xZS )CloudScraperc           
         |j                  dd      | _        |j                  dd      | _        |j                  dd       | _        |j                  di       | _        |j                  dd      | _        |j                  dd	      | _        |j                  d
d       | _        |j                  dd       | _        |j                  dd       | _	        |j                  dd      | _
        |j                  dd       | _        |j                  dd       | _        |j                  dd       | _        |j                  ddt        j                  j!                         v rdnd      | _        t%        | j"                  |j                  dd             | _        d| _        |j                  dd      | _        t-        t.        | b  |i | d| j2                  d   v rB| j&                  j2                  | _        | j                  s| j&                  j                  | _	        t5        | j                  t6              r dj9                  | j                        | _	        | j;                  dt=        | j                  | j                  | j                  | j                  | j                               t?        j@                  tB        jD                  d        y )NdebugFdisableCloudflareV1delaycaptcha
doubleDownTinterpreternativerequestPreHookrequestPostHookr   r   r   r   r   r   allow_brotlibrotlibrowser)rP   rR   r   
solveDepth   requests
User-Agent:zhttps://)r   r   r   r   r   c                 4    | j                   | j                  ffS N)r3   protocol)objs    r4   <lambda>z'CloudScraper.__init__.<locals>.<lambda>   s    CMMCLL?3S r5   )#r   rG   rH   rI   rJ   rK   rL   rN   rO   r   r   r   r   r   sysmoduleskeysrP   r   
user_agent_solveDepthCntrS   r-   rE   r.   headersr   listjoinmountr   copyregpickler    
SSLContextr/   s      r4   r.   zCloudScraper.__init__y   s;   ZZ/
#)::.CU#K ZZ.
zz)R0 **\48!::mX>$jj)94@%zz*;TB!::mT:K>$jj)94@%zz*;TB!::mT:"JJ 0 0 22D

 %**JJy$/

   **\15lD*D;F; l33  ??22DL###'??#>#> d&&-"xx(8(89D

 ,,.. $ 4 4#22 ,,		
 	s~~'STr5   c                     | j                   S rY   )__dict__)r0   s    r4   __getstate__zCloudScraper.__getstate__   s    }}r5   c                 4    t        t        | 
  ||g|i |S rY   )r-   rE   request)r0   methodurlr1   r2   r3   s        r4   perform_requestzCloudScraper.perform_request   s!    \40NtNvNNr5   c                 6    d| _         dt        _         ||      )Nr   )ra   r]   tracebacklimit)r0   	exceptionmsgs      r4   simpleExceptionzCloudScraper.simpleException   s    nr5   c           	          	 t        t        j                  |       j                  dd             y # t        $ r#}t        dt        |d|              Y d }~y d }~ww xY w)Nzutf-8backslashreplace)errorszDebug Error: message)printr   dump_alldecode
ValueErrorgetattr)reqes     r4   debugRequestzCloudScraper.debugRequest   sU    	>$--$++G<N+OP 	>M'!Y":!;<==	>s   /2 	AAAc                    t         j                  j                  j                  dk  r|j                  j                  d      dk(  ry| j                  r2|j                  r&t        j                  |j                        |_        |S t        j                  dt         j                  j                  j                   d       |S )Nz1.25.1zContent-EncodingbrzYou're running urllib3 z, Brotli content detected, Which requires manual decompression, But option allow_brotli is set to False, We will not continue to decompress.)rU   packagesurllib3__version__rb   getrP   _contentrQ   
decompresscontentloggingwarning)r0   resps     r4   decodeBrotlizCloudScraper.decodeBrotli   s    $$008;@P@PQc@dhl@l  T]] & 1 1$,, ?  .x/@/@/H/H/T/T.U V: : r5   c                 f   |j                  d      r4|j                  d      | j                  k7  r|j                  d      | _        | j                  r | j                  | ||g|i |\  }}}}| j                   | j                  ||g|i |      }| j
                  r| j                  |       | j                  rA| j                  | |      }||k7  r*|}| j
                  rt        d       | j                  |       | j                  st        |       }|j                  |      ri| j                  | j                  k\  r&| j                  }| j                  t        d| d       | xj                  dz  c_         |j                   |fi |}|S |j"                  s|j$                  dvrd| _        |S )Nproxiesz==== requestPostHook Debug ====z+!!Loop Protection!! We have tried to solve z time(s) in a row.r   )i  i  r   )r   r   rN   r   rp   rG   r   rO   rz   rH   r
   is_Challenge_Requestra   rS   ru   r   Challenge_Responseis_redirectstatus_code)	r0   rn   ro   r1   r2   responsenewResponsecloudflareV1_s	            r4   rm   zCloudScraper.request   s   ::i VZZ	%:dll%J!::i0DL *=$*=*=+ 	+
 +'VS$ $$ D  >t>v>
 ::h' ..tX>K;&&::;<%%h/ ''%d+L 00:
 &&$//9++A((0EaSHZ[
 ##q(#:<::8NvN
   ++0D0DJ0V*+D'r5   c                 b     | di |}|r$dD ]  }t        ||d      }|t        |||       ! |S )zV
        Convenience function for creating a ready-to-go CloudScraper object.
        )authcertcookiesrb   hooksparamsr   dataNr   )r~   setattr)clssessr2   scraperattrvals         r4   create_scraperzCloudScraper.create_scraper:  sG    
 --d 0dD$/?GT3/0
 r5   c                 R    | j                   d
i dD ci c]  }||v r||j                  |d        c}}	  |j                  |fi |}|j                          t        |j                        j                  }d }|j                  j                         D ]  }|j                  d      s|d| v s|} n | j                  | t        d       d|j                  j                  dd|      i|j                  d	   fS c c}w # t        $ r t        j                  d| d        w xY w)N)
rP   rR   rG   rI   rK   rJ   rL   r   rN   rO   "z." returned an error. Could not collect tokens..zoUnable to find Cloudflare cookies. Does the site actually have Cloudflare IUAM (I'm Under Attack Mode) enabled?cf_clearance )domainrV   r   )r   r   r   raise_for_status	Exceptionr   errorr   ro   netlocr   list_domains
startswithru   r	   rb   )	r   ro   r2   fieldr   r   r   cookie_domainds	            r4   
get_tokenszCloudScraper.get_tokensM  sN   $#$$ 
=38 f_ vzz%..
"	7;;s-f-D!!#
 $((#**--/ 
	A||C QQvh<%8 !
	
 #H  3 3NB} 3 ] OOL)	
 	
O&  	MMAcU"PQR	s   C=#D $D&c                 ~     | j                   |fi |\  }}dj                  d |j                         D              |fS )zO
        Convenience function for building a Cookie HTTP header value.
        z; c              3   >   K   | ]  }d j                  |        yw)=N)rd   ).0pairs     r4   	<genexpr>z1CloudScraper.get_cookie_string.<locals>.<genexpr>  s     CD$Cs   )r   rd   items)r   ro   r2   tokensr`   s        r4   get_cookie_stringzCloudScraper.get_cookie_string  s>    
 ,S^^C:6:
yyCFLLNCCZOOr5   rY   )r>   r?   r@   r.   rk   rp   ru   staticmethodr   r   rm   classmethodr   r   r   rB   rC   s   @r4   rE   rE   w   sy    9U~O > >$J\  $ .
 .
d P Pr5   rE   )r   r   r   z<DEPRECATION: The OpenSSL being used by this python install (z) does not meet the minimum supported version (>= OpenSSL 1.1.1) in order to support TLS 1.3 required by Cloudflare, You may encounter an unexpected Captcha or cloudflare 1020 blocks.)!r   rU   r]   r    requests.adaptersr   requests.sessionsr   requests_toolbelt.utilsr   rQ   ImportErrorrf   copy_regr   urllib.parse
exceptionsr   r	   
cloudflarer
   r`   r   r   r   rE   OPENSSL_VERSION_INFOrz   OPENSSL_VERSIONr   sessionr   r   r   r5   r4   <module>r      s     
 
 ) % (	&!
 # " 
DR DRROP7 OPh i'	
FsGZGZF[ \M 	M ,,

%
%$$
 22 O  		
  
  &%&s3   B6 C C 6B>=B>	CCCC