
    ]Eh                         d dl Z d dlZd dlZd dlmZ d dlZd dlmZ d dlZd dlZ ej                  ej                  j                          G d d      Zy)    N)html)	rut_chilec                   v    e Zd Zd Zd Zd Zd ZddZddZd Z	d Z
dd	Zdd
Zd Zd Zd ZddZd Zd Zy)ScrapperClassc           	          || _         d | _        t        j                         | _        d| j                  _        | j                  j                  j                  ddddddd       y )	NFzoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36zJtext/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8zes-CL,es;q=0.9,en;q=0.8zgzip, deflate, brz
keep-alive1)z
User-AgentAcceptzAccept-LanguagezAccept-Encoding
ConnectionzUpgrade-Insecure-Requests)dbdriverrequestsSessionsessionverifyheadersupdate)selfr   s     N/var/www/intrajisbackend.com/public_html/app/backend/classes/scrapper_class.py__init__zScrapperClass.__init__   sb      '')# 	## Lb82&),%
 	    c                    	 t               }|j                  d       |j                  d       |j                  d       |j                  ddg       |j                  dd       t        t	               j                               }t        j                  ||      | _        | j                  j                  d	       y
# t        $ r}t        d|        Y d}~yd}~ww xY w)zConfigurar el driver de Chromez--no-sandboxz--disable-dev-shm-usagez---disable-blink-features=AutomationControlledexcludeSwitcheszenable-automationuseAutomationExtensionF)serviceoptionszEObject.defineProperty(navigator, 'webdriver', {get: () => undefined})TzError configurando driver: N)Optionsadd_argumentadd_experimental_optionServiceChromeDriverManagerinstall	webdriverChromer   execute_script	Exceptionprint)r   chrome_optionsr   es       r   setup_driverzScrapperClass.setup_driver    s    	$YN''7''(AB''(WX223DGZF[\223KUS 13;;=>G#**7N*SDKKK&&'no 	/s34	s   B:B= =	CCCc                    	 | j                   j                  t        j                  d      }| j                   j	                  d|      }t        j                  |      }t        j                  t        j                  |            }|j                  d       t        d       |S # t        $ r}t        d|        Y d}~yd}~ww xY w)zExtraer la imagen del captcha
imgCaptchaak  
                var canvas = document.createElement('canvas');
                var ctx = canvas.getContext('2d');
                var img = arguments[0];
                canvas.width = img.width;
                canvas.height = img.height;
                ctx.drawImage(img, 0, 0);
                return canvas.toDataURL('image/png').substring(22);
            zcaptcha_image.pngz4Imagen del captcha guardada como 'captcha_image.png'zError al obtener captcha: N)r   find_elementByIDr$   base64	b64decodeImageopenioBytesIOsaver&   r%   )r   captcha_img
img_base64img_dataimgr(   s         r   get_captcha_imagezScrapperClass.get_captcha_image5   s    	++22255,GK 33 5 J ''
3H**RZZ12C HH()HIJ 	.qc23	s   B B# #	C,B??Cc                     	 | j                          t        d       y# t        $ r}t        d|        Y d}~yd}~ww xY w)z7Resolver captcha manualmente (usuario ingresa el valor)u4   CAPTCHA DETECTADO - Se requiere intervención manualNzError al resolver captcha: )r:   r&   r%   )r   r(   s     r   solve_captcha_manualz"ScrapperClass.solve_captcha_manualT   sF    	""$ HI
  	/s34	s    	?:?c                    	 | d| }dd| dddd| ddd	d
