UNPKG

@nodecfdi/csf-pdf-scraper

Version:

Obtiene la constancia fiscal actual de una persona moral o física

72 lines (71 loc) 2.88 kB
import { createWriteStream } from 'node:fs'; import { pipeline } from 'node:stream'; import { promisify } from 'node:util'; import { HtmlForm, PortalRfcAmpcUrls } from '@nodecfdi/sat-scrapers-auth'; export default class Scraper { _portal; constructor(_portal) { this._portal = _portal; } async downloadAsBase64(once = true) { await this._portal.confirmSessionIsAlive(); await this.generateConstancia(); const response = this._portal.getHttpGateway().getStream(PortalRfcAmpcUrls.DownloadConstancia); const resultBase64 = await this.readStreamToBase64(response); if (once) { await this._portal.logout(); } return resultBase64; } async downloadAsFile(targetPath, once = true) { await this._portal.confirmSessionIsAlive(); await this.generateConstancia(); const response = this._portal.getHttpGateway().getStream(PortalRfcAmpcUrls.DownloadConstancia); const streamPipeline = promisify(pipeline); await streamPipeline(response, createWriteStream(targetPath)); if (once) { await this._portal.logout(); } } async generateConstancia() { const satHttpGateway = this._portal.getHttpGateway(); let foundedButtonGenerateConstancia = false; try { const htmlMainPage = await this._portal.getPortalMainPage(); foundedButtonGenerateConstancia = htmlMainPage.includes('formReimpAcuse:j_idt50'); const inputs = new HtmlForm(htmlMainPage, 'form').getFormValues(); if (Object.keys(inputs).length > 0) { const request = { ...inputs, 'javax.faces.partial.ajax': 'true', 'javax.faces.source': 'formReimpAcuse:j_idt50', 'javax.faces.partial.execute': '@all', 'formReimpAcuse:j_idt50': 'formReimpAcuse:j_idt50', }; await satHttpGateway.postAjax(PortalRfcAmpcUrls.ConsultaTramite, PortalRfcAmpcUrls.ConsultaTramite, request); } } catch (error) { throw new AggregateError([error], 'Cannot generate constancia'); } if (!foundedButtonGenerateConstancia) { throw new Error('Constancia not found'); } } async readStreamToBase64(readStream) { return new Promise((resolve, reject) => { const chunks = []; readStream.on('data', (chunk) => { chunks.push(chunk); }); readStream.on('end', () => { const buffer = Buffer.concat(chunks); const base64 = buffer.toString('base64'); resolve(base64); }); readStream.on('error', (err) => { reject(err); }); }); } }