OSAGO check

This commit is contained in:
Selim Mustafaev 2020-11-29 10:19:16 +03:00
parent a7b0a609ff
commit b8b8b13b06
4 changed files with 3166 additions and 18 deletions

View File

@ -1,10 +1,13 @@
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 checkOsago(number, vin, timestamp, token) {
let date = new Date(timestamp*1000);
let dateStr = `${date.getDate()}.${date.getMonth() + 1}.${date.getFullYear()}`;
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',
@ -14,11 +17,78 @@ class RsaProvider {
vin: vin,
isBsoRequest: false,
captcha: token
})
}),
agent: httpsAgent
});
let json = await result.json();
console.log(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;
}
}

3088
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -19,6 +19,7 @@
"jsonwebtoken": "^8.5.1",
"mongodb": "^3.6.1",
"node-fetch": "^2.6.1",
"node-html-parser": "^2.0.0",
"pubnub": "^4.29.6",
"uuid": "^8.3.0"
},

View File

@ -161,8 +161,19 @@ router.get('/shared_report', cors({ origin: 'https://auto.aliencat.pro' }), asyn
router.post('/checkOsago', async (req, res) => {
try {
const { number, vin, date, token } = req.body;
console.log('Body: ', req.body);
let result = await RsaProvider.checkOsago(number, vin, date, token);
console.log(result);
let collection = req.db.collection('vehicles');
let filter = number ? { number } : { vin1: vin };
await collection.updateOne(filter, { $push: { osagoContracts: result } });
let vehicle = await collection.findOne(filter);
if(vehicle) {
res.send({ success: true, data: vehicle });
} else {
res.status(204).send(makeError('There is no vehicle with such plate number or VIN'));
}
} catch(ex) {
res.send(makeError(ex.message));
console.error(ex);