| ddg}|D ]  }	 t        d|d    d|d           | j                  j                  |d   |d   dd      }|j                  dk(  r`	 |j	                         }|r8|j                  d      s9|j                  d      s(|j                  d      st        t        |            dkD  rdd|d   j                         j                  dd       t        j                  d      ||j                  d|      |j                  d|j                  dd            |j                  dd      |j                  dd      |j                  d d      |j                  d!d      d"|j                  d#g       |j                  d$g       |d%}t        d&|d           |c S t        d'|d    d(       t        d'|d    d*|j                           dd/d0|d1d2S # t        j                  $ r t        d'|d    d)       Y w xY w# t        j                  j                  $ r t        d'|d    d+|d    d,       Y >t        j                  j                  $ r}	t        d'|d    d-|	        Y d.}	~	td.}	~	ww xY w# t         $ r"}	dd3d4t        |	       | d| d5cY d.}	~	S d.}	~	ww xY w)6u$  
        Obtener datos del cliente usando APIs externas con múltiples fallbacks
        
        Args:
            rut_sin_dv (str): RUT sin dígito verificador
            dv (str): Dígito verificador
        
        Returns:
            dict: Datos del cliente desde API externa
        -zSIIChile Herokuz,https://siichile.herokuapp.com/consulta?rut=   )nameurltimeoutzRUT API Alternativez8https://api.libredte.cl/utilidades/contribuyentes/datos/
   z
SII Mirrorz+http://siichile.herokuapp.com/consulta?rut=   u   🌐 Probando r@   : rA   rB   FT)rB   r   allow_redirects   rutrazon_socialnombre2   external_api_ _%Y-%m-%d %H:%M:%S empresa_menor_tamanoaut_moneda_extranjerainicio_actividadesfecha_inicio_actividades)rH   business_namesmall_companyforeign_currency_authactivities_start
start_dateactividadesdocumentos_timbrados)successmethod	timestamprut_consultedcontributor_dataeconomic_activitiesstamped_documentsraw_responseu$   ✅ Datos obtenidos exitosamente de u   ❌ u   : Datos inválidos o vacíosu   : Respuesta no es JSON válidoz: HTTP u   : Timeout después de su   : Error de conexión: Nexternal_api_failedz1All external APIs failed or returned invalid dataz(Try again later or use direct SII method)r\   r]   errorr_   recommendationapi_externaz"Error conectando con API externa: r\   r]   rf   rut_consultado)r&   r   getstatus_codejsonlenstrlowerreplacetimestrftimeJSONDecodeErrorr   
exceptionsTimeoutRequestExceptionr%   )
r   
rut_sin_dvdvrut_completoapis_to_try
api_configresponsedataresultr(   s
             r   get_customer_data_via_apiz'ScrapperClass.get_customer_data_via_apig   sc   c	(\2$/L
 .I,X! 2UVbUcd! )HW!K$ * <
;N:f+=*>bEAR@STU#||//"5) *9 5$(,	  0  H  ++s2%%#+==?D  $ $ $ 8 $ 2 #CI 3 040=j>P>V>V>X>`>`adfi>j=k.l15?R1S5A/3xx|/L9=.RVRZRZ[cegRh9i9=BXZ\9]AEJaceAf<@HHEY[]<^6:hh?Y[]6^9& <@88MSU;V9=BXZ\9]48*"$ !&(LZX^M_L`&a b'- %Z-?,@@\&] ^ ( Z%7$8@T@T?UVW k<@ !/L!-"L !  $33 %!DF);(<<Z"[\$%  **22 DF!3 44J:V_K`Jaabcd**;; DF!3 44J1#NO  	 '=c!fXF%/L""6	 	s   'J! AH+7EG??J! G?J! H+4
J! ?%H($H+%J! 'H((H++5J J! #J?JJ! JJ! !	K*KKKc           	      b   	 | d| }t        d|        t        j                  |      sddd|dS t        d       | j                         }|sddd|dS t        d	|d
           ||dd|d
   |d   d}t        d       t	        j
                  d|d      }|j                  dk7  rddd|j                   |dS t        d       t        j                  |j                        }| j                  ||      }|j                  d      r`t        d       t        d|j                  di       j                  dd              t        dt        |j                  dg                     |S # t        $ r9}	t        dt        |	              dddt        |	       | d| dcY d }	~	S d }	~	ww xY w)!u#  
        Obtener datos del cliente directamente del SII con captcha automático
        
        Args:
            rut_sin_dv (str): RUT sin dígito verificador
            dv (str): Dígito verificador
        
        Returns:
            dict: Datos del cliente desde SII directo
        r>   u#   🎯 Consultando SII directamente: Fsii_directou   RUT inválidori   +   🔐 Obteniendo captcha automáticamente...zNo se pudo obtener el captcha   ✅ Captcha obtenido: codeSTCNORcaptcha)RUTDVPRGOPCtxt_codetxt_captchau    📡 Enviando consulta al SII...z&https://zeus.sii.cl/cvc_cgi/stc/getstc   )r~   rB   rG   zError HTTP: u+   ✅ Respuesta recibida, extrayendo datos...r\   #   🎉 Datos extraídos exitosamente!u   📋 Razón Social: datos_contribuyenterI   zN/Au   📋 Actividades: actividades_economicasu#   ❌ Error en consulta directa SII: u   Error de conexión: N)r&   r   is_valid_rutfetch_captchar   postrl   r   
fromstringtextextract_sii_direct_datark   rn   r%   ro   )
r   rx   ry   rz   captcha_datar~   r}   treeresult_datar(   s
             r   get_customer_data_direct_siiz*ScrapperClass.get_customer_data_direct_sii   s   F	(\2$/L7~FG )),7$+,&2	  ?@--/L$+<&2	  *<+?*@AB "(0+I6D 45}}%MTXbdeH##s*$++H,@,@+AB&2	  ?@ ??8==1D 66t\JKy);<,[__=RTV-W-[-[\jlq-r,stu*3{?WY[/\+]*^_` 	7Ax@A '/Ax8%/L""6	 	s0   0E, #E, A%E, =B.E, ,	F.5.F)#F.)F.c                    	 t        d       ddg}|D ]  }	 | j                  j                  |ddiddd	      }|j                  d
