Skip to content

Instantly share code, notes, and snippets.

@juanpablocs
Last active September 4, 2023 20:10
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save juanpablocs/1d2a2246237c21b2d2533346a4dab0a9 to your computer and use it in GitHub Desktop.
Save juanpablocs/1d2a2246237c21b2d2533346a4dab0a9 to your computer and use it in GitHub Desktop.
Ver RUC de la Sunat con node.js sin captcha. Simple y rápido.

Ruc Sunat

Obtener resultados sin necesidad de captcha ni ocr. Simple código

Instalar paquetes

npm init -y
npm i request cheerio --save

Run

node index.js

Code

archivo: index.js

/**
* @author Juan Pablo <juanpablocs21@gmail.com>
* @description usage two package npm `request` and `cheerio`
* replace `HERE NUMBER RUC` and run > node index.js
*/
const request = require('request').defaults({jar: true});
const cheerio = require('cheerio');

const clean   = str => str.replace(/\s+/g, ' ');
const urlCode = 'http://e-consultaruc.sunat.gob.pe/cl-ti-itmrconsruc/captcha?accion=random';
const urlPost = 'http://e-consultaruc.sunat.gob.pe/cl-ti-itmrconsruc/jcrS00Alias';

const ruc = 'HERE NUMBER RUC';

request(urlCode, (err, response, code)=> {
  const formData = {
    nroRuc:ruc, 
    accion:'consPorRuc', 
    numRnd: code
  };
  request.post({url:urlPost, form: formData}, (err, response, body)=>{ 
    if (!err && response.statusCode == 200) {
      const $ = cheerio.load(body);
      const $table = $(".form-table").eq(2);
      $table.find('tr').each((i, el)=>{
        const a = $(el).find('td[colspan=1]');
        const b = $(el).find('td[colspan=3]');
        console.log(clean(a.text()),'...', clean(b.text()));
      });
      return;
    }
    console.log('error fetch ruc');
  });
});
@tincho425
Copy link

tincho425 commented Jan 27, 2021

Muchas gracias por tu colaboración! 😄
Una propuesta para evitar errores en la segunda consulta que me han aparecido: setear en los request headers de la segunda petición el parámetro 'Cookie' con el valor del response header 'set-cookie' de la primera petición.
Saludos!

@NetRevolutions
Copy link

He notado que esta url: http://e-consultaruc.sunat.gob.pe/cl-ti-itmrconsruc/captcha?accion=random ya no esta funcionando, alguna solucion para esto.
Saludos.

@luistimana
Copy link

@pwsandoval
Copy link

Puedes usar este: https://e-consultaruc.sunat.gob.pe/cl-ti-itmrconsmulruc/captcha?accion=random
Saludos.

Se obtiene el captcha pero no los datos el RUC, qué otro cambio se debería realizar?

@NetRevolutions
Copy link

He intentado consumir la url desde nodeJS, me devuelve status 200 pero devuelve un error indicando que consulte al administrador.
Alguna idea???
Aqui coloco mi codigo, espero alguien le sirva y de paso me indique donde esta el error:

const request = require('request').defaults({jar: true});
const cheerio = require('cheerio');

const clean   = str => str.replace(/\s+/g, ' ');
const urlCode = 'https://e-consultaruc.sunat.gob.pe/cl-ti-itmrconsmulruc/captcha?accion=random';
const urlPost = 'https://e-consultaruc.sunat.gob.pe/cl-ti-itmrconsruc/jcrS00Alias';

