o
    Z�¿jÏQ  ã                   @   sÆ  d dl Z d dl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m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 g d¢ZdZ	 g dddddddœ‘dddddddœ‘dddddddœ‘dddddddœ‘dddddddœ‘dddddddœ‘ddddd ddœ‘dd!d"d#d$ddœ‘dd%d"d#d&ddœ‘dd'd"d#d(ddœ‘dd)d"d#d*ddœ‘dd+d"d#d,ddœ‘dd-d"d.d/ddœ‘dd0d"d.d1ddœ‘dd2d"d3d4ddœ‘dd5d"d3d6d7dœ‘dd8d"d3d9d7dœ‘dd:d"d3d;d7dœ‘ddd<d=d>ddœ‘dd+d<d?d@ddœ‘dAddddBddœ‘dAddddCddœ‘dDdEd"dFdGddœ‘dDdHd"dIdJddœ‘dDdKd"d#dLddœ‘dDdMdNdMdOddœ‘dDdPd"d.dQddœ‘dDdPdNdPdRddœ‘dDdSd"d.dTddœ‘dDdSdNdSdUddœ‘dDdVd"d3dWddœ‘dDdXd"d3dYddœ‘dDdVdNdVdZddœ‘d[d\d"d#d]ddœ‘d[d^d"d#d_ddœ‘d[d`d"d3daddœ‘d[dbd"d3dcd7dœ‘ddded"d#dfddœ‘ZdgZG dhdi„ dieeƒZdjefdkdl„ZeG dmdn„ dnƒƒZedo Z g dp¢Z!eG dqdr„ drƒƒZ"G dsdt„ dtƒZ#duedjefdvdw„Z$dS )xé    N)Údeepcopy)Ú	dataclassÚfieldÚfields)Údatetime)Úcache)ÚBytesIO)ÚLiteral)Ú	urlencodeé   )ÚCurlInfoÚCurlOpt)ÚCurlÚ	CurlError)ÚFingerprintÚFingerprintUpdateErrorÚFingerprintSpecÚFingerprintManagerÚget_fingerprintéd   ÚChromeÚ99ÚWindowsÚ10Úchrome99F)ÚbrowserÚversionÚosÚ