k(  rQ|j	                         }t        j                  |d         dd j                         }t        d|        ||d   dc S t        d|j                   d|         t        d       y# t        j                  j                  $ r}t        d| d|        Y d}~d}~wt        j                  j                  $ r}t        d| d|        Y d}~d}~ww xY w# t        $ r}t        d|        Y d}~yd}~ww xY w)u   
        Obtener captcha automáticamente desde la API del SII con manejo robusto de SSL
        
        Returns:
            dict: Datos del captcha con código y token
        r   z0https://zeus.sii.cl/cvc_cgi/stc/CViewCaptcha.cgiz/http://zeus.sii.cl/cvc_cgi/stc/CViewCaptcha.cgioperr   r?   FT)r~   rB   r   rF   rG   
txtCaptcha$   (   r   )r   r   u   ❌ Error HTTP z en u   ❌ Error SSL en rE   Nu   ❌ Error de conexión en u-   ❌ No se pudo obtener captcha de ninguna URLu%   ❌ Error crítico en fetch_captcha: )r&   r   r   rl   rm   r/   r0   decoder   ru   SSLErrorrw   r%   )	r   urls_to_tryrA   r}   r~   captcha_codessl_errreq_errr(   s	            r   r   zScrapperClass.fetch_captcha*  s   0	?@ CAK
 # #||00$a[ "$(,  1  H  ++s2'}} (.'7'7\8J'KBr'R'Y'Y'[ 6|nEF$0'+L'9  
 0D0D/ET#OP 1D AB  **33 -cU"WI>?**;; 6se2gYGH  	9!=>	s_   D4 A?CD4 C4D4 D1C50D4 5 D1D,&D4 ,D11D4 4	E=EEc                 2   	 d}d}|j                  |      }|r|d   j                  j                         nd}g }	 |j                  |      dd }|D ]  }		 |	j                  d      d   j                  j                         }
t        |	j                  d      d   j                  j                               }|	j                  d	      d   j                  j                         }|	j                  d
      d   j                  j                         dk(  }|j	                  |
|||d        	 g }	 |j                  d      }|dd D ]\  }|j                  d      }t        |      dk(  s#|d   j                         }|d   j                         }|j	                  ||d       ^ 	 d}d}d}d}	 |j                  d      }|r&|d   j                  dd      d   j                         }|j                  d      }|r&|d   j                  dd      d   j                         }|j                  d      }|r&|d   j                  dd      d   j                         }|j                  d      }|r&|d   j                  dd      d   j                         }ddt        j                  d      |||||||d||d}|s|s|r|S ddd|dS # t
        t        f$ r Y w xY w#  Y xY w#  Y CxY w#  Y ]xY w# t        $ r}dddt        |       |dcY d}~S d}~ww xY w) u  
        Extraer datos del HTML del SII usando XPaths específicos
        
        Args:
            tree: Árbol HTML parseado con lxml
            rut_completo (str): RUT completo consultado
            
        Returns:
            dict: Datos estructurados extraídos
        z/html/body/div/div[4]z/html/body/div/table[1]/trr   rP      Nz./td[1]/fontz./td[2]/fontz./td[3]/fontz./td[4]/fontSi)girocodigo	categoriaafectaz//table[@class='tabla']/trztd/font/text()   )	Documentou   Año último timbrajezO//span[contains(text(),'Contribuyente presenta Inicio de Actividades:')]/text():zA//span[contains(text(),'Fecha de Inicio de Actividades:')]/text()zP//span[contains(text(),'Contribuyente es Empresa de Menor Tama')]/text()[last()]zt//span[contains(text(),'Contribuyente autorizado para declarar y pagar sus impuestos en moneda extranjera:')]/text()Tr   rO   )rH   rI   rQ   rR   rS   rT   )r\   r]   r^   rj   r   r   r[   Fu8   No se encontraron datos válidos en la respuesta del SIIri   zError extrayendo datos: )xpathr   stripintappend
