geartrack
Version:
Tracking providers for Gearbest and AliExpress Orders.
121 lines (100 loc) • 3.26 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 = "Asia/Hong_Kong" // +8h
const URL = 'http://www.faryaa.com/user/index/package-refer/type/track?order_number={{id}}&button_search=Track'
const panasia = {}
/**
* Get panasia info
* Scraps the Panasia website
* Async
*
* Design changes may break this code!!
* @param id
* @param cb(Error, PanasiaInfo)
*/
panasia.getInfo = function (id, cb) {
request(URL.replace('{{id}}', id), function (error, response, body) {
if (error || response.statusCode != 200) {
cb(utils.errorDown())
return
}
// Not found
if (body.indexOf('Order does not exist') != -1 || body.indexOf('one-parcel') == -1) {
cb(utils.errorNoData())
return
}
let entity = null
try {
entity = createPanasiaEntity(body, id)
entity.retries = response.attempts
} catch (error) {
return cb(utils.errorParser(id, error.message))
}
cb(null, entity)
})
}
/**
* Create panasia entity from html
* @param html
* @param id
*/
function createPanasiaEntity(html, id) {
let $ = parser.load(html)
let td11 = $('.one-parcel .td11').contents()
let orderNumber = td11[1].data
let product = td11[3].data
let td22 = $('.one-parcel .td22').contents()
let trackingNumber = td22[1].data
let country = utils.removeChineseChars(td22[3].data).trim()
let td33 = $('.one-parcel .td33').contents()
let dates = []
for(let i = 1; i < td33.length; ++i) {
let date = td33[i].children[1].data
dates.push(moment.tz(date, "YYYY-MM-DD HH:mm:ss", zone).format())
}
let td44 = $('.one-parcel .td44').contents()
let states = []
for(let i = 0; i < td44.length; ++i) {
let s = td44[i].children[0].data
states.push(s.replace(',', ', ').replace('En tr?nsito', 'En transito'))
}
let finalStates = []
for(let i = 0; i < dates.length; ++i) {
finalStates.push({
state: states[i],
date: dates[i]
})
}
return new PanasiaInfo({
orderNumber: orderNumber,
product: product,
id: id,
country: country,
states: finalStates.sort((a, b) => {
let dateA = moment(a.date),
dateB = moment(b.date)
return dateA < dateB
})
})
}
/*
|--------------------------------------------------------------------------
| Entity
|--------------------------------------------------------------------------
*/
function PanasiaInfo(obj) {
this.id = obj.id
this.states = obj.states
this.orderNumber = obj.orderNumber
this.product = obj.product
this.country = obj.country
this.trackerWebsite = panasia.getLink(obj.id)
}
panasia.getLink = function (id) {
return URL.replace('{{id}}', id)
}
module.exports = panasia