qiushang 10 月之前
父節點
當前提交
c382569de1

+ 1 - 1
package.json

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

+ 26 - 3
src/renderer/assets/css/fontx/demo_index.html

@@ -55,6 +55,12 @@
           <ul class="icon_lists dib-box">
           
             <li class="dib">
+              <span class="icon iconfont">&#xe7cc;</span>
+                <div class="name">疑问-圆-填充</div>
+                <div class="code-name">&amp;#xe7cc;</div>
+              </li>
+          
+            <li class="dib">
               <span class="icon iconfont">&#xe658;</span>
                 <div class="name">免责</div>
                 <div class="code-name">&amp;#xe658;</div>
@@ -138,9 +144,9 @@
 <pre><code class="language-css"
 >@font-face {
   font-family: 'iconfont';
-  src: url('iconfont.woff2?t=1725584676706') format('woff2'),
-       url('iconfont.woff?t=1725584676706') format('woff'),
-       url('iconfont.ttf?t=1725584676706') format('truetype');
+  src: url('iconfont.woff2?t=1727167270788') format('woff2'),
+       url('iconfont.woff?t=1727167270788') format('woff'),
+       url('iconfont.ttf?t=1727167270788') format('truetype');
 }
 </code></pre>
           <h3 id="-iconfont-">第二步:定义使用 iconfont 的样式</h3>
@@ -167,6 +173,15 @@
         <ul class="icon_lists dib-box">
           
           <li class="dib">
+            <span class="icon iconfont iconx-yiwen"></span>
+            <div class="name">
+              疑问-圆-填充
+            </div>
+            <div class="code-name">.iconx-yiwen
+            </div>
+          </li>
+          
+          <li class="dib">
             <span class="icon iconfont iconx-mianze-01"></span>
             <div class="name">
               免责
@@ -294,6 +309,14 @@
           
             <li class="dib">
                 <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#iconx-yiwen"></use>
+                </svg>
+                <div class="name">疑问-圆-填充</div>
+                <div class="code-name">#iconx-yiwen</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
                   <use xlink:href="#iconx-mianze-01"></use>
                 </svg>
                 <div class="name">免责</div>

+ 7 - 3
src/renderer/assets/css/fontx/iconfont.css

@@ -1,8 +1,8 @@
 @font-face {
   font-family: "iconfont"; /* Project id 4464344 */
-  src: url('iconfont.woff2?t=1725584676706') format('woff2'),
-       url('iconfont.woff?t=1725584676706') format('woff'),
-       url('iconfont.ttf?t=1725584676706') format('truetype');
+  src: url('iconfont.woff2?t=1727167270788') format('woff2'),
+       url('iconfont.woff?t=1727167270788') format('woff'),
+       url('iconfont.ttf?t=1727167270788') format('truetype');
 }
 
 .iconfont {
@@ -13,6 +13,10 @@
   -moz-osx-font-smoothing: grayscale;
 }
 
+.iconx-yiwen:before {
+  content: "\e7cc";
+}
+
 .iconx-mianze-01:before {
   content: "\e658";
 }

文件差異過大導致無法顯示
+ 0 - 0
src/renderer/assets/css/fontx/iconfont.js


+ 7 - 0
src/renderer/assets/css/fontx/iconfont.json

@@ -6,6 +6,13 @@
   "description": "软件",
   "glyphs": [
     {
+      "icon_id": "4464109",
+      "name": "疑问-圆-填充",
+      "font_class": "yiwen",
+      "unicode": "e7cc",
+      "unicode_decimal": 59340
+    },
+    {
       "icon_id": "33845663",
       "name": "免责",
       "font_class": "mianze-01",

二進制
src/renderer/assets/css/fontx/iconfont.ttf


二進制
src/renderer/assets/css/fontx/iconfont.woff


二進制
src/renderer/assets/css/fontx/iconfont.woff2


二進制
src/renderer/assets/image/chromium.png


+ 143 - 33
src/renderer/components/home.vue

@@ -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;  

+ 30 - 0
src/renderer/components/update.vue

@@ -2,6 +2,7 @@
     <div>
 		<div :style="{background: '#fafafa', padding: '5px 20px', lineHeight: '34px'}" class="footer-between">
 		    <div>
+				<span @click="questionVisible = true" class="footer-menu"><i class="iconfont iconx-yiwen"></i>常见问题</span>
 				<span @click="mianVisible = true" class="footer-menu"><i class="iconfont iconx-mianze-01"></i>免责声明</span>
 		        <a href="https://www.xingyousoft.com"><span class="footer-menu"><i class="iconfont iconx-wangzhi"></i>官网</span></a>
 		    </div>
@@ -66,6 +67,30 @@
 				<el-button @click="mianVisible = false;">同意并使用</el-button>
 			</div>
 		</el-dialog>
+		
+		<!-- 常见问题 -->
+		<el-dialog title="常见问题" :visible.sync="questionVisible" width="700px" :close-on-click-modal="false" :close-on-press-escape="false" :show-close="false">
+			<el-collapse accordion>
+				<el-collapse-item title="阿里巴巴下载时生成验证码拦截文件夹" name="1">
+					<div>点击软件右上角菜单按钮,选择软件设置-账号登录,点击阿里巴巴账号,浏览器打开后登录阿里巴巴账号,登录完成后关闭浏览器即可正常使用。</div>
+				</el-collapse-item>
+				<el-collapse-item title="网络图片访问异常 -1 或 -2" name="2">
+					<div>网页中可能存在网络图片无法加载的情况,会过滤掉无法下载的图片</div>
+				</el-collapse-item>
+				<el-collapse-item title="账号登陆后,下载任务显示处理中没反应" name="3">
+					<div>查看任务栏是否关闭该浏览器 <img style="width: 20px;" src="../assets/image/chromium.png" />,如未关闭请关闭浏览器后重新下载。</div>
+				</el-collapse-item>
+				<el-collapse-item title="关闭浏览器后,下载任务显示处理中仍没反应" name="4">
+					<div>可能出现官网拦截,出现请拖动滑块还原拼图的情况,点击软件右上角菜单按钮,选择软件设置-账号登录,点击对应的淘宝/天猫账号,浏览器打开后手动拖动还原拼图拦截,完成后关闭浏览器即可正常使用。</div>
+				</el-collapse-item>
+				<el-collapse-item title="下载完成后,打开文件夹如何保持图片顺序" name="5">
+					<div>在下载完成后的文件夹中,鼠标右击空白位置,选择排序方式-日期-递增。</div>
+				</el-collapse-item>
+			</el-collapse>
+			<div slot="footer" class="dialog-footer-center">
+				<el-button @click="questionVisible = false;">关闭</el-button>
+			</div>
+		</el-dialog>
     </div>
 </template>
 
@@ -80,6 +105,7 @@
 		data(){
 			return {
 				mianVisible: false,
+				questionVisible: false,
 				softInfo: {
 					softName: pjson.softInfo.softName,
 					version: pjson.version,
@@ -257,4 +283,8 @@
 	font-weight: 600; 
 	padding: 9px 0;
 }
+.el-collapse-item__header{
+	font-weight: 600 !important;
+	font-size: 14px !important;
+}
 </style>

部分文件因文件數量過多而無法顯示