IndexError
ValueErrorrn   splitrr   rs   r%   ro   rx   ry   r&   r   rk   rl   rm   )"r   r   rz   XPATH_RAZON_SOCIALXPATH_ACTIVIDADESrazon_social_nodesrI   rZ   actividad_rowsnoder   r   r   r   r[   
table_rowsrowcells	documentoultimo_timbrajerS   rT   rQ   rR   xpath_inicioxpath_fechaxpath_empresaxpath_monedar   r(   rA   r   r}   r~   s"                                     r   r   z%ScrapperClass.extract_sii_direct_datac  s~   l	!8 < "&,>!?AS-a055;;=Y[L K!%,=!>qr!B* !D!#zz.9!<AAGGI!$TZZ%?%B%G%G%M%M%O!P$(JJ~$>q$A$F$F$L$L$N	!%N!;A!>!C!C!I!I!Kt!S#**$(&,)2&,	, !& $& !ZZ(DE
%ab> 	CII&67E5zQ$)!HNN$4	*/(..*:,33)25D5 	 "$')$#% $&!#zz*{|)5a)>)>sA)Fr)J)P)P)R&"jj)lm/:1~/C/CC/KB/O/U/U/W, $

+} ~ +8+;+A+A#q+I"+M+S+S+U(#zz  +a   b,8O,A,A#q,I",M,S,S,U)  '!]]+>?".'$0,@-B*<0H( +6(<F$ {.B  %+W&2	 K '
3 ! ! 0>  	 '3CF8<".	 	s   8K0 K CK'K )K0 -8K! &<K! "	K0 ,C$K) +K0 <K0 KK KK KK0 !K&#K0 )K-+K0 0	L9LLLc                    t        d       | j                  ||      }|j                  d      rt        d       |S t        d|j                  dd              t        d       | j                  ||      }|j                  d      rt        d       |S t        d	|j                  dd              d
d|j                  dd      |j                  dd      d| d| ddS )u  
        Obtener datos del cliente desde el SII
        
        Args:
            rut_sin_dv (str): RUT sin dígito verificador
            dv (str): Dígito verificador
            max_attempts (int): Número máximo de intentos (no usado con API)
            use_api_first (bool): Si usar API externa (recomendado)
        
        Returns:
            dict: Datos del cliente extraídos del SII
        u)   🚀 Método 1: Intentando API externa...r\   u1   ✅ Datos obtenidos exitosamente con API externa!u   ❌ API externa falló: rf   zError desconocidouA   🎯 Método 2: Intentando SII directo con captcha automático...u1   ✅ Datos obtenidos exitosamente con SII directo!u   ❌ SII directo falló: Ftodos_los_metodos_fallaronrP   )rh   r   r>   z(Verificar conectividad y validez del RUT)r\   r]   errorsrj   recomendacion)r&   r   rk   r   )r   rx   ry   max_attemptsuse_api_first
api_result
sii_results          r   get_customer_datazScrapperClass.get_customer_data  s     	9:33JC
>>)$EF,Z^^GEX-Y,Z[\ 	QR66z2F
>>)$EF,Z^^GEX-Y,Z[\ 2)~~gr:)~~gr: ",AbT2G	
 		
r   c                    d}| j                         sdd| d| dS 	 t        |      D ]5  }	 t        d|dz    d|        | j                  j	                  |       t        | j                  d	      j                  t        j                  t        j                  d
f             t        d       | j                  j                  t        j                  d
      }|j                          |j                  |       | j                  j                  t        j                  d      }|j                          |j                  |       t        d| d| d       t        j                  d       | j!                  ||      }|st        d       et        d       | j                  j                  t        j                  d      }	|	j#                          t        d       t        | j                  d      j                  t        j%                  t        j                  t        j&                  df      t        j                  t        j&                  df      t        j                  t        j                  df      t        j                  t        j(                  df      t        j+                  t        j(                  dfd                   t        j                  d       t        d       | j-                         }
