图集岛VIP中P(改)

VIP破解 + 单张下载 + 一键下载(批量单张下载)+ 打包下载 + Viwer预览(可以使用FancyBox但是不让发布不会js引用) + 简易收藏功能

// ==UserScript==
// @name 图集岛VIP中P(改)
// @namespace http://tampermonkey.net/
// @version 1.0.3
// @description VIP破解 + 单张下载 + 一键下载(批量单张下载)+ 打包下载 + Viwer预览(可以使用FancyBox但是不让发布不会js引用) + 简易收藏功能
// @author ss548
// @include /https?:\/\/(\w+\.)?tujidao.\w+/
// @icon  https://yskhd.com/wp-content/themes/modown/static/img/smilies/rolleyes.png
// @require https://lf6-cdn-tos.bytecdntp.com/cdn/expire-1-M/jszip/3.7.1/jszip.min.js
// @require https://lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/FileSaver.js/2.0.5/FileSaver.min.js
// @grant GM_xmlhttpRequest
// @grant unsafeWindow
// @grant GM_addStyle
// @license MIT
// ==/UserScript==

(function () {
    "use strict";
    GM_addStyle(".sc{position: absolute;top: 0;left: 0;background: #ebae12;border-radius: 50%;width: 35px;text-align: center;color: #FFF;z-index: 100;font-size: 13px;cursor: pointer;}");
    var locurl = window.location.href;
    var html1 =
        '<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><script type="text/javascript" src="https://www.tujidao02.com/Static/css/jquery.js"></script><script type="text/javascript" src="http://demo.jb51.net/js/viewerjs/js/js/viewer.js"></script><link rel="stylesheet" href="http://demo.jb51.net/js/viewerjs/js/css/viewer.css" type="text/css">' +
        "<style>img {vertical-align: top;text-align: center;}" +
        ".imgbox{margin-bottom:5px;position: relative;overflow: hidden;}" +
        ".imgbox img{max-width: 100%;cursor:pointer;}" +
        ".imgnum{cursor:pointer;position: absolute;left: 0px;top: 0px;background: rgba(255, 152, 0,0.5);z-index: 100;padding: 5px;color: #f9f9f9;border-radius: 0px;}" +
        ".btn-box{display:flex;justify-content: space-around;}" +
        ".btn{width:48%;cursor:pointer;background: rgba(255, 152, 0,0.8);z-index: 100;text-align: center;margin: 5px 0;padding: 10px 0px;color: #f9f9f9;border-radius: 2px;}" +
        "a:link{color:pink;}a:visited{color:purple;}" +
        ".contianer{column-count: 4;column-gap: 5px;margin:0;padding:0;}" +
        ".loading-box{width: 100%;height: 50px;display: none;align-items: center;position: absolute;top: 50px;left: 0;z-index: 999;}.loading{margin: 0 auto;width: 120px;height: 40px;line-height: 40px;color: #FFF;font-size: 17px;text-align: center;background: #1111119e;border-radius: 2px;}"+
        "</style></head>" +
        '<body bgcolor="#27282d"><div class="loading-box"><p class="loading">下载中...</p></div><ul id="images" align="center" class="contianer">';
    var pic_base =
        "<li class='imgbox'><div class='imgnum'  onclick='download1({pic_id},{num})'>{imgnum} 下载"+
        "</div><img alt='{pic_id}_{num}.jpg' filename='{title}_{num}.jpg' data-original='https://tjg.gzhuibei.com/a/1/{pic_id}/{num}.jpg' src='https://tjg.gzhuibei.com/a/1/{pic_id}/{num}.jpg'></li>";
    var title = "";
    var flag = false;
    var layer = null;
    var toastMsg;
    layui.use('layer', function(){
        layer = layui.layer;
    });
// 下载函数
    function download(pic_id,imageId) {
        //console.log('download')
        GM_xmlhttpRequest({
            method: "GET",
            url: `https://tjg.gzhuibei.com/a/1/${pic_id}/${imageId}.jpg`,
            headers: {
                referer: "https://www.tujidao02.com/"
            },
            responseType:"blob",
            onload: function(xhr) {
                var r = xhr.responseText,
                    data = new Uint8Array(r.length),
                    i = 0;
                while (i < r.length) {
                    data[i] = r.charCodeAt(i);
                    i++;
                }
                let blob = new Blob([data], {
                    type: "image/jpeg"
                });
                var blobURL = window.URL.createObjectURL(blob);
                //console.log(blobURL)
                var downA = document.createElement("a");
                downA.href = blobURL;
                downA.setAttribute("download", document.title+`_${imageId}.jpg`);
                downA.click();
                window.URL.revokeObjectURL(blobURL);
            }
        })
    }
// 一键下载函数
    function onekeydownload(pic_id,num) {
        for(let i=1;i<=num;i++){
            (function(j) {
                window.setTimeout(function(){
                    download(pic_id,j);
                },100*i);
            })(i);
        }
    }


    //******新增打包下载点击
    function zipDown(){
        //批量下载
        if (!flag) {
            downloadPack();
            flag = true;
        } else {
            alert('下载中, 请耐心等待...\n点击确认继续下载');
        }
    }
    //******新增zip下载
    async function downloadPack() {
        console.log("start download...");
        $(".loading-box").css("display","flex");
        var start = performance.now();

        var list = document.querySelectorAll('.imgbox>img');
        var title = document.title;
        var zip = new JSZip();
        for (const item of list) {
            var url = item.getAttribute('src');
            var filename = item.getAttribute('filename');
            //console.log(url,filename);
            const response = getFile(url);
            zip.file(filename, response);

        }

        zip.generateAsync({
            type: 'blob'
        }).then(function (content) {
            saveAs(content, title + '.zip');
            var end = performance.now();
            console.log('completed: ', `${(end - start) / 1000} ms`)
            $(".loading-box").css("display","none");
        });
    }

    //******新增下载文件
    async function getFile(url) {
        return new Promise((resolve, reject) => {
            GM_xmlhttpRequest({
                method: "GET",
                url: url,
                headers: {
                    referer: "https://" + window.location.host
                },
                responseType: "blob",
                onload: function (response) {
                    resolve(response.response);
                },
                onerror: function (error) {
                    reject(error);
                }
            });
        });
    }

// 打开新窗口展示图片
    var createnew = function (num, pic_id, tags) {
        var tagHtml = [];
        var last = tags.pop();
        var pic_new = pic_base.replaceAll("{pic_id}", pic_id).replaceAll('{title}', last.innerText);
        for (let t of tags) {
            tagHtml.push(t.outerHTML);
        }
        tagHtml.push(last.innerText);
        tagHtml =
            "<div style='color:white;font-size:25px'>" +
            tagHtml.join(" / ") + `<div class="btn-box"><div class='btn' onclick='download2(${pic_id},${num})'>一键下载</div><div onclick='zipDown()' class="btn">打包下载</div></div>`
            "</div>";
        var imgs = [];
        for (var i = 1; i <= num; i++) {
            imgs.push(
                pic_new.replaceAll("{num}", i).replace("{imgnum}", ` [${i}/${num}]`)
            );
        }
        let html = html1.replace("img_title", `${last.innerText} - ${num}P @ ${pic_id}`);
        html += imgs.join("\n");
        html += "</ul><script>const viewer = new Viewer(document.getElementById('images'),{inline: false,url: 'data-original',rotatable:false,scalable:false});</script>";
        //var w = window.open("https://www.tujidao02.com");
        var w = window.open(window.location.href);
        w.onload = () => {
            w.document.write('');
            w.document.write(tagHtml + html);
            w.document.title = last.innerText;
            w.document.close();
        };
    };

    /**
     * 给已有的图片容器添加点击事件,移除原有跳转链接
     */
    function addEvent(list) {
        for (const li of list) {
            //console.log(li);
            addCollectAndRemoveDom(li);

            //第一个a
            li.querySelector('img').onclick = function () {
                // 获取数量
                var num = li
                    .querySelector("span.shuliang")
                    .innerText.split("P")[0];

                num = parseInt(num);

                // id
                var aTag = li.querySelector("a");
                aTag.removeAttribute("href"); // 删除链接,防止跳转
                var id = li.querySelector(".biaoti a").getAttribute("href");
                id = id.split("id=")[1];
                //丢掉最后一个
                var tags = li.querySelectorAll("p>a");
                //console.log(tags);
                createnew(num, id, [...tags]);
            };
        }
    }

    /**
     *  添加收藏与移除
     */
    function addCollectAndRemoveDom(li){
        let id = li.querySelector(".biaoti a").getAttribute("href");
        id = id.split("id=")[1];
        if(locurl.indexOf("shoucang")==-1){
            $(li).append('<p class="sc" style="height: 35px;line-height: 35px;">收藏</p>');
            li.querySelector('.sc').onclick = function (){
                let lii = li.cloneNode(true);
                let p_sl = lii.querySelector('p');
                if(p_sl.innerText.indexOf("收录")>-1){
                    p_sl.remove();
                }
                let li_str = lii.outerHTML;
                collect(id, li_str);
            };
        }else{
            $(li).append('<p class="sc" style="height: 35px;line-height: 35px;">移除</p>');
            li.querySelector('.sc').onclick = function (){
                collectRemove(id);
            };
        }
    }

    /**
     *  收藏
     */
    function collect(id, li_str){
        //console.log("id: ", id);
        //console.log("li: ",li_str);
        let list = localStorage.getItem("sclist");
        let obj = {
            "id": id,
            "li": li_str.replace('<p class="sc" style="height: 35px;line-height: 35px;">收藏</p>','')
        };
        let arr = [];
        if(list == null){
            //console.log("list不存在");
            arr.push(obj);
            localStorage.setItem("sclist",JSON.stringify(arr));
        }else{
            //console.log("list存在", JSON.parse(list));
            list = JSON.parse(list);
            for(let i=0; i<list.length; i++){
                if(id===list[i].id){
                    layer.msg(id+"已收藏");
                    if(i<list.length){
                        return;
                    }
                }
                if(i==list.length-1 && id != list[i].id){
                    list.push(obj);
                    localStorage.setItem("sclist",JSON.stringify(list));
                }
            }
        }
    }
    /**
     *  取消收藏
     */
    function collectRemove(id){
        let list = localStorage.getItem("sclist");
        list = JSON.parse(list);
        list.forEach((item,index,list) => {
            if(item.id === id){
                list.splice(index,1);
            }
        });
        localStorage.setItem("sclist",JSON.stringify(list));
        main();
        layer.msg(id+"已移除");
    }

    /**
     *  获取收藏写入收藏页面
     */
    function getCollect(){
        if(locurl.indexOf("shoucang")>-1){
            $(".hezi ul").html("");
            let list = localStorage.getItem("sclist");
            if(list != null){
                list = JSON.parse(list);
                for(let item of list){
                    $(".hezi ul").append(item.li);
                }
            }
        }
    }

    /**
     *  获取当前页面的图片列表
     */
    function getLiList() {
        return document.querySelectorAll("div.hezi>ul>li");
    }

    function main(){
        //console.log(locurl);
        if($(".unav")){
            let alist = $(".unav a");
            for(let i=0; i<alist.length; i++){
                //console.log(alist[i]);
                if(alist[i].innerText=='开通会员' || alist[i].innerText=='APP下载'){
                    //console.log("success");
                    alist[i].remove();
                }
                if(alist[i].innerText=='我的收藏'){
                    alist[i].style.color = "#ffca00";
                }
            }
        }
        getCollect();
        addEvent(getLiList());
    }
    main();

    if(!unsafeWindow.download1)
    {
        unsafeWindow.download1 = download;
    }
    if(!unsafeWindow.download2)
    {
        unsafeWindow.download2 = onekeydownload;
    }
    if(!unsafeWindow.zipDown)
    {
        unsafeWindow.zipDown = zipDown;
    }

    var contentContainer = document.getElementById("search");
    var config = { childList: true, subtree: true };
    // 当观察到突变时执行的回调函数
    var callback = function (mutationsList) {
        mutationsList.forEach(function (item, index) {
            const { addedNodes } = item;
            addEvent(addedNodes);
        });
    };

    // 创建一个链接到回调函数的观察者实例
    var observer = new MutationObserver(callback);

    // 开始观察已配置突变的目标节点
    contentContainer && observer.observe(contentContainer, config);

})();