// ==UserScript==
// @name Discord快速下载高清原图
// @namespace http://tampermonkey.net/
// @version 0.12
// @description 自用脚本:0.11:由于在Discord消息中MidJourney Bot生成的图片显示的是缩略图,批量生成图片时,需要反复点击U1,U2,U3,U4,点开图片再右键另存为才能保存高清原图。本脚本简化这一过程,点击"下载图片"即可下载高清原图到浏览器默认下载位置,不用再跳转去MidJourney主页下载。 0.21:在Discord其他频道也可快速下载原图。
// @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
// @downloadURL none
// ==/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 =
'';
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);
const buttonArr = allMsg.querySelectorAll("button");
if(allMsg.textContent.includes('Favorite') ){//如果这条消息含有Favorite按钮直接下载此图片
getImgDirectly(allMsg);
}else if(buttonArr.length == 1){
const images = allMsg.querySelectorAll(".originalLink-Azwuo9");
if(images.length == 1){
getImgDirectly(allMsg);
}else{
for(let i=0 ;i