// ==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...
})();