Greasy Fork

ImgBB 相册下载器

批量下载ImgBB 相册图片

目前为 2025-01-12 提交的版本。查看 最新版本

// ==UserScript==
// @name         ImgBB 相册下载器
// @name:en      ImgBB Image Downloader
// @name:zh-CN   ImgBB 相册下载器
// @namespace    http://tampermonkey.net/
// @version      1.0.2
// @description  Downbnload Single Image or album
// @description:zh-cn 批量下载ImgBB 相册图片
// @license      MIT
// @author       You
// @match        https://ibb.co/album/*
// @match        https://123.imgbb.com
// @icon         data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==
// @grant        GM_download
// @run-at       document-body
// ==/UserScript==
(function () {
    'use strict';
    /* globals jQuery, $, waitForKeyElements */
    function findAlbumInfo() {
        //Get Album Info
        var albumInfo = { albumName: "", albumURL: "", albumID: "", imgCount: 0 };
        $("meta").each(function (index) {
            if ($(this).attr("property")) {
                switch ($(this).attr("property")) {
                    case ("og:title"):
                        albumInfo.albumName = $(this).attr("content");
                        break;
                    case ("og:url"):
                        albumInfo.albumURL = $(this).attr("content");
                        albumInfo.albumID = albumInfo.albumURL.slice(21, 27);
                        break;
                }
            }
        });
        //Get image Count
        $("span").each(function (index) {
            if ($(this).attr("data-text") == "image-count") {
                albumInfo.imgCount = parseInt($(this).text());
                return;
            }
        });
        //console.log(albumInfo);
        return albumInfo;
    }

    function listImageURLs(albumID) {
        var imgInfos = [];
        $.ajaxSettings.async = false;
        $.ajax({
            url: "https://ibb.co/json",
            data: { "action": "get-album-contents", "albumid": albumID },
            type: "POST",
            dataType: "json",
            timeout: 5000, // 设置超时时间为5秒
            success: function (data) {
                //console.log(data);
                imgInfos = data.contents;
            },
            error: function (jqXHR, textStatus, errorThrown) {
                if (textStatus === 'timeout') {
                    // 超时错误处理
                    console.log('Request timed out.');
                } else {
                    // 其他错误处理
                    console.log('Error: ' + errorThrown);
                }
            }

        });
        $.ajaxSettings.async = true;
        //console.log(imgInfos);
        return imgInfos;
    }

    function appendDownloadEle(albumInfo) {
        if ($("#img_downloader").length <= 0) {
            // 下载按钮
            let btnTab;
            // Get location of the Tab
            $("#tab-sub-link").each(function (index) { btnTab = $(this); });
            //Create the Download Tab
            var tabtxt = `<li id="img_downloader" class="phone-hide phablet-hide pop-btn">
                            <span class="top-btn-text">
                                <span id ="download_button" class="btn-text phone-hide phablet-hide"
                                    style="background-color: rgb(223, 110, 110); color: rgb(255, 255, 255);  border-radius: 10px; padding-left: 10px; padding-right: 10px; margin-bottom: 2px;"><img
                                        width="24" height="22" class="iconcenter" style="vertical-align: middle;"
                                       src="data:image/png;base64,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"></img>
                                    点击下载<span class="arrow-down"></span></span></span>
                            <div id="img_downloader_dropdown" class="pop-box arrow-box arrow-box-top anchor-left" style="display: none;">
                                <div class="pop-box-inner pop-box-menu">
                                    <ul>
                                        <li><a id="img_downloader_origin"> 原图下载</a></li>
                                        <li><a id="img_downloader_medium"> 标清图下载</a></li>
                                        <li><a id="img_downloader_thumb"> 缩略图下载</a></li>
                                        <li><a id="img_downloader_CB"> 复制到剪切板</a></li>
                                    </ul>
                                </div>
                            </div>
                        </li>`;
            btnTab.parent().parent().after(tabtxt);
            $("#img_downloader_origin").on("click", async function (event) {
                await album_download(albumInfo.imgInfos, albumInfo.albumName, "原图");
            });
            $("#img_downloader_medium").on("click", async function (event) {
                await album_download(albumInfo.imgInfos, albumInfo.albumName, "标清图");
            });
            $("#img_downloader_thumb").on("click", async function (event) {
                await album_download(albumInfo.imgInfos, albumInfo.albumName, "缩略图");
            });
            $("#img_downloader_CB").on("click", function (event) {
                $("#img_downloader").css("pointer-events", "none")
                event.preventDefault();
                let imgInfos = albumInfo.imgInfos;
                var copystring = "";
                for (let i = 0; i < imgInfos.length; i++) {
                    var name = "ImgBB/" + albumInfo.albumName + "/" + imgInfos[i].filename;
                    var url = imgInfos[i].url;
                    copystring = copystring + url + "\n";
                }
                //console.log(copystring);
                copyText(copystring);
                console.log("Links copied!-By Yingest");
            });
        }
    }

    async function album_download(imgInfos, albumName, type) {
        event.preventDefault();
        $("#img_downloader").css("pointer-events", "none")
        let downloading = `<span id ="download_button" class="btn-text phone-hide phablet-hide"
                                    style="background-color: rgb(223, 110, 110); color: rgb(255, 255, 255);  border-radius: 10px; padding-left: 10px; padding-right: 10px; margin-bottom: 2px;"><img
                                        width="24" height="22" class="iconcenter" style="vertical-align: middle;"
                                       src="data:image/png;base64,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"></img>
                                    下载中...<span id="downloaded"></span><meter id="downloadedbar" min="0" max="100" value="0"></meter></span>`
        let downloaded = `<span id ="download_button" class="btn-text phone-hide phablet-hide"
                                    style="background-color: rgb(223, 110, 110); color: rgb(255, 255, 255);  border-radius: 10px; padding-left: 10px; padding-right: 10px; margin-bottom: 2px;"><img
                                        width="24" height="22" class="iconcenter" style="vertical-align: middle;"
                                       src="data:image/png;base64,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"></img>
                                    下载完成<span class="arrow-down"></span></span>`
        $("#download_button").replaceWith(downloading)
        let total = imgInfos.length.toString();
        $("#downloaded").text("0/" + total + " : ")
        $("#downloadedbar").attr("max", total)
        let delay = sleep(100);
        let url = ""
        let name = ""
        console.log(type + " download Start...-By Yingest");
        for (let i = 0; i < imgInfos.length; i++) {
            name = "ImgBB/" + albumName + "/" + type + "/" + imgInfos[i].filename;
            if (type == "原图") {
                url = imgInfos[i].url;
                name = "ImgBB/" + albumName + "/" + imgInfos[i].filename;}
            else if (type == "标清图") { url = imgInfos[i].medium.url;}
            else if (type == "缩略图") { url = imgInfos[i].thumb.url;}
            await download(imgInfos[i].url, name);
            $("#downloaded").text((i + 1).toString() + "/" + total + " : ")
            $("#downloadedbar").attr("value", (i + 1).toString())
            await delay;
        }
        console.log(type + " download Finished.-By Yingest");
        $("#download_button").replaceWith(downloaded)
        $("#img_downloader").css("pointer-events", "auto")
    }

    function download(url, name) {
        return new Promise((resolve, reject) => {
            GM_download({
                url,
                name,
                saveAs: false,
                onerror: reject,
                onload: resolve
            });
            console.log("'" + name + "' downloaded");
        });
    }


    function sleep(ms) {
        return new Promise(resolve => setTimeout(resolve, ms));
    }


    async function copyText(copystring) {
        try {
            await navigator.clipboard.writeText(copystring);
            console.log('文本已复制到剪贴板');
        } catch (err) {
            console.error('复制失败: ', err);
        }
    }


    $(document).ready(function () {
        // 查找相册名称位置,向左上角添加【下载】按钮.
        let albumInfo = findAlbumInfo();
        albumInfo.imgInfos = listImageURLs(albumInfo.albumID);
        //console.log(albumInfo);
        if (albumInfo.imgInfos.length == albumInfo.imgCount) { appendDownloadEle(albumInfo); }
    });
    /** useless function
    function childernEle(father,Orders,attr){
        // Tools for get childern elements
        var len=Orders.length;
        var info=new Array;;
        if(len==0){
            info.push(father.val());
            info.push(father.text());
            for(var i = 0;i < attr.length;i++){info.push(father.attr(attr[i]));}
        }
        else if(len>=1){
            var childern=father.contents();
            childern.each(function (index) {
                if(index==Orders[0]){info = childernEle($(this),Orders.slice(1,len),attr);}
            });
        }
        return info
    }

    function listImageURLs_old() {
        var info0,info1,info2;
        var imgInfos=new Array();
        let imgJQList = $("div");
        if(imgJQList.length > 0 ){
            imgJQList.each(function (index) {
                if($(this).attr("data-type")=="image"){
                    var imgInfo={
                        imgName:"",
                        imgID:"",
                        imgURL_Origin:"",
                        imgURL_View:"",
                        imgURL_Small:""
                    };
                    info0=childernEle($(this),[],["data-id"]);
                    //info1=childernEle($(this),[0,0],["href"]);
                    info2=childernEle($(this),[0,0,0],["src","alt"]);
                    imgInfo.imgName=info2[3];
                    imgInfo.imgID=info0[2];
                    imgInfo.imgURL_View=info2[2];
                    //console.log(imgInfo);
                    imgInfos.push(imgInfo);
                }
            });
        }
        return imgInfos
    }
    function getImageURL_old(viewerLink,type) {
        console.info(viewerLink);
        var p = GM_xmlhttpRequest({
                method: "GET",
                url: viewerLink,
                responseType:type,
                headers: {
                    "Content-Type": "application/x-www-form-urlencoded;charset=utf-8"
                },
                onload: function (response) {
                    console.log("请求成功");
                    console.log(response.responseText);
                },
                onerror: function (response) {
                    console.log("请求失败");
                },
                ontimeout: function (response) {
                    console.info("查询信息超时。");
                }
            });
        console.info(p)
        return p
    }
    **/
})();