1. Go to this page and download the library: Download phpcfdi/cfdi-sat-scraper library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
phpcfdi / cfdi-sat-scraper example snippets
declare(strict_types=1);
use PhpCfdi\CfdiSatScraper\QueryByFilters;
use PhpCfdi\CfdiSatScraper\Filters\Options\ComplementsOption;
use PhpCfdi\CfdiSatScraper\Filters\DownloadType;
use PhpCfdi\CfdiSatScraper\Filters\Options\StatesVoucherOption;
use PhpCfdi\CfdiSatScraper\Filters\Options\RfcOnBehalfOption;
use PhpCfdi\CfdiSatScraper\Filters\Options\RfcOption;
// se crea con un rango de fechas específico
$query = new QueryByFilters(new DateTimeImmutable('2019-03-01'), new DateTimeImmutable('2019-03-31'));
$query
->setDownloadType(DownloadType::recibidos()) // en lugar de emitidos
->setStateVoucher(StatesVoucherOption::vigentes()) // en lugar de todos
->setRfc(new RfcOption('EKU9003173C9')) // de este RFC específico
->setComplement(ComplementsOption::reciboPagoSalarios12()) // que incluya este complemento
->setRfcOnBehalf(new RfcOnBehalfOption('AAA010101AAA')) // con este RFC A cuenta de terceros
;
declare(strict_types=1);
use PhpCfdi\CfdiSatScraper\QueryByFilters;
use PhpCfdi\CfdiSatScraper\ResourceType;
use PhpCfdi\CfdiSatScraper\SatScraper;
use PhpCfdi\CfdiSatScraper\Sessions\Ciec\CiecSessionManager;
use PhpCfdi\ImageCaptchaResolver\CaptchaResolverInterface;
/** @var CaptchaResolverInterface $captchaResolver */
$satScraper = new SatScraper(CiecSessionManager::create('rfc', 'ciec', $captchaResolver));
$query = new QueryByFilters(new DateTimeImmutable('2019-03-01'), new DateTimeImmutable('2019-03-31'));
$list = $satScraper->listByPeriod($query);
// impresión de cada uno de los metadata
foreach ($list as $cfdi) {
echo 'UUID: ', $cfdi->uuid(), PHP_EOL;
echo 'Emisor: ', $cfdi->get('rfcEmisor'), ' - ', $cfdi->get('nombreEmisor'), PHP_EOL;
echo 'Receptor: ', $cfdi->get('rfcReceptor'), ' - ', $cfdi->get('nombreReceptor'), PHP_EOL;
echo 'Fecha: ', $cfdi->get('fechaEmision'), PHP_EOL;
echo 'Tipo: ', $cfdi->get('efectoComprobante'), PHP_EOL;
echo 'Estado: ', $cfdi->get('estadoComprobante'), PHP_EOL;
}
// descarga de cada uno de los CFDI, reporta los descargados en $downloadedUuids
$downloadedUuids = $satScraper->resourceDownloader(ResourceType::xml(), $list)
->setConcurrency(50) // cambiar a 50 descargas simultáneas
->saveTo('/storage/downloads'); // ejecutar la instrucción de descarga
echo json_encode($downloadedUuids);
declare(strict_types=1);
use PhpCfdi\CfdiSatScraper\Filters\DownloadType;
use PhpCfdi\CfdiSatScraper\SatScraper;
use PhpCfdi\CfdiSatScraper\Sessions\Ciec\CiecSessionManager;
use PhpCfdi\ImageCaptchaResolver\CaptchaResolverInterface;
/** @var CaptchaResolverInterface $captchaResolver */
$satScraper = new SatScraper(CiecSessionManager::create('rfc', 'ciec', $captchaResolver));
$uuids = [
'5cc88a1a-8672-11e6-ae22-56b6b6499611',
'5cc88c4a-8672-11e6-ae22-56b6b6499612',
'5cc88d4e-8672-11e6-ae22-56b6b6499613'
];
$list = $satScraper->listByUuids($uuids, DownloadType::recibidos());
echo json_encode($list);
declare(strict_types=1);
use PhpCfdi\CfdiSatScraper\NullMetadataMessageHandler;
use PhpCfdi\CfdiSatScraper\QueryByFilters;
use PhpCfdi\CfdiSatScraper\SatHttpGateway;
use PhpCfdi\CfdiSatScraper\SatScraper;
use PhpCfdi\CfdiSatScraper\Sessions\SessionManager;
/**
* @var SessionManager $sessionManager
* @var SatHttpGateway $httpGateway
*/
// se define el controlador de mensajes
$handler = new class () extends NullMetadataMessageHandler {
public function maximum(DateTimeImmutable $date): void
{
echo 'Se encontraron más de 500 CFDI en el segundo: ', $date->format('c'), PHP_EOL;
}
};
// se crea el scraper usando el controlador de mensajes
$satScraper = new SatScraper($sessionManager, $httpGateway, $handler);
$query = new QueryByFilters(new DateTimeImmutable('2019-03-01'), new DateTimeImmutable('2019-03-31'));
$list = $satScraper->listByPeriod($query);
echo json_encode($list);
declare(strict_types=1);
use PhpCfdi\CfdiSatScraper\QueryByFilters;
use PhpCfdi\CfdiSatScraper\ResourceType;
use PhpCfdi\CfdiSatScraper\SatScraper;
use PhpCfdi\CfdiSatScraper\Sessions\Ciec\CiecSessionManager;
use PhpCfdi\ImageCaptchaResolver\CaptchaResolverInterface;
/** @var CaptchaResolverInterface $captchaResolver */
$satScraper = new SatScraper(CiecSessionManager::create('rfc', 'ciec', $captchaResolver));
$query = new QueryByFilters(new DateTimeImmutable('2019-03-01'), new DateTimeImmutable('2019-03-31'));
$list = $satScraper->listByPeriod($query);
// $downloadedUuids contiene un listado de UUID que fueron procesados correctamente, 50 descargas simultáneas
$downloadedUuids = $satScraper->resourceDownloader(ResourceType::xml(), $list, 50)
->saveTo('/storage/downloads', true, 0777);
echo json_encode($downloadedUuids);
declare(strict_types=1);
use PhpCfdi\CfdiSatScraper\Contracts\ResourceDownloadHandlerInterface;
use PhpCfdi\CfdiSatScraper\Exceptions\ResourceDownloadError;
use PhpCfdi\CfdiSatScraper\Exceptions\ResourceDownloadResponseError;
use PhpCfdi\CfdiSatScraper\Exceptions\ResourceDownloadRequestExceptionError;
use PhpCfdi\CfdiSatScraper\QueryByFilters;
use PhpCfdi\CfdiSatScraper\ResourceType;
use PhpCfdi\CfdiSatScraper\SatScraper;
use PhpCfdi\CfdiSatScraper\Sessions\Ciec\CiecSessionManager;
use PhpCfdi\ImageCaptchaResolver\CaptchaResolverInterface;
use Psr\Http\Message\ResponseInterface;
/** @var CaptchaResolverInterface $captchaResolver */
$satScraper = new SatScraper(CiecSessionManager::create('rfc', 'ciec', $captchaResolver));
$query = new QueryByFilters(new DateTimeImmutable('2019-03-01'), new DateTimeImmutable('2019-03-31'));
$list = $satScraper->listByPeriod($query);
$myHandler = new class implements ResourceDownloadHandlerInterface {
public function onSuccess(string $uuid, string $content, ResponseInterface $response): void
{
$filename = '/storage/' . $uuid . '.xml';
echo 'Saving ', $uuid, PHP_EOL;
file_put_contents($filename, (string) $response->getBody());
}
public function onError(ResourceDownloadError $error) : void
{
if ($error instanceof ResourceDownloadRequestExceptionError) {
echo "Error getting {$error->getUuid()} from {$error->getReason()->getRequest()->getUri()}\n";
} elseif ($error instanceof ResourceDownloadResponseError) {
echo "Error getting {$error->getUuid()}, invalid response: {$error->getMessage()}\n";
$response = $error->getReason(); // reason is a ResponseInterface
print_r(['headers' => $response->getHeaders(), 'body' => $response->getBody()]);
} else { // ResourceDownloadError
echo "Error getting {$error->getUuid()}, reason: {$error->getMessage()}\n";
print_r(['reason' => $error->getReason()]);
}
}
};
// $downloadedUuids contiene un listado de UUID que fueron procesados correctamente
$downloadedUuids = $satScraper->resourceDownloader(ResourceType::xml(), $list)->download($myHandler);
echo json_encode($downloadedUuids);
declare(strict_types=1);
use PhpCfdi\CfdiSatScraper\SatScraper;
use PhpCfdi\CfdiSatScraper\Sessions\Ciec\CiecSessionManager;
use PhpCfdi\ImageCaptchaResolver\BoxFacturaAI\BoxFacturaAIResolver;
$configsFile = 'storage/boxfactura-model/configs.yaml';
$captchaResolver = BoxFacturaAIResolver::createFromConfigs($configsFile);
$satScraper = new SatScraper(CiecSessionManager::create('rfc', 'ciec', $captchaResolver));
declare(strict_types=1);
use PhpCfdi\CfdiSatScraper\SatScraper;
use PhpCfdi\CfdiSatScraper\Sessions\Ciec\CiecSessionManager;
use PhpCfdi\ImageCaptchaResolver\Resolvers\AntiCaptchaResolver;
$captchaResolver = AntiCaptchaResolver::create('anticaptcha-client-key');
$satScraper = new SatScraper(CiecSessionManager::create('rfc', 'ciec', $captchaResolver));
declare(strict_types=1);
use PhpCfdi\CfdiSatScraper\Exceptions\LoginException;
use PhpCfdi\CfdiSatScraper\SatScraper;
use PhpCfdi\CfdiSatScraper\Sessions\Ciec\CiecSessionManager;
use PhpCfdi\ImageCaptchaResolver\CaptchaResolverInterface;
/** @var CaptchaResolverInterface $captchaResolver */
$satScraper = new SatScraper(CiecSessionManager::create('rfc', 'ciec', $captchaResolver));
try {
$satScraper->confirmSessionIsAlive();
} catch (LoginException $exception) {
echo 'ERROR: ', $exception->getMessage(), PHP_EOL;
return;
}
declare(strict_types=1);
use PhpCfdi\CfdiSatScraper\SatScraper;
use PhpCfdi\CfdiSatScraper\Sessions\Fiel\FielSessionManager;
use PhpCfdi\CfdiSatScraper\Sessions\Fiel\FielSessionData;
use PhpCfdi\Credentials\Credential;
/**
* @var string $certificate Contenido del certificado
* @var string $privateKey Contenido de la llave privada
* @var string $passPhrase Contraseña de la llave privada
*/
// crear la credencial
// se puede usar Credential::openFiles(certificateFile, privateKeyFile, passphrase) si la FIEL está en archivos
$credential = Credential::create($certificate, $privateKey, $passPhrase);
if (! $credential->isFiel()) {
throw new Exception('The certificate and private key is not a FIEL');
}
if (! $credential->certificate()->validOn()) {
throw new Exception('The certificate and private key is not valid at this moment');
}
// crear el objeto scraper usando la FIEL
$satScraper = new SatScraper(FielSessionManager::create($credential));
declare(strict_types=1);
use GuzzleHttp\Client;
use GuzzleHttp\RequestOptions;
use PhpCfdi\CfdiSatScraper\SatHttpGateway;
use PhpCfdi\CfdiSatScraper\SatScraper;
use PhpCfdi\CfdiSatScraper\Sessions\SessionManager;
$insecureClient = new Client([
RequestOptions::VERIFY => false
]);
$gateway = new SatHttpGateway($insecureClient);
/** @var SessionManager $sessionManager */
$scraper = new SatScraper($sessionManager, $gateway);
declare(strict_types=1);
use GuzzleHttp\Client;
use PhpCfdi\CfdiSatScraper\SatHttpGateway;
use PhpCfdi\CfdiSatScraper\SatScraper;
use PhpCfdi\CfdiSatScraper\Sessions\SessionManager;
$client = new Client([
'curl' => [CURLOPT_SSL_CIPHER_LIST => 'DEFAULT@SECLEVEL=1'],
]);
/** @var SessionManager $sessionManager */
$scraper = new SatScraper($sessionManager, new SatHttpGateway($client));
Loading please wait ...
Before you can download the PHP files, the dependencies should be resolved. This can take some minutes. Please be patient.