gam/curp-scrapper

dev-main 2024-04-23 19:39 UTC

README

CURP Scrapper

Source Code Download Package PHP Programming Language Read License Build Status Codecov Code Coverage Psalm Type Coverage

About

Consulta la CURP 🇲🇽 (Clave Única de Registro de Población) mediante web scrapping al portal oficial. Puedes obtener todos los datos que ofrece el portal oficial asi como la descarga del PDF.

How it is work?

La consulta de datos funciona mediante web scrapping al portal oficial utilizando un webdriver para la automatización de un navegador basado en Chromium. Se levanta una instancia headless del navegador cambiando algunos parámetros para que sea indetectable a la tecnología anti-bot de Akamai.

Personalmente, no soy fan de utilizar webdrivers/selenium o cualquier otro software de automatización de pruebas en navegadores para hacer tareas de scrapping, pero para este caso facilita en gran medida la no detección de bots de Akamai.

Installation

Instala este paquete mediante Composer.

composer require gam/curp-scrapper

Browser & Webdriver Installation

Antes de usar el paquete es necesario instalar un navegador basado en chromium y su respectivo webdriver:

  1. Instalar Chrome o Chromium
  2. Instalar el correspondiente webdriver o simplemente puedes ejecutar:
    # Instala el driver correspondiente a la version de Chrome/Chromium instalada
    php vendor/bin/driver

Usage

Usar la biblioteca es sencillo. Puedes obtener los datos de una CURP o descargar el PDF.

Obtener Datos De CURP

<?php

declare(strict_types=1);

/*
 * Si no se especifica la ruta del driver,
 * el paquete utilizara el ubicado en la ruta build/
 * el cual se instala utilizando composer scrapper:driver
 */
$scrapper = new \Gam\CurpScrapper\Renapo\Scrapper();

$data = $scrapper->getCurpData(new \Gam\CurpScrapper\Model\Curp('UZLK580803MVZGIB96'));

/**
 * @var \Gam\CurpScrapper\Model\Ciudadano $ciudadano
 * Obtener datos del ciudadano
 */
$ciudadano = $data->getCiudadano();

/**
 * @var \Gam\CurpScrapper\Model\DocumentoProbatorio $documentoProbatorio
 * Obtener datos del documento como Tomo, Año de registro, Foja, Acta, Libro
 */
$documentoProbatorio = $data->getDocumentoProbatorio();

/**
 * @var \Gam\CurpScrapper\Model\CurpEstatus $status
 * Consulte los posibles estatus de una CURP
 */
$status = $data->getEstatusCurp();

Obtener PDF De CURP

Existen 2 formas de obtener el PDF de una CURP

  • Mediante el resultado de una búsqueda: Se da como parámetro un objeto de tipo CurpResult el cual es resultado de una búsqueda mediante el método getCurpData.

  • Directamente desde una CURP: Se da como parámetro un objeto de tipo Curp.

<?php

declare(strict_types=1);

$scrapper = new \Gam\CurpScrapper\Renapo\Scrapper();

/*
 * Obtener PDF desde el resultado de una busqueda
 */
$data = $scrapper->getCurpData(new \Gam\CurpScrapper\Model\Curp('UZLK580803MVZGIB96'));
$pdf = $scrapper->getPdf($data);


/*
 * Obtener PDF desde una CURP
 */
 $pdf = $scrapper->getPdfFromCurp(new \Gam\CurpScrapper\Model\Curp('UZLK580803MVZGIB96'));

NOTA: En ambos escenarios se hace el mismo número de solicitudes HTTP al portal web

Estatus De CURP

  • AN: Alta Normal
  • AH: Alta con Homonimia
  • RCN: Registro de Cambio No afectando a CURP
  • RCC: Registro de Cambio Afectando a CURP
  • BD: Baja por Defunción
  • BSU: Baja Sin Uso
  • BAP: Baja por Documento Apócrifo
  • BDM: Baja Administrativa
  • BDP: Baja por Adopción
  • BJD: Baja Judicial

Proxy

Si bien puedes obtener los datos de una CURP sin ninguna accion adicional, cuando realizas más de 15 solicitudes en menos de 1 minuto*, la tecnología de Akamai bloquera tus posteriores peticiones y obtendras el siguiente mensaje de error: El servicio no está disponible

Esto se debe a que, la tecnología de Akamai, basa parte de su detección de bots en un rate-limit y tambien determina si la solicitud proviene de un pool de direcciones IP que pertenezcan a proxies publicos, cloud providers o en general, IP con mala reputación.

Por lo anterior, es recomendable establecer un Proxy Residencial:

// sin autenticacion
$scrapper = new \Gam\CurpScrapper\Renapo\Scrapper(
    proxy: new \Gam\CurpScrapper\Model\Proxy('127.0.0.1', 8383)
);

// con autenticacion
$scrapper = new \Gam\CurpScrapper\Renapo\Scrapper(
    proxy: new \Gam\CurpScrapper\Model\Proxy('127.0.0.1', 8383, 'foo', 'bar')
);

Configuraciones

En ciertos es escenarios puede ser requerido cambiar algunos parametros del scrapper.

  • Path del binario de chrome: Si no es posible ubicarlo en las rutas por defecto, puede especificar la ruta absoluta del binario de chrome con la variable de entorno SCRAPPER_CHROME_BINARY
    putenv('SCRAPPER_CHROME_BINARY=/path/to/binary.exe');
  • Path del webdriver: Si deseas especificar otra ruta para el webdriver (chromedriver.exe):
    $scrapper = new \Gam\CurpScrapper\Renapo\Scrapper(driverPath: '/path/to/driver.exe')
  • Directorio temporal de chrome: Si no es posible crear el directorio temporal por defecto, puede especificar una ruta alterna:
    $scrapper = new \Gam\CurpScrapper\Renapo\Scrapper(dataDir: '/path/to/temp-dir');

Contributing

Contributions are welcome! To contribute, please familiarize yourself with CONTRIBUTING.md.

Coordinated Disclosure

Keeping user information safe and secure is a top priority, and we welcome the contribution of external security researchers. If you believe you've found a security issue in software that is maintained in this repository, please read SECURITY.md for instructions on submitting a vulnerability report.

Copyright and License

gam/curp-scrapper is copyright © Antonio Gamboa. All rights reserved.

TODO

  • Code Coverage