os_versionÚtarget_nameÚh3_fingerprintsÚ100Ú	chrome100Ú101Ú	chrome101Ú104Ú	chrome104Ú107Ú	chrome107Ú110Ú	chrome110Ú116Ú	chrome116Ú119ÚmacOSÚSonomaÚ	chrome119Ú120Ú	chrome120Ú123Ú	chrome123Ú124Ú	chrome124Ú131Ú	chrome131Ú133ÚSequoiaÚ
chrome133aÚ136Ú	chrome136Ú142ÚTahoeÚ	chrome142Ú145Ú	chrome145TÚ146Ú	chrome146Ú150Ú	chrome150ÚAndroidÚ12Úchrome99_androidÚ14Úchrome131_androidÚEdgeÚedge99Úedge101ÚSafariz15.3zBig SurÚ	safari153z15.5ÚMontereyÚ	safari155z17.0Ú	safari170z17.2ÚiOSÚsafari172_iosz18.0Ú	safari180Úsafari180_iosz18.4Ú	safari184Úsafari184_iosz26.0Ú	safari260z26.0.1Ú
safari2601Úsafari260_iosÚFirefoxz133.0Ú
firefox133z135.0Ú
firefox135z144.0Ú
firefox144z147.0Ú
firefox147ÚTorz14.5Útor145zhttps://api.impersonate.pro/v1c                   @   s   e Zd ZdZdS )r   z%Raised when fingerprint update fails.N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__© rh   rh   úQ/home/dinkstrade/pdmp/venv/lib/python3.10/site-packages/curl_cffi/fingerprints.pyr   X  s    r   Úreturnc                  C   s’   t jdkr4t j d¡} | rt j | d¡S t j d¡}|r%t j |ddd¡S t j d¡}t j |ddd¡S t j d¡}|rCt j |d¡S t j d	¡S )
NÚntÚAPPDATAÚimpersonateÚUSERPROFILEÚAppDataÚRoamingú~ÚXDG_CONFIG_HOMEz~/.config/impersonate)r   ÚnameÚenvironÚgetÚpathÚjoinÚ
expanduser)ÚappdataÚuserprofileÚhomeÚxdg_config_homerh   rh   ri   Ú_get_default_config_dir\  s   
r}   c                   @   sÀ  e Zd ZU dZeed< dZeed< dZeed< dZeed< dZ	eed< dZ
eed	< eed
�Zee ed< dZeed< dZeed< eed
�Zee ed< eed
�Zee ed< dZeed< eed
�Zee ed< dZeed< dZeed< eed
�Zee ed< dZedB ed< dZeed< dZeed< dZeed< dZedB ed< dZeed< dZee dB ed< ee d
�Z!e eef ed< dZ"eed < dZ#eed!< dZ$eed"< dZ%eed#< d$Z&eed%< dZ'eed&< dZ(edB ed'< dZ)edB ed(< dZ*eed)< dZ+eed*< dZ,eed+< dZ-eed,< ee d
�Z.e eef ed-< dZ/eed.< eed
�Z0ee ed/< dZ1eed0< dZ2edB ed1< ee d
�Z3e eef ed2< dZ4eed3< dZ5eed4< dZ6ee dB ed5< dZ7eed6< dS )7r   Ú ÚclientÚclient_versionr   r   Úv2Úhttp_versionz1.2Útls_version)Údefault_factoryÚtls_ciphersFÚtls_alpnÚtls_alpsÚtls_cert_compressionÚtls_signature_hashesé   Útls_key_shares_limitÚtls_supported_groupsÚtls_session_ticketÚtls_extension_orderÚtls_delegated_credentialsNÚtls_record_size_limitÚ
tls_greaseÚtls_use_new_alps_codepointÚtls_signed_cert_timestampsÚtls_echÚtls_permute_extensionsÚtls_trust_anchorsÚheadersÚheader_orderÚsplit_cookiesÚform_boundaryÚhttp2_settingsr   Úhttp2_window_updateÚhttp2_pseudo_headers_orderÚhttp2_stream_weightÚhttp2_stream_exclusiveÚhttp2_no_priorityÚhttp3_settingsÚhttp3_pseudo_headers_orderÚhttp3_tls_extension_orderÚhttp3_headersÚhttp3_header_orderÚhttp3_tls_supported_groupsÚquic_transport_parametersÚquic_cid_lengthÚ
ws_headersÚws_header_orderÚws_disable_session_ticketÚws_tls_cert_compressionÚheader_lang)8rd   re   rf   r   ÚstrÚ__annotations__r€   r   r   r‚   rƒ   r   Úlistr…   r†   Úboolr‡   rˆ   r‰   r‹   ÚintrŒ   r�   rŽ   r�   r�   r‘   r’   r“   r”   r•   r–   Údictr—   r˜   r™   rš   r›   rœ   r�   rž   rŸ   r    r¡   r¢   r£   r¤   r¥   r¦   r§   r¨   r©   rª   r«   r¬   r­   rh   rh   rh   ri   r   m  s^   
 r   )ÚchromeÚfirefoxÚedgeÚbraveÚoperar·   Ú	operaminiÚqihooÚqqÚquarkÚsamsungÚsogouÚsogou_ieÚvolleyÚokhttpÚwebviewÚbaiduÚwechatÚbingÚ
duckduckgoÚgoogleÚyandex)ÚmacosÚwindowsÚlinuxÚiosÚandroidc                   @   sB   e Zd ZU dZedB ed< dZedB ed< dZe	d dB ed< dS )r   NÚplatformr   ÚuniformÚstrategy)
rd   re   rf   rÎ   r®   r¯   r   ÚClientLiteralrÐ   r	   rh   rh   rh   ri   r   ·  s   
 r   c                   @   sP  e Zd Zedefdd„ƒZedefdd„ƒZedefdd„ƒZedefdd	„ƒZeded
B fdd„ƒZ	ededd
fdd„ƒZ
ededeeef defdd„ƒZed#ded
B defdd„ƒZedeeef deeef fdd„ƒZedeeef fdd„ƒZeedeeef fdd„ƒƒZededefdd „ƒZedeeeef  fd!d"„ƒZd
S )$r   rj   c                 C   s   t j dtƒ ¡S )NÚIMPERSONATE_CONFIG_DIR)r   rt   ru   r}   ©Úclsrh   rh   ri   Úget_config_dir¿  s   z!FingerprintManager.get_config_dirc                 C   ó   t j |  ¡ d¡S )Nzconfig.json©r   rv   rw   rÕ   rÓ   rh   rh   ri   Úget_config_pathÃ  ó   z"FingerprintManager.get_config_pathc                 C   rÖ   )Nzfingerprints.jsonr×   rÓ   rh   rh   ri   Úget_fingerprint_pathÇ  rÙ   z'FingerprintManager.get_fingerprint_pathc                 C   s   t j dt¡ptS )NÚIMPERSONATE_API_ROOT)r   rt   ru   ÚDEFAULT_API_ROOTrÓ   rh   rh   ri   Úget_api_rootË  s   ÿzFingerprintManager.get_api_rootNc              	   C   s¦   t j d¡}|r
|S |  ¡ }t j |¡sd S t|ƒ�!}zt |¡}W n tj	y3   Y W d   ƒ d S w W d   ƒ n1 s>w   Y  | d¡}t
|tƒrQ|rQ|S d S )NÚIMPERSONATE_API_KEYÚapi_key)r   rt   ru   rØ   rv   ÚexistsÚopenÚjsonÚloadÚJSONDecodeErrorÚ
isinstancer®   )rÔ   rß   Úconfig_pathÚfÚconfigrh   rh   ri   Úget_api_keyÑ  s&   
üÿþ
zFingerprintManager.get_api_keyrß   c              	   C   sà   |   ¡ }tj |¡st |¡ |  ¡ }tj |¡rBt|ƒ�}zt |¡}W n tj	y1   i }Y nw W d  ƒ n1 s<w   Y  ni }||d< t
 ¡  ¡ |d< t|dƒ�}tj||dd� W d  ƒ dS 1 siw   Y  dS )z(Persist the API key for impersonate.pro.Nrß   Úupdate_timeÚwé   ©Úindent)rÕ   r   rv   rà   ÚmakedirsrØ   rá   râ   rã   rä   r   ÚutcnowÚ	isoformatÚdump)rÔ   rß   Ú
