qiushang 1 місяць тому
батько
коміт
9c522231de

+ 3 - 3
nsis/test.nsi

@@ -1,16 +1,16 @@
 # ====================== 自定义宏 产品信息==============================
 !define PRODUCT_MID        		    "Ds8JqlRmiiGR"
-!define PRODUCT_VERSION        		"2.2.4.0"
+!define PRODUCT_VERSION        		"2.2.4.1"
 !define PRODUCT_NAME           		"星优图片下载助手"
 !define INSTALL_OUTPUT_NAME    		"XYCapture_XY.exe" 
 !define EXE_NAME               		"XYCapture.exe"
 !define PRODUCT_PATHNAME           	"XYCapture"     #安装卸载项用到的KEY,注册表
 !define INSTALL_APPEND_PATH         "XYCapture"     #安装路径追加的名称 
-!define APP_DOWNLOAD_URL    		"https://xy.xingyousoft.com/soft/XYCapture/lastest2.2.4.0.7z"
+!define APP_DOWNLOAD_URL    		"https://xy.xingyousoft.com/soft/XYCapture/lastest2.2.4.1.7z"
 !define PRODUCT_PUBLISHER      	    "苏州星优办公软件有限公司"
 !define PRODUCT_LEGAL          	    "苏州星优办公软件有限公司"
 !define STATISTICS_url              "https://www.xingyousoft.com/api/index/user_log"   # 统计网址
-!define UNINSTALL_url               "https://xy.xingyousoft.com/soft/XYCapture/uninstallWeb/?v=2.2.4.0"   # 接卸优惠网址
+!define UNINSTALL_url               "https://xy.xingyousoft.com/soft/XYCapture/uninstallWeb/?v=2.2.4.1"   # 接卸优惠网址
 
 # ====================== 自定义宏 安装信息==============================
 !define INSTALL_7Z_NAME 	   		"app.7z"

+ 1 - 1
package.json