|
r0|
j	                  d      rt        d       |
c | j/                          S t        d       ||dz
  k  r t        d        t        j                  d       8 dd$| d| |d%| j/                          S # t0        $ rP}t        d!|dz    d"t3        |              ||dz
  k  r t        d        t        j                  d       Y d#}~d#}~ww xY w# | j/                          w xY w)&uV  
        Obtener datos del cliente usando Selenium (método original)
        
        Args:
            rut_sin_dv (str): RUT sin dígito verificador
            dv (str): Dígito verificador
            max_attempts (int): Número máximo de intentos
        
        Returns:
            dict: Datos del cliente extraídos del SII
        $https://zeus.sii.cl/cvc/stc/stc.htmlFz"No se pudo configurar el navegadorr>   )r\   rf   rj   u   🔄 Intento r   z de rC   r   u(   ✅ Página cargada, ingresando datos...r   u   ✅ RUT z
 ingresado   u3   ❌ No se pudo resolver el captcha automáticamenteu,   ✅ Captcha resuelto, enviando formulario...
bt_aceptaru   ⏳ Esperando resultados...r?   	resultadorf   	contenidotablebodycontribuyente   u,   ✅ Resultados cargados, extrayendo datos...r\   r   u'   ⚠️ No se encontraron datos válidosu   🔄 Reintentando...u   ❌ Error en intento rE   Nu9   Se agotaron todos los intentos sin obtener datos válidos)r\   messagerj   intentos_realizados)r)   ranger&   r   rk   WebDriverWaituntilECpresence_of_element_locatedr-   r.   r,   clear	send_keysrr   sleep'attempt_captcha_resolution_with_contextclickany_of
CLASS_NAMETAG_NAMEtext_to_be_present_in_elementextract_sii_dataclose_driverr%   ro   )r   rx   ry   r   rA   attempt	rut_inputdv_inputcaptcha_solvedsubmit_buttonr   r(   s               r   get_customer_data_via_seleniumz,ScrapperClass.get_customer_data_via_seleniumM  sS    5   " =%/L""6 V	  . K&J&M'A+d<.IJ KKOOC( "$++r28866u~F DF !% 8 8 FIOO%''
3  ${{77tDHNN$&&r*HZL"Z@A JJqM &*%Q%QR\^`%aN)ST HI %)KK$<$<RUUL$QM!'') 78!$++r288		::BMM;;WX::BMM7;ST::BEE;;OP::BKK;QR<<bkk6=RTcd JJqMHI #'"7"7"9K"{y'ACD*** ' GH"\A%55!"89 JJqMKK&\ !V%/L""6'3	  ! &1'A+bQIJ!1145

1	& sO   O EM?O FM?O -3M? O ?	OAOO OO O-c                    	 t        j                  d       d}g d}|D ]<  }	 | j                  j                  t        j
                  |      }t        d|         n |s6	 | j                  j                  t        j                  d      }t        d       g d	}|D ]S  }	 t        d
|        |j                          |j                  |       | j                  j                  t        j
                  d      }|j                          t        j                  d       | j                  j                  j                         | j                  j                  }	t        d|	        |	dk7  st        fddD              rt        d|         yt        fddD              r=t        d| d       | j                  j                  d       t        j                  d       t!        | j                  d      j#                  t$        j'                  t        j
                  df            }
| j                  j                  t        j
                  d      }|
