// ==UserScript== // @name 淘宝天猫图片打包下载 // @version 0.6.0 // @description 主图、SKU、详情和视频打包下载 // @author lelf(原作者)suren(修改) // @match *://item.taobao.com/* // @match *://detail.tmall.com/* // @require https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js // @require https://cdn.bootcss.com/materialize/1.0.0-rc.2/js/materialize.min.js // @require https://cdn.bootcss.com/jszip/3.2.2/jszip.min.js // @require https://cdn.jsdelivr.net/npm/file-saver@2.0.2/dist/FileSaver.min.js // @require https://cdn.bootcss.com/jszip-utils/0.1.0/jszip-utils.min.js // @resource lelf-materialcss https://cdn.jsdelivr.net/gh/lelf2005/cdn@master/material.css?v=20200630 // @grant GM_addStyle // @grant GM_getResourceText // @license MIT // @namespace https://greasyfork.org/users/786427 // @downloadURL none // ==/UserScript== (function() { 'use strict'; var $ = $ || window.$; var materialcss = GM_getResourceText('lelf-materialcss'); GM_addStyle(materialcss); addMenu(); var zipImgs; var zipDetailImgs; let splitImgZip //=====<-在详情页面添加下载图标->===== function addMenu() { var DLBtn = `
`; $("body").append(DLBtn);//用append在body内加入DLBtn $("#lelf_tb").click(function(){ getTBPics();//获取所有图片 $('#lelf_modal2').modal();//打开弹窗 }); } //=====<-获取所有内容->===== function getTBPics(){ zipImgs = [];//定义压缩包内主图、SKU图片数组 zipDetailImgs = [];//定义压缩包内详情页图片数组 var mainVideoHtml = '';//定义视频代码 var imgHtml = '';//定义主图html代码 var skuImgHtml = '';//定义SKU图html代码 var detailImgHtml = '';//定义详情页html代码 var imgSrc = '';//定义主图地址 var skuImgSrc = '';//定义SKU图地址 var detailImgSrc = '';//定义详情页图片地址 var NewOROld = document.getElementById("J_SiteNav");//通过旧版ID:J_SiteNav定义判断值 //=====<-判断新旧版本并获取资源位置->===== var isBlobVideo = false; if(NewOROld){ var mainVideo = $("video").find("source");//旧版视频位置 var mainImg = $("#J_UlThumb").find("img");//旧版主图位置 var skuImg = $(".tb-sku .tm-img-prop").find("a");//旧版SKU图位置 var detailImg = $("#description > .content").find("img");//旧版详情页位置 } else{ var mainVideo = $(".lib-video").find("video");//新版视频位置 var mainImg = $("ul").find("img");//新版主图位置 var skuImg = $(".skuCate").find("img");//新版SKU位置 var detailImg = $(".desc-root").find("img");//新版详情页位置 } //=====<-获取视频内容->===== if(mainVideo.length > 0){ mainVideo[0].src = mainVideo[0].src.substring(0, mainVideo[0].src.lastIndexOf("?")); mainVideoHtml = ''+ '

| 主图视频:

'+ '
'+ ' '+ '
'; zipImgs.push(mainVideo[0].src);//将视频放入压缩包 } else if($("video").length > 0){ mainVideoHtml = '

| 糟糕!视频被藏起来了!

'; } //=====<-获取主图内容->===== for(var i =0; i< mainImg.length;i++){ imgSrc = mainImg[i].src; if(imgSrc.lastIndexOf("webp")>-1){ imgSrc = imgSrc.substring(0, imgSrc.lastIndexOf('_', imgSrc.lastIndexOf('_') - 1)); } else{ imgSrc = imgSrc.substring(0, imgSrc.lastIndexOf("_")); } zipImgs.push(imgSrc);//将主图放入压缩包 imgHtml += '
'; } //=====<-获取SKU内容->===== if(NewOROld){ if(skuImg.length == 0){//旧版 skuImg = $(".tb-skin .tb-img").find("a"); } for(var n =0; n< skuImg.length;n++){ if(skuImg[n].style.background){ skuImgSrc = skuImg[n].style.background.split("(")[1].split(")")[0]; skuImgSrc = skuImgSrc.substring(1,skuImgSrc.lastIndexOf("_")); zipImgs.push(skuImgSrc);//将SKU图放入压缩包 skuImgHtml += '
'; } } } else{ for(var i =0; i< skuImg.length;i++){//新版 skuImgSrc = skuImg[i].src; if(skuImgSrc.lastIndexOf("webp")>-1){ skuImgSrc = skuImgSrc.substring(0, skuImgSrc.lastIndexOf('_', skuImgSrc.lastIndexOf('_') - 1)); } else{ skuImgSrc = skuImgSrc.substring(0, skuImgSrc.lastIndexOf("_")); } zipImgs.push(skuImgSrc);//将SKU图放入压缩包 skuImgHtml += '
'; } } //=====<-获取详情页内容->===== for(var k =0; k< detailImg.length;k++){ if(detailImg[k].getAttribute("data-ks-lazyload") !== null){ detailImgSrc = detailImg[k].getAttribute("data-ks-lazyload"); } else{ detailImgSrc = detailImg[k].src; } if(detailImg[k].naturalWidth > 100 ){ zipDetailImgs.push(detailImgSrc);//将详情图放入压缩包 detailImgHtml += '
'; } } addTBHtml(mainVideoHtml,imgHtml,skuImgHtml,detailImgHtml); $('.materialboxed').materialbox(); } //=====<-将内容在弹窗内展现->===== function addTBHtml(video,imgs,skuImgs,detailImgs){ var isAdded = $("#lelf_modal2"); if(isAdded.length > 0){ isAdded.remove(); } var s = ''+ ''; $("body").append(s);//向body内插入上述代码 var instance = M.Tabs.init($('.tabs'), '{}'); $('.tabs').tabs('updateTabIndicator'); var itemId = window.location.href.split("id=")[1].split('&')[0]; if(itemId === null && itemId.toString().length<0){ itemId="unknown"; } $("#lelf_tbpic_download").click(function(){ var zip = new JSZip(); var mainImgs = zip.folder("main"); var detailImgs = zip.folder("detail"); var suffix = ''; var totalAssets = zipImgs.length + zipDetailImgs.length; var currentAsset = 0; for(var i=0;i Math.max(m, x.width), 0); const maxHeight = imgs.reduce((m, x) => m + x.height + gap, 0); let canvash = 0; for (let i = 0; i < urls.length; i += 1) { const url = urls[i]; const { width , height } = imgs[i] ; canvash += (height / width) * 790 + gap; } this.canvas.width = 790; this.canvas.height = canvash; let y = 0; const x = 0; for (let i = 0; i < urls.length; i += 1) { const url = urls[i]; let name = ""; if (typeof File === "function" && url instanceof File) { name = url.name.split(".").shift(); } else { name = url .split("/") .pop() .split(".") .shift(); } const { width , height } = imgs[i] ; this.ctx.drawImage(imgs[i], x, y, 790, (height / width) * 790); map.push([name, x, y, width, height]); y += (height / width) * 790 + gap; } cb(); } loadImages(urls) { const imgs = []; let count = 0; const { length } = urls; return new Promise((resolve, reject) => { for (let i = 0; i < urls.length; i += 1) { const img = new this.Image(); img.setAttribute("crossOrigin",'Anonymous') const url = urls[i]; img.onerror = reject; img.onload = () => { imgs[i] = img; count += 1; if (count === length) resolve(imgs); }; if (typeof File === "function" && url instanceof File) { const reader = new FileReader(); reader.addEventListener( "load", () => { img.src = reader.result; }, false ); reader.readAsDataURL(url); } else { img.src = url; } } }); } } function imgPreview(){ const preview = document.createElement('img'); preview.src = document.getElementById("mycanvas").toDataURL(); preview.style.width = "100%"; preview.style.border = "1px solid #a2de96"; document.getElementById("mergePreview").appendChild(preview); $('#mergeImgs').html('长版详情分辨率:('+document.getElementById("mycanvas").width+'*'+document.getElementById("mycanvas").height+') / 右键另存为'); } // Your code here... })();