config_dirÚconfig_filerç   rè   rh   rh   ri   Úset_api_keyã  s(   

ÿ€ý€"ÿzFingerprintManager.set_api_keyÚurlr—   c              
   C   sì   t ƒ }tƒ }zLz.| tj|  ¡ ¡ |r!| tjdd„ | ¡ D ƒ¡ | tj|¡ | 	¡  t
| tj¡ƒ}W n tyL } ztd| › d|› �ƒ|‚d }~ww W | ¡  n| ¡  w | ¡ }|dkrt|jddd�}td| › d	|› d|› �ƒ‚|S )
Nc                 S   s"   g | ]\}}|› d |› �  ¡ ‘qS )ú: )Úencode)Ú.0ÚkeyÚvaluerh   rh   ri   Ú
<listcomp>   s   " zAFingerprintManager._fetch_fingerprint_payload.<locals>.<listcomp>z)Failed to access fingerprint endpoint at r÷   i�  zutf-8Úreplace)Úerrorsz: HTTP )r   r   Úsetoptr   ÚURLrø   Ú
HTTPHEADERÚitemsÚ	WRITEDATAÚperformr²   Úgetinfor   ÚRESPONSE_CODEr   r   ÚcloseÚgetvalueÚdecode)rö   r—   ÚcurlÚbufferÚstatus_codeÚexcÚpayloadÚbodyrh   rh   ri   Ú_fetch_fingerprint_payload÷  sB   þÿþ€ÿÿÿÿÿz-FingerprintManager._fetch_fingerprint_payloadÚapi_rootc              
   C   s6  |p|   ¡ }| d¡› d�}i }|  ¡ }|rd|› �|d< i }d}t}	 |› dt||dœƒ› �}|  ||¡}	zt |	¡}
t|
t	ƒsIt
d	|› d
�ƒ‚|
 d|
 d¡¡}W n tjyk } zt
d	|› d|› �ƒ|‚d}~ww t|tƒsxt
d|› �ƒ‚|D ]?}t|t	ƒs‚qz| d¡p‹| d¡}|s�qz| d| di ¡¡}t|tƒr°zt |¡}W n
 tjy¯   Y qzw t|t	ƒr¹|||< qz|
 d¡}t|t	ƒrÉ| d¡sÊn| d¡}t|tƒrØ||kràt
d|› d�ƒ‚|}q$|  ¡ }tj |¡sòt |¡ t|  ¡ dƒ�}tj||dd� W d  ƒ n	1 �sw   Y  | j ¡  t|ƒS )z.Get the latest fingerprints for impersonating.ú/z/fingerprintszBearer ÚAuthorizationr   Tú?)ÚskipÚlimitz"Invalid fingerprint response from z: expected objectr  Údatar÷   NzNo fingerprints found at rs   ÚtargetÚfingerprintÚ
paginationÚhas_moreÚ	next_skipz$Invalid fingerprint pagination from z: expected increasing next_skiprë   rŠ   rí   )rÝ   Úrstripré   ÚFINGERPRINT_PAGE_LIMITr
   r  râ   Úloadsrå   r³   r   ru   rä   r°   r®   r²   rÕ   r   rv   rà   rï   rá   rÚ   rò   Úload_fingerprintsÚcache_clearÚlen)rÔ   r  Úbase_urlr—   rß   Úfingerprintsr  r  rö   r  r  r  r  Úitemrs   Úrawr  r  ró   Úwfrh   rh   ri   Úupdate_fingerprints  s~   


