Greasy Fork

Greasy Fork is available in English.

MidJourney快速下载高清原图

save high-definition images(自用)

当前为 2023-04-27 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         MidJourney快速下载高清原图
// @namespace    http://tampermonkey.net/
// @version      0.11
// @description  save high-definition images(自用) 
// @author       Yuzu
// @match        https://discord.com/channels/*/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=discord.com
// @grant        none
// @require      https://code.jquery.com/jquery-3.6.0.min.js
// @license      MIT License

// ==/UserScript==


(function() {
    'use strict';
    
    function getImgDirectly(Msg) {// 获取消息中图片的真实链接
        var c = Msg.getElementsByClassName("originalLink-Azwuo9");
        var d = c.item(0);
        var imgUrl = d.getAttribute("href"); 
        console.log(imgUrl);
        downloadImage(imgUrl);

    }

    function getLastMsgId() {
        var allMsg = document.getElementsByClassName("messageListItem-ZZ7v6g"); //获取消息列表
        var lastMsgId = allMsg[allMsg.length - 1].id; //获取最后一条消息的id
        return lastMsgId;
    }

    function addDLBtn() {//添加下载按钮

        var addDownloadButton =
            '<button role="button" type="button" class="component-ifCTxY button-ejjZWC lookFilled-1H2Jvj colorPrimary-2-Lusz sizeSmall-3R2P2p grow-2T4nbg DLBtn"><div class="contents-3NembX"><div class="content-1xP6ZE" aria-hidden="false"><div class="label-31sIdr">下载图片</div></div></div></button>';
        var bb = $('.mediaAttachmentsContainer-1WGRWy');

        var i = 0;
        for (i = 0; i < bb.length; i++) {
            var x = bb[i].innerHTML;
            if (bb[i].querySelector('button.DLBtn') == null){
                bb[i].innerHTML = x + addDownloadButton;
            }
           
        }
        const DLBtn1 = document.querySelectorAll("button.DLBtn");

        for (var checkbtn of DLBtn1) {
            var randomId = "random-id-" + Math.floor(Math.random() * 100000).toString();

            checkbtn.setAttribute("id", "idToDL" + randomId);
            checkbtn.addEventListener("click", function (event) {
           
                var a = event.target.id;
                var clickId = document.getElementById(a);
                var message = clickId.closest("li");
                if (message) {
                    var messageId = message.id;

                    console.log("消息 ID 为:" + messageId);
                    loopButtons(messageId); // 开始循环点击所有按钮并执行操作
                }

            });
        }

        return bb[0];
    }

    // 点击按钮并检查是否有新消息
    async function handleButtonClick(buttonId, clickid) {
        const button = buttonId;
        var clickMSG = document.getElementById(clickid);
        var myList = clickMSG.closest("ol");
        var preCount = myList.getElementsByTagName("li").length;
        button.click();
        await waitForNewMessage(clickid, preCount);
    }

    // 等待新消息出现并检查是否有图片
    async function waitForNewMessage(clickid, preCount) {
        let imgFound = false;
        var clickMSG = document.getElementById(clickid);
        var myList = clickMSG.closest("ol");

        while (!imgFound) {
            // 检查消息列表是否有新消息
            await sleep(1000); // 等待2秒钟再继续检查
            console.log("等待消息加载……");
            var lis = myList.getElementsByTagName("li");
            if (lis.length > preCount) {
                // 如果有新消息,则检查其中是否包含png图片
                for (let i = preCount; i < lis.length; i++) {
                    while (!imgFound) {
                        await sleep(3000);
                        console.log("loading");
                        var img1 = lis[i].querySelector(".originalLink-Azwuo9");
                        
                        if (img1 != null) {
                            
                            var imgUrl = img1.getAttribute("href");
                            
                            if (imgUrl != null & imgUrl.endsWith(".png")) {
                                imgFound = true;

                                console.log(imgUrl);
                                downloadImage(imgUrl); // 下载图片
                                break; // 结束循环,不再检查其它消息
                            }
                        }
                    }
                }
            }
        }
        return imgUrl;
    }

    function downloadImage(imgUrl) {
        // 创建一个 XMLHttpRequest 对象
        const xhr = new XMLHttpRequest();
        xhr.open('GET', imgUrl, true);
        xhr.responseType = 'blob';// 请求的数据类型为二进制流

        // 当请求完成时执行该函数
        xhr.onload = function() {
            // 如果请求成功
            if (xhr.status === 200) {
                // 获取响应中的二进制数据
                const blob = xhr.response;

                // 创建一个超链接元素
                const link = document.createElement('a');
                const blobUrl = URL.createObjectURL(blob);
                link.style.display = 'none';
                link.href = blobUrl;// 将二进制数据转换成 URL


                var urlStr = imgUrl.split('/');
                var imgName = urlStr[urlStr.length - 1];
                link.download = imgName; // 指定文件名
                document.body.appendChild(link);
                link.click(); // 触发点击事件进行下载
                URL.revokeObjectURL(blobUrl);
                document.body.removeChild(link);
            }
        };

        // 发送请求
        xhr.send();
    }



    // 等待指定的时间(单位:毫秒)
    function sleep(ms) {
        return new Promise((resolve) => setTimeout(resolve, ms));
    }

    // 循环点击所有按钮并执行操作
    async function loopButtons(clickid) {
        var allMsg = document.getElementById(clickid);
        if(allMsg.textContent.includes('Favorite')){//如果这条消息含有Favorite按钮直接下载此图片
            getImgDirectly(allMsg);
        }else{
            const buttonArr = allMsg.querySelectorAll("button");
            for (let i = 1; i < 5; i++) {
                //循环点击指定的四个按钮
                await handleButtonClick(buttonArr[i], clickid);
            }


        }

        addDLBtn();
    }


    // 主函数main
    async function main() {
        console.log('启动脚本...');

        await sleep(3000);
        var bb = document.getElementsByClassName("children-2XdE_I");
        
        while (bb.length <= 0) {
            await sleep(1000);
            
            bb = document.getElementsByClassName("children-2XdE_I");
        }

        var aa = addDLBtn();
        var newMsg = getLastMsgId();
        let path = window.location.pathname;

        setInterval(function() {

            if (window.location.pathname != path || newMsg != getLastMsgId()) {
                path = window.location.pathname;
                console.log('页面路径为:', path);
                addDLBtn();

            }
            newMsg = getLastMsgId();
        }, 1000); // 每秒检查一次路径是否变化

    }

    // 调用主函数
    main();
})();