|
@@ -97,9 +97,12 @@
|
|
|
<el-link v-if="menuIndex == '3' || menuIndex == '4'" :underline="false" type="danger" style="text-align: center; font-size: 12px;">
|
|
|
(需登录{{menuIndex == '3' ? '天猫' : '淘宝'}}账号后才能下载)
|
|
|
</el-link>
|
|
|
+ <el-link v-if="menuIndex == '2'" :underline="false" type="danger" style="text-align: center; font-size: 12px;">
|
|
|
+ (需登录京东账号后才能下载)
|
|
|
+ </el-link>
|
|
|
</div>
|
|
|
|
|
|
- <el-link v-if="tbStatus == 3" :underline="false" type="danger" style="text-align: center; font-size: 12px;">登录完成后请关闭浏览器</el-link>
|
|
|
+ <el-link v-if="tbStatus == 3 || jdStatus == 3" :underline="false" type="danger" style="text-align: center; font-size: 12px;">登录完成后请关闭浏览器</el-link>
|
|
|
</el-row>
|
|
|
|
|
|
<div style="padding: 15px 0 20px;">
|
|
@@ -121,12 +124,20 @@
|
|
|
<!-- 天猫/淘宝 -->
|
|
|
<template v-if="menuIndex == '3' || menuIndex == '4'">
|
|
|
<div>
|
|
|
- <div>
|
|
|
- <el-tag type="info" size="mini" v-if="tbStatus == 1">未检测</el-tag>
|
|
|
- <el-tag type="success" size="mini" v-if="tbStatus == 2">{{menuIndex == '3' ? '天猫' : '淘宝'}}账号已登录</el-tag>
|
|
|
- <el-link type="danger" style="text-decoration: underline;" v-if="tbStatus == 3" :underline="false" @click="loginUrl('https://login.taobao.com')">未登录,点击登录<span>{{menuIndex == '3' ? '天猫' : '淘宝'}}</span>账号</el-link>
|
|
|
- <el-button size="mini" type="warning" :loading="checkLoading" style="margin-left: 10px;" :disabled='tbStatus == 2' @click="checkLogin">检测登录状态</el-button>
|
|
|
- </div>
|
|
|
+ <el-tag type="info" size="mini" v-if="tbStatus == 1">未检测</el-tag>
|
|
|
+ <el-tag type="success" size="mini" v-if="tbStatus == 2">{{menuIndex == '3' ? '天猫' : '淘宝'}}账号已登录</el-tag>
|
|
|
+ <el-link type="danger" style="text-decoration: underline;" v-if="tbStatus == 3" :underline="false" @click="loginUrl('https://login.taobao.com')">未登录,点击登录<span>{{menuIndex == '3' ? '天猫' : '淘宝'}}</span>账号</el-link>
|
|
|
+ <el-button size="mini" type="warning" :loading="checkLoading" style="margin-left: 10px;" :disabled='tbStatus == 2' @click="checkLogin">检测登录状态</el-button>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+
|
|
|
+ <!-- 京东账号 -->
|
|
|
+ <template v-if="menuIndex == '2'">
|
|
|
+ <div>
|
|
|
+ <el-tag type="info" size="mini" v-if="jdStatus == 1">未检测</el-tag>
|
|
|
+ <el-tag type="success" size="mini" v-if="jdStatus == 2">京东账号已登录</el-tag>
|
|
|
+ <el-link type="danger" style="text-decoration: underline;" v-if="jdStatus == 3" :underline="false" @click="loginUrl('https://passport.jd.com/new/login.aspx')">未登录,点击登录京东账号</el-link>
|
|
|
+ <el-button size="mini" type="warning" :loading="checkLoading" style="margin-left: 10px;" :disabled='jdStatus == 2' @click="checkJdLogin">检测登录状态</el-button>
|
|
|
</div>
|
|
|
</template>
|
|
|
</el-row>
|
|
@@ -200,11 +211,12 @@
|
|
|
|
|
|
<el-dialog title="提示" :visible.sync="loginVisible" width="400px" :close-on-click-modal="false" :close-on-press-escape="false">
|
|
|
<div style="text-align: center; color: #999; font-size: 14px;">
|
|
|
- <p>天猫/淘宝渠道需要登录后才能下载</p>
|
|
|
- <p style="font-size: 18px; color: #f73131; font-weight: 600; padding: 30px 40px 0;">目前检测还未登录天猫/淘宝账号,需立即登录</p>
|
|
|
+ <p>{{menuIndex == '2' ? '京东' : '天猫/淘宝'}}渠道需要登录后才能下载</p>
|
|
|
+ <p style="font-size: 18px; color: #f73131; font-weight: 600; padding: 30px 40px 0;">目前检测还未登录{{menuIndex == '2' ? '京东' : '天猫/淘宝'}}账号,需立即登录</p>
|
|
|
</div>
|
|
|
<div slot="footer" class="dialog-footer-center">
|
|
|
- <el-button @click="loginVisible = false; loginUrl('https://login.taobao.com')">点击登录天猫/淘宝账号</el-button>
|
|
|
+ <el-button v-if="menuIndex == '2'" @click="loginVisible = false; loginUrl('https://passport.jd.com/new/login.aspx')">点击登录京东账号</el-button>
|
|
|
+ <el-button v-else @click="loginVisible = false; loginUrl('https://login.taobao.com')">点击登录天猫/淘宝账号</el-button>
|
|
|
</div>
|
|
|
</el-dialog>
|
|
|
|
|
@@ -296,6 +308,7 @@
|
|
|
loading: false,
|
|
|
checkLoading: false, //点击检测登录状态
|
|
|
tbStatus: 1, // 1、未检测 2、已经登录 3、未登录
|
|
|
+ jdStatus: 1, // 1、未检测 2、已经登录 3、未登录
|
|
|
execLimit: 2,
|
|
|
execNum: 3, // 限制5张
|
|
|
|
|
@@ -338,6 +351,10 @@
|
|
|
if (!fs.existsSync(os.tmpdir() + separator + 'chrome-data-capture')) {
|
|
|
fs.mkdirSync(os.tmpdir() + separator + 'chrome-data-capture');
|
|
|
}
|
|
|
+
|
|
|
+ if (!fs.existsSync(os.tmpdir() + separator + 'chrome-data-capture-jd')) {
|
|
|
+ fs.mkdirSync(os.tmpdir() + separator + 'chrome-data-capture-jd');
|
|
|
+ }
|
|
|
|
|
|
// 打开浏览器
|
|
|
const {
|
|
@@ -416,11 +433,10 @@
|
|
|
cancelButtonText: '取消',
|
|
|
type: 'warning'
|
|
|
}).then(() => {
|
|
|
- this[type+'List'].splice(rowIndex, 1);
|
|
|
- if(this[type+'List'].length == 0) {
|
|
|
- this.clearList();
|
|
|
- }
|
|
|
-
|
|
|
+ this[type+'List'].splice(rowIndex, 1);
|
|
|
+ if(this[type+'List'].length == 0) {
|
|
|
+ this.clearList();
|
|
|
+ }
|
|
|
}).catch(() => {
|
|
|
|
|
|
});
|
|
@@ -559,11 +575,20 @@
|
|
|
if (!fs.existsSync(os.tmpdir() + separator + 'chrome-data-capture')) {
|
|
|
fs.mkdirSync(os.tmpdir() + separator + 'chrome-data-capture');
|
|
|
}
|
|
|
+ if (!fs.existsSync(os.tmpdir() + separator + 'chrome-data-capture-jd')) {
|
|
|
+ fs.mkdirSync(os.tmpdir() + separator + 'chrome-data-capture-jd');
|
|
|
+ }
|
|
|
+
|
|
|
+ let userDataDir = os.tmpdir() + separator + 'chrome-data-capture';
|
|
|
+ if(url.indexOf('.jd.com/') > -1){
|
|
|
+ userDataDir = os.tmpdir() + separator + 'chrome-data-capture-jd';
|
|
|
+ }
|
|
|
+
|
|
|
const tbBrowser = await puppeteer.launch({
|
|
|
headless: false,
|
|
|
executablePath: puppeteer.executablePath().replace('win32-1', 'win64-1'),
|
|
|
args: ['--window-size=1280,800'],
|
|
|
- userDataDir: os.tmpdir() + separator + 'chrome-data-capture',
|
|
|
+ userDataDir: userDataDir,
|
|
|
});
|
|
|
const page = await tbBrowser.newPage();
|
|
|
await page.setViewport({ width: 1280, height: 800 });
|
|
@@ -666,14 +691,17 @@
|
|
|
})
|
|
|
}
|
|
|
|
|
|
- let tbLogin = true;
|
|
|
+ let tbLogin = true,jdLogin = true;
|
|
|
if((this.menuIndex == '3' || this.menuIndex == '4') && this.tbStatus == 3){
|
|
|
tbLogin = false;
|
|
|
}
|
|
|
+ if(this.menuIndex == '2' && this.jdStatus == 3){
|
|
|
+ jdLogin = false;
|
|
|
+ }
|
|
|
|
|
|
this.loading = false;
|
|
|
// 打开文件夹
|
|
|
- if(fileList.length > 0 && tbLogin){
|
|
|
+ if(fileList.length > 0 && tbLogin && jdLogin){
|
|
|
this.$message({message: '恭喜你,任务已完成!', type: 'success'});
|
|
|
electronApi.call('showItemInfolder',[this.downloadDir + separator + pjson.softInfo.softName +'\\tty.tty'])
|
|
|
}
|
|
@@ -871,8 +899,77 @@
|
|
|
|
|
|
},
|
|
|
|
|
|
- // 京东下载
|
|
|
+ // 检查京东登录状态
|
|
|
+ checkJdLogin(){
|
|
|
+ this.checkLoading = true;
|
|
|
+ this.jdStatus = 1;
|
|
|
+ return new Promise((resolve, reject) => {
|
|
|
+ (async () => {
|
|
|
+ try{
|
|
|
+ const jdBrowser = await puppeteer.launch({
|
|
|
+ executablePath: puppeteer.executablePath().replace('win32-1', 'win64-1'),
|
|
|
+ userDataDir: os.tmpdir() + separator + 'chrome-data-capture-jd',
|
|
|
+ });
|
|
|
+ const page = await jdBrowser.newPage();
|
|
|
+ let testUrl = 'https://www.jd.com';
|
|
|
+ await page.goto(testUrl, {waitUntil : 'networkidle2'});
|
|
|
+
|
|
|
+ let loginInfo = await page.evaluate(() => {
|
|
|
+ let navTags = document.querySelector('.link-login');
|
|
|
+ let userTags = document.querySelector('.nickname');
|
|
|
+ let userTags2 = document.querySelector('.nick'); //企业账号
|
|
|
+
|
|
|
+ if(navTags && navTags.innerHTML.indexOf('请登录') > -1){
|
|
|
+ return false;
|
|
|
+ }else if(userTags || userTags2){
|
|
|
+ return true;
|
|
|
+ }else{
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ if(loginInfo){
|
|
|
+ this.jdStatus = 2;
|
|
|
+ }else{
|
|
|
+ this.jdStatus = 3;
|
|
|
+ }
|
|
|
+
|
|
|
+ resolve(this.jdStatus);
|
|
|
+ this.checkLoading = false;
|
|
|
+ jdBrowser.close();
|
|
|
+ }catch(e){
|
|
|
+ reject(3);
|
|
|
+ this.showError(e);
|
|
|
+ }
|
|
|
+ })();
|
|
|
+ });
|
|
|
+ },
|
|
|
+
|
|
|
+ //京东下载
|
|
|
async jdDownload(urlInfo){
|
|
|
+ let task = null;
|
|
|
+ if(this.jdStatus == 1 || this.jdStatus == 3){ // 未检测登录状态/或提示未登录状态,开始检测
|
|
|
+ await this.checkJdLogin().then((data) => {
|
|
|
+ if(data == 2){ // 已经登录,处理下载
|
|
|
+ task = this.jdScanImg(urlInfo);
|
|
|
+ }else{ // 未登录
|
|
|
+ task = 'notLogin';
|
|
|
+ this.jdStatus = 3;
|
|
|
+ this.loginVisible = true;
|
|
|
+ }
|
|
|
+ }).catch(err => {
|
|
|
+ task = 'notLogin';
|
|
|
+ this.jdStatus = 3;
|
|
|
+ });
|
|
|
+ }else if(this.jdStatus == 2){ // 已经登录
|
|
|
+ task = this.jdScanImg(urlInfo);
|
|
|
+ }
|
|
|
+
|
|
|
+ return task;
|
|
|
+ },
|
|
|
+
|
|
|
+ // 京东下载
|
|
|
+ async jdScanImg(urlInfo){
|
|
|
let task = await new Promise((resolve,reject) =>{
|
|
|
(async () => {
|
|
|
try{
|
|
@@ -881,9 +978,21 @@
|
|
|
urlInfo.num = 0;
|
|
|
const jdBrowser = await puppeteer.launch({
|
|
|
executablePath: puppeteer.executablePath().replace('win32-1', 'win64-1'),
|
|
|
- userDataDir: os.tmpdir() + separator + 'chrome-data-capture',
|
|
|
+ userDataDir: os.tmpdir() + separator + 'chrome-data-capture-jd',
|
|
|
+ defaultViewport: null,
|
|
|
+ args: [
|
|
|
+ '--start-maximized',
|
|
|
+ '--no-sandbox',
|
|
|
+ '--disable-setuid-sandbox',
|
|
|
+ '--disable-blink-features=AutomationControlled',
|
|
|
+ ]
|
|
|
});
|
|
|
const page = await jdBrowser.newPage();
|
|
|
+ await page.evaluateOnNewDocument(() => {
|
|
|
+ const newProto = navigator.__proto__;
|
|
|
+ delete newProto.webdriver;
|
|
|
+ navigator.__proto__ = newProto;
|
|
|
+ });
|
|
|
|
|
|
let jdImgInfo = {
|
|
|
mainImg: [],
|
|
@@ -917,7 +1026,7 @@
|
|
|
|
|
|
let detailUrl = '';
|
|
|
let videoUrl = '';
|
|
|
- if(response.url().indexOf('&callback=showdesc') > -1 && response.url().indexOf('/description/') > -1){ // 商品详情接口
|
|
|
+ if(response.url().indexOf('/description/') > -1){ // 商品详情接口
|
|
|
detailUrl = response.url();
|
|
|
}
|
|
|
|
|
@@ -930,7 +1039,9 @@
|
|
|
if(detailUrl && this.settingData.detailImg){ // jd商品详情
|
|
|
try {
|
|
|
let data = await response.text();
|
|
|
- data = data.slice(0, -1).replace('showdesc(', '');
|
|
|
+ if(data.indexOf('showdesc(') > -1){
|
|
|
+ data = data.slice(0, -1).replace('showdesc(', '');
|
|
|
+ }
|
|
|
let detailInfo = JSON.parse(data);
|
|
|
let regex = /\/\/img[0-9]+.360buyimg.com\S+.(jpg|jpeg|png|gif|avif|tif|tiff)/g;
|
|
|
let detailImgArr = [];
|
|
@@ -1197,12 +1308,14 @@
|
|
|
|
|
|
//鼠标放在主图第一张,生成视频
|
|
|
const elementHandle = await page.$('li[class*=thumbnail--]');
|
|
|
- const classListProperty = await elementHandle.getProperty('classList');
|
|
|
- const classList = await classListProperty.jsonValue();
|
|
|
- const classesArray = Object.values(classList);
|
|
|
- const allClasses = classesArray.join('.');
|
|
|
- if(allClasses && allClasses.indexOf('active-') < 0){
|
|
|
- await page.hover('li.'+allClasses);
|
|
|
+ if(elementHandle){
|
|
|
+ const classListProperty = await elementHandle.getProperty('classList');
|
|
|
+ const classList = await classListProperty.jsonValue();
|
|
|
+ const classesArray = Object.values(classList);
|
|
|
+ const allClasses = classesArray.join('.');
|
|
|
+ if(allClasses && allClasses.indexOf('active-') < 0){
|
|
|
+ await page.hover('li.'+allClasses);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
let scrollHeight = pageInfo.scrollHeight;
|
|
@@ -1639,13 +1752,13 @@
|
|
|
total_bytes = parseInt(data.headers['content-length']);
|
|
|
const status = data.statusCode;
|
|
|
if (status < 200 || status >= 300) {
|
|
|
- reject(false);
|
|
|
+ //reject(false);
|
|
|
this.$notify.error({
|
|
|
title: '网络图片访问异常!- 1',
|
|
|
message: imageUrl.slice(0,50)
|
|
|
});
|
|
|
}else if(isNaN(total_bytes)){
|
|
|
- reject(false);
|
|
|
+ //reject(false);
|
|
|
this.$notify.error({
|
|
|
title: '网络图片访问异常!- 2',
|
|
|
message: imageUrl.slice(0,50)
|
|
@@ -1679,9 +1792,6 @@
|
|
|
resolve(true);
|
|
|
});
|
|
|
});
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
} catch (error) {
|
|
|
console.error(imageUrl, `Failed to download image: ${error.message}`);
|
|
|
throw error;
|