j                          |
j                  |       |j                          |j                  |       t        j                  d       |D ].  }	 | j                  j                  t        j
                  |      } n Ft        d|        V t        d       y#  Y xY w#  t        d       Y yxY w#  Y nxY w# t(        $ r}t        d| d|        Y d}~d}~ww xY w# t(        $ r}t        d|        Y d}~yd}~ww xY w) u9  
        Intentar resolver el captcha automáticamente con contexto de RUT
        
        Args:
            rut_sin_dv (str): RUT sin dígito verificador
            dv (str): Dígito verificador
            
        Returns:
            bool: True si se resolvió exitosamente, False en caso contrario
        r   Nr   r   r   r   %   ✅ Campo captcha encontrado con ID: r   %   ✅ Campo captcha encontrado por name-   ❌ No se pudo encontrar el campo del captchaF	123400001111222255551212212199994321   🔢 Probando código: r   r      🌐 URL actual: r   c              3   &   K   | ]  }|v  
 y wN .0keywordpage_sources     r   	<genexpr>zHScrapperClass.attempt_captcha_resolution_with_context.<locals>.<genexpr>         IwG{2  I   r   
   situación
tributariavigenter   "   ✅ Captcha resuelto con código: Tc              3   &   K   | ]  }|v  
 y wr  r  r  rf   r
  s     r   r  zHScrapperClass.attempt_captcha_resolution_with_context.<locals>.<genexpr>       bE5K/br  
incorrectorf   u	   inválido   ❌ Código z$ incorrecto, volviendo a intentar...rC   r   r   r   '   🤔 Respuesta inesperada para código    ❌ Error probando código rE   7   ❌ No se pudo resolver el captcha con códigos comunes%   ❌ Error en resolución de captcha: )rr   r   r   r,   r-   r.   r&   NAMEr   r   r   r
  rp   current_urlanyrk   r   r   r   r   r%   )r   rx   ry   captcha_inputcaptcha_selectorsselectorcommon_codesr   r   r  r   r   r(   r
  s                @r   r   z5ScrapperClass.attempt_captcha_resolution_with_context  s   ^	JJqM !M I- $(KK$<$<RUUH$MMA(LM	 !!$(KK$<$<RWWj$QMAB dL$ ;:3D6:;!'')!++D1 %)KK$<$<RUUL$QM!'') JJqM #'++"9"9"?"?"AK"&++"9"9K-k];< $'MM  I  CH  I  I B4&IJ# b=abbTF2VWX(NO

1 %2$++r$B$H$H::BEE5>J%	 $(;;#;#;BEE4#H!)!++J7 ( **2.

1 ): )H)040H0HPX0Y %) ! GvNOo;z KL[!IJ n) ( ! 7vRsCD  	9!=>	s    M	 8L M	 "5L 
M	 "C-L!M	 D"L!4*LL!!M	 #L!1M	  LM	 LM	 M	 LL!!	M*M;M	 MM	 		M*M%%M*c                    	 t        j                  d       d}g d}|D ]<  }	 | j                  j                  t        j
                  |      }t        d|         n |s6	 | j                  j                  t        j                  d      }t        d       d}g d	}|D ]<  }	 | j                  j                  t        j
                  |      }t        d
|         n |s	 | j                  j                  t        j                  d      }|D ]_  }|j                  d      xs d}|j                  d      xs d}	d|j                         v sd|	j                         v sR|}t        d        n |st        d       t        d       	 | j                  j                  t        j                  d      }
t        dt        |
              t        |
      D ]\  \  }}|j                  d      xs d}|j                  d      xs d}|j                  d      xs d}t        d| d| d| d| d	       ^ | j                  j                  t        j                  d      }t        d t        |              t        |      D ]G  \  }}|j                  d      xs d}|j                  d      xs d!}t        d"| d| d#|dd$  d%       I 	 g d'}|D ]S  }	 t        d(|        |j                          |j!                  |       | j                  j                  t        j
                  d)      }|j#                          t        j                  d*       | j                  j$                  j                         | j                  j&                  }t        d+|        |d,k7  st)        fd-d.D              rt        d/|         y0t)        fd1d2D              r=t        d3| d4       | j                  j+                  d,       t        j                  d*       t-        | j                  d5      j/                  t0        j3                  t        j
                  d6f            }| j                  j                  t        j
                  d7      }|j                          |j!                  d8       |j                          |j!                  d9       t        j                  d:       |D ].  }	 | j                  j                  t        j
                  |      } n Ft        d;|        V t        d>       y#  Y xY w#  t        d       Y yxY w#  Y xY w#  Y xY w# t        $ r}t        d&|        Y d}~d}~ww xY w#  Y xY w# t        $ r}t        d<| d=|        Y d}~d}~ww xY w# t        $ r}t        d?|        Y d}~yd}~ww xY w)@u   
        Intentar resolver el captcha automáticamente
        
        Returns:
            bool: True si se resolvió exitosamente, False en caso contrario
        r   Nr   r   r   r   r   F)r+   r6   zcaptcha-imageimagen_captchau&   ✅ Imagen captcha encontrada con ID: r9   srcrP   altr   u+   ✅ Imagen captcha encontrada por contenidouN   ⚠️ No se encontró imagen de captcha, intentando sin validación de imagenu.   🔍 Inspeccionando elementos de la página...inputu   📝 Inputs encontrados: idsin_idr@   sin_nametypesin_typez	   Input z: ID='z	', NAME='z	', TYPE=''u   🖼️ Imágenes encontradas: sin_srcz
   Imagen z', SRC='d   z...'u   Error en inspección: r   r  r   r   r  r   c              3   &   K   | ]  }|v  
 y wr  r  r  s     r   r  z;ScrapperClass.attempt_captcha_resolution.<locals>.<genexpr>  r  r  r  r  Tc              3   &   K   | ]  }|v  
 y wr  r  r  s     r   r  z;ScrapperClass.attempt_captcha_resolution.<locals>.<genexpr>  r  r  r  r  z incorrectorC   r   r   760638226r   r  r  rE   r  r  )rr   r   r   r,   r-   r.   r&   r  find_elementsr   get_attributerp   rn   	enumerater%   r   r   r   r
  r  r  rk   r   r   r   r   )r   r   r!  r"  r6   img_selectorsimagesr9   r&  r'  inputsiinpinput_id
