
    'jg2                        U d dl mZ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mZ d dlmZ d dlmZ 	 d dlZd	Zn# e$ r	 d dlZd
ZY nw xY w ee          j        dz  Zeed<   e G d d                      Ze G d d                      Ze G d d                      Ze G d d                      Ze G d d                      Z G d d          Zd Z dS )    )asdict	dataclass)Path)DictListOptional)get_fingerprint_network)BayesianNetworkget_possible_values)HeaderGenerator)get_user_agentNTFdataDATA_DIRc                       e Zd ZU eed<   eed<   eed<   eed<   eed<   eed<   eed<   eed<   eed	<   eed
<   eed<   eed<   eed<   eed<   eed<   eed<   eed<   eed<   eed<   dS )ScreenFingerprintavailHeight
availWidthavailTop	availLeft
colorDepthheight
pixelDepthwidthdevicePixelRatiopageXOffsetpageYOffsetinnerHeightouterHeight
outerWidth
innerWidthscreenXclientWidthclientHeighthasHDRN)__name__
__module____qualname__int__annotations__floatbool     g/home/ice/.hermes/hermes-agent/venv/lib/python3.11/site-packages/browserforge/fingerprints/generator.pyr   r      s         OOOMMMNNNOOOKKKOOOJJJOOOOOOLLLLLLLLr-   r   c                      e Zd ZU eed<   eeef         ed<   ee         ed<   eed<   eed<   eed<   eed<   eed<   eed	<   ee         ed
<   eed<   ee         ed<   eed<   eed<   eed<   eed<   eed<   eed<   eeef         ed<   dS )NavigatorFingerprint	userAgentuserAgentData
doNotTrackappCodeNameappName
appVersionoscpu	webdriverlanguage	languagesplatformdeviceMemoryhardwareConcurrencyproduct
productSubvendor	vendorSubmaxTouchPointsextraPropertiesN)	r%   r&   r'   strr)   r   r   r   r(   r,   r-   r.   r0   r0   .   s         NNNS>!!!LLLOOOJJJNNNMMMCyMMM3-LLLOOOKKKNNN#s(^#####r-   r0   c                   $    e Zd ZU eed<   eed<   dS )	VideoCardrendererr@   N)r%   r&   r'   rD   r)   r,   r-   r.   rF   rF   E   s"         MMMKKKKKr-   rF   c                   0   e Zd ZU dZeed<   eed<   eeef         ed<   eeef         ed<   eeef         ed<   eeef         ed<   e	eeef                  ed<   e	e
         ed	<   ee         ed
<   ee         ed<   e	e         ed<   e	e         ed<   defdZdS )Fingerprintz(Output data of the fingerprint generatorscreen	navigatorheadersvideoCodecsaudioCodecspluginsDatabattery	videoCardmultimediaDevicesfonts
mockWebRTCslimreturnc                     t           r&t          j        |                                           S t          j        t	          |                     S )z7
        Dumps the dataclass as a JSON string.
        )
