Pack to download-wnacg

Try downloading the wnacg image as a package

As of 2020-06-08. See the latest version.

// ==UserScript==
// @name:en         Pack to download-wnacg
// @name         打包下载wnacg的图片
// @name:zh-CN      打包下载wnacg的图片
// @namespace    raincore
// @version      0.5
// @description 由于wnacg的直接下载通道无法使用,所以我想通过脚本请求每一张图片,之后打包保存。
// @description:en  Try downloading the wnacg image as a package
// @author       raincore
// @icon http://www.wnacg.com/favicon.ico
// @match       *://*.wnacg.com/photos-index-*
// @match       *://*.wnacg.wtf/photos-index-*
// @match       *://*.wnacg.org/photos-index-*
// @require https://cdn.staticfile.org/jquery/3.5.1/jquery.min.js
// @require https://cdn.staticfile.org/FileSaver.js/1.3.8/FileSaver.min.js
// @require https://cdn.staticfile.org/jszip/3.3.0/jszip.min.js
// @connect img2.wnacg.download
// @connect img1.wnacg.download
// @grant GM_xmlhttpRequest
// @grant unsafeWindow
// ==/UserScript==
var a=document.createElement('a');
var c=document.createElement('a');
var doneSize=0;
var maxSize;
var requestList=[];
var cancelled=false;
var tab=$('.uwthumb')[0];
(function (){
    a.className="btn";
    a.style="width:130px;";
    a.text="打包下载";
    c.className="btn";
    c.style="width:130px;";
    c.text="取消下载";
    a.onclick=main;
    c.onclick=cancel;
    tab.append(a);
})();
function main() {
    'use strict';
    tab.append(c);
    a.onclick=null;
    c.style="width:130px;";
    doneSize=0;
    maxSize=0;
    cancelled=false;
    var curWwwPath = window.document.location.href;
    var aid=curWwwPath.substring(curWwwPath.indexOf("aid")+4,curWwwPath.lastIndexOf(".html"));
    aid=parseInt(aid);
    getImgList(aid,download);
}
function cancel(){
    cancelled=true;
    for(var i=0;i<requestList.length;i++){
        requestList[i].abort();
    }
    c.style="width:130px;display:none;";
    a.onclick=main;
}
function download(imglist) {
    var array=[];
    var file_name=$('#bodywrap h2').text()+".zip";
    for(let i=0;i<imglist.length;i++){
        array[i]="https:"+imglist[i].url;
    }
    var zip = new JSZip();
    var len = function (arr) {
        var l = 0;
        for (var key in arr) {
            l++;
        }
        return l;
    }
    a.text="开始下载...";
    maxSize=imglist.length-1;
    for (let i = 0; i < array.length-1; i++) {
        getImage(array[i], function (data) {
            zip.file(PrefixInteger(i,4)+".png",data);
            var ziplength = len(zip.files);
            if (ziplength == array.length-1) {
                a.text="正在压缩...";
                c.style="width:130px;display:none;";
                zip.generateAsync({ type: "blob" },function updateCallback(metadata) {
                    a.text="正在压缩:"+metadata.percent.toFixed(2) + " %";
                })
                    .then(function (content) {
                    cancelled?null:saveAs(content, file_name);
                    cancelled?a.text="打包下载":a.text="下载完成";
                    a.onclick=main;
                    cancelled?null:a.onmouseover=function(){this.text="重新下载";};
                });
            }
        });
    }
}
function getImage(images,callback) {
    var tmp=GM_xmlhttpRequest({
        "method": "GET",
        "url": images,
        "headers": {
            "user-agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36'
        },
        "responseType":"arraybuffer",
        "onload": function (result) {
            doneSize++;
            cancelled?a.text="打包下载":a.text="已下载"+doneSize+"/"+maxSize;
            var arrayBuffer = result.response;
            callback(arrayBuffer);
        },
        onabort :function(){
            a.text="打包下载";
        }
    });
    requestList.push(tmp);
}
function getImgList(aid,callback){
    a.text="加载资源列表...";
    GM_xmlhttpRequest({
        "method": "GET",
        "url": "/photos-gallery-aid-"+PrefixInteger(aid,7)+".html",
        "headers": {
            "user-agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36'
        },
        "onload": function (result) {
            var rawText = result.response;
            rawText=rawText.split('\n');
            var raw="";
            for(var i=2;i<rawText.length-5;i++){
                rawText[i]=rawText[i].substring(18);
                rawText[i]=rawText[i].substring(0,rawText[i].indexOf('");'));
                rawText[i]=rawText[i].replace(/\\/g,"");
                raw+=rawText[i];
            }
            eval(raw);
            a.text="加载成功!";
            callback(imglist);
        }
    });
}
function PrefixInteger(num, n) {
    return (Array(n).join(0) + num).slice(-n);
}