// ==UserScript==
// @name Pixiv图片下载
// @namespace Violentmonkey Scripts
// @match https://www.pixiv.net/*
// @grant unsafeWindow
// @version 1.0
// @author 52lcx
// @grant GM_addStyle
// @grant GM_xmlhttpRequest
// @grant GM_download
// @require https://cdnjs.cloudflare.com/ajax/libs/jszip/3.6.0/jszip.min.js
// @description 添加一个按钮🤤来下载图片
// ==/UserScript==
GM_addStyle('.sc-12n125f-0{display:none!important}')
var old_url=""
var observer_url =new MutationObserver(function(){
var now_url=location.href
if(old_url===now_url){return}
else{old_url=now_url
console.log('url发生变化')
allFUN();
}
})
observer_url.observe(document.head,{attributes: true, childList: true, subtree: true})
function allFUN(){
console.log('我执行了')
var novel_have=location.href.match(/novel/)
if (location.href.match(/(\d+)$/)&&novel_have===null){
setTimeout(function(){
var button_has=document.querySelector('#download_button')
if(button_has===null)
{console.log('没有找到,所以我执行了')
addButton()}
},5000)
var callback = function (mutationsList, observer) {
// 检查是否已经有了目标图片
var img = document.querySelector('.sc-1qpw8k9-1');
if (img) {
//监测链接是否一致
setTimeout(function(){
addButton()
},1000)
// 停止观察
observer.disconnect();
}
};
var img_observer = new MutationObserver(callback);
var config = { attributes: true, childList: true, subtree: true };
img_observer.observe(document, config);
}
function addButton(){
// 创建按钮
var button = document.createElement('button');
button.textContent = '🥰';
button.setAttribute('id', 'download_button');
button.setAttribute('style', `
border: none;
transform: scale(1.3);
background-color: transparent;
cursor: pointer;
`);
// 下载事件,单张图片,多组图片,插图
button.addEventListener('click', function () {
// //进度条
// function createProgressBar(){
// return new Promise(resolve=>{
// var progressBar = document.createElement('progress');
// progressBar.max = 100;
// progressBar.value = 0;
// document.body.appendChild(progressBar);
// resolve(progressBar)
// })
// }
var progressBar = document.createElement('progress');
progressBar.max = 100;
progressBar.value = 0;
progressBar.setAttribute('class', 'progressBar');
progressBar.setAttribute('style', `
position: fixed;
top: 10px;
right: 20px;
width: 300px;
height: 20px;
background-color:white;
`);
document.body.appendChild(progressBar);
if (document.querySelector(".sc-d98f2c-0.sc-1y32dbe-0.bvRXUX.new-header-logo").getAttribute("href") === "/manga") {
console.log("这是漫画");
// 点击阅读全部
var all = document.querySelector('.sc-emr523-2');
var all_length = document.querySelector('.sc-1mr081w-0').textContent.split('/')[1];
all.click();
loding_img(all_length)
}
else if(document.querySelector('.sc-1mr081w-2')){
console.log('这是多插图')
var load_all=document.querySelector('.sc-emr523-2')
all_length = document.querySelector('.sc-1mr081w-0').textContent.split('/')[1];
if(load_all!==null){load_all.click()
// 与漫画相同逻辑
loding_img(all_length)}
else{
download_img(all_length)
}
}
else if(document.querySelector('.sc-1qpw8k9-1')){
console.log('这是单张插画')
var link=document.querySelector('.sc-1qpw8k9-3').href
var name=document.querySelector('.sc-1u8nu73-3')
if(name===null)
{
name='插画'
}
else{
name=name.textContent}
var end=link.split('.').pop()
if(name==null){name='未知'}
progressBar=document.querySelector('.progressBar')
GM_xmlhttpRequest({
method: 'GET',
url: link,
responseType: 'blob',
headers: { referer: "https://i.pximg.net/*" },
onprogress: function(event) {
if (event.lengthComputable) {
var percentComplete = (event.loaded / event.total) * 100;
progressBar.value = percentComplete;
console.log('下载进度: ' + percentComplete + '%');
}
},
onload: function(response) {
var url = URL.createObjectURL(response.response);
var a = document.createElement('a');
a.href = url;
a.download = name + '.' + end;
document.body.appendChild(a);
a.click();
URL.revokeObjectURL(url);
document.body.removeChild(a);
document.querySelector('.progressBar').remove()
},
onerror: function(error) {
console.log('下载失败: ' + error);
document.querySelector('.progressBar').remove()
}
});
}
});
// 将按钮添加到指定的父节点
var place = document.querySelector('.sc-ye57th-1');
place.appendChild(button);
GM_addStyle('#download_button { transition: transform 0.3s ease-out !important; } #download_button:hover { transform: scale(2) rotate(360deg) !important; }')
console.log('按钮添加成功')
}
function loding_img(all_length)
{
// 监听页面元素变化,直到图片长度和漫画长度相等为止
var config = { childList: true, subtree: true };
function callback() {
var all_img = document.querySelectorAll('.gtm-expand-full-size-illust');
var all_img_length = all_img.length;
var zip = new JSZip();
if (all_length == all_img_length) {
var links = Array.from(all_img).map(element => element.href);
Promise.all(links.map((link, index) => {
console.log('图片链接')
console.log(`这是第${index}张图片`);
var end = link.split('.').pop();
return new Promise((resolve, reject) => {
var progressBar=document.querySelector('.progressBar')
GM_xmlhttpRequest({
method: 'GET',
url: link,
responseType: 'blob',
headers:{referer:"https://i.pximg.net/*"},
onprogress: function(event) {
if (event.lengthComputable) {
var percentComplete = (event.loaded / event.total) * 100;
progressBar.value = percentComplete;
console.log('下载进度: ' + percentComplete + '%');
}
},
onload: function (response) {
console.log(`下载第${index + 1}张图片成功`);
var img_name = `${index + 1}.${end}`;
zip.file(img_name, response.response, { binary: true });
resolve();
},
onerror: function () {
alert('下载失败!');
document.querySelector('.progressBar').remove()
observer.disconnect();
reject();
}
});
});
})).then(() => {
document.querySelector('.progressBar').remove()
zip.generateAsync({ type: 'blob' }).then((content) => {
var a = document.createElement('a');
a.href = URL.createObjectURL(content);
var name = document.querySelector('.sc-1u8nu73-15');
if (name!==null) {
name = name.textContent;
} else {
name = document.querySelector('.sc-1qpw8k9-1').alt.split('#').pop()
}
a.download = name + '.zip';
a.click();
console.log('压缩包下载完成');
});
}).catch(error => {
console.error('下载图片或生成 ZIP 文件时出错:', error);
});
observer.disconnect();
}
}
var observer = new MutationObserver(callback);
observer.observe(document, config);
}
function download_img(all_length){
var all_img = document.querySelectorAll('.gtm-expand-full-size-illust');
var all_img_length = all_img.length;
var zip = new JSZip();
if (all_length == all_img_length) {
var links = Array.from(all_img).map(element => element.href);
Promise.all(links.map((link, index) => {
console.log('图片链接')
console.log(`这是第${index}张图片`);
var end = link.split('.').pop();
var progressBar=document.querySelector('.progressBar')
return new Promise((resolve, reject) => {
GM_xmlhttpRequest({
method: 'GET',
url: link,
responseType: 'blob',
headers:{referer:"https://i.pximg.net/*"},
onprogress: function(event) {
if (event.lengthComputable) {
var percentComplete = (event.loaded / event.total) * 100;
progressBar.value = percentComplete;
console.log('下载进度: ' + percentComplete + '%');
}
},
onload: function (response) {
console.log(`下载第${index + 1}张图片成功`);
var img_name = `${index + 1}.${end}`;
zip.file(img_name, response.response, { binary: true });
resolve();
},
onerror: function () {
alert('下载失败!');
observer.disconnect();
reject();
}
});
});
})).then(() => {
document.querySelector('.progressBar').remove()
zip.generateAsync({ type: 'blob' }).then((content) => {
var a = document.createElement('a');
a.href = URL.createObjectURL(content);
var name = document.querySelector('.sc-1u8nu73-15');
if (name!==null) {
name = name.textContent;
} else {
name = document.querySelector('.sc-1qpw8k9-1').alt.split('#').pop()
}
a.download = name + '.zip';
a.click();
console.log('压缩包下载完成');
});
}).catch(error => {
console.error('下载图片或生成 ZIP 文件时出错:', error);
});
}
}
}