USE_ORJSONjsondumpsdecoder   selfs    r.   rZ   zFingerprint.dumps\   s@      	-:d##**,,, z&,,'''r-   N)r%   r&   r'   __doc__r   r)   r0   r   rD   r   rF   r   r+   rZ   r,   r-   r.   rI   rI   K   s	        22#####s(^c3hc3hc3hd38n%%%%	""""Cy   9
4.(s ( ( ( ( ( (r-   rI   c                       e Zd ZU dZdZee         ed<   dZee         ed<   dZ	ee         ed<   dZ
ee         ed<   d Zdefd	ZdS )
Screenz=Constrains the screen dimensions of the generated fingerprintN	min_width	max_width
min_height
max_heightc                     d | j         | j        fvr| j         | j        k    s d | j        | j        fvr| j        | j        k    rt	          d          d S d S )NzHInvalid screen constraints: min values cannot be greater than max values)ra   rb   rc   rd   
ValueErrorr\   s    r.   __post_init__zScreen.__post_init__p   sk    888//DOT_===$/11Z   >=11r-   rV   c                 b    t          d | j                                        D                       S )z:
        Returns true if any constraints were set
        c              3      K   | ]}|d uV  	d S Nr,   ).0values     r.   	<genexpr>z Screen.is_set.<locals>.<genexpr>   s'      II5$IIIIIIr-   )any__dict__valuesr\   s    r.   is_setzScreen.is_set{   s/     II$-2F2F2H2HIIIIIIr-   )r%   r&   r'   r^   ra   r   r(   r)   rb   rc   rd   rg   r+   rq   r,   r-   r.   r`   r`   g   s         GG#Ix}####Ix}### $J$$$ $J$$$	 	 	J J J J J J Jr-   r`   c                   J   e Zd ZdZ e e                      Z	 	 	 	 ddee         de	de	de	fdZ
ddddd	dee         dee	         dee	         dee	         d
ef
dZdee	         dee         ded
ee         fdZededed
e	fd            Zededede	de	d
ef
d            ZdS )FingerprintGeneratorz(Generates realistic browser fingerprintsNFrJ   strictmock_webrtcrU   c                 `    t          di || _        || _        || _        || _        || _        dS )ak  
        Initializes the FingerprintGenerator with the given options.

        Parameters:
            screen (Screen, optional): Screen constraints for the generated fingerprint.
            strict (bool, optional): Whether to raise an exception if the constraints are too strict. Default is False.
            mock_webrtc (bool, optional): Whether to mock WebRTC when injecting the fingerprint. Default is False.
            slim (bool, optional): Disables performance-heavy evasions when injecting the fingerprint. Default is False.
            **header_kwargs: Header generation options for HeaderGenerator
        Nr,   )r   header_generatorrJ   rt   ru   rU   )r]   rJ   rt   ru   rU   header_kwargss         r.   __init__zFingerprintGenerator.__init__   s>    $ 2A1Q1Q=1Q1Q )/"!,			r-   )rJ   rt   ru   rU   rV   c          	         i }|i }t          || j                  }t          || j                  }|                     |||          }|r|d         |d<    | j        j        di |}t          |          }	|	t          d          	 | j        	                    i |d|	fi          }
|
n|rt          d          i }8t          |
                                          D ]{}|
|         dk    rd|
|<   t          |
|         t                    rM|
|                             d	          r2t          j        |
|         t#          d	          d                   |
|<   ||                    d
d          }d |                    d          D             }||
d<   |                     |
|t          || j                  t          || j                            S )a  
        Generates a fingerprint and a matching set of ordered headers using a combination of the default options
        specified in the constructor and their possible overrides provided here.

        Parameters:
            screen (Screen, optional): Screen constraints for the generated fingerprint.
            strict (bool, optional): Whether to raise an exception if the constraints are too strict.
            mock_webrtc (bool, optional): Whether to mock WebRTC when injecting the fingerprint. Default is False.
            slim (bool, optional): Disables performance-heavy evasions when injecting the fingerprint. Default is False.
            **header_kwargs: Additional header generation options for HeaderGenerator.generate
        N)rt   rJ   filtered_valuesr1   
user_agentz/Failed to find User-Agent in generated responseTz^Cannot generate headers. User-Agent may be invalid, or screen constraints are too restrictive.z*MISSING_VALUE**STRINGIFIED*zAccept-Language c                 F    g | ]}|                     d d          d         S );   r   )split)rk   locales     r.   
<listcomp>z1FingerprintGenerator.generate.<locals>.<listcomp>   s8     
 
 
(.FLLa  #
 
 
r-   ,r:   r,   )_firstrJ   rt   partial_csprw   generater   rf   fingerprint_generator_network(generate_consistent_sample_when_possiblelistkeys
isinstancerD   
startswithrY   loadslengetr   _transform_fingerprintru   rU   )r]   rJ   rt   ru   rU   rx   r{   r   rL   r|   fingerprint	attributeaccept_language_header_valueaccepted_languagess                 r.   r   zFingerprintGenerator.generate   sO   ( +- M ,,,,&&&/ ' 
 
  	C*5k*BM,'0$'0AA=AA#G,,
NOOO	!2[[CCj]CC  
 &  t  
 !O	!& k..0011 	d 	dI9%):::)-I&+i0#66 d;y;Q;\;\< < d *.K	4J3K_K_KaKa4b)c)cI& (/{{3Db'I'I$
 
2N2T2TUX2Y2Y
 
 
 $6K **; 0114##	
 
 	
r-   r{   c                      r                                 sdS  fd j        j        d         j        D             |d<   	 t	           j        |          S # t
          $ r}|r||d= Y d}~nd}~ww xY wdS )a  
        Generates partial content security policy (CSP) based on the provided options and filtered values.

        Parameters:
            strict (Optional[bool): Whether to raise an exception if the constraints are too strict.
            screen (Optional[Screen]): Screen for generating the partial CSP.
            filtered_values (Dict): Filtered values used for generating the partial CSP.

        Returns:
            Dict: Partial CSP values.
        Nc                 @    g | ]}                     |          |S r,   )_is_screen_within_constraints)rk   screen_stringrJ   r]   s     r.   r   z4FingerprintGenerator.partial_csp.<locals>.<listcomp>  sA     %
 %
 %
 11-HH%
%
 %
 %
r-   rJ   )rq   r   nodes_by_namepossible_valuesr   	Exception)r]   rt   rJ   r{   es   ` `  r.   r   z FingerprintGenerator.partial_csp   s      	6==?? 	4%
 %
 %
 %
 %
!%!C!Q"	%
 %
 %
!	*&t'I?[[[ 	* 	* 	* ))))))	* ts   A 
A3"A..A3r   screen_optionsc                    	 t          j        | t          d          d                   }|                    dd          |j        pdk    ob|                    dd          |j        pdk    oA|                    dd          |j        pdk    o |                    dd          |j        pdk    S # t          t          f$ r Y dS w xY w)	aa  
        Checks if the given screen dimensions are within the specified constraints.

        Parameters:
            screen_string (str): Stringified screen dimensions.
            screen_options (Screen): Screen constraint options.

        Returns:
            bool: True if the screen dimensions are within the constraints, False otherwise.
        r}   Nr   r   r   g     j@F)
rY   r   r   r   ra   rc   rb   rd   rf   	TypeError)r   r   rJ   s      r.   r   z2FingerprintGenerator._is_screen_within_constraints  s    	Zc/.B.B.D.D EFFF 

7B''N,D,IJ RJJx,,1J1OaPR JJw**~/G/N3OR JJx++0I0PSQ I& 	 	 	55	s   B,B/ /CCr   rL   c                 t     fddD             }|d         d         |d<                         dd          |d<   t          t          di  d         t          di || d          d	          d
          d                               d          rt	          di  d         nd d          d         ||          S )a  
        Transforms fingerprint into a final dataclass instance.

        Parameters:
            fingerprint (Dict): Fingerprint to be transformed.
            headers (Dict): Generated headers.
            mock_webrtc (bool): Whether to mock WebRTC when injecting the fingerprint.
            slim (bool): Disables performance-heavy evasions when injecting the fingerprint.

        Returns:
            Fingerprint: Transformed fingerprint as a Fingerprint dataclass instance.
        c                 "    i | ]}||         S r,   r,   )rk   kr   s     r.   
<dictcomp>z?FingerprintGenerator._transform_fingerprint.<locals>.<dictcomp>B  s/     
 
 
 {1~
 
 
r-   )r1   r2   r3   r4   r5   r6   r7   r8   r;   r<   r>   r?   r@   rA   rC   r=   r:   r:   r   r9   rB   rJ   rM   rN   rO   rP   rQ   NrR   rS   )rJ   rK   rL   rM   rN   rO   rP   rQ   rR   rS   rT   rU   r,   )r   rI   r   r0   rF   )r   rL   ru   rU   navigator_kwargss   `    r.   r   z+FingerprintGenerator._transform_fingerprint1  s   "
 
 
 

 
 
0 (8'DQ'G$-8__=Mq-Q-Q)*$=={8'<==*>>-=>>#M2#M2#M2	*9D9U9U_	55K4555[_)*=>g&"
 
 
 	
r-   )NFFF)r%   r&   r'   r^   r
   r	   r   r   r`   r+   ry   rI   r   r   r   staticmethodrD   r   r   r,   r-   r.   rs   rs      s       22$3O4K4K4M4M$N$N! $(!    	
    : $(!%&*#R
 R
 R
  R
 	R

 d^R
 tnR
 
R
 R
 R
 R
h tn .6v.> QU 	$       D S & UY    \2 :
:
$(:
7;:
CG:
	:
 :
 :
 \:
 :
 :
r-   rs   c                  6    t          d | D             d          S )zF
    Simple function that returns the first non-None value passed
    c              3      K   | ]}||V  	d S rj   r,   )rk   vs     r.   rm   z_first.<locals>.<genexpr>s  s"      44qammmmm44r-   N)next)rp   s    r.   r   r   o  s#     44F444d;;;r-   )!dataclassesr   r   pathlibr   typingr   r   r   apify_fingerprint_datapointsr	   browserforge.bayesian_networkr
   r   browserforge.headersr   browserforge.headers.utilsr   orjsonrY   rX   ImportError__file__parentr   r)   r   r0   rF   rI   r`   rs   r   r,   r-   r.   <module>r      s[   ) ) ) ) ) ) ) ) )       ' ' ' ' ' ' ' ' ' ' @ @ @ @ @ @ N N N N N N N N 0 0 0 0 0 0 5 5 5 5 5 5JJ   KKKJJJ
 h&/$ / / /        , $ $ $ $ $ $ $ $,        
 ( ( ( ( ( ( ( (6 J J J J J J J J4j
 j
 j
 j
 j
 j
 j
 j
Z< < < < <s   < A
	A