@@ -1,6 +1,6 @@
 {
 	"name": "XYCapture",
-	"version": "2.2.4.0",
+	"version": "2.2.4.1",
 	"author": "苏州星优办公软件有限公司",
 	"description": "An electron-vue project",
 	"license": "capture",

BIN
src/renderer/assets/image/m-pdd.png


+ 7 - 4
src/renderer/components/header.vue

@@ -126,7 +126,7 @@
 		</el-dialog>
 		
 		<!-- 软件设置 -->
-		<el-dialog title="软件设置" :visible.sync="settingModal" width="400px">
+		<el-dialog title="软件设置" :visible.sync="settingModal" width="420px">
 			<div>
 				<el-divider content-position="left">
 					账号登录
@@ -139,6 +139,7 @@
 					<el-button size="mini" @click="toLogin('jd')" :loading="jdLoading">京东</el-button>
 					<el-button size="mini" @click="toLogin('tb')" :loading="tbLoading">天猫/淘宝</el-button>
 					<el-button size="mini" @click="toLogin('red')" :loading="redLoading">小红书</el-button>
+					<el-button size="mini" @click="toLogin('pdd')" :loading="pddLoading">拼多多</el-button>
 				</el-row>
 				<el-divider content-position="left">
 					浏览器选择 
@@ -153,9 +154,8 @@
 					</el-radio-group>
 				</el-row>
 				<el-row style="text-align: center; margin-top: 10px;" v-if="chromeType == 1">
-					<el-input size="small" v-model="chromePath" placeholder="请输入本地Chrome/Edge浏览器启动地址" style="width: 75%;"></el-input>
-						<el-link @click="chromeHelp('https://www.xingyousoft.com/news/detail/Z80IPpNVNNC1')" type="danger" style="text-decoration: underline; font-size: 12px;" :underline="false">查看如何输入</el-link>
-					</el-popover>
+					<el-input size="small" v-model="chromePath" placeholder="请输入本地Chrome/Edge浏览器启动地址" style="width: 75%;" clearable></el-input>
+					<el-link @click="chromeHelp('https://www.xingyousoft.com/news/detail/Z80IPpNVNNC1')" type="danger" style="text-decoration: underline; font-size: 12px;" :underline="false">查看如何输入</el-link>
 				</el-row>
 				<el-divider content-position="left">
 					内置浏览器版本
@@ -317,6 +317,7 @@
 				jdLoading: false,
 				tbLoading: false,
 				redLoading: false,
+				pddLoading: false,
 				cacheLoading: false,
 				saveLoading: false,
 				
@@ -472,6 +473,8 @@
 					url = 'https://login.taobao.com';
 				}else if(type == 'red'){
 					url = 'https://www.xiaohongshu.com';
+				}else if(type == 'pdd'){
+					url = 'https://mobile.yangkeduo.com/personal.html';
 				}
 				this[type + 'Loading'] = true;
 				setTimeout(() => {

+ 351 - 6
src/renderer/components/home.vue

@@ -26,6 +26,9 @@
 						<el-menu-item index="6">
 							<img src="../assets/image/m-aliguoji.png" class="m-image"/><span slot="title">阿里国际</span>
 						</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">
 							<img src="../assets/image/m-baidu.png" class="m-image"/><span slot="title">百度爱采购</span>
 						</el-menu-item>
@@ -35,6 +38,7 @@
 						<el-menu-item index="5">
 							<img src="../assets/image/m-hong.png" class="m-image"/><span slot="title">小红书</span>
 						</el-menu-item>
+						
 						<el-menu-item index="10">
 							<img src="../assets/image/m-chrome.png" class="m-image"/><span slot="title">其他(Beta)</span>
 						</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>
 				
-				<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>
 						<div class="content-top">
 							<div>
@@ -110,6 +114,7 @@
 										<span v-if="menuIndex == '6'">阿里国际 - </span>
 										<span v-if="menuIndex == '7'">百度爱采购 - </span>
 										<span v-if="menuIndex == '8'">亚马逊 - </span>
+										<span v-if="menuIndex == '9'">拼多多 - </span>
 										<span v-if="menuIndex == '10'">网页 - </span>
 										图片下载
 									</h3>
@@ -141,7 +146,7 @@
 										<el-checkbox :value="true" style="opacity: 0.6; cursor: not-allowed;">图片</el-checkbox>
 									</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>
 										<el-checkbox-group :min="1" v-model="settingArr" style="display: inline-block;" @input="settingGroup">
 											<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="video">视频</el-checkbox>
 										</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>
 										</el-popover>
 									</div>
@@ -194,6 +200,16 @@
 											<el-button size="mini" type="warning" :loading="checkLoading" style="margin-left: 10px;" :disabled='redStatus == 2' @click="checkRedLogin">检测登录状态</el-button>
 										</div>
 									</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>
 							</div>
 						
@@ -236,6 +252,10 @@
 												<i class="el-icon-error" style="font-size: 16px; color: #ed4014;"></i>
 												<span>验证码拦截,请手动验证!</span>
 											</template>
+											<template v-if="row.status == '7'">
+												<i class="el-icon-error" style="font-size: 16px; color: #ed4014;"></i>
+												<span>频繁访问受限,清除缓存重试</span>
+											</template>
 										</template>
 									</vxe-column>
 									<vxe-column title="操作" width="80">
@@ -280,6 +300,10 @@
 								<p>小红书渠道需要登录后才能下载</p>
 								<p class="visible-tips-style">目前检测还未登录小红书账号,需立即登录</p>
 							</template>
+							<template v-else-if="menuIndex == '9'">
+								<p>拼多多渠道需要登录后才能下载</p>
+								<p class="visible-tips-style">目前检测还未登录拼多多账号,需立即登录</p>
+							</template>
 							<template v-else>
 								<p>天猫/淘宝渠道需要登录后才能下载</p>
 								<p class="visible-tips-style">目前检测还未登录天猫/淘宝账号,需立即登录</p>
@@ -293,6 +317,7 @@
 								<el-button type="primary" @click="loginVisible = false; skipLogin = true; exportFile();">继续下载</el-button>
 							</template>
 							<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>
 						</div>
 					</el-dialog>
@@ -335,7 +360,7 @@
 	// import puppeteer from 'puppeteer'
 	import puppeteer from 'puppeteer-extra'
 	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 waitUntil = 'networkidle2';
 	const { ipcRenderer } = require('electron');
@@ -389,6 +414,7 @@
 				tbList: [],
 				tmallList: [],
 				redList: [],
+				pddList: [],
 				commonList: [],
 				productName: pjson.softInfo.softName,
 				imgUrl: this.$api.imgUrl,
@@ -401,7 +427,7 @@
 					video: false,
 				},
 				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: [],
 				
@@ -416,6 +442,7 @@
 				redStatus: 1, //同上
 				alibabaStatus: 1, //同上上
 				aliguojiStatus: 1, //同上上上
+				pddStatus: 1,
 				execLimit: 1,
 				execNum: 3, // 限制5张
 				
@@ -428,6 +455,7 @@
 				jdBrowser: null,
 				commonBrowser: null,
 				redBrowser: null,
+				pddBrowser: null,
 				loginBrowser: null, // 登录用的浏览器实例
 				skipLogin: false,
 				pauseFlag: true, //暂停中止标志
@@ -750,6 +778,7 @@
 				this.redStatus = 3;
 				this.alibabaStatus = 3;
 				this.aliguojiStatus = 3;
+				this.pddStatus = 3;
 				
 				if(this.loginBrowser){
 					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 task = "";
 					let userDataDir = this.initDataDir();
@@ -998,6 +1044,9 @@
 							case '8': // 亚马逊
 								task = this.alibabaDownload(item, this.amazonBrowser);
 								break;
+							case '9': // 拼多多
+								task = this.pddDownload(item, this.pddBrowser);
+								break;
 							case '10': // 普通网址
 								task = this.normalDownload(item, this.commonBrowser);
 								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(){
@@ -3122,12 +3464,15 @@
 			},
 			
 			// 获取页面标题 - 生成对应的文件夹
-			async getTitle(page, urlInfo){
+			async getTitle(page, urlInfo, tagStr){
 				// 已页面标题作为新建文件夹,保留前50个字
 				let title = await page.title();
 				if(!title){
 					title = '无标题-'+new Date().getTime();
 				}
+				if(tagStr){
+					title = tagStr.replace(/\.\.\./g, '');
+				}
 				if(title){
 					title = title.substring(0, 50).trim();
 					if(this.containsAnyChar(title, ['\\', '/', ':', '*', '?', '"', '<', '>', '|'])){  //判断是否含有特殊字符