@nodecfdi/csf-pdf-scraper
Version:
Obtiene la constancia fiscal actual de una persona moral o física
72 lines (71 loc) • 2.88 kB
JavaScript
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);
});
});
}
}