qiushang 1 éve
szülő
commit
ad1c4c9e84
1 módosított fájl, 211 hozzáadás és 66 törlés
  1. 211 66
      src/renderer/components/home.vue

+ 211 - 66
src/renderer/components/home.vue

@@ -14,6 +14,8 @@
 							<template slot="title"><i class="el-icon-picture"></i>图片下载</template>
 							<el-menu-item index="1">阿里巴巴</el-menu-item>
 							<el-menu-item index="2">京东</el-menu-item>
+							<el-menu-item index="3">天猫</el-menu-item>
+							<el-menu-item index="4">淘宝</el-menu-item>
 							<el-menu-item index="10">其他网址</el-menu-item>
 						</el-submenu>
 						
@@ -43,7 +45,7 @@
 							</div>
 							
 							<div style="padding: 15px 20px 0 20px; height: calc(100% - 160px);">
-								<el-input type="textarea" :rows="5" placeholder="请输入网址链接(例:https://www.example.com)" v-model="url"></el-input>
+								<el-input type="textarea" :rows="5" :placeholder="'请输入网址链接(例:' + exampleUrl[menuIndex-1] + ')'" v-model="url"></el-input>
 								
 								<div style="padding: 20px 0;">
 									<el-row>
@@ -84,7 +86,11 @@
 										</template>
 										
 										<template v-if="menuIndex == '2'">
-											<el-button size="small" type="info" @click="accountLogin()" >检测登录状态</el-button>
+											<el-checkbox :value="true" style="opacity: 0.6; cursor: not-allowed;">下载主图</el-checkbox>
+											<el-checkbox v-model="settingData.detailImg" >下载详情图</el-checkbox>
+											<el-checkbox v-model="settingData.skuImg" >下载SKU图</el-checkbox>
+											<!-- <el-checkbox v-model="settingData.commentImg" >下载评论图</el-checkbox> -->
+											<el-checkbox v-model="settingData.video" >下载视频</el-checkbox>
 										</template>
 										
 									</el-row>
@@ -154,6 +160,7 @@
 					video: true,
 				},
 				activities: [],
+				exampleUrl: ['https://www.1688.com', 'https://www.jd.com', 'https://www.tmall.com', 'https://www.taobao.com'],
 
 				fileList: [],
 				
@@ -325,7 +332,13 @@
 					case '2': // 京东
 						this.jdDownload();
 						break;
-					case '10': // 其他网址
+					case '3': // 天猫
+						this.tmallDownload();
+						break;
+					case '4': // 淘宝
+						this.tbDownload();
+						break;
+					case '10': // 普通网址
 						this.normalDownload();
 						break;
 				}
@@ -470,97 +483,230 @@
 				})();
 			},
 			
