// ==UserScript==
// @name 图集岛VIP-FancyBox版
// @namespace https://scriptcat.org/script-show-page/443
// @version 3.3
// @description 破解图集岛VIP
// @author yyg, 253681319,LARASSR
// @include /https?:\/\/(\w+\.)?(tujidao|sqmuying)\w*\.\w+/
// @license MIT
// @date 2022-01-14
// @require https://cdn.staticfile.org/jquery/3.6.0/jquery.min.js
// @require https://cdn.jsdelivr.net/gh/LARASPY/hello@master/main.js
// @require https://cdn.jsdelivr.net/gh/LARASPY/hello@master/fancybox.js
// @connect https?:\/\/(\w+\.)?(tujidao|sqmuying)\w*\.\w+
// @connect tjgew6d4ew.82pic.com
// @grant GM_xmlhttpRequest
// @grant GM_getValue
// @grant GM_setValue
// @grant unsafeWindow
// ==/UserScript==
(async function () {
"use strict";
let html1 =
'
img_title' +
"" +
'';
let html2 = "
";
let pic_base =
"{imgnum}
";
let downLoadButton =
'下载图片';
console.log("start");
let addStateMent = function (head, type, src, textContent, setAttribute) {
let statement = document.createElement(type);
if (src) statement.src = src;
if (textContent) statement.textContent = textContent;
if (setAttribute) {
// console.log(setAttribute);
for (const [key, value] of Object.entries(setAttribute)) {
statement.setAttribute(key, value);
}
}
head.appendChild(statement);
};
let isPackageAndDownload = false;
let packageAndDownload = function () {
let Alpha_Script = {
obtainHtml: function (options) {
options = options || {};
if (!options.url || !options.method) {
throw new Error("参数不合法");
}
GM_xmlhttpRequest(options);
},
parseHeaders: function (headStr) {
let o = {};
let myregexp = /^([^:]+):(.*)$/gim;
let match = /^([^:]+):(.*)$/gim.exec(headStr);
while (match != null) {
o[match[1].trim()] = match[2].trim();
match = myregexp.exec(headStr);
}
// console.log(o);
return o;
},
};
let blobCache = {};
if (isPackageAndDownload) {
alert("下载中, 请耐心等待...\n点击确认继续下载");
} else {
isPackageAndDownload = true;
let zip = new JSZip();
let imgList = $('img[label="sl"]');
let length = imgList.length;
let errorNum = 0;
$.each(imgList, function (index, value) {
let img = zip.folder(document.title);
let imgSrc = $(value).attr("src");
let imageSrcParts = imgSrc.split('/');
Alpha_Script.obtainHtml({
url: imgSrc,
method: "GET",
headers: Alpha_Script.parseHeaders(
"Host:" + imageSrcParts[2] + "\n" +
"Referer:" + window.location.origin + "\n"
),
timeout: 30000,
responseType: "blob",
onload: function (response) {
console.log("DownlodeUrl " + index + ": ", response.finalUrl);
// debugger
if (
response &&
response.status &&
response.status >= 200 &&
response.status < 300
) {
let responseHeaders = Alpha_Script.parseHeaders(
response.responseHeaders
);
let contentType = responseHeaders["Content-Type"];
if (!contentType) {
contentType = "image/png";
}
let blob = new Blob([response.response], {
type: contentType,
});
blobCache[imgSrc] = blob;
img.file(1 + index + ".jpg", blobCache[imgSrc], {
base64: false,
});
// if (length == 1) debugger
} else {
errorNum++;
if (errorNum === imgList.length) {
isPackageAndDownload = false;
err("图片全部下载失败,请使用插件下载。");
alert("图片全部下载失败,请使用插件下载。");
}
}
length--;
},
onerror: function (error) {
err(error);
length--;
},
ontimeout: function () {
errorNum++;
if (errorNum === imgList.length) {
isPackageAndDownload = false;
err("图片全部下载失败,请使用插件下载。");
alert("图片全部下载失败,请使用插件下载。");
}
err("DownlodeUrl " + index + ": 超时");
length--;
},
});
});
let packagName = document.title;
if (!packagName) {
packagName = "PackageSL";
}
let id = setInterval(function () {
if (length === 0) {
clearInterval(id);
zip
.generateAsync({
type: "blob",
})
.then(function (content) {
if (errorNum !== imgList.length) {
saveAs(content, packagName + ".zip");
isPackageAndDownload = false;
console.log(
"图片下载完成 " +
(imgList.length - errorNum) +
"张,失败 " +
errorNum +
"张,总共" +
imgList.length +
"张。"
);
alert(
"图片下载完成 " +
(imgList.length - errorNum) +
"张,失败 " +
errorNum +
"张,总共" +
imgList.length +
"张。"
);
}
});
}
}, 100);
}
};
let fancyboxStart = function (document) {
let head = document.getElementsByTagName("head")[0];
let srcList = [
"https://cdn.staticfile.org/jquery/3.6.0/jquery.min.js",
"https://cdn.staticfile.org/jszip/3.1.5/jszip.min.js",
"https://cdn.staticfile.org/FileSaver.js/1.3.8/FileSaver.min.js",
];
let itemTpye = { name: "type", value: "text/css" };
new Promise(function (resolve, reject) {
let id = setInterval(function () {
srcList.push(
"https://cdn.jsdelivr.net/gh/LARASPY/hello@master/fancybox.js",
"https://cdn.jsdelivr.net/gh/LARASPY/xhua@master/other/slidingPosition@v_0.2.js"
);
for (var src of srcList) {
addStateMent(head, "script", src);
}
console.log("waiting...");
if (fancyBoxCss && $) {
console.log("FancyBoxCss && $ OK !!!");
clearInterval(id);
resolve(head);
}
}, 100);
}).then(function (data) {
// console.log(data);
addStateMent(head, "style", null, fancyBoxCss, itemTpye);
if (os.isPc) {
addStateMent(head, "style", null, fancyBoxCssAdditon, itemTpye);
}
});
};
let packageAndDownloadInitCheck = function () {
new Promise(function (resolve) {
let id = setInterval(function () {
if (Fancybox4 && JSZip && $) {
clearInterval(id);
resolve();
}
}, 100);
}).then(function () {
packageAndDownload();
});
};
let createnew = function (num, pic_id, tags, pic_new) {
let tagHtml = [];
let last = tags.pop();
console.log(" # Title: ", last.innerText);
for (let t of tags) {
tagHtml.push(t.outerHTML);
}
tagHtml.push(downLoadButton);
tagHtml.push(last.innerText);
tagHtml =
"" +
tagHtml.join(" / ") +
"
";
let imgs = [];
for (let i = 1; i <= num; i++) {
imgs.push(
pic_new
.replace("{num}", i)
.replace("{imgnum}", ` [${i}/${num}]`)
.replace("{index}", i - 1)
);
}
history.pushState({}, '', `/sousu/?s0=${last.innerText}`);
let html = html1.replace(
"img_title",
`${last.innerText} - ${num}P @ ${pic_id}`
);
html += imgs.join("\n");
html += html2;
let w = window.open(
location.origin + `/sousu/?s0=${last.innerText}`
);
w.onload = () => {
w.document.write(tagHtml + html);
fancyboxStart(w.document);
w.document.close();
};
};
// let lis = document.getElementsByClassName('shuliang');
//
//
// 27P
// 机构:网络美女
// 标签:大尺-度 福利
// 人物:Byoru
// [网红COSER写真] 日本性感萝莉Byoru - Kiara Summer
//
// 小图链接
/**
* 给已有的图片容器添加点击事件,移除原有跳转链接
*/
function addEvent(list) {
layui.use('layer', () => layer = layui.layer);
for (const li of list) {
//第一个a
li.querySelector("img").onclick = function () {
// 获取数量
let num = li.querySelector("span.shuliang").innerText.split("P")[0];
num = parseInt(num);
// id
let aTag = li.querySelector("a");
aTag.removeAttribute("href"); // 删除链接,防止跳转
let id = li.querySelector(".biaoti a").getAttribute("href");
id = id.split("id=")[1];
//丢掉最后一个标签
let tags = li.querySelectorAll("p>a");
//构造链接
let img = li.querySelector("img");
let imageSrcParts = img.getAttribute('src').split('/');
let imageSrcBase = imageSrcParts.slice(0, -1).join('/');
let imageSrcExt = imageSrcParts.slice(-1)[0].split('.').pop();
let pic_new = pic_base.replace("{imageSrcBase}", imageSrcBase).replace("{imageSrcExt}", imageSrcExt);
let id_ = /(.*)(\d+)\/(\d+)\/(\d+).*/g.exec($(this).attr('src'));
if (id_[2] >= 5) {
layer.msg("😭该图集无法白嫖~", { time: 1000 });
} else {
createnew(num, id, [...tags], pic_new);
}
};
}
}
/**
* 获取当前页面的图片列表
*/
function getLiList() {
return document.querySelectorAll("div.hezi>ul>li");
}
addEvent(getLiList());
let contentContainer = document.getElementById("search");
let config = {
childList: true,
subtree: true,
};
// 当观察到突变时执行的回调函数
let callback = function (mutationsList) {
mutationsList.forEach(function (item, index) {
const { addedNodes } = item;
addEvent(addedNodes);
});
};
// 创建一个链接到回调函数的观察者实例
let observer = new MutationObserver(callback);
// 开始观察已配置突变的目标节点
contentContainer && observer.observe(contentContainer, config);
// 配置 自动无缝翻页 突变的目标节点
let AutoPagerCallbacks = function (mutationsList) {
mutationsList.forEach(function (item, index) {
// console.log(item);
const { children } = item.addedNodes[0].children[0];
addEvent(children);
});
};
let AutoPagerContainer = document.querySelector("body");
let AutoPagerObserver = new MutationObserver(AutoPagerCallbacks);
AutoPagerContainer && AutoPagerObserver.observe(AutoPagerContainer, config);
//加载 下载函数,标签定位函数
if (!unsafeWindow.packageAndDownload) unsafeWindow.packageAndDownload = packageAndDownload;
if (!unsafeWindow.packageAndDownloadInitCheck) unsafeWindow.packageAndDownloadInitCheck = packageAndDownloadInitCheck;
if (!unsafeWindow.fancyboxStart) unsafeWindow.fancyboxStart = fancyboxStart(document);
})();