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;