geartrack
Version:
Tracking providers for Gearbest and AliExpress Orders.
138 lines (116 loc) • 3.79 kB
JavaScript
;
const request = require('requestretry').defaults({timeout: 10000, maxAttempts: 2, retryDelay: 500})
const parser = require('cheerio')
const utils = require('./utils')
const sprintf = require('sprintf')
const moment = require('moment-timezone')
const zone = "Europe/Madrid" // +1h
const URL = 'https://www.correosexpress.com/web/correosexpress/envios4?param=%s;%s'
const correos = {}
/**
* Get correos info
* Scraps the Correos Express website
* Async
*
* Design changes may break this code!!
* @param id
* @param postalcode
* @param cb(Error, CorreosInfo)
*/
correos.getInfo = function (id, cb) {
request(sprintf(URL, utils.getPostalCode(id), id), function (error, response, body) {
if (error || response.statusCode != 200) {
cb(utils.errorDown())
return
}
// Not found
if (body.indexOf('portlet-msg-error') != -1) {
cb(utils.errorNoData())
return
}
let entity = null
try {
entity = createCorreosEntity(body, id)
entity.retries = response.attempts
} catch (error) {
return cb(utils.errorParser(id, error.message))
}
cb(null, entity)
})
}
/**
* Create correos entity from html
* @param html
*/
function createCorreosEntity(html, id) {
let $ = parser.load(html)
let states = []
const fields = ['date', 'info', 'department']
$('.results-row').each(function (i, elem) {
if (i == 0) return
let state = {}
$(this).children().each(function (s, e) {
let text = $(this).text().trim()
if(s == 0)
text = moment.tz(text, "DD/MM/YY HH:mm", zone).format()
state[fields[s]] = text
})
states.push(state)
})
return new CorreosInfo({
'nenvio': $('#nenvio').val(),
'estado': $('#estado').val(),
'fecha': $('#fecha').val(),
'fechaEstado': $('#fechaEstado').val(),
'sendername': $('#sendername').val(),
'sendercity': $('#sendercity').val(),
'senderaddress': $('#senderaddress').val(),
'receivername': $('#receivername').val(),
'receivercity': $('#receivercity').val(),
'receiveraddress': $('#receiveraddress').val(),
'weight': $('#weight').val(),
'parcels': $('#parcels').val(),
'ref': $('#reference').val(),
'observations': $('#observations').val(),
'states': states,
'id': id
})
}
/*
|--------------------------------------------------------------------------
| Entity
|--------------------------------------------------------------------------
*/
function CorreosInfo(obj) {
// Sent details
this.id = obj.nenvio
this.state = obj.estado
this.received = moment.tz(obj.fecha, "DD/MM/YY", zone).format()
this.lastUpdate = moment.tz(obj.fechaEstado, "DD/MM/YY HH:mm", zone).format()
// Sender Details
this.sender = {
name: obj.sendername.replace('¿', ''),
city: obj.sendercity,
address: obj.senderaddress
}
// Receiver Details
this.receiver = {
name: obj.receivername,
city: obj.receivercity,
address: obj.receiveraddress
}
// Product Details
this.product = {
weight: obj.weight,
parcels: obj.parcels,
ref: obj.ref,
observations: obj.observations
}
//States
this.states = obj.states.reverse()
this.trackerWebsite = correos.getLink(obj.id)
}
correos.getLink = function (id) {
return sprintf(URL, utils.getPostalCode(id), id)
}
module.exports = correos