ó
    ã fi,  ã                   óŽ   • S SK r S SKrS SKrSSKJr   \  S r  SS jr	SS jr
S rS rSS	 jrS
 rSS jrg! \ a    \r N-f = f)é    Né   )ÚAPIErrorc                 ó–   • SnU  H=  n[        U[        5      (       a  X-  nOUSR                  US   US   5      -  nUS-  nM?     USS $ )ziConverts a Python list of facets into a comma-separated string that can be understood by
the Shodan API.
Ú z{}:{}r   r   Ú,Néÿÿÿÿ)Ú
isinstanceÚ
basestringÚformat)ÚfacetsÚ	facet_strÚfacets      ÚS/home/gothic/public_html/Scylla/venv/lib/python3.13/site-packages/shodan/helpers.pyÚcreate_facet_stringr      s]   € ð €IÛˆÜ�eœZ×(Ñ(ØÑ‰Ià˜Ÿ™¨¨a©°%¸±(Ó;Ñ;ˆIØ�SÑŠ	ñ ð �S�bˆ>Ðó    c                 óZ  • XS'   SnSn	X†::  a¶   UR                  5       S:X  a1  [        R                  " XA-   [        R                  " U5      USS0US9nOoUR                  5       S:X  a  [        R
                  " XA-   X'S	9nOCUR                  5       S
:X  a  [        R                  " XA-   X'S	9nO[        R                  " XA-   X'S	9n U	(       a  X†:¼  a  [        S5      eUR                  S:X  a   [        UR                  5       S   5      e UR                  5       n[        U5      [        :X  a%  UR                  SS5      (       a  [        US   5      eU$ ! [         a
    Sn	US-  n Of = fX†::  a  GMd  N¯! [        [        4 a     Of = f[        S5      e! [         a    [        S5      ef = f)a4  General-purpose function to create web requests to SHODAN.

Arguments:
    function  -- name of the function you want to execute
    params    -- dictionary of parameters for the function
    proxies   -- a proxies array for the requests library

Returns
    A dictionary containing the function's results.

Úkeyr   FÚpostzcontent-typezapplication/json)ÚparamsÚheadersÚproxiesÚdelete)r   r   ÚputTr   zUnable to connect to Shodani‘  ÚerrorzInvalid API keyzUnable to parse JSON responseN)ÚlowerÚrequestsr   ÚjsonÚdumpsr   r   ÚgetÚ	Exceptionr   Ústatus_codeÚ
ValueErrorÚKeyErrorÚtypeÚdict)
r   Úfunctionr   ÚdataÚbase_urlÚmethodÚretriesr   Útriesr   s
             r   Úapi_requestr,      s§  € ð ˆ5�Mð €EØ€EØ
Ó
ð	Ø�|‰|‹~ Ó'Ü—}’} XÑ%8¼$¿*º*ÀTÓ:JÐSYØ.<Ð>PÐ-QØ-4ñ6‘ð —‘“ 8Ó+Ü—’ xÑ':À6Ñ[‘Ø—‘“ 5Ó(Ü—|’| HÑ$7ÀÑX‘ä—|’| HÑ$7ÀÑX�ð ö
 �Ó!ÜÐ4Ó5Ð5ð ×Ñ˜3Óð	Ü˜4Ÿ9™9›; wÑ/Ó0Ð0ð8Ø�y‰y‹{ˆô
 ˆDƒz”TÓ˜dŸh™h w°×5Ñ5Ü�t˜G‘}Ó%Ð%ð €Køô5 ó 	ØˆEØ�Q‰JŠEð	úð ×
øô4 œHÐ%ó 	Ùð	úäÐ(Ó)Ð)øô
 ó 8ÜÐ6Ó7Ð7ð8ús0   �B4E Ã,E3 Ä	F ÅE'Å&E'Å3FÆFÆF*c              #   ó”  #   • [         R                  nU(       a   SSKJn  [	        U [
        5      (       a  U /n U  Hx  nUR                  S5      (       a  [        R                  " US5      nO[        US5      nU H5  n[	        U[
        5      (       d  UR                  S5      nU" U5      nUv •  M7     Mz     g! [         a     N£f = f7f)z@Loop over all the records of the provided Shodan output file(s).r   )Úloadsz.gzÚrúutf-8N)
r   r.   Úujsonr    r	   r
   ÚendswithÚgzipÚopenÚdecode)ÚfilesÚfastr.   ÚfilenameÚfinÚlineÚbanners          r   Úiterate_filesr<   Z   s®   é € ä�J‰J€EÞð	Ý#ô �%œ×$Ñ$Ø�ˆãˆà×Ñ˜U×#Ñ#Ü—)’)˜H cÓ*‰Cä�x Ó%ˆCãˆDä˜d¤J×/Ñ/Ø—{‘{ 7Ó+�ñ ˜4“[ˆFØŒLó ò øô ó 	Ùð	üs(   ‚C›B8 ¡BCÂ8
CÃCÃCÃCc                 ó\   • SU ;   a  U S   (       a  U S   $ SU ;   a  SU S   ;   a  U S   S   $ g )NÚ
screenshotÚopts© ©r;   s    r   Úget_screenshotrB   |   sA   € Ø�vÓ &¨×"6Ø�lÑ#Ð#Ø	�6Ó	˜l¨f°V©nÓ<Ø�f‰~˜lÑ+Ð+àr   c                 ó"   • SU ;   a  U S   $ U S   $ )NÚipv6Úip_strr@   rA   s    r   Úget_iprF   …   s   € Ø�ÓØ�f‰~ÐØ�(ÑÐr   c                 ó0   • [         R                  " XU5      $ )N)r3   r4   )r8   ÚmodeÚcompresslevels      r   Ú	open_filerJ   ‹   s   € Ü�9Š9�X ]Ó3Ð3r   c                 óv   • [         R                  " U5      S-   nU R                  UR                  S5      5        g )NÚ
r0   )r   r   ÚwriteÚencode)Úfoutr;   r:   s      r   Úwrite_bannerrP   �   s*   € Ü�:Š:�fÓ Ñ$€DØ‡J�Jˆt�{‰{˜7Ó#Õ$r   c                 ó¾   • U S:X  a  gU S:  a  SR                  U SS5      $ / SQnSnU H   nX-  n X:  d  M  SR                  XU5      s  $    SR                  XW5      $ )	a„  Return a humanized string representation of a number of bytes.
>>> humanize_bytes(1)
'1 byte'
>>> humanize_bytes(1024)
'1.0 kB'
>>> humanize_bytes(1024*123)
'123.0 kB'
>>> humanize_bytes(1024*12342)
'12.1 MB'
>>> humanize_bytes(1024*12342,2)
'12.05 MB'
>>> humanize_bytes(1024*1234,2)
'1.21 MB'
>>> humanize_bytes(1024*1234*1111,2)
'1.31 GB'
>>> humanize_bytes(1024*1234*1111,1)
'1.3 GB'
r   z1 bytei   z{0:0.{1}f} {2}r   Úbytes)ÚKBÚMBÚGBÚTBÚPBg      �@)r   )Ú
byte_countÚ	precisionÚsuffixesÚmultipleÚsuffixs        r   Úhumanize_bytesr]   ”   su   € ð& �QƒØØ�DÓØ×&Ñ& z°1°gÓ>Ð>â-€HØ€HÛˆØÑˆ
ØÕ Ø#×*Ñ*¨:À&ÓIÒIñ ð ×"Ñ" :¸&ÓAÐAr   )NNzhttps://api.shodan.ior   r   N)F)Úaé	   )r   )r3   r   r   Ú	exceptionr   r
   Ú	NameErrorÚstrr   r,   r<   rB   rF   rJ   rP   r]   r@   r   r   Ú<module>rc      se   ðÛ Û Û å ðÙò
ð AXØ15ô<ô~òDòô4ò%õ
BøðW ó Ø‚Jðús   ”9 ¹AÁA