jarviscrawlercore
Version:
jarvis crawler core
332 lines (286 loc) • 9.09 kB
JavaScript
const {holdBarMove} = require('../captcha.js');
const log = require('../log');
/**
* closeDialog - close dialog
* @param {object} page - page
* @return {error} err - error
*/
async function closeDialog(page) {
let awaiterr;
const lstbtn = await page.$$('#sufei-dialog-close').catch((err) => {
awaiterr = err;
});
if (awaiterr) {
return awaiterr;
}
if (lstbtn.length > 0) {
await lstbtn[0].hover();
await lstbtn[0].click();
}
// const frames = await page.frames();
// for (let i = 0; i < frames.length; ++i) {
// if (frames[i]._name == 'sufei-dialog-content') {
// const lstbtn = await frames[i].$$('#sufei-dialog-close').catch((err) => {
// awaiterr = err;
// });
// if (awaiterr) {
// return awaiterr;
// }
// if (lstbtn.length > 0) {
// await lstbtn[0].hover();
// await lstbtn[0].click();
// }
// return undefined;
// }
// }
return undefined;
}
/**
* nocaptcha - nocaptcha
* @param {object} page - page
* @return {object} ret - {isnocaptcha, error}
*/
async function nocaptcha(page) {
let awaiterr;
const frames = await page.frames();
for (let i = 0; i < frames.length; ++i) {
if (frames[i]._name == 'sufei-dialog-content') {
const lstnocaptcha = await frames[i].$$('#nocaptcha').catch((err) => {
awaiterr = err;
});
if (awaiterr) {
return {error: awaiterr};
}
if (lstnocaptcha.length > 0) {
const lstcoscale = await frames[i].$$('.nc_scale').catch((err) => {
awaiterr = err;
});
if (awaiterr) {
return {error: awaiterr};
}
const lstslide = await frames[i]
.$$('.nc_iconfont.btn_slide')
.catch((err) => {
awaiterr = err;
});
if (awaiterr) {
return {error: awaiterr};
}
if (lstslide.length > 0 && lstcoscale.length > 0) {
const bbbox0 = await lstslide[0].boundingBox();
const bbbox1 = await lstcoscale[0].boundingBox();
await holdBarMove(page, bbbox0, bbbox1, 500, Math.floor(1000 / 60));
return {isnocaptcha: true};
}
}
}
}
return {isnocaptcha: false};
}
/**
* findSKUType - find skutype
* @param {object} lstskut - sku type list
* @param {string} typevalue - typevalue, if value is 5919063:6536025, the typevalue is 5919063
* @return {object} skutypeobj - skutype object
*/
function findSKUType(lstskut, typevalue) {
for (let i = 0; i < lstskut.length; ++i) {
if (lstskut[i].typevalue == typevalue) {
return lstskut[i];
}
}
return undefined;
}
// /**
// * findSKU - find sku
// * @param {object} lstsku - sku list
// * @param {string} value - value, if value like 5919063:6536025
// * @return {object} skuobj - sku object
// */
// function findSKU(lstsku, value) {
// for (let i = 0; i < lstsku.length; ++i) {
// if (lstsku[i].value == value) {
// return lstsku[i];
// }
// }
// return undefined;
// }
/**
* procSKU - 处理SKU数据,支持多种选择
* 因为可能有多种分类,譬如颜色和套餐,所以这块需要有一点点的逻辑处理
* @param {object} skus - skus, [{value, curimg}]
* @param {object} tbtxt - tbtxt from .tb-txt, map[value] => title
* @param {object} skusret - skusret from Hub
* @param {object} sibobj - sibobj, sib.htm onSibRequestSuccess的返回
* @return {object} ret - {lstskut, lstsku, error}
*/
function procSKU(skus, tbtxt, skusret, sibobj) {
const lstskut = [];
for (let i = 0; i < skus.length; ++i) {
if (skus[i].value) {
const cvarr = skus[i].value.split(':');
if (cvarr && cvarr.length == 2) {
let cursku = findSKUType(lstskut, cvarr[0]);
if (cursku == undefined) {
cursku = {
typevalue: cvarr[0],
skus: [],
};
lstskut.push(cursku);
}
cursku.skus.push(skus[i]);
} else {
log.warn(
'taobao.procSKU() invalid skus[i].value.split ' + skus[i].value,
);
// return {
// error: new Error('taobao.procSKU() invalid skus[i].value.split'),
// };
}
} else {
return {error: new Error('taobao.procSKU() invalid skus[i].value')};
}
}
for (let i = 0; i < skus.length; ++i) {
if (skus[i].curimg) {
const arr = skus[i].curimg.split('("');
if (arr.length == 2) {
const arr1 = arr[1].split('")');
skus[i].img = arr1[0];
skus[i].img = skus[i].img.replace('30x30', '600x600');
skus[i].img = 'https:' + skus[i].img;
}
}
if (skusret && skusret.mapTitle[skus[i].value]) {
skus[i].title = skusret.mapTitle[skus[i].value];
}
if (tbtxt && tbtxt[skus[i].value]) {
skus[i].title = tbtxt[skus[i].value];
}
}
let lstsku = [];
if (lstskut.length == 0) {
return {lstsku: [], lstskut: []};
} else if (lstskut.length == 1) {
lstsku = skus;
} else if (lstskut.length == 2) {
for (let i = 0; i < lstskut[0].skus.length; ++i) {
for (let j = 0; j < lstskut[1].skus.length; ++j) {
const cskuid =
lstskut[0].skus[i].value + ';' + lstskut[1].skus[j].value;
if (skusret.mapID[';' + cskuid + ';']) {
const cv = {value: cskuid};
if (lstskut[0].skus[i].title && lstskut[1].skus[j].title) {
cv.title =
lstskut[0].skus[i].title + ' ' + lstskut[1].skus[j].title;
} else if (lstskut[0].skus[i].title) {
cv.title = lstskut[0].skus[i].title;
} else {
cv.title = lstskut[1].skus[j].title;
}
if (lstskut[0].skus[i].curimg) {
cv.curimg = lstskut[0].skus[i].curimg;
} else if (lstskut[1].skus[j].curimg) {
cv.curimg = lstskut[1].skus[j].curimg;
}
if (lstskut[0].skus[i].img) {
cv.img = lstskut[0].skus[i].img;
} else if (lstskut[1].skus[j].img) {
cv.img = lstskut[1].skus[j].img;
}
lstsku.push(cv);
}
}
}
} else {
return {error: new Error('taobao.procSKU() invalid lstskut.length')};
}
const mapStock = {};
if (sibobj.data && sibobj.data.dynStock && sibobj.data.dynStock.sku) {
for (const k in sibobj.data.dynStock.sku) {
if (Object.prototype.hasOwnProperty.call(sibobj.data.dynStock.sku, k)) {
mapStock[k] = sibobj.data.dynStock.sku[k].stock;
}
}
}
const mapPrice = {};
let hasprice = false;
if (sibobj.data && sibobj.data.promotion && sibobj.data.promotion.promoData) {
for (const k in sibobj.data.promotion.promoData) {
if (
Object.prototype.hasOwnProperty.call(sibobj.data.promotion.promoData, k)
) {
if (k != 'def' && Array.isArray(sibobj.data.promotion.promoData[k])) {
mapPrice[k] = sibobj.data.promotion.promoData[k][0].price;
hasprice = true;
}
}
}
}
if (!hasprice && sibobj.data && sibobj.data.originalPrice) {
for (const k in sibobj.data.originalPrice) {
if (Object.prototype.hasOwnProperty.call(sibobj.data.originalPrice, k)) {
if (k != 'def') {
mapPrice[k] = sibobj.data.originalPrice[k].price;
hasprice = true;
}
}
}
}
for (let i = 0; i < lstsku.length; ++i) {
try {
if (mapStock[';' + lstsku[i].value + ';']) {
lstsku[i].stock = parseInt(mapStock[';' + lstsku[i].value + ';']);
}
if (mapPrice[';' + lstsku[i].value + ';']) {
lstsku[i].price = parseFloat(mapPrice[';' + lstsku[i].value + ';']);
} else if (sibobj.data && sibobj.data.price) {
lstsku[i].price = parseFloat(sibobj.data.price);
}
if (skusret && skusret.mapID[';' + lstsku[i].value + ';']) {
lstsku[i].skuid = skusret.mapID[';' + lstsku[i].value + ';'];
}
} catch (err) {
return {
error: new Error('taobao.procSKU() parse lstsku value ' + err.message),
};
}
}
return {lstsku: lstsku, lstskut: lstskut};
}
/**
* fixSKU - fix sku
* @param {object} sku - sku
* @return {object} sku - sku
*/
function fixSKU(sku) {
if (sku.img && sku.img.indexOf('//') == 0) {
sku.img = 'https:' + sku.img;
}
return sku;
}
/**
* fixProduct - fix product
* @param {object} product - product
* @return {object} product - product
*/
function fixProduct(product) {
if (Array.isArray(product.imgs) && product.imgs.length > 0) {
for (let i = 0; i < product.imgs.length; ++i) {
if (product.imgs[i] && product.imgs[i].indexOf('//') == 0) {
product.imgs[i] = 'https:' + product.imgs[i];
}
}
}
if (Array.isArray(product.skus) && product.skus.length > 0) {
for (let i = 0; i < product.skus.length; ++i) {
product.skus[i] = fixSKU(product.skus[i]);
}
}
return product;
}
exports.closeDialog = closeDialog;
exports.nocaptcha = nocaptcha;
exports.procSKU = procSKU;
exports.fixSKU = fixSKU;
exports.fixProduct = fixProduct;