95 lines
2.4 KiB
JavaScript
95 lines
2.4 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; |