PHPackages                             phpcfdi/cfdi-sat-scraper - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. phpcfdi/cfdi-sat-scraper

ActiveLibrary[Utility &amp; Helpers](/categories/utility)

phpcfdi/cfdi-sat-scraper
========================

Web Scraping para extraer facturas electrónicas desde la página del SAT

v5.0.3(5mo ago)9018.0k↓15.2%27MITPHPPHP &gt;=8.2CI failing

Since Apr 19Pushed 5mo ago14 watchersCompare

[ Source](https://github.com/phpcfdi/cfdi-sat-scraper)[ Packagist](https://packagist.org/packages/phpcfdi/cfdi-sat-scraper)[ RSS](/packages/phpcfdi-cfdi-sat-scraper/feed)WikiDiscussions main Synced 1mo ago

READMEChangelog (10)Dependencies (13)Versions (26)Used By (0)

phpcfdi/cfdi-sat-scraper
========================

[](#phpcfdicfdi-sat-scraper)

[![Source Code](https://camo.githubusercontent.com/83e5330b582e42b52b86407c67954266fcd25b4b94b7941cb9d36d5fa052aa18/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f736f757263652d706870636664692f636664692d2d7361742d2d736372617065722d626c75653f6c6f676f3d676974687562)](https://github.com/phpcfdi/cfdi-sat-scraper)[![Packagist PHP Version Support](https://camo.githubusercontent.com/12b71d18beb2a06395fbece8c3e4fcc75667eed7d0c4324531fcb9737d8b6c3b/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f7068702d762f706870636664692f636664692d7361742d736372617065723f6c6f676f3d706870)](https://packagist.org/packages/phpcfdi/cfdi-sat-scraper)[![Discord](https://camo.githubusercontent.com/e7d280832b4bb781e0e83dc7b04440636ea6a67d076133da0938b79caab9d6dd/68747470733a2f2f696d672e736869656c64732e696f2f646973636f72642f3435393836303535343039303238333031393f6c6f676f3d646973636f7264)](https://discord.gg/aFGYXvX)[![Latest Version](https://camo.githubusercontent.com/8bd28c445367a8304eaad4fe3189e1e1484a62a6a4f8e6a4a53af1b165feab31/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f72656c656173652f706870636664692f636664692d7361742d736372617065723f6c6f676f3d676974)](https://github.com/phpcfdi/cfdi-sat-scraper/releases)[![Software License](https://camo.githubusercontent.com/c870aa3ef6f9d536e051ae4bf7595ec4485372373b375d2c62938aebbc65b0db/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f706870636664692f636664692d7361742d736372617065723f6c6f676f3d6f70656e2d736f757263652d696e6974696174697665)](https://github.com/phpcfdi/cfdi-sat-scraper/blob/main/LICENSE)[![Build Status](https://camo.githubusercontent.com/fea5f3f8eb46602e45db3066e8591b4341137bb7efaa424f2e7bcee4f29d2da0/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f616374696f6e732f776f726b666c6f772f7374617475732f706870636664692f636664692d7361742d736372617065722f6275696c642e796d6c3f6272616e63683d6d61696e266c6f676f3d6769746875622d616374696f6e73)](https://github.com/phpcfdi/cfdi-sat-scraper/actions/workflows/build.yml?query=branch:main)[![Reliability](https://camo.githubusercontent.com/c1f4a451868a65bdeb44c4dab93af707c249ae4312bc2f93db6f84b074777823/68747470733a2f2f736f6e6172636c6f75642e696f2f6170692f70726f6a6563745f6261646765732f6d6561737572653f70726f6a6563743d706870636664695f636664692d7361742d73637261706572266d65747269633d72656c696162696c6974795f726174696e67)](https://sonarcloud.io/component_measures?id=phpcfdi_cfdi-sat-scraper&metric=Reliability)[![Maintainability](https://camo.githubusercontent.com/d8b572bd92ba32045e89485473ea656e6a8e47e2f7dbc074a5de2830695e4a24/68747470733a2f2f736f6e6172636c6f75642e696f2f6170692f70726f6a6563745f6261646765732f6d6561737572653f70726f6a6563743d706870636664695f636664692d7361742d73637261706572266d65747269633d7371616c655f726174696e67)](https://sonarcloud.io/component_measures?id=phpcfdi_cfdi-sat-scraper&metric=Maintainability)[![Code Coverage](https://camo.githubusercontent.com/152f311cba17524953439dacdc4715af9ed3d1ad1978ff03e59fa83dee74be9f/68747470733a2f2f696d672e736869656c64732e696f2f736f6e61722f636f7665726167652f706870636664695f636664692d7361742d736372617065722f6d61696e3f6c6f676f3d736f6e617271756265636c6f7564267365727665723d6874747073253341253246253246736f6e6172636c6f75642e696f)](https://sonarcloud.io/component_measures?id=phpcfdi_cfdi-sat-scraper&metric=Coverage)[![Violations](https://camo.githubusercontent.com/f7e5fcfc784b73894ebb40e2f6620a47698a104cea661c72a9419ac01c69ad3c/68747470733a2f2f696d672e736869656c64732e696f2f736f6e61722f76696f6c6174696f6e732f706870636664695f636664692d7361742d736372617065722f6d61696e3f666f726d61743d6c6f6e67266c6f676f3d736f6e617271756265636c6f7564267365727665723d6874747073253341253246253246736f6e6172636c6f75642e696f)](https://sonarcloud.io/project/issues?id=phpcfdi_cfdi-sat-scraper&resolved=false)[![Total Downloads](https://camo.githubusercontent.com/cd662bf03c0c4b91198d852193253a1b062eb48b3224dc8b1f2612b2264e03ad/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f64742f706870636664692f636664692d7361742d736372617065723f6c6f676f3d7061636b6167697374)](https://packagist.org/packages/phpcfdi/cfdi-sat-scraper)

Obtiene las facturas emitidas, recibidas, vigentes y cancelados por medio de web scraping desde la página del SAT. Los recursos descargables son los archivos XML de CFDI y los archivos PDF de representación impresa, solicitud de cancelación y acuse de cancelación.

Instalacion por composer
------------------------

[](#instalacion-por-composer)

```
composer require phpcfdi/cfdi-sat-scraper
```

Funcionamiento
--------------

[](#funcionamiento)

El servicio de descarga de CFDI del SAT que se encuentra en la dirección , requiere identificarse con RFC, Clave CIEC y de la resolución de un *captcha*, o bien, utilizando el certificado y llave privada FIEL.

Una vez dentro del sitio se pueden consultar facturas emitidas y facturas recibidas. Ya sea por UUID o por filtro.

- Criterios:

    - Tipo: Emitidas o recibidas.
    - Filtro: UUID o consulta.
- Consulta de emitidas:

    - Fecha y hora de emisión.
    - Fecha y hora de recepción.
    - RFC Receptor.
    - Estado del comprobante (cualquiera, vigente o cancelado).
    - Tipo de comprobante (si contiene un complemento específico).
    - RFC A cuenta de terceros.
- Consulta de recibidas:

    - Fecha de emisión.
    - Hora inicial y hora final (dentro de la fecha de emisión).
    - RFC Emisor.
    - Estado del comprobante (cualquiera, vigente o cancelado).
    - Tipo de comprobante (si contiene un complemento específico).
    - RFC A cuenta de terceros.

El servicio de búsqueda regresa una tabla con información, con un tope de 500 registros por consulta (aun cuando existan más, solo se muestran 500).

Una vez con el listado el sitio ofrece ligas para poder descargar el archivo XML del CFDI.

Implementación del funcionamiento del sitio en la librería
----------------------------------------------------------

[](#implementación-del-funcionamiento-del-sitio-en-la-librería)

El objeto principal de trabajo se llama `SatScraper` con el que se pueden realizar consultas por rango de fecha o por UUIDS específicos y obtener resultados. La consulta por UUID (uno o varios) se ejecuta con el método `listByUuids` y el resultado es un `MetadataList`. La consulta por filtros se llama `QueryByFilters`, se ejecuta con los métodos `listByPeriod` y `listByDateTime`y el resultado es un `MetadataList`.

Para generar los resultados del `MetadataList` la librería cuenta con una estrategia de división. Si se trata de una consulta de CFDI por filtros automáticamente se divide por día. En caso de que en el periodo consultado se encuentren 500 o más registros entonces la búsqueda se va subdividiendo en diferentes periodos, hasta llegar a la consulta mínima de 1 segundo. Luego los resultados son nuevamente unidos.

Una vez que tienes un listado `MetadataList` se puede aplicar un filtro para obtener un nuevo listado con únicamente los objetos `Metadata` donde el UUID coincide; o bien, usar otros filtros como solo los que contienen un determinado recurso descargable.

Una vez con los resultados `MetadataList` se puede solicitar una descarga a una carpeta específica o bien por medio de un objeto *handler*. El proceso de descarga permite hacer varias descargas en forma simultánea.

La descarga puede ser de archivos de:

- Archivos de CFDI (XML).
- Representación impresa del CFDI (PDF).
- Solicitud de cancelación (PDF).
- Acuse de cancelación (PDF).

Los métodos para ejecutar la descarga de metadata son:

- Por UUID: `SatScraper::listByUuids(string[] $uuids, DownloadType $type): MetadataList`
- Por filtros con días completos: `SatScraper::listByPeriod(Query $query): MetadataList`
- Por filtros con fechas exactas: `SatScraper::listByDateTime(Query $query): MetadataList`

Y una vez con el objeto `MetadataList` se crea un objeto descargador de recursos `ResourceDownloader`y se le pide que ejecute las descargas por tipo de recurso.

- Creación: `SatScraper::resourceDownloader(ResourceType $resourceType, MetadataList $list = null, int $concurrency = 10): ResourceDownloader`
- Guardar a una carpeta: `ResourceDownloader::saveTo(string $destination): void`
- Guardar con un manejador: `ResourceDownloader::download(ResourceDownloadHandlerInterface $handler): void`

Si se llega a la consulta mínima de 1 segundo y se obtuvieron 500 o más registros entonces adicionalmente se llama a un *callback* (opcional) para reportar este acontecimiento.

La búsqueda siempre debe crearse con un rango de fechas, además en forma predeterminada, se busca por CFDI emitidos, con cualquier complemento y con cualquier estado (vigente o cancelado). Sin embargo, puedes cambiar la búsqueda antes de enviar a procesarla.

Esta librería está basada en [Guzzle](https://github.com/guzzle/guzzle), por lo que puedes configurar el cliente a tus propias necesidades como configurar un proxy o depurar las llamadas HTTP. Gracias a esta librería podemos ofrecer descargas simultáneas de XML y hacer el proceso de comunicación mucho más veloz que si se estuviera utilizando un navegador completo.

Autenticación
-------------

[](#autenticación)

Esta librería permite identificarse ante el SAT utilizando alguno de dos mecanismos: Clave CIEC o FIEL.

### Autenticación por FIEL

[](#autenticación-por-fiel)

Para identificarse utilizando la FIEL se necesita usar el manejador de sesiones `FielSessionManager`, con el respectivo certificado, llave privada y contraseña de la llave privada.

La ventaja de este método es que no requiere de un resolvedor de captchas. La desventaja es que es riesgoso trabajar con la FIEL.

Advertencia: No utilice este mecanismo a menos que se trate de su propia FIEL. La FIEL en México está regulada por la "Ley de Firma Electrónica Avanzada". Su uso es extenso y no está limitado al SAT, con ella se pueden realizar múltiples operaciones legales. En PhpCfdi no recomendamos que almacene o use la FIEL de terceras personas.

### Autenticación por clave CIEC

[](#autenticación-por-clave-ciec)

Para identificarse utilizando la clave CIEC se necesita usar el manejador de sesiones `CiecSessionManager`, con los datos de RFC, Clave CIEC y un resolvedor de captchas.

La ventaja de este método es que no se requiere la FIEL. La desventaja es que se requiere un resolvedor de captchas.

La resolución de captchas se realiza a través de la librería de resolución de captchas [`phpcfdi/image-captcha-resolver`](https://github.com/phpcfdi/image-captcha-resolver).

Para entornos de desarrollo y producción recomendamos utilizar la resolución de captchas con el proyecto [`phpcfdi/image-captcha-resolver-boxfactura-ai`](https://github.com/phpcfdi/image-captcha-resolver-boxfactura-ai)(gracias al trabajo de [BOX Factura](https://www.boxfactura.com/)).

Si estás usando un servicio que no está implementado puedes revisar la documentación de este proyecto e integrar el servicio dentro de los clientes soportados.

Ejemplo de elaboración de consulta
----------------------------------

[](#ejemplo-de-elaboración-de-consulta)

```