const sunatData = ( ruc ) => {
    let promise1 = new Promise((resolve, reject) => {
        request( urlCode, (err, res, code) => {
            const formData = {
                nroRuc: ruc,
                accion: 'consPorRuc',
                numRnd: code,
                contexto: 'ti-it',
                modo: '1',
                rbtnTipo: '1',
                search1: ruc,
                tipdoc: '1',
                actReturn: '1'                
            };

            if (err) {
                console.log(err);
                reject( 'No se pudo consultar la url para obtener el codigo');
            } else {
                resolve({                    
                    formData
                });            
            }            
        });        
    });

    return promise1.then(result =>{
        return new Promise((resolve, reject) => {
            request.post({ url: urlPost, form: result.formData}, (err, response, body) => {
                if ( !err && response.statusCode == 200) {
                    const $ = cheerio.load( body );
                    const $table = $(".form-table").eq(2);
                    const htmlData = '';
                    $table.find('tr').each((i, el) => {
                        const a = $(el).find('td[colspan=1]');
                        const b = $(el).find('td[colspan=3]');
                        //console.log(clean(a.text()),'...', clean(b.text()));
                        htmlData += clean(a.text()) + '...' + clean(b.text());
                    });

                    resolve({
                        //ruc: result.ruc,
                        statusCode: response.statusCode,
                        formData: result.formData,
                        body,
                        //htmlData
                    });
                } else {
                    console.log(err);
                    reject( 'No se pudo obtener los datos de Sunat' );
                }
            });
            //resolve(result.formData);
        });

    }, error => {
        console.log('Se produjo un error en la 2da promesa');
    });    
};

module.exports = {
    sunatData
}

Este es el mensaje que obtengo:
image
image

Saludos y Gracias
Jose R.

@Jean45612
Copy link

He intentado consumir la url desde nodeJS, me devuelve el estado 200 pero devuelve un error indicando que consulta al administrador. Alguna idea??? Aqui coloco mi codigo, espero que alguien le sirva y de paso me indique donde esta el error:

const request = require('request').defaults({jar: true});
const cheerio = require('cheerio');

const clean   = str => str.replace(/\s+/g, ' ');
const urlCode = 'https://e-consultaruc.sunat.gob.pe/cl-ti-itmrconsmulruc/captcha?accion=random';
const urlPost = 'https://e-consultaruc.sunat.gob.pe/cl-ti-itmrconsruc/jcrS00Alias';

const sunatData = ( ruc ) => {
    let promise1 = new Promise((resolve, reject) => {
        request( urlCode, (err, res, code) => {
            const formData = {
                nroRuc: ruc,
                accion: 'consPorRuc',
                numRnd: code,
                contexto: 'ti-it',
                modo: '1',
                rbtnTipo: '1',
                search1: ruc,
                tipdoc: '1',
                actReturn: '1'                
            };

            if (err) {
                console.log(err);
                reject( 'No se pudo consultar la url para obtener el codigo');
            } else {
                resolve({                    
                    formData
                });            
            }            
        });        
    });

    return promise1.then(result =>{
        return new Promise((resolve, reject) => {
            request.post({ url: urlPost, form: result.formData}, (err, response, body) => {
                if ( !err && response.statusCode == 200) {
                    const $ = cheerio.load( body );
                    const $table = $(".form-table").eq(2);
                    const htmlData = '';
                    $table.find('tr').each((i, el) => {
                        const a = $(el).find('td[colspan=1]');
                        const b = $(el).find('td[colspan=3]');
                        //console.log(clean(a.text()),'...', clean(b.text()));
                        htmlData += clean(a.text()) + '...' + clean(b.text());
                    });

                    resolve({
                        //ruc: result.ruc,
                        statusCode: response.statusCode,
                        formData: result.formData,
                        body,
                        //htmlData
                    });
                } else {
                    console.log(err);
                    reject( 'No se pudo obtener los datos de Sunat' );
                }
            });
            //resolve(result.formData);
        });

    }, error => {
        console.log('Se produjo un error en la 2da promesa');
    });    
};

module.exports = {
    sunatData
}

Este es el mensaje que obtengo: imagen imagen

Saludos y gracias José R.

Hola colega, yo también tengo el mismo problema.
He estado probando distintas formas de solucionar el problema pero no he tenido exito.
Lograste encontrar una solución?

Gracias.
Saludos.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment