AutoCatBackend/data_providers/rsa.js
Selim Mustafaev b8b8b13b06 OSAGO check
2020-11-29 10:19:16 +03:00

95 lines
2.3 KiB
JavaScript

const fetch = require('node-fetch');
const https = require('https');
const parser = require('node-html-parser');
const httpsAgent = new https.Agent({
rejectUnauthorized: false
});
class RsaProvider {
static async getProcessId(number, vin, dateStr, token) {
let url = 'https://dkbm-web.autoins.ru/dkbm-web-1.0/policyInfo.htm';
let result = await fetch(url, {
method: 'POST',
body: new URLSearchParams({
requestDate: dateStr,
licensePlate: number,
vin: vin,
isBsoRequest: false,
captcha: token
}),
agent: httpsAgent
});
let json = await result.json();
if(!json.validCaptcha) {
throw Error('Invalid captcha token');
}
if(!json.processId) {
throw Error('Process ID is null');
}
return json.processId;
}
static async getReportHtml(number, vin, dateStr, processId) {
let url = 'https://dkbm-web.autoins.ru/dkbm-web-1.0/policyInfoData.htm';
let result = await fetch(url, {
method: 'POST',
body: new URLSearchParams({
requestDate: dateStr,
licensePlate: number,
vin: vin,
isBsoRequest: false,
processId
}),
agent: httpsAgent
});
return await result.text();
}
static parseReport(html) {
let root = parser.parse(html);
if(!root) {
throw Error('Failed to parse dkbm response');
}
let tr = root.querySelector('.data-row');
if(tr) {
let data = tr.childNodes.filter(n => n.nodeType == 1);
let result = {
number: data[1].rawText,
name: data[2].rawText,
status: data[3].rawText,
restrictions: data[9].rawText,
insurant: data[10].rawText,
owner: data[11].rawText,
usageRegion: data[13].rawText
};
let vehicleData = data[5].querySelectorAll('td');
if(vehicleData.length > 0) {
result.plateNumber = vehicleData[3].rawText;
result.vin = vehicleData[5].rawText;
}
return result;
} else {
throw Error('Failed to find data in dkbm response');
}
}
static async checkOsago(number, vin, timestamp, token) {
let date = new Date(timestamp*1000);
let dateStr = `${date.getDate()}.${date.getMonth() + 1}.${date.getFullYear()}`;
let processId = await this.getProcessId(number, vin, dateStr, token);
let reportHtml = await this.getReportHtml(number, vin, dateStr, processId);
let report = this.parseReport(reportHtml);
report.date = timestamp;
return report;
}
}
module.exports = RsaProvider;