Buscar en este blog

martes, 2 de septiembre de 2025

(web scraping) Recuperación Mi Cartola Fiscal y Cobranza Judicial Deudas FiscalesTGR












Estimados colegas,

Hace un tiempo se me encomendó el desarrollo de un proceso para el ingreso con credenciales y la posterior recuperación de los datos de la carpeta tributaria desde el sitio web del TGR.

Para cumplir con este objetivo construí una aplicación en C# que automatiza la obtención de esta información. Sin embargo, a comienzos de este año TGR realizó cambios en su portal, lo que impidió continuar con el web scraping y representó un desafío que nos tomó varios meses resolver.

Tras un esfuerzo constante —acompañado de muchos cafés y bastante paciencia— hoy puedo informarles que finalmente contamos con una aplicación estable que permite recuperar nuevamente la información de manera correcta y confiable.

Es importante destacar que la aplicación opera dentro de los marcos legales vigentes, utilizando únicamente las credenciales oficiales proporcionadas por cada empresa, y no ejecuta ningún proceso de hacking ni vulnera la página del TGR.

Este proyecto surgió porque, en versiones anteriores, era posible obtener los datos de manera más directa; sin embargo, con el paso del tiempo, TGR fue restringiendo el proceso de recuperación. Para dar continuidad al servicio se invirtieron 142 horas de trabajo en solucionar el problema y garantizar la operación del sistema.

En este momento disponemos de una versión estable que realiza exitosamente la recuperación de la información.

Próximos pasos / recomendaciones:

  1. Monitorear periódicamente posibles cambios en el portal del TGR que puedan afectar la recuperación de datos.

  2. Documentar cualquier incidencia y actualizar la aplicación según sea necesario.

  3. Considerar mejoras futuras, como optimizar tiempos de ejecución y robustecer la seguridad de las credenciales de las empresas.

  4. Mantener un plan de respaldo de los datos recuperados para asegurar la disponibilidad en caso de fallas del portal.


La información que recuperamos es :

Datos Mi cartola fiscal/Cobranza










Luego podemos acceder a Cobranza Judicial Deudas Fiscales










El resultado de scrapear la página es un json la con información.

















Dejamos constancia que es posible realizar el proceso dentro de los márgenes legales y que hemos desbloqueado este ítem.

Marcelo Rojas Rojas
02-09-2025
Abaddon.1974@gmail.com
997800285




domingo, 1 de junio de 2025

Detección errores de Autenticación SII

Estimados colegas les dejo un pequeño script en csharp para detectar el por qué no es posible recuperar las cookies de las credenciales desde el servidor del SII. Esto debido a que un cliente tiene un proceso masivo de autenticación de varios clientes y muchos de ellos generaban error al momento de generar el proceso de autenticación. 

Bueno les dejo el script para que puedan determinar lo siguiente: 
- (SII) La Clave Tributaria ingresada no es correcta 
- (SII) Su clave tributaria se encuentra bloqueada. 
- (SII) Usted nuevamente ha ingresado erróneamente su Clave Tributaria. 
- (SII) En este momento no lo podemos atender. Por favor intente más tarde.


Extensión de Csharp
	
	
/// 
/// Recupera el error subyacente desde la respuesta 'Response'
/// En el caso que no sea posible recuperar las coookies desde el SII y debe reconocer
/// cual es el problema podemos interpretar el contenido del response. Esto permite determinar
/// que pudo haber pasado en el proceso de autenticación.
/// NOTA:
/// Se debe mantener este código pues los resultados del SII pueden cambiar en el tiempo
/// y eso puedo dañar la interpretación de los errores.
/// NOTA:
/// Es posible que el contenido recuperado regrese ocacionalmente basura, esto no se puede controlar
/// en este proceso. pero se dejara un registro del archivo como un log en disco.
internal static void ExtGetErrorResponse(this string contenido, string rutEmpresa)
{

    ////
    //// Si ejecutamos este metodo quiere decir que no fue posible
    //// recuperar las cookies desde el autenticador del SII.

    ////
    //// TODO: Solo si necesita guardar el archivo para analisis
    File.WriteAllText(
        $"ErroresRequest\\ERROR_R{rutEmpresa}.Html",
            contenido,
                Encoding.UTF8);
    ////
    //// Pattern
    //// 401 - "La Clave Tributaria ingresada no es correcta"
    if (Regex.IsMatch(contenido,
            "La Clave Tributaria ingresada no es correcta",
                RegexOptions.Singleline))
                    throw new UnauthorizedAccessException(
                        "401 - Error de autenticación. " +
                            "(SII) La Clave Tributaria ingresada no es correcta");
    ////
    //// Pattern
    //// 423 - "Su clave tributaria se encuentra bloqueada"
    if (Regex.IsMatch(contenido,
            "Su clave tributaria se encuentra bloqueada",
                RegexOptions.Singleline))
                    throw new UnauthorizedAccessException(
                        "423 - Error de autenticación. " +
                            "(SII) Su clave tributaria se encuentra bloqueada.");
    ////
    //// Pattern
    //// 423 - "Usted nuevamente ha ingresado err"
    if (Regex.IsMatch(contenido,
            "Usted nuevamente ha ingresado err",
                RegexOptions.Singleline))
                    throw new UnauthorizedAccessException(
                        "423 - Error de autenticación. " +
                            "(SII) Usted nuevamente ha ingresado erróneamente su Clave Tributaria.");
    ////
    //// Pattern
    //// 503 - En este momento no lo podemos atender. Por favor intente más tarde.
    if (Regex.IsMatch(contenido,
            "En este momento no lo podemos atender",
                RegexOptions.Singleline))
                    throw new HttpRequestException(
                        "503 - Error de autenticación. " +
                            "(SII) En este momento no lo podemos atender. Por favor intente más tarde.");
    ////
    //// En caso que no se encuentre el pattern en la respuesta del SII
    //// podemos capturar toda la respuesta del SII y evaluarla.
    throw new Exception($"Error desconocido, '{contenido}'");


}
Como usarlo
En su proyecto al momento de consultar las cookies y no tener resultado puede:

////
//// Recupere la respuesta de la consulta ( response )
using (HttpWebResponse response = (HttpWebResponse)req.GetResponse())
{
    ////
    //// Recuperar el token
    if (response.StatusCode == HttpStatusCode.OK)
    {
        ////
        //// Recupere las cookies de la operación
        if (response.Headers.AllKeys.Contains("Set-Cookie"))
        {
            ////
            //// Recupere y formate las cookies
            string cookies = response.Headers["Set-Cookie"];
            if (!string.IsNullOrEmpty(cookies))
                _cookies = cookies.ExtGetCookies();
        }
        else
        {
            ////
            //// Es posible que el SII no regrese cookies y puede deberse a 
            //// error de credenciales.
            using (var reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8))
            {
                ////
                //// Busca el motivo por el cual no hay cookies en la
                //// respuesta de la autentiación
                reader.ReadToEnd().ExtGetErrorResponse(rutEmpresa);

            }

        }

    }

}