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 pop-keep-click">
                            <span class="top-btn-text">

                                <span 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", function (event) {
                //$("#img_downloader_dropdown" ).attr("style","display: none;")
                event.preventDefault();
                let imgInfos=albumInfo.imgInfos;
                console.log("Original Download Start...-By Yingest");
                for(let i=0;i < imgInfos.length;i++){
                    var name = "ImgBB/" + albumInfo.albumName + "/" +imgInfos[i].filename;
                    var url = imgInfos[i].url;
                    //console.log([name,url]);
                    GM_download(url,name);
                }
                console.log("Original Downlaoad Finish!-By Yingest");
            });
            $("#img_downloader_medium" ).on("click", function (event) {
                //$("#img_downloader_dropdown" ).attr("style","display: none;")
                event.preventDefault();
                let imgInfos=albumInfo.imgInfos;
                console.log("Medium Download Start...-By Yingest");
                for(let i=0;i < imgInfos.length;i++){
                    var name = "ImgBB/" + albumInfo.albumName + "/Medium/" + imgInfos[i].filename;
                    var url = imgInfos[i].medium.url;
                    //console.log([name,url]);
                    GM_download(url,name);
                }
                console.log("Medium Downlaoad Finish!-By Yingest");
            });
            $("#img_downloader_thumb" ).on("click", function (event) {
                //$("#img_downloader_dropdown" ).attr("style","display: none;")
                event.preventDefault();
                let imgInfos=albumInfo.imgInfos;
                console.log("Thumb Download Start...-By Yingest");
                for(let i=0;i < imgInfos.length;i++){
                    var name ="ImgBB/" + albumInfo.albumName + "/Thumb/" + imgInfos[i].filename;
                    var url = imgInfos[i].thumb.url;
                    //console.log([name,url]);
                    GM_download(url,name);
                }
                console.log("Thumb Downlaoad Finish!-By Yingest");
            });
            $("#img_downloader_CB" ).on("click", function (event) {
                //$("#img_downloader_dropdown" ).attr("style","display: none;")
                event.preventDefault();
                let imgInfos=albumInfo.imgInfos;
                //console.log("Thumb Download Start...-By Yingest");
                var copystring="";
                for(let i=0;i < imgInfos.length;i++){
                    var name = "ImgBB/" + albumInfo.albumName + "/" +imgInfos[i].filename;
                    var url = imgInfos[i].url;
                    //console.log([name,url]);
                    //GM_download(url,name);
                    copystring=copystring+url+"\n";
                }
                console.log(copystring);
                copyText(copystring);
                console.log("Links copied!-By Yingest");
            });
        }
    }
    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
    }
    **/
})();