-			// 账号登录
-			accountLogin(type){
+			// 京东下载
+			jdDownload(){
 				(async () => {
 					try{
-						if(!this.jdBrowser){
-							this.jdBrowser = await puppeteer.launch({ headless: false });
-						}
-						const page = await this.jdBrowser.newPage();
-						await page.setViewport({ width: 1280, height: 800 });  
+						const jdBrowser = await puppeteer.launch();
+						const page = await jdBrowser.newPage();
+						await page.setViewport({ width: 1280, height: 800 });
+						
+						let jdImgInfo = {
+							mainImg: [],
+							skuImg: [],
+							commentImg: [],
+							detailImg: [],
+							video: []
+						};
+						
+						let titleFlag = true;
 						
 						page.on('response', async(response) => {
+							
+							if(titleFlag){ // 第一次生成页面标题
+								await this.getTitle(page);
+								titleFlag = false;
+							}
+							
+							if(this.activities.length < 2){
+								this.activities.push({id: 2, num:0, content: '图片下载中...',type: 'success'});
+							}
+						
 							// 检查响应的 MIME 类型是否以 'image/' 开头
-							if (response.headers()['content-type'] && response.headers()['content-type'].startsWith('application/json')) {  
+							if (response.headers()['content-type'] && response.headers()['content-type'].startsWith('application/json')) {
+								
+								let detailUrl = '';
+								let videoUrl = '';
+								if(response.url().indexOf('&callback=showdesc') > -1 && response.url().indexOf('/description/') > -1){ // 商品详情接口  
+									detailUrl = response.url();
+								}
 								
-									console.log(response.url(), response.headers()['content-type']);
+								if(response.url().indexOf('/tencent/video_v3') > -1){ // 商品视频接口
+									videoUrl = response.url();
+								}
+								
+								if(detailUrl && this.settingData.detailImg){ // jd商品详情
+									try {
+										let data = await response.text();
+										data = data.slice(0, -1).replace('showdesc(', '');
+										let detailInfo = JSON.parse(data);
+										let regex = /(http|https):\/\/img[0-9]+.360buyimg.com\S+.(jpg|jpeg|png|gif|avif|tif|tiff)/g;
+										let detailImgArr = [];
+										if(detailInfo && detailInfo.content){
+											detailImgArr = detailInfo.content.match(regex);
+										}
+										jdImgInfo.detailImg = detailImgArr;
+										
+										for(let i = 0; i < detailImgArr.length; i++){
+											let fileName = detailImgArr[i].split('/').pop();
+											if(fileName){
+												var queryIndex = fileName.indexOf('?');
+												if (queryIndex !== -1) {
+													fileName = fileName.substr(0, queryIndex);  
+												}
+												
+												if (!fs.existsSync(this.handleData.newPath + '\\详情图')) {
+													fs.mkdirSync(this.handleData.newPath + '\\详情图');
+												}
+												
+												let outputPath = this.handleData.newPath + '\\详情图\\' + fileName;
+												await this.downloadImage(detailImgArr[i], outputPath);
+											}
+										}
+										
+									} catch (error) {  
+										console.error('详情图片解析失败:', error);
+									}
+								}
+								
+								if(videoUrl && this.settingData.video){ // jd商品视频
+									try {
+										let data = await response.text();
+										data = data.slice(0, -1).replace(/^jQuery[0-9]+\(/, '');
+										let videoInfo = JSON.parse(data);
+										let videoUrl = videoInfo.playUrl;
+										jdImgInfo.video.push(videoUrl);
+										
+										let fileName = videoUrl.split('/').pop();
+										if(fileName){
+											var queryIndex = fileName.indexOf('?');
+											if (queryIndex !== -1) {
+												fileName = fileName.substr(0, queryIndex);  
+											}
+											
+											if (!fs.existsSync(this.handleData.newPath + '\\视频')) {
+												fs.mkdirSync(this.handleData.newPath + '\\视频');
+											}
+											
+											let outputPath = this.handleData.newPath + '\\视频\\' + fileName;
+											await this.downloadImage(videoUrl, outputPath);
+										}
+										
+									} catch (error) {  
+										console.error('视频解析失败:', error);  
+									}
+								}
+							}
+							
+							if (response.headers()['content-type'] && response.headers()['content-type'].startsWith('image/')) {
+								let regex = /^https:\/\/img[0-9]+.360buyimg.com\/n/;
+								if(regex.exec(response.url())){ // 匹配符合规则的图片路径
+									let reg = /\/n[0-9]+\/jfs\//;
+									if(response.url().indexOf('/s40x40_jfs/') > -1 && this.settingData.skuImg){ // sku图片
+										let skuImgUrl = response.url().replace('/s40x40_jfs/', '/jfs/').replace(/\/n[0-9]+\/jfs\//, '/n1/jfs/');;
+										jdImgInfo.skuImg.push(skuImgUrl);
+										
+										let fileName = skuImgUrl.split('/').pop();
+										if(fileName){
+											var queryIndex = fileName.indexOf('?');
+											if (queryIndex !== -1) {
+												fileName = fileName.substr(0, queryIndex);  
+											}
+											if (!fs.existsSync(this.handleData.newPath + '\\sku图')) {
+												fs.mkdirSync(this.handleData.newPath + '\\sku图');
+											}
+											let outputPath = this.handleData.newPath + '\\sku图\\' + fileName;
+											await this.downloadImage(skuImgUrl, outputPath);
+										}
+									}
+									
+									if(response.url().match(reg)){ // 主图
+										let mainImgUrl = response.url().replace(/\/n[0-9]+\/jfs\//, '/n1/jfs/');
+										jdImgInfo.mainImg.push(mainImgUrl);
+										
+										let fileName = mainImgUrl.split('/').pop();
+										if(fileName){
+											var queryIndex = fileName.indexOf('?');
+											if (queryIndex !== -1) {
+												fileName = fileName.substr(0, queryIndex);  
+											}
+											if (!fs.existsSync(this.handleData.newPath + '\\主图')) {
+												fs.mkdirSync(this.handleData.newPath + '\\主图');
+											}
+											let outputPath = this.handleData.newPath + '\\主图\\' + fileName;
+											await this.downloadImage(mainImgUrl, outputPath);
+										}
+										
+									}
+								}
 							}
+							
 						});
 						
-						//await page.setJavaScriptEnabled(false);
-						// await page.goto('https://www.jd.com/', {waitUntil : 'networkidle2'});
-						await page.goto('https://item.jd.com/10056666299521.html', {waitUntil : 'networkidle2'});
+						await page.goto(this.url, {waitUntil : 'networkidle2'});
 						
-						page.on('request', request => {  
-							console.log(request);
-						    // 检查请求的 URL 是否符合可能导致跳转的条件  
-						    // if (/* 某些条件,比如 URL 包含特定字符串 */) {  
-						    //     request.abort(); // 取消请求  
-						    // } else {  
-						    //     request.continue(); // 允许请求继续  
-						    // }  
-						});  
-						await page.setRequestInterception(true);
+						await jdBrowser.close();
+						this.activities.push({id: 3, content: '图片下载完成',type: 'success'});
+					}catch(e){
+						this.showError(e);
+					}
+				})();
+			},
+			
+			// 天猫下载
+			tmallDownload(){
+				(async () => {
+					try{
+						const jdBrowser = await puppeteer.launch();
+						const page = await jdBrowser.newPage();
+						await page.setViewport({ width: 1280, height: 800 });
 						
+						let jdImgInfo = {
+							mainImg: [],
+							skuImg: [],
+							commentImg: [],
+							detailImg: [],
+							video: []
+						};
 						
-
+						let titleFlag = true;
+						
+						page.on('response', async(response) => {
+							
+							// if(titleFlag){ // 第一次生成页面标题
+							// 	await this.getTitle(page);
+							// 	titleFlag = false;
+							// }
+							
+							if(this.activities.length < 2){
+								this.activities.push({id: 2, num:0, content: '图片下载中...',type: 'success'});
+							}
 						
-						let loginResult = await page.evaluate(() => {
-							if(document.querySelector('.link-login')){
-								document.querySelector('.link-login').click();
-								return false;
-							}else{
-								return true;
+							// 检查响应的 MIME 类型是否以 'image/' 开头
+							if (response.headers()['content-type'] && response.headers()['content-type'].startsWith('application/json')) {
+								
+								let data = await response.text();
+								console.log(data);
+								
+								
+							}
+							
+							if (response.headers()['content-type'] && response.headers()['content-type'].startsWith('image/')) {
+								
 							}
+							
 						});
 						
-						if(loginResult){ // 登录成功
-							//const cookies = await page.cookies('https://www.jd.com/');
-							//await page.setViewport({ width: 1, height: 1 });  
-							console.log('登录成功');
-						}else{ //登录失败
-							console.log('登录失败');
-						}
-						
-						// let scrollHeight = pageInfo.scrollHeight;
-						// let cHeight = pageInfo.cHeight;
-						
-						// let num = Math.ceil(scrollHeight / cHeight);
-						// let start = -1;
-						// let scrollInt = setInterval(async() => {
-						// 	start ++;
-						// 	await page.evaluate((start) => {
-						// 		let cHeight = document.documentElement.clientHeight;
-						// 		window.scrollTo({
-						// 			top: cHeight * start, 
-						// 			behavior: "smooth" 
-						// 		});
-						// 	}, start);
-						// 	if(start > num || start > 500){ // 防止页面过长,滚动500次自动停止
-						// 		clearInterval(scrollInt);
-						// 		await this.scanImg(this.jdBrowser, page);
-						// 		this.loading = false;
-						// 	}
-						// }, 500);
+						let testUrl = 'https://detail.tmall.com/item.htm?id=666055276707&spm=a21bo.jianhua%2Fa.201876.d9.5af92a895n1RYy&scm=1007.40986.276750.0&pvid=5feff41b-7992-483e-96dc-b87acafa1ea9&xxc=home_recommend&utparam=%7B%22aplus_abtest%22%3A%22b579fe12b84b34042c867320618f0c6b%22%7D&priceTId=2147807217241454856155439e67b8&pisk=fG5xstAYAuqDq32GGZwksGpFOMUo6sQqmi7IshxmCgIRRwoDCh2VXdIG4d1DiZj-u_IKsjq43NG9sCZ3xWVhurRw1k2muoem0E8K15x6fLGYU_n7xWVhy-T2saZ37kskZH8M1E9jhbaJSeGs1G9sNaty7FiX5jaRP3861F9shagWoFTsfxG5tlKSlhcOChxReugMGfG1G5JvvLDi6fdXlKC1z3BlE_LvHH9uKDcNGgb1isJzEYRNr9IOCGynUIQ1hIThuShJOZ6l6UfgSAKfr_Q5ML3K9KB6WpO6eVG1yI6DFsAQO0LPFZX1gi3t1E5ctdKeePGwIQ1Hd9sx7y7WGFswL1qEgn_186WH97DXOaB1vOIPf6fLn-oHvFDbyzHZQKTojP1_90ukYHYJxrFtQAJzzUK3yzHZQKTyyH4YDAkwUz5..';
 						
+						await page.goto(testUrl, {waitUntil : 'networkidle2'});
 						
+						await jdBrowser.close();
+						this.activities.push({id: 3, content: '图片下载完成',type: 'success'});
 					}catch(e){
 						this.showError(e);
 					}
 				})();
 			},
 			
-			// 京东下载
-			jdDownload(){
+			//淘宝下载
+			tbDownload(){
 				
 			},
 			
-			
-			// 扫描并下载图片
+			// 阿里巴巴 - 扫描并下载图片
 			async scanImg(browser, page){
 				//detailImg:详情图;skuImg:sku图片;commentImg: 评论图;video: 视频
-				
 				const imgInfo = await page.evaluate(() => {
 					let outObj = {
 						mainImg: [],
@@ -701,7 +847,6 @@
 					}
 				}
 				
-				
 				await browser.close();
 				this.activities.push({id: 3, content: '图片下载完成',type: 'success'});
 			},