input_name
input_typeimg_idimg_srcr(   r#  r   r   r  r   r   r
  s                            @r   attempt_captcha_resolutionz(ScrapperClass.attempt_captcha_resolution&  s   T	JJqM !M I- $(KK$<$<RUUH$MMA(LM	 !!$(KK$<$<RWWj$QMAB K\M) "&++":":255("KKB8*MN	 
![[66r{{EJF% "!//6<"!//6<"$		3yCIIK7O*-K!"OP!" fg BC4222;;H1#f+?@'/ fFAs"006B(H!$!2!26!:!HjJ!$!2!26!:!HjJIaSxj	*YWaVbbcde	f 222;;F7F}EF'/ UFAs ..t4@F!//6C)GJqcxxdSTU dL$ =<3D6:;!'')!++D1 %)KK$<$<RUUL$QM!'') JJqM #'++"9"9"?"?"AK"&++"9"9K-k];< $'MM  I  CH  I  I B4&IJ# b=abbTF+>?(NO

1 %2$++r$B$H$H::BEE5>J%	 $(;;#;#;BEE4#H ")!++J7 ( **3/

1 ): )H)040H0HPX0Y %) ! GvNOs=~ KLG!IJ 2  4.qc2334t) ( ! 7vRsCD  	9!=>	s
   V1 8T3V1 "5T; V1 #8UV1 !A=U U /V1 EU 	V1 C-V	V1 D"V	'*VV	V1 V	$V1 3T85V1 ;U
V1 
V1 UV1 UV1 	U?&U:4V1 :U??V1 VV			V.V)#V1 )V..V1 1	W:WWc           	      P	   	 | j                   j                  }| j                   j                  }dt        j                  d      |i i g |d}	 | j                   j                  t        j                  d      }|D ]  }|j                  j                         |j                  d      }t        fddD              r|j                  t        j                  d      }|D ]  }|j                  t        j                  d	      }	t        |	      d
k\  s2|	d   j                  j                         j                         }
|	d   j                  j                         }d|
v r	||d   d<   d|
v sd|
v r	||d   d<   d|
v sd|
v r	||d   d<   d|
v r	||d   d<   d|
v s||d   d<    t        fddD              r|j                  t        j                  d      }|D ]  }|j                  t        j                  d	      }	t        |	      d
k\  s2|	d   j                  j                         j                         }
|	d   j                  j                         }d|
v sd|
v r	||d   d<   d|
v s||d   d<    t        fddD              s|j                  t        j                  d      }|D ]  }|j                  t        j                  d	      }	t        |	      d
k\  s2|	d   j                  j                         }|	d   j                  j                         }|so|sr|j                         s|d    j                  ||d!         	 	 | j                   j                  t        j                  d$      }g }|D ]?  }|j                  j                         }|s t        |      d%kD  s/|j                  |       A ||d&<   |d   s,|d   s'|d    s"t        d( |j%                  d&g       D              r,t#        d)t        |d          d*t        |d           d+       |S t#        d,       d-d.d/S # t         $ r}t#        d"|        Y d#}~d#}~ww xY w# t         $ r}t#        d'|        Y d#}~d#}~ww xY w# t         $ r&}t#        d0|        d-t'        |      d1cY d#}~S d#}~ww xY w)2u   
        Extraer los datos específicos de la situación tributaria del SII
        
        Returns:
            dict: Datos estructurados de la consulta SII
        TrO   )r\   r^   url_consultadar   situacion_tributariar   raw_htmlr   	outerHTMLc              3   &   K   | ]  }|v  
 y wr  r  r  r	  
