|
@@ -26,6 +26,9 @@
|
|
<el-menu-item index="6">
|
|
<el-menu-item index="6">
|
|
<img src="../assets/image/m-aliguoji.png" class="m-image"/><span slot="title">阿里国际</span>
|
|
<img src="../assets/image/m-aliguoji.png" class="m-image"/><span slot="title">阿里国际</span>
|
|
</el-menu-item>
|
|
</el-menu-item>
|
|
|
|
+ <el-menu-item index="9">
|
|
|
|
+ <img src="../assets/image/m-pdd.png" class="m-image"/><span slot="title">拼多多</span>
|
|
|
|
+ </el-menu-item>
|
|
<el-menu-item index="7">
|
|
<el-menu-item index="7">
|
|
<img src="../assets/image/m-baidu.png" class="m-image"/><span slot="title">百度爱采购</span>
|
|
<img src="../assets/image/m-baidu.png" class="m-image"/><span slot="title">百度爱采购</span>
|
|
</el-menu-item>
|
|
</el-menu-item>
|
|
@@ -35,6 +38,7 @@
|
|
<el-menu-item index="5">
|
|
<el-menu-item index="5">
|
|
<img src="../assets/image/m-hong.png" class="m-image"/><span slot="title">小红书</span>
|
|
<img src="../assets/image/m-hong.png" class="m-image"/><span slot="title">小红书</span>
|
|
</el-menu-item>
|
|
</el-menu-item>
|
|
|
|
+
|
|
<el-menu-item index="10">
|
|
<el-menu-item index="10">
|
|
<img src="../assets/image/m-chrome.png" class="m-image"/><span slot="title">其他(Beta)</span>
|
|
<img src="../assets/image/m-chrome.png" class="m-image"/><span slot="title">其他(Beta)</span>
|
|
</el-menu-item>
|
|
</el-menu-item>
|
|
@@ -65,7 +69,7 @@
|
|
|
|
|
|
<soft-img ref="imgRef" v-show="['2-1', '2-2', '2-3', '2-5'].indexOf(menuIndex) > -1" @open-vip="openVip" @check-authority="checkAuthority"></soft-img>
|
|
<soft-img ref="imgRef" v-show="['2-1', '2-2', '2-3', '2-5'].indexOf(menuIndex) > -1" @open-vip="openVip" @check-authority="checkAuthority"></soft-img>
|
|
|
|
|
|
- <el-main v-show="['1', '2', '3', '4', '5', '6', '7', '8', '10'].indexOf(menuIndex) > -1" ref="el-main" style="background-color: #fafafa;">
|
|
|
|
|
|
+ <el-main v-show="['1', '2', '3', '4', '5', '6', '7', '8', '9', '10'].indexOf(menuIndex) > -1" ref="el-main" style="background-color: #fafafa;">
|
|
<template>
|
|
<template>
|
|
<div class="content-top">
|
|
<div class="content-top">
|
|
<div>
|
|
<div>
|
|
@@ -110,6 +114,7 @@
|
|
<span v-if="menuIndex == '6'">阿里国际 - </span>
|
|
<span v-if="menuIndex == '6'">阿里国际 - </span>
|
|
<span v-if="menuIndex == '7'">百度爱采购 - </span>
|
|
<span v-if="menuIndex == '7'">百度爱采购 - </span>
|
|
<span v-if="menuIndex == '8'">亚马逊 - </span>
|
|
<span v-if="menuIndex == '8'">亚马逊 - </span>
|
|
|
|
+ <span v-if="menuIndex == '9'">拼多多 - </span>
|
|
<span v-if="menuIndex == '10'">网页 - </span>
|
|
<span v-if="menuIndex == '10'">网页 - </span>
|
|
图片下载
|
|
图片下载
|
|
</h3>
|
|
</h3>
|
|
@@ -141,7 +146,7 @@
|
|
<el-checkbox :value="true" style="opacity: 0.6; cursor: not-allowed;">图片</el-checkbox>
|
|
<el-checkbox :value="true" style="opacity: 0.6; cursor: not-allowed;">图片</el-checkbox>
|
|
</div>
|
|
</div>
|
|
|
|
|
|
- <div v-if="['1', '2', '3', '4', '6', '7', '8'].indexOf(menuIndex) > -1" style="padding-top: 10px;">
|
|
|
|
|
|
+ <div v-if="['1', '2', '3', '4', '6', '7', '8', '9'].indexOf(menuIndex) > -1" style="padding-top: 10px;">
|
|
<label>下载类型:</label>
|
|
<label>下载类型:</label>
|
|
<el-checkbox-group :min="1" v-model="settingArr" style="display: inline-block;" @input="settingGroup">
|
|
<el-checkbox-group :min="1" v-model="settingArr" style="display: inline-block;" @input="settingGroup">
|
|
<el-checkbox label="mainImg">主图</el-checkbox>
|
|
<el-checkbox label="mainImg">主图</el-checkbox>
|
|
@@ -150,7 +155,8 @@
|
|
<el-checkbox label="commentImg" v-if="menuIndex == '3' || menuIndex == '4'">评论图</el-checkbox>
|
|
<el-checkbox label="commentImg" v-if="menuIndex == '3' || menuIndex == '4'">评论图</el-checkbox>
|
|
<el-checkbox label="video">视频</el-checkbox>
|
|
<el-checkbox label="video">视频</el-checkbox>
|
|
</el-checkbox-group>
|
|
</el-checkbox-group>
|
|
- <el-popover placement="bottom" popper-class="popper-open" trigger="hover" content="下载类型至少选一个,评论图默认只下载商品首页展示的评论内容">
|
|
|
|
|
|
+ <el-popover placement="bottom" popper-class="popper-open" trigger="hover"
|
|
|
|
+ :content="menuIndex == '9' ? '视频下载的是商品视频,非商品讲解视频' : '下载类型至少选一个,评论图默认只下载商品首页展示的评论内容'">
|
|
<i class="el-icon-info" slot="reference" style="margin-left: 10px; color: #F56C6C;"></i>
|
|
<i class="el-icon-info" slot="reference" style="margin-left: 10px; color: #F56C6C;"></i>
|
|
</el-popover>
|
|
</el-popover>
|
|
</div>
|
|
</div>
|
|
@@ -194,6 +200,16 @@
|
|
<el-button size="mini" type="warning" :loading="checkLoading" style="margin-left: 10px;" :disabled='redStatus == 2' @click="checkRedLogin">检测登录状态</el-button>
|
|
<el-button size="mini" type="warning" :loading="checkLoading" style="margin-left: 10px;" :disabled='redStatus == 2' @click="checkRedLogin">检测登录状态</el-button>
|
|
</div>
|
|
</div>
|
|
</template>
|
|
</template>
|
|
|
|
+
|
|
|
|
+ <!-- 拼多多 -->
|
|
|
|
+ <template v-if="menuIndex == '9'">
|
|
|
|
+ <div>
|
|
|
|
+ <el-tag type="info" size="mini" v-if="pddStatus == 1">未检测</el-tag>
|
|
|
|
+ <el-tag type="success" size="mini" v-if="pddStatus == 2">拼多多账号已登录</el-tag>
|
|
|
|
+ <el-link type="danger" style="text-decoration: underline;" v-if="pddStatus == 3" :underline="false" @click="loginUrl('https://mobile.yangkeduo.com/login.html')">未登录,点击登录拼多多账号</el-link>
|
|
|
|
+ <el-button size="mini" type="warning" :loading="checkLoading" style="margin-left: 10px;" :disabled='pddStatus == 2' @click="checkPddLogin">检测登录状态</el-button>
|
|
|
|
+ </div>
|
|
|
|
+ </template>
|
|
</el-row>
|
|
</el-row>
|
|
</div>
|
|
</div>
|
|
|
|
|
|
@@ -236,6 +252,10 @@
|
|
<i class="el-icon-error" style="font-size: 16px; color: #ed4014;"></i>
|
|
<i class="el-icon-error" style="font-size: 16px; color: #ed4014;"></i>
|
|
<span>验证码拦截,请手动验证!</span>
|
|
<span>验证码拦截,请手动验证!</span>
|
|
</template>
|
|
</template>
|
|
|
|
+ <template v-if="row.status == '7'">
|
|
|
|
+ <i class="el-icon-error" style="font-size: 16px; color: #ed4014;"></i>
|
|
|
|
+ <span>频繁访问受限,清除缓存重试</span>
|
|
|
|
+ </template>
|
|
</template>
|
|
</template>
|
|
</vxe-column>
|
|
</vxe-column>
|
|
<vxe-column title="操作" width="80">
|
|
<vxe-column title="操作" width="80">
|
|
@@ -280,6 +300,10 @@
|
|
<p>小红书渠道需要登录后才能下载</p>
|
|
<p>小红书渠道需要登录后才能下载</p>
|
|
<p class="visible-tips-style">目前检测还未登录小红书账号,需立即登录</p>
|
|
<p class="visible-tips-style">目前检测还未登录小红书账号,需立即登录</p>
|
|
</template>
|
|
</template>
|
|
|
|
+ <template v-else-if="menuIndex == '9'">
|
|
|
|
+ <p>拼多多渠道需要登录后才能下载</p>
|
|
|
|
+ <p class="visible-tips-style">目前检测还未登录拼多多账号,需立即登录</p>
|
|
|
|
+ </template>
|
|
<template v-else>
|
|
<template v-else>
|
|
<p>天猫/淘宝渠道需要登录后才能下载</p>
|
|
<p>天猫/淘宝渠道需要登录后才能下载</p>
|
|
<p class="visible-tips-style">目前检测还未登录天猫/淘宝账号,需立即登录</p>
|
|
<p class="visible-tips-style">目前检测还未登录天猫/淘宝账号,需立即登录</p>
|
|
@@ -293,6 +317,7 @@
|
|
<el-button type="primary" @click="loginVisible = false; skipLogin = true; exportFile();">继续下载</el-button>
|
|
<el-button type="primary" @click="loginVisible = false; skipLogin = true; exportFile();">继续下载</el-button>
|
|
</template>
|
|
</template>
|
|
<el-button v-else-if="menuIndex == '5'" @click="loginVisible = false; loginUrl('https://www.xiaohongshu.com')">点击登录小红书账号</el-button>
|
|
<el-button v-else-if="menuIndex == '5'" @click="loginVisible = false; loginUrl('https://www.xiaohongshu.com')">点击登录小红书账号</el-button>
|
|
|
|
+ <el-button v-else-if="menuIndex == '9'" @click="loginVisible = false; loginUrl('https://mobile.yangkeduo.com/login.html')">点击登录拼多多账号</el-button>
|
|
<el-button v-else @click="loginVisible = false; loginUrl('https://login.taobao.com')">点击登录天猫/淘宝账号</el-button>
|
|
<el-button v-else @click="loginVisible = false; loginUrl('https://login.taobao.com')">点击登录天猫/淘宝账号</el-button>
|
|
</div>
|
|
</div>
|
|
</el-dialog>
|
|
</el-dialog>
|
|
@@ -335,7 +360,7 @@
|
|
// import puppeteer from 'puppeteer'
|
|
// import puppeteer from 'puppeteer'
|
|
import puppeteer from 'puppeteer-extra'
|
|
import puppeteer from 'puppeteer-extra'
|
|
const StealthPlugin = require('puppeteer-extra-plugin-stealth');
|
|
const StealthPlugin = require('puppeteer-extra-plugin-stealth');
|
|
- const listNameArr = ['alibaba','jd','tmall','tb','red','aliguoji','acaigou','amazon', '' ,'common'];
|
|
|
|
|
|
+ const listNameArr = ['alibaba','jd','tmall','tb','red','aliguoji','acaigou','amazon', 'pdd' ,'common'];
|
|
// const headless = true;
|
|
// const headless = true;
|
|
// const waitUntil = 'networkidle2';
|
|
// const waitUntil = 'networkidle2';
|
|
const { ipcRenderer } = require('electron');
|
|
const { ipcRenderer } = require('electron');
|
|
@@ -389,6 +414,7 @@
|
|
tbList: [],
|
|
tbList: [],
|
|
tmallList: [],
|
|
tmallList: [],
|
|
redList: [],
|
|
redList: [],
|
|
|
|
+ pddList: [],
|
|
commonList: [],
|
|
commonList: [],
|
|
productName: pjson.softInfo.softName,
|
|
productName: pjson.softInfo.softName,
|
|
imgUrl: this.$api.imgUrl,
|
|
imgUrl: this.$api.imgUrl,
|
|
@@ -401,7 +427,7 @@
|
|
video: false,
|
|
video: false,
|
|
},
|
|
},
|
|
exampleUrl: ['https://www.1688.com', 'https://www.jd.com', 'https://www.tmall.com', 'https://www.taobao.com', 'https://www.xiaohongshu.com',
|
|
exampleUrl: ['https://www.1688.com', 'https://www.jd.com', 'https://www.tmall.com', 'https://www.taobao.com', 'https://www.xiaohongshu.com',
|
|
- 'https://www.alibaba.com', 'https://b2b.baidu.com', 'https://www.amazon.com/', '', 'https://www.example.com'],
|
|
|
|
|
|
+ 'https://www.alibaba.com', 'https://b2b.baidu.com', 'https://www.amazon.com', 'https://mobile.yangkeduo.com/goods.html', 'https://www.example.com'],
|
|
|
|
|
|
fileList: [],
|
|
fileList: [],
|
|
|
|
|
|
@@ -416,6 +442,7 @@
|
|
redStatus: 1, //同上
|
|
redStatus: 1, //同上
|
|
alibabaStatus: 1, //同上上
|
|
alibabaStatus: 1, //同上上
|
|
aliguojiStatus: 1, //同上上上
|
|
aliguojiStatus: 1, //同上上上
|
|
|
|
+ pddStatus: 1,
|
|
execLimit: 1,
|
|
execLimit: 1,
|
|
execNum: 3, // 限制5张
|
|
execNum: 3, // 限制5张
|
|
|
|
|
|
@@ -428,6 +455,7 @@
|
|
jdBrowser: null,
|
|
jdBrowser: null,
|
|
commonBrowser: null,
|
|
commonBrowser: null,
|
|
redBrowser: null,
|
|
redBrowser: null,
|
|
|
|
+ pddBrowser: null,
|
|
loginBrowser: null, // 登录用的浏览器实例
|
|
loginBrowser: null, // 登录用的浏览器实例
|
|
skipLogin: false,
|
|
skipLogin: false,
|
|
pauseFlag: true, //暂停中止标志
|
|
pauseFlag: true, //暂停中止标志
|
|
@@ -750,6 +778,7 @@
|
|
this.redStatus = 3;
|
|
this.redStatus = 3;
|
|
this.alibabaStatus = 3;
|
|
this.alibabaStatus = 3;
|
|
this.aliguojiStatus = 3;
|
|
this.aliguojiStatus = 3;
|
|
|
|
+ this.pddStatus = 3;
|
|
|
|
|
|
if(this.loginBrowser){
|
|
if(this.loginBrowser){
|
|
await this.loginBrowser.close();
|
|
await this.loginBrowser.close();
|
|
@@ -945,6 +974,23 @@
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ if(this.menuIndex == '9'){ // 拼多多
|
|
|
|
+ if(this.pddStatus == 1 || this.pddStatus == 3){ // 未检测登录状态/或提示未登录状态,开始检测
|
|
|
|
+ await this.checkPddLogin().then((data) => {
|
|
|
|
+ if(data != 2){ // 未登录
|
|
|
|
+ this.pddStatus = 3;
|
|
|
|
+ this.loginVisible = true;
|
|
|
|
+ }
|
|
|
|
+ }).catch(err => {
|
|
|
|
+ this.pddStatus = 3;
|
|
|
|
+ });
|
|
|
|
+ if(this.pddStatus == 3){
|
|
|
|
+ this.loading = false;
|
|
|
|
+ return false;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
let taskArr = [];
|
|
let taskArr = [];
|
|
let task = "";
|
|
let task = "";
|
|
let userDataDir = this.initDataDir();
|
|
let userDataDir = this.initDataDir();
|
|
@@ -998,6 +1044,9 @@
|
|
case '8': // 亚马逊
|
|
case '8': // 亚马逊
|
|
task = this.alibabaDownload(item, this.amazonBrowser);
|
|
task = this.alibabaDownload(item, this.amazonBrowser);
|
|
break;
|
|
break;
|
|
|
|
+ case '9': // 拼多多
|
|
|
|
+ task = this.pddDownload(item, this.pddBrowser);
|
|
|
|
+ break;
|
|
case '10': // 普通网址
|
|
case '10': // 普通网址
|
|
task = this.normalDownload(item, this.commonBrowser);
|
|
task = this.normalDownload(item, this.commonBrowser);
|
|
break;
|
|
break;
|
|
@@ -3047,6 +3096,299 @@
|
|
},
|
|
},
|
|
/*********************************************************************************************************************/
|
|
/*********************************************************************************************************************/
|
|
|
|
|
|
|
|
+ /***********拼多多商品下载**********/
|
|
|
|
+ // 检查pdd登录状态
|
|
|
|
+ checkPddLogin(){
|
|
|
|
+ this.checkLoading = true;
|
|
|
|
+ this.pddStatus = 1;
|
|
|
|
+ return new Promise((resolve, reject) => {
|
|
|
|
+ (async () => {
|
|
|
|
+ try{
|
|
|
|
+ if(this.loginBrowser){
|
|
|
|
+ await this.loginBrowser.close();
|
|
|
|
+ this.loginBrowser = null;
|
|
|
|
+ }
|
|
|
|
+ puppeteer.use(StealthPlugin());
|
|
|
|
+ this.loginBrowser = await puppeteer.launch({
|
|
|
|
+ executablePath: this.initPath(),
|
|
|
|
+ userDataDir: this.initDataDir(),
|
|
|
|
+ args: [
|
|
|
|
+ '--start-maximized',
|
|
|
|
+ '--no-sandbox',
|
|
|
|
+ '--disable-setuid-sandbox',
|
|
|
|
+ '--disable-blink-features=AutomationControlled',
|
|
|
|
+ '--window-size=1280,800'
|
|
|
|
+ ],
|
|
|
|
+ });
|
|
|
|
+ const page = await this.loginBrowser.newPage();
|
|
|
|
+ await page.setViewport({ width: 1280, height: 800 });
|
|
|
|
+ let testUrl = "https://mobile.yangkeduo.com/personal.html";
|
|
|
|
+ await page.goto(testUrl, {waitUntil : 'networkidle2'});
|
|
|
|
+
|
|
|
|
+ let loginBtn = await page.$('.login-box');
|
|
|
|
+ if(loginBtn){
|
|
|
|
+ let searchValue = await page.$eval('.login-box', el => el.innerText);
|
|
|
|
+ if(searchValue == '手机登录' || searchValue.indexOf('登录') > -1){
|
|
|
|
+ this.pddStatus = 3; //未登录
|
|
|
|
+ }else{
|
|
|
|
+ this.pddStatus = 2;
|
|
|
|
+ }
|
|
|
|
+ }else{
|
|
|
|
+ this.pddStatus = 2;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ resolve(this.pddStatus);
|
|
|
|
+ this.checkLoading = false;
|
|
|
|
+ await this.loginBrowser.close();
|
|
|
|
+ this.loginBrowser = null;
|
|
|
|
+ }catch(e){
|
|
|
|
+ this.checkLoading = false;
|
|
|
|
+ reject(3);
|
|
|
|
+ this.showError(e);
|
|
|
|
+ }
|
|
|
|
+ })();
|
|
|
|
+ });
|
|
|
|
+ },
|
|
|
|
+ // 9-pdd图片下载
|
|
|
|
+ async pddDownload(urlInfo, pddBrowser){
|
|
|
|
+ let task = await new Promise((resolve,reject) =>{
|
|
|
|
+ (async () => {
|
|
|
|
+ try{
|
|
|
|
+ let authority = this.$refs.headerRef.authority.isAuthority;
|
|
|
|
+ let number = 0;
|
|
|
|
+ urlInfo.status = '2';
|
|
|
|
+ urlInfo.num = 0;
|
|
|
|
+ const page = await pddBrowser.newPage();
|
|
|
|
+ await page.goto(urlInfo.url, {waitUntil : 'networkidle2'});
|
|
|
|
+
|
|
|
|
+ if(urlInfo.title){
|
|
|
|
+ if (fs.existsSync(this.downloadDir + separator + pjson.softInfo.softName + separator + urlInfo.title)) {
|
|
|
|
+ urlInfo.newPath = this.downloadDir + separator + pjson.softInfo.softName + separator + urlInfo.title;
|
|
|
|
+ } else {
|
|
|
|
+ fs.mkdirSync(this.downloadDir + separator + pjson.softInfo.softName + separator + urlInfo.title);
|
|
|
|
+ urlInfo.newPath = this.downloadDir + separator + pjson.softInfo.softName + separator + urlInfo.title;
|
|
|
|
+ }
|
|
|
|
+ }else{
|
|
|
|
+ // 获取商品标题
|
|
|
|
+ let titleHandle = await page.$$('span.enable-select');
|
|
|
|
+ if(titleHandle && titleHandle.length > 0){
|
|
|
|
+ let titleValue = await page.$eval('span.enable-select', el => el.innerText);
|
|
|
|
+ await this.getTitle(page, urlInfo, titleValue); // 生成页面标题对应的文件夹
|
|
|
|
+ }else{
|
|
|
|
+ await this.getTitle(page, urlInfo, '拼多多商品-'+new Date().getTime()); // 生成页面标题对应的文件夹
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ urlInfo.status = '3';
|
|
|
|
+
|
|
|
|
+ // 被平台限制浏览
|
|
|
|
+ let notSale = await page.$$('.not-sale');
|
|
|
|
+ if(notSale && notSale.length > 0){
|
|
|
|
+ let notValue = await page.$eval('.not-sale', el => el.innerText);
|
|
|
|
+ if(notValue.indexOf('商品已售罄') > -1 || notValue.indexOf('推荐以下') > -1){
|
|
|
|
+ await page.close();
|
|
|
|
+ urlInfo.status = '7';
|
|
|
|
+ resolve(true);
|
|
|
|
+ this.loading = false;
|
|
|
|
+ return false;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //detailImg:详情图;skuImg:sku图片;commentImg: 评论图;video: 视频
|
|
|
|
+ const imgInfo = await page.evaluate((authority, execNum) => {
|
|
|
|
+ let outObj = {
|
|
|
|
+ mainImg: [],
|
|
|
|
+ detailImg: [],
|
|
|
|
+ skuImg: [],
|
|
|
|
+ commentImg: [],
|
|
|
|
+ video: [],
|
|
|
|
+ skuName: []
|
|
|
|
+ };
|
|
|
|
+
|
|
|
|
+ let skuHandle = document.querySelector('div[class*=sku-plus] img');
|
|
|
|
+ if(skuHandle){
|
|
|
|
+ skuHandle.click({force: true});
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //主图
|
|
|
|
+ let mainDiv = document.querySelectorAll('#main > div > div')[0];
|
|
|
|
+ let arr1 = mainDiv.querySelectorAll('img');
|
|
|
|
+ for(let i=0; i< arr1.length; i++){
|
|
|
|
+ if(i > 0 && i < arr1.length-1){ // 去掉首尾重复
|
|
|
|
+ let mainImgUrl = arr1[i].src || arr1[i].dataset.src;
|
|
|
|
+ if(!authority && i < execNum){
|
|
|
|
+ outObj.mainImg.push(mainImgUrl);
|
|
|
|
+ }
|
|
|
|
+ if(authority){
|
|
|
|
+ outObj.mainImg.push(mainImgUrl);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //sku
|
|
|
|
+ let arr2 = document.querySelectorAll('#skuImageSlider img');
|
|
|
|
+ for(let i=0; i< arr2.length; i++){
|
|
|
|
+ if(i > 0 && i < arr2.length-1){ // 去掉首尾重复 -去掉重复图片
|
|
|
|
+ let skuImgUrl = arr2[i].src || arr2[i].dataset.src;
|
|
|
|
+ if(outObj.skuImg.indexOf(skuImgUrl) == -1){
|
|
|
|
+ let nextEle = arr2[i].parentElement.nextElementSibling;
|
|
|
|
+ let num = Number(i) + 1;
|
|
|
|
+ let name = 'sku图' + num + '.jpeg';
|
|
|
|
+ if(nextEle){
|
|
|
|
+ name = nextEle.innerText.split('\n')[0];
|
|
|
|
+ name = name.replace(/[\\|/|:|*|?|"|<|>||]/g, "");
|
|
|
|
+ }
|
|
|
|
+ if(!authority && i < execNum){
|
|
|
|
+ outObj.skuImg.push(skuImgUrl);
|
|
|
|
+ outObj.skuName.push(name);
|
|
|
|
+ }
|
|
|
|
+ if(authority){
|
|
|
|
+ outObj.skuImg.push(skuImgUrl);
|
|
|
|
+ outObj.skuName.push(name);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //详情图
|
|
|
|
+ let arr3 = document.querySelectorAll('img[class*=pdd-lazy-image][aria-label="查看图片"]');
|
|
|
|
+ if(arr3.length == 0){
|
|
|
|
+ arr3 = [];
|
|
|
|
+ let imgArr = document.querySelectorAll('img[class*=pdd-lazy-image]');
|
|
|
|
+ for(let m = 0; m < imgArr.length; m++){
|
|
|
|
+ if(imgArr[m].parentElement.ariaLabel == '点击查看大图'){
|
|
|
|
+ arr3.push(imgArr[m]);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ for(let i=0; i< arr3.length; i++){
|
|
|
|
+ let detailImgUrl = arr3[i].src || arr3[i].dataset.src;
|
|
|
|
+ if(!authority && i < execNum){
|
|
|
|
+ outObj.detailImg.push(detailImgUrl);
|
|
|
|
+ }
|
|
|
|
+ if(authority){
|
|
|
|
+ outObj.detailImg.push(detailImgUrl);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 视频
|
|
|
|
+ let arr5 = document.querySelectorAll('video');
|
|
|
|
+ for(let i=0; i< arr5.length; i++){
|
|
|
|
+ if(outObj.video.indexOf(arr5[i].src) == -1){
|
|
|
|
+ if(!authority && i < execNum){
|
|
|
|
+ outObj.video.push(arr5[i].src);
|
|
|
|
+ }
|
|
|
|
+ if(authority){
|
|
|
|
+ outObj.video.push(arr5[i].src);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return outObj;
|
|
|
|
+ }, authority, this.execNum);
|
|
|
|
+
|
|
|
|
+ // 主图下载
|
|
|
|
+ if(this.settingArr.indexOf('mainImg') > -1){
|
|
|
|
+ for(let j = 0; j < imgInfo.mainImg.length; j++){
|
|
|
|
+ let imgUrl = imgInfo.mainImg[j];
|
|
|
|
+ let queryIndex = imgInfo.mainImg[j].indexOf('?');
|
|
|
|
+ if (queryIndex !== -1) {
|
|
|
|
+ imgUrl = imgUrl.substr(0, queryIndex);
|
|
|
|
+ }
|
|
|
|
+ let fileName = imgUrl.split('/').pop();
|
|
|
|
+ let num = Number(j) + 1;
|
|
|
|
+ let suffix = '.jpg';
|
|
|
|
+ if(fileName.lastIndexOf('.') > -1){
|
|
|
|
+ suffix = fileName.substr(fileName.lastIndexOf('.'));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (!fs.existsSync(urlInfo.newPath + '\\主图')) {
|
|
|
|
+ fs.mkdirSync(urlInfo.newPath + '\\主图');
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ let outputPath = urlInfo.newPath + '\\主图\\主图' + num + suffix;
|
|
|
|
+ await this.downloadImage(imgInfo.mainImg[j], outputPath, urlInfo);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // sku图片下载
|
|
|
|
+ if(this.settingArr.indexOf('skuImg') > -1){
|
|
|
|
+ for(let j = 0; j < imgInfo.skuImg.length; j++){
|
|
|
|
+ let imgUrl = imgInfo.skuImg[j];
|
|
|
|
+ let queryIndex = imgInfo.skuImg[j].indexOf('?');
|
|
|
|
+ if (queryIndex !== -1) {
|
|
|
|
+ imgUrl = imgUrl.substr(0, queryIndex);
|
|
|
|
+ }
|
|
|
|
+ let fileName = imgUrl.split('/').pop();
|
|
|
|
+ let num = Number(j) + 1;
|
|
|
|
+ let suffix = '.jpg';
|
|
|
|
+ if(fileName.lastIndexOf('.') > -1){
|
|
|
|
+ suffix = fileName.substr(fileName.lastIndexOf('.'));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (!fs.existsSync(urlInfo.newPath + '\\sku图')) {
|
|
|
|
+ fs.mkdirSync(urlInfo.newPath + '\\sku图');
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ let outputPath = urlInfo.newPath + '\\sku图\\' + imgInfo.skuName[j] + suffix;
|
|
|
|
+ await this.downloadImage(imgInfo.skuImg[j], outputPath, urlInfo);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //详情图下载
|
|
|
|
+ if(this.settingArr.indexOf('detailImg') > -1){
|
|
|
|
+ for(let j = 0; j < imgInfo.detailImg.length; j++){
|
|
|
|
+ let imgUrl = imgInfo.detailImg[j];
|
|
|
|
+ let queryIndex = imgInfo.detailImg[j].indexOf('?');
|
|
|
|
+ if (queryIndex !== -1) {
|
|
|
|
+ imgUrl = imgUrl.substr(0, queryIndex);
|
|
|
|
+ }
|
|
|
|
+ let fileName = imgUrl.split('/').pop();
|
|
|
|
+ let num = Number(j) + 1;
|
|
|
|
+ let suffix = '.jpg';
|
|
|
|
+ if(fileName.lastIndexOf('.') > -1){
|
|
|
|
+ suffix = fileName.substr(fileName.lastIndexOf('.'));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (!fs.existsSync(urlInfo.newPath + '\\详情图')) {
|
|
|
|
+ fs.mkdirSync(urlInfo.newPath + '\\详情图');
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ let outputPath = urlInfo.newPath + '\\详情图\\详情图' + num + suffix;
|
|
|
|
+ await this.downloadImage(imgInfo.detailImg[j], outputPath, urlInfo);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ //视频下载
|
|
|
|
+ if(this.settingArr.indexOf('video') > -1){
|
|
|
|
+ for(let j = 0; j < imgInfo.video.length; j++){
|
|
|
|
+ let fileName = imgInfo.video[j].split('/').pop();
|
|
|
|
+ if(fileName){
|
|
|
|
+ let queryIndex = fileName.indexOf('?');
|
|
|
|
+ if (queryIndex !== -1) {
|
|
|
|
+ fileName = fileName.substr(0, queryIndex);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (!fs.existsSync(urlInfo.newPath + '\\视频')) {
|
|
|
|
+ fs.mkdirSync(urlInfo.newPath + '\\视频');
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ let outputPath = urlInfo.newPath + '\\视频\\' + fileName;
|
|
|
|
+ await this.downloadImage(imgInfo.video[j], outputPath, urlInfo);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ await page.close();
|
|
|
|
+ urlInfo.status = '4';
|
|
|
|
+ resolve(true);
|
|
|
|
+ this.loading = false;
|
|
|
|
+ }catch(e){
|
|
|
|
+ urlInfo.status = '5';
|
|
|
|
+ reject(e);
|
|
|
|
+ this.showError(e);
|
|
|
|
+ }
|
|
|
|
+ })();
|
|
|
|
+ });
|
|
|
|
+ },
|
|
|
|
|
|
//
|
|
//
|
|
downloadExample(){
|
|
downloadExample(){
|
|
@@ -3122,12 +3464,15 @@
|
|
},
|
|
},
|
|
|
|
|
|
// 获取页面标题 - 生成对应的文件夹
|
|
// 获取页面标题 - 生成对应的文件夹
|
|
- async getTitle(page, urlInfo){
|
|
|
|
|
|
+ async getTitle(page, urlInfo, tagStr){
|
|
// 已页面标题作为新建文件夹,保留前50个字
|
|
// 已页面标题作为新建文件夹,保留前50个字
|
|
let title = await page.title();
|
|
let title = await page.title();
|
|
if(!title){
|
|
if(!title){
|
|
title = '无标题-'+new Date().getTime();
|
|
title = '无标题-'+new Date().getTime();
|
|
}
|
|
}
|
|
|
|
+ if(tagStr){
|
|
|
|
+ title = tagStr.replace(/\.\.\./g, '');
|
|
|
|
+ }
|
|
if(title){
|
|
if(title){
|
|
title = title.substring(0, 50).trim();
|
|
title = title.substring(0, 50).trim();
|
|
if(this.containsAnyChar(title, ['\\', '/', ':', '*', '?', '"', '<', '>', '|'])){ //判断是否含有特殊字符
|
|
if(this.containsAnyChar(title, ['\\', '/', ':', '*', '?', '"', '<', '>', '|'])){ //判断是否含有特殊字符
|