ÿÿþ€ÿ


ÿ
€


ÿÕ-
ÿ
z&FingerprintManager.update_fingerprintsr  c                    s`   dd„ t tƒD ƒ‰ i }|  ¡ D ]\}}t|tƒsq‡ fdd„| ¡ D ƒ}tdi |¤Ž||< q|S )Nc                 S   s   h | ]}|j ’qS rh   )rs   ©rù   r%  rh   rh   ri   Ú	<setcomp>Y  s    z9FingerprintManager._parse_fingerprints.<locals>.<setcomp>c                    s   i | ]\}}|ˆ v r||“qS rh   rh   )rù   ÚkÚv©Úallowedrh   ri   Ú
<dictcomp>^  s    z:FingerprintManager._parse_fingerprints.<locals>.<dictcomp>rh   )r   r   r  rå   r³   )r  Úparsedrú   rû   Úfilteredrh   r-  ri   Ú_parse_fingerprintsW  s   
z&FingerprintManager._parse_fingerprintsc                 C   s¨   i }t D ]J}| d¡}t|tƒr|sq| d¡}| d¡}| d¡}| d¡}t|tƒr0| ¡ ndt|tƒr8|ndt|tƒr@|ndt|tƒrH|nddœ||< q|  |¡S )Nr   r   r   r   r   r~   )r   r€   r   r   )ÚNATIVE_IMPERSONATE_TARGETSru   rå   r®   Úlowerr2  )rÔ   Únative_payloadr%  r   r   r   Úos_namer   rh   rh   ri   Ú_load_native_fingerprintsb  s   




ü
z,FingerprintManager._load_native_fingerprintsc                 C   sp   |   ¡ }|  ¡ }tj |¡r6t|ƒ�}t | ¡ ¡}W d   ƒ n1 s$w   Y  t	|t
ƒr6| |  |¡¡ |S ©N)r7  rÚ   r   rv   rà   rá   râ   r  Úreadrå   r³   Úupdater2  )rÔ   r0  Úfingerprint_pathrç   r$  rh   rh   ri   r   u  s   
ÿ
z$FingerprintManager.load_fingerprintsr  c                 C   s*   |   ¡ }||vrtd|› �ƒ‚t|| ƒS )ú>Return a deep-copied fingerprint that callers can edit safely.zFingerprint target not found: )r   ÚKeyErrorr   )rÔ   r  r$  rh   rh   ri   r   �  s   z"FingerprintManager.get_fingerprintc                 C   s®   dd„ t D ƒ}g }t|  ¡  ¡ ƒD ]C\}}| |¡}|r@| d|| dd¡| dd¡| dd¡| dd¡t| d	d
¡ƒdœ¡ q| d||j|j|j	|j
|jdv dœ¡ q|S )Nc                 S   s   i | ]}|d  |“qS )r   rh   r)  rh   rh   ri   r/  ‹  s    
ÿz8FingerprintManager.list_fingerprints.<locals>.<dictcomp>Úbuiltinr   r~   r   r   r   r    F)Útypers   r   r   r   r   r    Úcustom)Úv3Úv3only)r3  Úsortedr   r  ru   Úappendr±   r   r€   r   r   r‚   )rÔ   Únative_lookupÚrowsrs   r  Únativerh   rh   ri   Úlist_fingerprints‰  s8   ÿ




ùÿùÿz$FingerprintManager.list_fingerprintsr8  )rd   re   rf   Úclassmethodr®   rÕ   rØ   rÚ   rÝ   ré   rõ   Ústaticmethodr³   Úbytesr  r²   r(  Úobjectr   r2  r7  r   r   r   r°   rH  rh   rh   rh   ri   r   ¾  s8     A$

 r   r  c                 C   s
   t  | ¡S )r<  )r   r   )r  rh   rh   ri   r   ¬  s   
r   )%râ   r   Úcopyr   Údataclassesr   r   r   r   Ú	functoolsr   Úior   Útypingr	   Úurllib.parser
   Úconstr   r   r
  r   r   Ú__all__r  r3  rÜ   ÚRuntimeErrorr   r®   r}   r   rÑ   ÚPlatformLiteralr   r   r   rh   rh   rh   ri   Ú<module>   s   úÿ
ú÷úïúç"úß*ú×2úÏ:úÇBú¿Jú·Rú¯Zú§búŸjú—rú�zú‡ ú �þ ú �ö ú �î ú �æ #ú �Þ +ú �Ö 3ú �Î ;ú �Æ Cú �¾ Kú �¶ Sú �® [ú �¦ cú �ž kú �– sú �Ž {ú �†  ú � �ý  ú � �õ  ú � �í  ú � �å  $ú � �Ý  ,ú � �Õ  6<þ
 o