table_texts     r   r  z1ScrapperClass.extract_sii_data.<locals>.<genexpr>  s     tW7j0tr  )rH      razón socialrJ   r   trtdr   r   r   rH   r   rK  rJ   rI   u
   dirección	domicilio	direccioncomunau   regiónregionc              3   &   K   | ]  }|v  
 y wr  r  rI  s     r   r  z1ScrapperClass.extract_sii_data.<locals>.<genexpr>  s     nW7j0nr  )r  estador  activor  rS  rE  fechac              3   &   K   | ]  }|v  
 y wr  r  rI  s     r   r  z1ScrapperClass.extract_sii_data.<locals>.<genexpr>  s     dW7j0dr  )	actividadu
   económicar   r   )r   descripcionz"Error extrayendo datos de tablas: NdivrC   contenido_textualz$Error extrayendo contenido textual: c              3   @   K   | ]  }d |j                         v   yw)r   N)rp   )r  r   s     r   r  z1ScrapperClass.extract_sii_data.<locals>.<genexpr>,  s     lOtzz|3ls   u   ✅ Datos extraídos: z datos del contribuyente, u    actividades económicasu7   ⚠️ No se encontraron datos válidos en la respuestaFu    No se encontraron datos válidos)r\   r   u$   ❌ Error extrayendo datos del SII: )r\   rf   )r   r
  r  rr   rs   r5  r-   r   r   rp   r6  r  rn   r   isdigitr   r%   r&   rk   ro   )r   r
  r  extracted_datatablesr   
table_htmlrowsr   r   keyvaluer   rX  r(   divscontent_textrY  r   rJ  s                      @r   r   zScrapperClass.extract_sii_data  s   m	7++11K++11K  !]]+>?"-')(**,'N<@222;;H# 6'E!&!1!1!3J!&!4!4[!AJ t@stt$222;;E#' \C$'$5$5bkk4$HE"5zQ&+Ahmm&9&9&;&A&A&C(-a(;(;(=#(C<SXN3H$I%$P%4%;x3\aN3H$I.$Y%1S%8K3<NY^N3H$I+$V%-_V[N3H$I($S%.#%5V[N3H$I($S\$ n@mnn$222;;E#' 	\C$'$5$5bkk4$HE"5zQ&+Ahmm&9&9&;&A&A&C(-a(;(;(=#/3#6(c/W\N3I$J8$T%,^V[N3I$J7$S	\ d@cdd$222;;E#' 
'C$'$5$5bkk4$HE"5zQ).q)<)<)>.3Ahmm.A.A.C#)kfnn>N$23K$L$S$S287BU& %'
'Y6'xB{{00eD! 2C88>>+DD	B$++D12
 7C23 455678l@R@RSfhj@kll.s>BW3X/Y.ZZt^,DEFGG_a b%%OP#(5WXX=  @:1#>??@   B<QC@AAB   	78<=$s1v66	7s   A	Q6 CP. BP. A1P. AP. )P. 	AP. <P. P. P. .P. 
Q6 AQ Q )Q AQ6 Q6 .	Q7Q
Q6 
QQ6 	Q3Q.)Q6 .Q33Q6 6	R%?R R% R%c                    	 |r=d|v r9t        |dd      5 }|j                  |d          ddd       t        d|        |j                  dd      }|j	                         D ci c]  \  }}|dk7  s|| }}}t        |dd      5 }t        j                  ||d	d
       ddd       t        d|        y# 1 sw Y   xY wc c}}w # 1 sw Y   *xY w# t        $ r}t        d|        Y d}~yd}~ww xY w)zGuardar resultado en archivohtml_completowzutf-8)encodingNzResultado guardado en: z.htmlz.jsonFr   )ensure_asciiindentz"Datos estructurados guardados en: zError guardando resultado: )r2   writer&   rq   itemsrm   dumpr%   )	r   r~   filenamefjson_filenamekv	json_datar(   s	            r   save_result_to_filez!ScrapperClass.save_result_to_file9  s   	54/(C': 3aGGD123/z:; %,,Wg>M +/**,O$!Q!:NAOIOmS7; Fq		)QU1EF6}oFG3 3 PF F  	5/s344	5sW   C B;;C &C4C9C 
C$C ;C C CC 	C:"C55C:c                     | j                   r.	 | j                   j                          t        d       d| _         yy#  Y xY w)zCerrar el navegadorzNavegador cerradoN)r   quitr&   r   s    r   r   zScrapperClass.close_driverN  s?    ;;  ")* DK s	   %< A c                 $    | j                          y)z0Destructor para asegurar que el driver se cierreN)r   rw  s    r   __del__zScrapperClass.__del__X  s    r   N)r3  r4  )r3  r4  r   T)r3  r4  r   )zsii_result.html)__name__
__module____qualname__r   r)   r:   r<   r   r   r   r   r   r   r   rB  r   rt  r   ry  r  r   r   r   r      sb    $*>&n`Qf7rzx,
\l \iV[zt7l5*r   r   )rr   r   r/   lxmlr   rm   r   urllib3ssldisable_warningsru   InsecureRequestWarningr   r  r   r   <module>r     sG           
   ++BB CM Mr   