carg-tracking-cli
Version:
Correo Argentino international tracking cli
144 lines (122 loc) • 3.99 kB
JavaScript
;
var Promise = require('bluebird');
var request = require('request-promise');
var drawInIterm = require('iterm2-image');
var prompt = require('prompt');
var tabletojson = require('tabletojson');
var Table = require('cli-table');
var _ = require('underscore');
var req = request.defaults({
jar: true, // save cookies to jar
rejectUnauthorized: false,
followAllRedirects: true // allow redirections
});
prompt.message = '';
prompt.delimiter = '';
function getImage() {
return new Promise(function (resolve, reject) {
req.get({
url: 'http://www.correoargentino.com.ar/sites/all/modules/custom/ca_forms_core/captcha/securimage/securimage_show.php',
headers: {
'Accept': 'image/webp,image/*,*/*;q=0.8',
'Referer': 'http://www.correoargentino.com.ar/formularios/oidn'
}
}).on('response', function (res) {
drawInIterm(res, function (err) {
if (err) {
reject(err);
return;
}
resolve();
});
});
});
}
function resolveCaptcha() {
return new Promise(function (resolve, reject) {
prompt.start();
prompt.get({
properties: {
captcha: {
description: 'Captcha (case sensitive):',
required: true
}
}
}, function (err, result) {
if (err) {
reject(err);
return;
}
resolve(result.captcha);
});
});
}
function getTrackingInfo(trackingId, captcha) {
return req.post({
url: 'http://www.correoargentino.com.ar/sites/all/modules/custom/ca_forms/api/wsFacade.php',
form: {
id: trackingId,
ct_captcha: captcha.toLowerCase().trim(),
action: 'oidn'
}
});
}
function showInternationalTrackingInfo(tablesAsJson) {
return new Promise(function (resolve) {
console.log('International:');
var keys = Object.keys(tablesAsJson[0]).filter(function (v) {
return v !== 'Acción';
});
var table = new Table({
head: keys
});
tablesAsJson.forEach(function (val) {
return table.push(_.values(_.omit(val, 'Acción')));
});
console.log(table.toString());
resolve();
});
}
function showNationalTrackingInfo(tablesAsJson) {
return new Promise(function (resolve) {
if (!tablesAsJson) {
resolve();
return;
}
console.log('National:');
var keys = Object.keys(tablesAsJson[0]);
var table = new Table({
head: keys
});
tablesAsJson.forEach(function (val) {
return table.push(_.values(_.omit(val, 'Acción')));
});
console.log(table.toString());
resolve();
});
}
function showTrackingInfo(body) {
return new Promise(function (resolve, reject) {
if (body === 'captcha_error') {
reject('Invalid captcha');
return;
}
// Shame on you correargentino.com.ar
var fixedBody = body.replace(/<tbody><td>/g, '<tr><td>').replace(/<\/td><\/tbody>/g, '<\/td></tr>');
var tablesAsJson = tabletojson.convert(fixedBody);
if (tablesAsJson.length === 0) {
console.log('No results');
return Promise.resolve();
}
console.log('Results:');
return showInternationalTrackingInfo(tablesAsJson[0]).then(function () {
return showNationalTrackingInfo(tablesAsJson[1]);
});
});
}
exports.track = function (trackingId) {
console.log('Getting Tracking for %s', trackingId);
getImage().then(resolveCaptcha).then(getTrackingInfo.bind(null, trackingId)).then(showTrackingInfo).catch(function (err) {
return console.error(err);
});
};