UNPKG

jarviscrawlercore

Version:
332 lines (286 loc) 9.09 kB
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;