// ==UserScript==
// @name 圖片全載-FancyboxV5
// @name:en Full Picture Load - FancyboxV5
// @name:zh-CN 图片全载-FancyboxV5
// @name:zh-TW 圖片全載-FancyboxV5
// @version 1.6.5
// @description 專注於寫真、H漫、漫畫的網站,目前規則數500+,進行圖片全量加載,讓你免去需要翻頁的動作,也能進行下載壓縮打包,如有下一頁元素能做到自動化下載。
// @description:en Load all pictures for picture websites, and can also compress and package them for download.
// @description:zh-CN 专注于写真、H漫、漫画的网站,目前规则数500+,进行图片全量加载,也能进行下载压缩打包,如有下一页元素能做到自动化下载。
// @description:zh-TW 專注於寫真、H漫、漫畫的網站,目前規則數500+,進行圖片全量加載,让你免去需要翻页的动作,也能進行下載壓縮打包,如有下一頁元素能做到自動化下載。
// @author tony0809
// @match *://*/*
// @exclude *.youtube.com*
// @exclude *docs.google.com*
// @exclude *google*/maps/*
// @exclude *mail.google.com*
// @icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAtFBMVEVEREAAAABEREBEREAuuaIzqpkvr58yiHgzhnY6kYM7mYI4kog4s6A2tpo0r544ooo2nY40sJw0sp00rZg1sJw0sZ0zsp01sZw0sZw0rZk1sJw1sZw1rZk0sp00rpk1sp01sZs1rpk1rpk0sp01spw1sJ00rZo1rZk1rpo0r5k0sJw0sZ01r5o0sZw0rpk0sp01sZ01sJw1spw1r5k1sp01sZw0sZ01sZw1rpk1sp01sZw1r5pUzpTcAAAAOXRSTlMAAAUGCw8QERIUFxgbHB0hIieqq6yvtLa3vb/AwMHCxMXFxsfIyc3Oz+zt7vDx8fL4+Pn5+vr7/v7AEFI4AAABR0lEQVR42qWT11bDMAxApbhsmm5KKVD2KiUQwpD1///FkZcSmh4e8FOsex3LsgymPy6ISkRyA4FlWMRXomIyQOg/SbyKAmSOE2Ip02UOYxf/DILNjOOEWLnAEAqio0MMAzJjTAZh1p0SrYCIuu0cMZc9JbENXLa1NWGdI1nWeQuXGPzBTdzC8ws52UI5MwchrA/VTOuTEP9fFyTG7E+R9q8JLsbW1UHzU8HHrCuU1fyToDlB43xRqMUgfc+/KA77fZrWSH/47zPlzOcpJxG8u32r/OEg5SRCqO/WTeT3+5oTuP4LxrXnd5F7waZ+wM5c+NVeujMRrDYMYueE+VK5E5r3uzOb7TbvHH7f/1pP/L8nU9u38Nwyy8OZdjfwY+ZnmPinp28y3mglNeERDJYy/9A3GYVS+GMPMB+uyL67/qO68Mb8MurBD7foVTtvIbtnAAAAAElFTkSuQmCC
// @license MIT
// @namespace https://greasyfork.org/users/20361
// @grant GM_xmlhttpRequest
// @grant GM.xmlHttpRequest
// @grant GM_registerMenuCommand
// @grant GM.registerMenuCommand
// @grant GM_openInTab
// @grant GM.openInTab
// @grant unsafeWindow
// @require https://cdn.jsdelivr.net/npm/[email protected]/dist/jszip.min.js
// @require https://cdn.jsdelivr.net/npm/[email protected]/dist/html2canvas.min.js
// @require https://cdn.jsdelivr.net/npm/[email protected]/dist/jquery.min.js
// @require https://cdn.jsdelivr.net/npm/@fancyapps/[email protected]/dist/fancybox/fancybox.umd.js
// ==/UserScript==
(async () => {
"use strict";
if (window.frameElement !== null) return; //腳本不在iframe框架裡運行
let options = { //預設選項基本上不要改動,如果改動了最好透過UI選項設定或按/,重置儲存在localStorage的設定
enable: 0, //!!!維持0不要改!!!
icon: 1, //是否顯示左下圖示,1:開啟、0:關閉
threading: 32, //最大下載線程數
default: "img[src]", //預設CSS/Xpath選擇器/javascript代碼
//default: "js;return [...document.images];",
zip: 1, //1:圖片下載後壓縮打包,0:批量下載圖片,無法全自動下載
file_extension: "zip", //zip or cbz
autoDownload: 0, //!!!維持0不要改!!!建議透過UI選項設定來開啟,需要customData也有autoDownload
autoDownloadCountdown: 5, //有有效的NEXT時自動下載的倒數秒數
comic: 0, //1,忽視漫畫站點開關選項,啟用漫畫規則
doubleTouchNext: 1, //觸控裝置雙擊前往下一頁,1:開啟、0:關閉
zoom: 0, //1 ~ 10 腳本插入的圖片縮放比例,10 = 100%,9 = 90%,0 = auto
column: 4, //圖片並排顯示的數量 2 ~ 6
fancybox: 1 //Fancybox圖片燈箱展示功能,1:開啟、0:關閉
};
const siteUrl = window.location.href;
let siteData = {};
let siteJson = null;
const language = window.navigator.language;
let displayLanguage = {};
let globalImgArray = [];
let thumbnailsSrcArray = [];
let videosSrcArray = [];
let promiseBlobArray = [];
let customTitle = null;
let downloading = false;
let fetching = false;
let fetchErrorArray = [];
let fastDownload = false;
let currentDownloadThread = 0;
let downloadNum = 0;
let errorNum = 0;
let doc = document;
let autoPager = true;
let currentPageNum = 0;
let nextLink = null;
const PcUa = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36 Edg/117.0.2045.43";
const MobileUa = "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Mobile Safari/537.36";
const loading_bak = "data:image/gif;base64,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83uGje9+g7TK7znAs/1N/3BQTmbMt6lvwRde10/Xu89+ZrjEJ07xilv84hjPuMY3zvGOe/zjIA+5yEdO8pKb/OQoT7nKV87ylrv85TCPucxnTvOa2/zmOM+5znfO8577/OdAD7rQh070ohv96EhPutKXzvSmO/3pUI+61KdO9apb/epYz7rWt871rnv962APu9jHTvaym/3saE+72tfO9ra7/e1wj7vc5073utv97njPu973zve++/3vgA+84AdP+MIb/vCIT7ziF8/4xjv+8ZCPvOQnT/nKW/7ymM+85jfP+c57/vOgD73oR0/60pv+9KhPvepXz/rWu/71sI+97GdP+9rb/va4z73ud8/73pH7/vfAD77wh0/84hv/+MhPvvKXz/zmO//50I++9KdP/epb//rYz772t8/97nv/++APv/jHT/7ym//86E+/+tfP/va7//3wj7/850//+tv//vjPv/73z//++///ABiAAjiABFiABniACJiACriADNiADviAEBiBEjiBFFiBFniBGJiBGriBHNiBHviBIBiCFxEIACH5BAUKAGgALCwBjAACATABAAf/gGiCg4SFhoeIiYqLjI2JAQYGHhgaEC8FHBQfOhaOnp+goaKjpKWmp6iKAausra0GNDEUJ52ptre4ubq7vGiuv8CrGCksG2e9yMnKy8yOwc/ABjgsHc3W19jZo9DcwCsiJ9ri4+TW3ee/IyI65e3u76Xo8q4YLtXw+Pn6gvP9rS8Dju0bSBCbv4PCKCwoyLAhL4QQDXCQ4LCixXgQIT6YeLGjx0UZQz7wUeujyY8hUxpQwOCkS4spY6748LJmwZg4SdyzyfMdTpwPXLTsSXTcz58oMhRdavAozgY+hjKdiszpURoIqGrdlaJECRIQNHhoYBXhAyBb0yKTkOGDghgQ/wyURRdDqtq7vDp8EEGD7NxgNC7gHYxsgQwRK/7+8mCDsONeHShAUMyqAYjHmHd1UJCYso/MoHOdKPBAcQm7oVOXsrDDw18SC1XLLsUABIa5EErO3g2q9m2rKCjyHv6JAQXXTjUIJ86ckQQYfpHqbk790IbJRyHErs690BkKpX/mQN29+wUSR1OUXz/ojILoKTmwn5+hc0wW89lbwPG0cf71O8AHkQc7/cfdAOGFhMJ2BlaXwQgxFdBgeR3YlxFaE+pTQgExiLADCwNkwKA1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";
const mh_loading_bak = "data:image/png;base64,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";
const autoPagerLoading = "data:image/gif;base64,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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=";
//自定義站點規則
const customData = [{
name: "小黃書/8色人體攝影 xchina.co xchina.biz xchina.fun 8se.me",
reg: /(xchina|8se)\.(co|me|biz|fun)\/photo\/id-\w+\.html/,
include: ".photos>a",
imgs: async () => {
let numP = fun.geT("//i[@class='fa fa-picture-o']/parent::div").match(/\d+/)[0];
//let pageSize = parseInt(fun.ge(".photos>a").href.match(/pageSize=(\d+)/i)[1], 10) || 17;
//let max = Math.ceil(numP / pageSize);
let max;
try {
max = parseInt([...new Set([...fun.gae(".pager a[href]")].map(e => e.href))].pop().match(/\/(\d+)\.html$/)[1], 10);
} catch (e) {
max = 1;
}
//if (max > 1 && [...fun.gae(".photos>a")].length < (pageSize + 1)) {
if (max > 1) {
let links = [];
let url = location.href.replace(".html", "");
for (let i = 2; i <= max; i++) {
links.push(url + "/" + i + ".html");
}
await fun.getEle(links, ".photos>a", [".photos", 0], ".pager,.photos>.item,.photos>.photoMask", 200);
}
if (parseInt(numP, 10) != [...fun.gae("img.cr_only")].length) {
setTimeout(() => {
fun.hide();
fun.show("圖片數量不符合,請反饋", 5000);
}, 1500)
}
thumbnailsSrcArray = [...fun.gae("img.cr_only")].map(e => e.src);
return thumbnailsSrcArray.map(e => e.replace("_600x0", ""));
},
button: [4],
insertImg: [
["//div[div[@class='photos']]/*[last()]", 2], 2
],
go: 1,
customTitle: () => {
let s = document.title.split("-");
let title = "";
if (/未分/.test(s[1])) {
title += s[0].trim()
} else {
title += s[1].trim() + " - ";
title += s[0].trim()
}
return title;
},
css: "body{overflow:unset!important}.photos>div.item,.jquery-modal.blocker.current,.push-top,.push-bottom,.slider-ad,.article.ad,.pager>.tips,body>footer~*:not([id^='pv-']):not([class^='pv-']):not(.pagetual_tipsWords):not(#comicRead):not(#fab):not(.FullPictureLoadMsg):not(.FullPictureLoadFixedBtn):not(#FullPictureLoadOptions):not(a):not(*[class^=fancybox]),.photoMask,.banner_ad{display: none!important;}",
topButton: true,
category: "nsfw2"
}, {
name: "JavSX.com https://w3.javsx.com/photos.html",
reg: /w3\.javsx\.com\/photos\/[\w-]+\.html$/,
imgs: async () => {
try {
let max = fun.ge("//a[text()='Last']").href.match(/\d+$/)[0];
let links = [];
for (let i = 2; i <= max; i++) {
links.push(location.href + "?page=" + i);
}
await fun.getEle(links, ".col-photos>a", [".col-photos", 0], ".pagination");
[...fun.gae("img[data-src]")].forEach(e => {
e.src = e.dataset.src;
});
} catch (e) {}
thumbnailsSrcArray = [...fun.gae("img[data-src]")].map(e => e.dataset.src);
return thumbnailsSrcArray.map(e => e.replace(/resize=[^&]+&/, ""));
},
button: [4],
insertImg: [
[".col-photos", 2], 2
],
go: 1,
customTitle: () => fun.geT("h1.title").replace("| Body Photography", "").replace("- JVID", "").replace("- 未分类人体摄影", "").trim(),
css: ".col-photos{margin-bottom:60px}.pagination{margin-top:0px!important}",
category: "nsfw2"
}, {
name: "Nlegs/HoneyLeg www.nlegs.com www.honeyleg.com", //無法完全應對此站的人機驗證,請使用專用腳本 https://greasyfork.org/scripts/463123
enable: 0,
reg: /(www\.nlegs\.com|www.honeyleg.com)\/(girls|article)\//,
init: () => {
let loopFind = setInterval(() => {
fun.ge(".pagination>li:last-child>a") && (clearInterval(loopFind), fun.getNP("//div[a/div[contains(@style,'thumb') and span]]", "li.active+li>a", null, ".pagination"))
}, 100);
},
imgs: "js;return fun.getImgA('.img-res','a[href*=image]',1);",
insertImg: ["//div[div[@class='col-md-2 col-sm-4 col-xs-12']]", 0],
customTitle: () => fun.geT("strong"),
threading: 1,
fetch: 1,
//css: ".col-md-2.col-sm-4.col-xs-12{width:1000px!important;height:auto!important;display:block!important;margin:0 auto !important;float: none!important;}",
category: "nsfw2"
}, {
name: "雅拉伊 www.yalayi.com 免VIP僅支援圖片簡單命名數字遞增的。",
reg: /https?:\/\/www\.yalayi\.com\/gallery\/\d+\.html/i,
imgs: async () => {
await fun.waitEle(".bigimg>img");
let max = fun.ge(".tishiwenzi-box").innerText.match(/\d+/)[0];
let firstImg = fun.ge(".bigimg>img");
let path = firstImg.dataset.original.match(/.+\//)[0];
let testArr = [path + "1.jpg", path + "01.jpg", path + "001.jpg", path + "0001.jpg"];
let ok = false;
let padStart;
for (let i = 0; i < testArr.length; i++) {
let obj = await fun.checkImgStatus(testArr[i]);
console.log(`確認圖片[${i}]`, obj);
if (obj.ok) {
ok = true;
padStart = parseInt(i, 10) + 1;
break;
}
}
let arr = [];
if (ok) {
arr.push(firstImg.src);
for (let i = 1; i <= max; i++) {
let src = path + String(i).padStart(padStart, "0") + ".jpg";
arr.push(src);
}
return arr;
} else {
return arr;
}
},
button: [4, "24%", 4],
insertImg: [".bigimg", 2],
customTitle: () => fun.title(" - ", 3),
threading: 4,
category: "nsfw1"
}, {
name: "JKF www.jkforum.net",
reg: /www\.jkforum\.net\/thread/,
imgs: "img[id^=aimg]",
customTitle: () => fun.title("-", 1),
category: "nsfw2"
}, {
name: "草榴 www.t66y.com cl.6962x.xyz",
reg: /\/htm_data\/\d+\/\d+\/\d+\.html/,
include: "img[ess-data]",
imgs: "img[ess-data]",
customTitle: () => fun.geT("h4.f16").replace(/\[\d+P\]$/i, ""),
category: "nsfw2"
}, {
name: "X成人论坛 xbbs.me",
reg: /xbbs\.me\/thread\/id-\w+\.html$/,
imgs: () => [...fun.gae(".xbbs-thread-image img[data]")].map(e => e.getAttribute("data")),
customTitle: () => fun.geT(".article>h1").trim(),
category: "nsfw2"
}, {
name: "驲哔么 ribi.me",
reg: /ribi\.me\/text\/\d+\/1$/,
imgs: ".img-fluid",
button: [4],
insertImg: [".container", 2],
customTitle: () => fun.attr(".img-fluid", "alt").replace(/\[福利COS\]\s?/, ""),
category: "nsfw1"
}, {
name: "优丝库HD - 免VIP yskhd.com ysk567.com",
reg: /(yskhd\.com|ysk567\.com)\/archives\/\d+/i,
imgs: () => {
thumbnailsSrcArray = [...fun.gae(".article-content img[src*='-285x285']")].map(e => e.src);
let getRes = [...fun.gae(".article-content img[src*='-285x285']")].map(e => e.src.replace("-285x285", "")).map(async src => {
let res = await fun.xhrHEAD(src);
let status = res.status;
return status == 404 ? src.replace(/(\.[a-z]+)$/i, "-scaled$1") : src;
});
return Promise.all(getRes);
},
button: [4],
insertImg: [
[".article-act", 1], 2
],
go: 1,
autoDownload: [0],
next: ".article-nav-prev>a",
prev: ".article-nav-next>a",
customTitle: () => fun.geT(".article-title").replace(/\s?\[\d+P\]/i, ""),
fancybox: {
v: 3,
css: false
},
category: "nsfw1"
}, {
name: "洛花秀 免VIP luohuaxiu.com",
reg: /luohuaxiu\.com\/archives\/\d+/,
exclude: ".single-video",
init: () => {
new MutationObserver(() => {
document.body.classList.remove("compensate-for-scrollbar");
}).observe(document.body, {
childList: true,
subtree: true
});
},
imgs: async () => {
let arr = [];
let max = fun.gae(".gallery-item").length;
let url = fun.ge(".gallery-item a").href;
let m = url.match(/^(.+\/)([\w-]+)(\.[a-z]{3,4})$/i);
let path;
try {
path = m[1];
} catch (e) {
try {
if (/\(\d+\)\./.test(url)) {
let m = url.match(/^(.+\()(\d+)(\)\.[a-z]{3,4})$/i);
for (let i = 1; i <= max; i++) {
arr.push(decodeURI(m[1] + i + m[3]));
}
}
if (options.fancybox == 1) {
fun.show("預覽縮圖轉DataURL中...", 0);
thumbnailsSrcArray = [...fun.gae(".gallery-item>a>img,.gallery-item>span>img")].map(e => fun.xhr(decodeURI(e.src), "blob").then(blob => fun.blobToDataURL(blob)));
thumbnailsSrcArray = await Promise.all(thumbnailsSrcArray).then(arr => {
fun.hide();
return arr;
});
}
return arr;
} catch (e) {
return arr;
}
}
let fileName = m[2];
let ex = m[3];
let blur = fun.ge(".gallery-blur-item");
if (blur && fileName.length <= 4) {
let n = url.match(/(\d+)\.[a-z]{3,4}$/)[1];
for (let i = parseInt(n, 10); i < (parseInt(n, 10) + parseInt(max, 10)); i++) {
arr.push(decodeURI(path + String(i).padStart(fileName.length, "0") + ex));
}
} else if (blur && fun.ge(".size-thumbnail[src*='-285x180']")) {
arr = [...fun.gae(".size-thumbnail[src*='-285x180']")].map(e => e.src.replace("-285x180", ""));
} else if (blur && fun.ge("img[src*='?width=285']")) {
arr = [...fun.gae("img[src*='?width=285']")].map(e => decodeURI(e.src.replace(/\?width=285.+/, "")));
} else if (blur) {
return arr;
} else {
arr = [...fun.gae(".gallery-item a")].map(e => e.href);
}
if (options.fancybox == 1) {
fun.show("預覽縮圖轉DataURL中...", 0);
thumbnailsSrcArray = [...fun.gae(".gallery-item>a>img,.gallery-item>span>img")].map(e => fun.xhr(decodeURI(e.src), "blob").then(blob => fun.blobToDataURL(blob)));
thumbnailsSrcArray = await Promise.all(thumbnailsSrcArray).then(arr => {
fun.hide();
return arr;
});
}
return arr;
},
button: [4],
insertImg: [
[".article-shares", 2], 2
],
go: 1,
autoDownload: [0],
next: ".article-nav-prev a",
prev: ".article-nav-next a",
customTitle: () => fun.geT(".article-title"),
fancybox: {
v: 3,
css: false
},
category: "nsfw1"
}, {
name: "24FA https://www.24fa.com/c49.aspx",
reg: /(www\.)?\d{2,3}(m|w|faw|fa|aa)?\.[a-z]{2,4}\/m?n\w+\.aspx/,
init: "document.onkeydown=null",
imgs: () => fun.getImgA("#content img", ".pager a:not([title])"),
button: [4],
insertImg: ["#content", 1],
autoDownload: [0],
next: ".prevNews>a",
prev: ".nextNews>a",
customTitle: () => fun.geT("h1"),
css: "body>section[id],#footer~*:not([id^='pv-']):not([class^='pv-']):not(.pagetual_tipsWords):not(#comicRead):not(#fab):not(.FullPictureLoadMsg):not(.FullPictureLoadFixedBtn):not(#FullPictureLoadOptions):not(*[class^=fancybox]){display:none!important}",
category: "nsfw2"
}, {
name: "Hit-x-Hot www.hitxhot.org",
reg: /www\.hitxhot\.org\/(gallerys|articles|photos)\/(?!\?page=|\?m=|hot|top|tag)\w+\.html(\?m=1)?$/i,
imgs: () => {
let max;
try {
max = fun.geT(".entry-title").match(/\d+$/)[0];
} catch (e) {
max = 1;
}
return /\?m=1/.test(siteUrl) ? fun.getImg(".entry-content img", max, "8") : fun.getImg(".entry-content img", max);
},
button: [4],
insertImg: [".entry-content", 2],
customTitle: () => document.title.split("|")[0].slice(10).trim(),
category: "nsfw2"
}, {
name: "www.depvailon.com pic.yailay.com nungvl.net www.kaizty.com lootiu.com",
reg: /(pic\.yailay\.com|www\.kaizty\.com)\/(gallerys|articles|photos)\/(?!\?page=|\?m=|hot|top|tag)\w+\.html$|www\.depvailon\.com\/(?!\?page=|\?m=).+\.html$|nungvl\.net\/gallerys\/\d+\.cg$|lootiu\.com\/gallery\/.+\.cfg$|(pic\.yailay\.com|www\.kaizty\.com)\/(gallerys|articles|photos)\/(?!\?page=|\?m=|hot|top|tag)\w+\.html\?m=1$|www\.depvailon\.com\/(?!\?page=|\?m=).+\.html\?m=1$|nungvl\.net\/gallerys\/\d+\.cg\?m=1$|lootiu\.com\/gallery\/.+\.cfg\?m=1$/i,
imgs: () => {
let max;
try {
max = fun.geT("h1,h2").match(/\d+$/)[0];
} catch (e) {
max = 1;
}
return /\?m=1/.test(siteUrl) ? fun.getImg(".contentme img,.contentme2 img", max, "8") : fun.getImg(".contentme img,.contentme2 img", max);
},
button: [4],
insertImg: [".contentme,.contentme2", 2],
customTitle: () => document.title.split("|")[0].slice(10).trim(),
css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}",
category: "nsfw2"
}, {
name: "TGStat Show more",
icon: 0,
key: 0,
reg: /^https:\/\/([a-z]{2}\.)?tgstat\.com\//,
observerClick: "//button[contains(text(),'Show more')]",
category: "nsfw2"
}, {
name: "Telegram Web",
reg: /^https:\/\/telegra\.ph\/.+/,
imgs: ".figure_wrapper img",
customTitle: () => fun.geT("h1").replace(/\|/g, "").replace(/(\s?-\s?)?\d+P/i, ""),
category: "nsfw2"
}, {
name: "新闻吧 https://www.xinwenba.net/web/meinv/ m.xwbar.com",
reg: /(www\.xinwenba\.net|m\.xwbar\.com)\/plus\/view-\d+-\d+\.html/,
imgs: () => {
let max;
try {
max = fun.geT(".paging>li>a").match(/\d+/)[0];
} catch (e) {
max = 1;
}
return fun.getImg(".main img", max, "5");
},
button: [4],
insertImg: [".view_img", 1],
autoDownload: [0],
next: ".pre_next li:first-child a",
prev: ".pre_next li:last-child a",
customTitle: () => fun.geT(".title>h1"),
category: "nsfw1"
}, {
name: "留园酷 https://www.cool18.com/",
reg: /(www\.cool18\.com\/bbs\d*\/index\.php\?app=forum&act=threadview&tid=\d+|wap\.cool18\.com\/index\.php\?app=index&act=view&cid=\d+)/,
imgs: "img[mydatasrc],#shownewsc img,.show_content img",
customTitle: () => fun.geT(".show_content b,h1.article-tit").replace(/(\s?\.?)?\s?\(\d+P\)\s?/i, ""),
css: ".img_ad_list{display:none!important}",
category: "nsfw2"
}, {
name: "ACG 资源网 meituzyw.com",
reg: /meituzyw\.com\/\d+\.html/i,
exclude: ".ri-hide-warp",
imgs: "img[data-lazy-src],.content-wrapper img",
button: [4],
insertImg: ["//p[img]", 2],
autoDownload: [0],
next: "a.entry-page-prev",
prev: "a.entry-page-next",
customTitle: () => fun.geT(".post-title,.entry-title").replace(/\[\d+p\]/i, "").trim(),
category: "nsfw1"
}, {
name: "秀人集 www.xr02.xyz",
reg: /www\.(xiuren\d+|xr\d+)\.\w+\/\w+\/\d+\.html/i,
imgs: () => fun.getImg('.content>p img[alt]', fun.geT(".page a:last-child", 2), 3),
init: () => {
let pag = [...fun.gae(".page")];
if (pag.length > 0) pag[0].remove();
},
button: [4],
insertImg: ["//div[p[img[@alt and @title]]]", 2],
autoDownload: [0],
next: "//span[contains(text(),'下一篇')]/a[contains(@href,'html')]",
prev: "//span[contains(text(),'上一篇')]/a[contains(@href,'html')]",
customTitle: () => fun.geT(".item_title>h1"),
//threading: 4,
css: ".content br{display:none!important}",
category: "nsfw1"
}, {
name: "秀人美女網 www.xrmn01.com",
reg: /(www\.xrmnw\.\w+|www.xrmn\d+.\w+|m\.xrmn\d+\.\w+)\/\w+\/\d+\/\d+\.html/i,
imgs: () => fun.getImg('.content p img[alt]', fun.geT(".page a:last-child", 2), 3),
button: [4],
insertImg: ["//div[p[img[@alt]]]", 2],
autoDownload: [0],
next: "//span[contains(text(),'下一篇')]/a[contains(@href,'html')]",
prev: "//span[contains(text(),'上一篇')]/a[contains(@href,'html')]",
customTitle: () => fun.geT(".item_title>h1").replace(/\d+P$/i, ""),
//threading: 4,
css: ".item_title>a,.content br,.bottom_fixed,.update_area_lists>div[id],body>div[id]:not([id^='pv-']):not([class^='pv-']):not(.pagetual_tipsWords):not(#comicRead):not(#fab):not(.FullPictureLoadMsg):not(.FullPictureLoadFixedBtn):not(#FullPictureLoadOptions):not(*[class^=fancybox]){display:none!important}",
category: "nsfw1"
}, {
name: "爱美女网 www.imn5.net www.imn5.cc",
reg: /www\.imn5\.\w+\/\w+\/\w+\/\d+\.html/i,
imgs: () => fun.getImg('.imgwebp p img[alt]', fun.geT(".page a:last-child", 2), 3),
button: [4],
insertImg: ["//div[p[img[@alt]]]", 2],
autoDownload: [0],
next: "//span/b[contains(text(),'下一篇')]/a[contains(@href,'html')]",
prev: "//span/b[contains(text(),'上一篇')]/a[contains(@href,'html')]",
customTitle: () => fun.geT(".focusbox h1+div").replace(/\d+P$/i, ""),
//threading: 4,
css: ".imgwebp br,img[src*='zz2.gif']{display:none!important}",
category: "nsfw1"
}, {
name: "美人图 meirentu.cc",
reg: /meirentu\.\w+\/pic\/\d+\.html/i,
imgs: () => fun.getImg('.content_left img[alt]', fun.geT(".page a:last-child", 2), 5),
button: [4],
insertImg: [".content_left", 2],
autoDownload: [0],
next: "//span[contains(text(),'下一篇')]/a[contains(@href,'html')]",
prev: "//span[contains(text(),'上一篇')]/a[contains(@href,'html')]",
customTitle: () => fun.geT(".item_title>h1").replace(/\d+P$/i, ""),
//threading: 4,
css: "img[alt]~br{display:none!important}",
category: "nsfw1"
}, {
name: "极品性感美女 www.xgmn1.xyz",
reg: /www\.xg\w+\.\w+\/\w+\/\w+\.html/i,
include: "//div[@class='toptip']/a[text()='极品性感美女']",
init: () => {
let pag = [...fun.gae(".pagination")];
if (pag.length > 0) pag[0].remove();
let p = [...fun.gae("//article/p[not(img)]")];
if (p.length > 0) {
let te = fun.ge(".article-content");
p.forEach(e => {
te.parentNode.insertBefore(e, te);
})
}
},
imgs: () => fun.getImg('.article-content img[alt]', fun.geT("a.current~*:last-child", 2), 3),
button: [4, "22%"],
insertImg: ["//p[img[@alt]]", 2],
autoDownload: [0],
next: ".article-nav-next>a[href$=html]",
prev: ".article-nav-prev>a[href$=html]",
customTitle: () => fun.geT(".article-title").replace(/\d+p$/i, ""),
//threading: 4,
css: ".article-header>a,.article-content br,img[src*='zz1.gif'],.bottom_fixed,.article-content~a,#bottom-banner,.content>div[id],body>.footer~*:not([id^='pv-']):not([class^='pv-']):not(.pagetual_tipsWords):not(#comicRead):not(#fab):not(.FullPictureLoadMsg):not(.FullPictureLoadFixedBtn):not(#FullPictureLoadOptions):not(a):not(*[class^=fancybox]){display:none!important}",
category: "nsfw1"
}, {
name: "爱看美女网 www.ikmn03.cc",
reg: /www\.ikmn(\d+)?\.\w+\/\w+\/\d+\.html/i,
include: ".info-pagebar>a",
init: () => {
let pag = [...fun.gae(".pagebar")];
if (pag.length > 0) pag[0].remove();
},
imgs: () => fun.getImg('.info-imtg-box img[alt]', fun.geT(".pagebar>*:last-child", 2), 3),
button: [4],
insertImg: ["//p[img[@alt]]", 2],
autoDownload: [0],
next: ".info-next li:last-child a",
prev: ".info-next li:first-child a",
customTitle: () => fun.geT("h1").replace(/\d+p$/i, ""),
//threading: 4,
category: "nsfw1"
}, {
name: "美女秀 www.22mm.net",
reg: /www\.22mm\.net\/a\/\w+\.html$/i,
imgs: () => fun.getImg(".content img", fun.ge(".page>li:last-child>a").href.match(/_(\d+)/)[1], 9),
button: [4],
insertImg: [".content", 2],
autoDownload: [0],
next: "//span[contains(text(),'上一篇')]/a",
prev: "//span[contains(text(),'下一篇')]/a",
customTitle: () => fun.geT(".item_title>h1"),
css: "union,.update_area_lists>li:nth-child(n+3):nth-child(-n+4){display:none!important}",
category: "nsfw1"
}, {
name: "卡卡美女网 www.kaka234.cc m.kaka234.cc",
reg: /https?:\/\/(www|m)\.kaka234\.cc\/HTM\/\w+\/(\w+\/)?\d+\/\d+\/\d+\.html/i,
include: ".Title>h1,.PsBox",
init: () => {
let ele = fun.ge(".PsBox");
if (ele) {
let eleParent = ele.parentNode;
eleParent.parentNode.insertBefore(ele.cloneNode(true), eleParent);
}
},
imgs: () => {
let max;
try {
max = fun.geT(".dede_pages li>a,.article_page li>a").match(/\d+/)[0];
} catch (e) {
max = 1;
}
return fun.getImg(".content img,.ArticleImageBox img", max, 9);
},
button: [4],
insertImg: ["//div[@class='content'] | //div[div[@class='ArticleImageBox']]", 2],
autoDownload: [0],
next: () => {
let next = fun.ge("//li[contains(text(),'上一篇')]/a");
return next ? next.href : null;
},
prev: 1,
customTitle: () => fun.geT(".Title>h1,.PsBox"),
css: ".m_adv{display:none!important}",
category: "nsfw1"
}, {
name: "福利图 fulitu.me",
reg: /fulitu\.me\/pic\/\d+\.html/i,
imgs: () => fun.getImg(".content_left img", fun.geT("//a[text()='下页']", 2), 5),
button: [4],
insertImg: [".content_left", 2],
autoDownload: [0],
next: "//span[contains(text(),'下一篇')]/a",
prev: "//span[contains(text(),'上一篇')]/a",
customTitle: () => fun.geT(".item_title>h1").replace(/\d+P$/i, "").trim(),
css: ".content br{display:none!important}",
category: "nsfw1"
}, {
name: "爱图门 aitu.men 佼人馆 jaoren.com",
reg: /^https:\/\/(aitu\.men|jaoren\.com)\/[^\/]+\/\d+\.html/i,
imgs: async () => {
await fun.getNP(".context img", ".pagelist span+a", null, ".pagelist", 0, null, 0);
return [...fun.gae(".context img")];
},
button: [4],
insertImg: [".context", 1],
autoDownload: [0],
next: ".post-previous a",
prev: ".post-next a",
customTitle: () => fun.geT("#content h1"),
category: "nsfw1"
}, {
name: "女神排行榜 nsphb.com",
reg: /^https:\/\/nsphb\.com\/\w+\/\d+\.html/i,
imgs: () => fun.getImgA(".article-content img", ".post-nav-links a"),
button: [4],
insertImg: [".article-content", 2],
autoDownload: [0],
next: "//a[p[text()='上一篇'] and not(starts-with(@href,'java'))]",
prev: "//a[p[text()='下一篇'] and not(starts-with(@href,'java'))]",
customTitle: () => fun.geT(".article-title>a").replace(/\d+p/i, ""),
category: "nsfw1"
}, {
name: "K55 https://k55.net/arttype/2.html",
reg: /^https:\/\/k55\.net\/artdetail-\d+\.html/i,
include: ".photo_box",
imgs: () => [...fun.gae(".photo_box img")].map(e => e.src).sort((a, b) => a.match(/(\d+)\.\w+$/)[1] - b.match(/(\d+)\.\w+$/)[1]),
button: [4],
insertImg: [".photo_box", 2],
autoDownload: [0],
next: ".item_prev_next>.item_right>a",
prev: ".item_prev_next>.item_left>a",
customTitle: () => fun.geT(".title-box>.h3-md.mb-1").replace(/\s?\[\d+P\].+$/i, ""),
fancybox: {
v: 3,
css: false
},
category: "nsfw1"
}, {
name: "Hotgirl.biz",
reg: /^https:\/\/hotgirl\.biz\/[^\/]+\/$/i,
imgs: ".entry-content img",
button: [4],
insertImg: [
[".entry-content", 0], 2
],
go: 1,
customTitle: () => fun.geT(".entry-title"),
category: "nsfw1"
}, {
name: "AsupanPenyegar asupanpenyegar.com",
reg: /^https?:\/\/asupanpenyegar\.com\/[^\/]+\/$/i,
imgs: ".s-post-content img",
button: [4],
insertImg: [".s-post-content", 2],
customTitle: () => fun.geT(".entry-title"),
category: "nsfw1"
}, {
name: "XLUST.ORG",
reg: /^https:\/\/xlust\.org\/[^\/]+\/$/i,
imgs: ".rl-gallery-item a",
button: [4],
insertImg: [
[".rl-gallery", 2], 2
],
go: 1,
customTitle: () => fun.geT(".entry-title").replace(/\([\d\s]+pics\)\s?/, ""),
fancybox: {
blacklist: 1
},
category: "nsfw1"
}, {
name: "秀人网 xiurenwang.me",
reg: /^https:\/\/xiurenwang\.me\/photo\.php\?id=\w+/i,
imgs: () => {
thumbnailsSrcArray = [...fun.gae(".intro>img")].map(e => e.src)
return thumbnailsSrcArray.map(e => e.replace("_600x0", ""))
},
button: [4],
insertImg: [".intro", 2],
customTitle: () => fun.geT("h1").replace(/\(\d+P\)/i, "").trim(),
css: "@media only screen and (max-width:640px){.paragraph .intro img{width:100%!important}}",
category: "nsfw1"
}, {
name: "秀人图 www.xiurento.com",
reg: /^https:\/\/www\.xiurento\.com\/\d+\.html/i,
exclude: "//button[contains(text(),'登录购买')]",
imgs: () => fun.getImgA("a[data-fancybox],.entry-content img", [...new Set([...fun.gae(".fenye a")].map(a => a.href))]),
button: [4],
insertImg: [".entry-content", 2],
autoDownload: [0],
next: ".article-nav-prev a",
prev: ".article-nav-next a",
customTitle: () => fun.geT(".entry-title").replace(/\d+p/i, "").trim(),
fancybox: {
v: 3,
css: false
},
category: "nsfw1"
}, {
name: "微密猫 wememiao.com weme.su weme2.com",
reg: /(wememiao\.com|weme\.su|weme2\.com)\/archives\/\d+/i,
imgs: "a[data-fancybox]",
button: [4],
insertImg: [
[".single-content .article-tags", 2], 2
],
autoDownload: [0],
next: ".article-nav-prev a",
prev: ".article-nav-next a",
customTitle: () => fun.geT(".article-title").replace(/\[[0-9a-z-\.\s]+\]/i, "").trim(),
go: 1,
fancybox: {
v: 3,
css: false
},
category: "nsfw1"
}, {
name: "优美图录 umei.net",
reg: /umei\.net\/\w+\/\d+\.html/i,
imgs: () => fun.getImg(".image_div img", fun.geT(".item_info span"), 9),
button: [4],
insertImg: [".image_div", 2],
customTitle: () => fun.geT(".item_title>h1"),
css: ".content_left img{cursor:unset}.affs,.xg_content>li:nth-child(n+1):nth-child(-n+2){display:none!important}.image_div a img{cursor:unset}",
category: "nsfw1"
}, {
name: "秀人图集 xiuren0.com",
reg: /xiuren\d\.com\/\d+\.html/i,
include: ".article-paging>*:last-child",
init: () => {
fun.remove("//p[img[@decoding and not(contains(@src,'/pic/'))]]");
},
imgs: () => fun.getImg(".article-content img:not([src*='/pic/'])", fun.geT(".article-paging>*:last-child"), "4"),
button: [4],
insertImg: [
[".article-paging", 1], 1
],
next: ".article-nav-prev>a",
prev: 1,
customTitle: () => fun.geT(".article-title"),
css: ".modown-ad{display:none!important}",
category: "nsfw1"
}, {
name: "秀人图集 xiuren0.com",
reg: /xiuren\d\.com\/\d+\.html/i,
imgs: ".article-content img:not([src*='p.xiurenb.top'])",
next: ".article-nav-prev>a",
prev: 1,
customTitle: () => fun.geT(".article-title"),
category: "nsfw1"
}, {
name: "Xiutaku xiutaku.com Kostaku kostaku.art",
reg: /(xiutaku\.com|kostaku\.art)\/\d+$/,
init: () => {
fun.remove(".search-form~*,.blog~*:not([class]),.pagination~*:not([class]):not(hr),.article.content~*:not([class]):not(hr),.bottom-articles~*");
},
imgs: () => fun.getImg(".article-fulltext img", fun.geT(".pagination-list>span:last-child")),
button: [4],
insertImg: [".article-fulltext", 2],
customTitle: () => fun.geT(".article-header>h1").replace("(mitaku.net)", "").trim(),
category: "nsfw1"
}, {
name: "私图网 baoruba.com tukuku.cc",
reg: /(baoruba\.com|tukuku\.cc)\/(bb|t)\d+\.html/i,
imgs: "img[decoding]",
button: [4],
insertImg: [".entry-content", 2],
customTitle: () => fun.title(" - 私图网"),
go: 1,
css: "[id].widget_text,.gridmode-post-thumbnail-single,.gridbit-thumbnail-alignwide{display:none!important}",
category: "nsfw1"
}, {
name: "找套图 www.zhaotaotu.cc",
reg: /www\.zhaotaotu\.cc\/thread-\d+\.htm/i,
imgs: ".message>img:not(:first-of-type)",
button: [4],
insertImg: [".message", 2],
customTitle: () => fun.geT(".media-body>h4").replace(/\(\d+P\)/i, ""),
category: "nsfw1"
}, {
name: "豆花520 www.douhua520.com",
reg: /www\.douhua520\.com\/p\/\d+/i,
imgs: () => [...fun.gae(".tm-container-content div>.img-fluid")].map(e => encodeURI("https://www.douhua520.com/" + e.alt)),
button: [4],
insertImg: ["//div[div[div[img[@class='img-fluid']]]]", 2],
customTitle: () => fun.geT(".tm-container-content h2.tm-text-primary"),
category: "nsfw1"
}, {
name: "尤美图库 www.umeitu.com",
reg: /www\.umeitu\.com\/img\/\d+\.html/,
imgs: () => fun.getImg(".vipimglist img", fun.geT(".stitle>h1>span").match(/\d+/)[0], 9),
button: [4],
insertImg: [".vipimglist", 2],
customTitle: () => fun.title(" - 尤美图库", 1).replace(/\[\d+P\]/i, ""),
css: ".sb.list2>li:nth-child(n+2):nth-child(-n+3){display:none!important}.vipimglist img{min-height:unset!important;}",
category: "nsfw1"
}, {
name: "美图库 www.meituku.org",
reg: /www\.meituku\.org\/\d+\/\d+\.html/,
imgs: () => [...fun.doc(imgs.join("")).images],
button: [4],
insertImg: ["#content", 2],
autoDownload: [0],
next: "//div[contains(text(),'下一篇')]/a",
prev: "//div[contains(text(),'上一篇')]/a",
customTitle: () => fun.geT(".info-title>a:nth-child(3)"),
category: "nsfw1"
}, {
name: "秀爱美女网 www.2mn.cc 秀套图吧 www.taotu8.cc",
reg: /(www\.2mn\.cc|www\.taotu8\.cc)\/mm\/\d+\.html/i,
imgs: () => {
let max;
try {
max = fun.ge(".page_navi a:last-child").href.split("_")[1].match(/\d+/)[0];
} catch (e) {
max = 1;
}
return fun.getImg(".sg_img img", max, 9);
},
button: [4],
insertImg: [".sg_img", 2],
customTitle: () => fun.geT("h1"),
css: "#divpsg,.tujia{display:none!important}.sg_img img{min-height:unset!important}",
category: "nsfw1"
}, {
name: "Xiuren 秀人网 www.xiuren.org",
reg: /www\.xiuren\.org\/.+\.html/i,
imgs: "a[rel='gallery']:not([href*='html']",
button: [4],
insertImg: [
[".post p>a:not([title])", 2, ".post p>a[title],.post p>span"], 2
],
customTitle: () => fun.geT("#title>h1").replace(/\d+p$/i, "").trim(),
css: "#post .post img{max-width:100% !important}",
category: "nsfw2"
}, {
name: "微圖坊 www.v2ph.com www.v2ph.net www.v2ph.ru",
//reg: /v2ph\.\w+\/album\/.+/i,
reg: () => {
if (/v2ph\.\w+\/album\/.+/i.test(siteUrl)) {
if (!siteUrl.includes("?page=")) {
return true;
}
}
return false;
},
include: ".photos-list",
init: () => {
if (/\.html\?hl=/.test(siteUrl)) {
location.href = location.href.replace(/\.html\?hl=.*/, ".html");
}
},
imgs: async () => {
let numP = fun.geT("dd:last-child").match(/\d+/)[0];
let max = Math.ceil(numP / 10);
let links = [];
links.push(siteUrl.replace(/\?page=\d+/, ""));
for (let i = 2; i <= max; i++) {
links.push(siteUrl.replace(/\?page=\d+/, "") + `?page=${i}`);
}
let srcArr = [];
let status = 200;
let vip = false;
let fetchNum = 0;
fun.show(displayLanguage.str_01, 0);
for (let i = 0; i < links.length; i++) {
await fetch(links[i]).then(res => {
if (res.status == 403) status = 403;
fun.show(`${displayLanguage.str_02}${fetchNum+=1}/${links.length}`, 0);
return res.arrayBuffer();
}).then(buffer => {
const decoder = new TextDecoder(document.characterSet || document.charset || document.inputEncoding);
const htmlText = decoder.decode(buffer);
const doc = fun.doc(htmlText);
debug(`\n${links[i]}\n`, doc);
let vipEle = fun.ge(".lead", doc);
if (vipEle) vip = true;
let imgs = [...fun.gae(".album-photo img[alt]", doc)];
imgs.length == 0 ? debug(`\n${links[i]}\n沒有任何圖片`) : debug(`\n${links[i]}\n此頁圖片`, imgs);
let tE = [...fun.gae("div.album-photo")].pop();
imgs.forEach(e => {
if (e.dataset.src) {
srcArr.push(e.dataset.src);
e.src = e.dataset.src;
} else srcArr.push(e.src);
if (i != 0) tE.parentNode.insertBefore(e.parentNode.cloneNode(true), tE.nextSibling);
});
try {
if (i != 0) fun.ge(".pagination").outerHTML = fun.ge(".pagination", doc).outerHTML;
} catch (e) {}
});
if (status == 403) {
setTimeout(() => {
fun.show("403請先登錄網站!", 0);
}, 1200);
return srcArr;
}
if (vip) {
setTimeout(() => {
fun.show("VIP限定專輯圖片!", 5000);
}, 1200);
return srcArr;
}
await fun.delay(600, 0);
}
debug(`\n所有圖片\n`, srcArr);
debug(`\n去重複後的圖片\n`, [...new Set(srcArr)]);
if (numP != srcArr.length && !vip) {
setTimeout(() => {
fun.hide();
fun.show("圖片有缺,請看主控台訊息", 5000);
}, 1300)
}
return srcArr;
},
button: [4],
insertImg: [".photos-list", 2],
customTitle: () => fun.geT("h1"),
css: ".albums-list img,.photos-list img{opacity:1!important}",
threading: 10,
category: "nsfw2"
}, {
name: "柠檬皮 www.cybesx.com",
reg: /www\.cybesx\.com\/\d+\.html$/i,
include: ".page-links",
exclude: ".read-point-box",
imgs: () => fun.getImg(".single-content img", (fun.geT(".page-links>a:last-child", 2) || 1), 7),
button: [4],
insertImg: [".single-content", 1],
customTitle: () => fun.geT("h1.entry-title"),
fancybox: {
v: 3,
css: false
},
category: "nsfw1"
}, {
name: "柠檬皮 www.cybesx.com",
reg: /www\.cybesx\.com\/\d+\.html$/i,
include: ".single-content img",
exclude: ".read-point-box",
imgs: ".single-content img",
button: [4],
insertImg: [".single-content", 1],
customTitle: () => fun.geT("h1.entry-title"),
fancybox: {
v: 3,
css: false
},
category: "nsfw1"
}, {
name: "Cherryfans cherryfans.cc",
reg: /cherryfans\.cc\/[^/]+\/$/i,
imgs: ".entry-content img[data-src]",
button: [4],
insertImg: [".entry-content", 2],
autoDownload: [0],
next: "a[rel=prev]",
prev: "a[rel=next]",
customTitle: () => fun.geT("h1.entry-title"),
css: ".entry-featured-media-main{display:none!important}",
category: "nsfw2"
}, {
name: "51sex 51sex.vip",
reg: /51sex\.vip\/pic\/\d+/i,
init: () => {
let url = siteData.next();
fun.addUrlHtml(url, ".headling_main", 1, "下一篇");
},
imgs: () => {
let max;
try {
max = fun.geT(".headling_swiper_num_small").match(/\d+/)[0];
} catch (e) {
max = 1;
}
let links = [];
for (let i = 1; i <= max; i++) {
links.push(location.href + "/" + i);
}
return fun.getImgA("#bigimg", links);
},
button: [4, "24%"],
insertImg: [".headling_main", 2],
next: () => {
let num = location.href.match(/\d+$/)[0];
return location.href.replace(/\d+$/, "") + (parseInt(num, 10) - 1);
},
customTitle: () => fun.geT('.headling_word_main_box_title').replace(/\[\d+P\]/i, "").replace(/\d+P$/i, "").replace(/\(\d+P\)/i, "").trim(),
css: ".headling_main{height:auto}",
category: "nsfw1"
}, {
name: "51sex 51sex.vip 分類自動翻頁",
reg: /https?:\/\/51sex\.vip\/category\/\d+/i,
init: () => {
location.pathname.split("/").length == 3 ? currentPageNum = 1 : currentPageNum = parseInt(location.pathname.split("/").pop(), 10);
},
autoPager: {
ele: ".headling_main_a",
observer: ".headling_main_a",
next: () => {
let url = location.href.match(/https?:\/\/51sex\.vip\/category\/\d+/)[0] + `/${currentPageNum += 1}`;
return url;
},
stop: () => {
let currentEles = [...fun.gae(".headling_main_a")];
if (currentEles.length < 24) {
return true;
} else {
if (currentEles.length > 24) currentEles = currentEles.slice(-24);
let nextEles = [...fun.gae(".headling_main_a", doc)];
for (let i in currentEles) {
for (let n in nextEles) {
if (currentEles[i].href == nextEles[n].href) return true;
}
}
}
return false;
},
history: 1,
title: () => doc.title + ` - Page ${currentPageNum}`
},
openInNewTab: "a.headling_main_a:not([target=_blank])",
category: "autoPager"
}, {
name: "美图乐 www.meitule.net",
reg: /www\.meitule\.\w+\/photo\/\d+\.html/i,
imgs: () => {
let max;
try {
max = fun.ge(".page>li:last-child>a").href.split("_")[1].match(/\d+/)[0];
} catch (e) {
max = 1;
}
return fun.getImg(".content img", max, 9);
},
button: [4],
insertImg: [".content", 2],
customTitle: () => fun.geT("h1.h5"),
css: "#dtag>center,#divpsg,.tujia,.list-album>li:nth-child(n+1):nth-child(-n+2){display:none!important}",
category: "nsfw1"
}, {
name: "美桌 http://www.win4000.com/meitu.html",
reg: /www\.win4000\.com\/meinv\d+\.html/,
imgs: () => fun.getImgA(".pic-large", "#scroll>li:not(.current)>a", 200),
button: [4],
insertImg: ["#pic-meinv,.pic-meinv", 2],
autoDownload: [0],
next: ".group-next>a",
prev: ".group-prev>a",
customTitle: () => fun.geT(".ptitle>h1"),
threading: 3,
category: "nsfw1"
}, {
name: "MM1311 www.mm1311.net m.mm1311.net",
reg: /(www|m)\.mm1311\.net\/\w+\/\d+\.html/,
imgs: () => {
let max;
fun.ge(".page-ch") ? max = fun.geT(".page-ch").match(/\d+/)[0] : max = fun.geT(".fenye>.rw").match(/\d+\/(\d+)/)[1];
return fun.getImg(".content-pic img,.post-content img", max, 9);
},
button: [4],
insertImg: [".content-pic,.post-content", 1],
autoDownload: [0],
next: ".updown_r",
prev: ".updown_l",
customTitle: () => fun.geT(".content>h5,.mm-title"),
css: "union{display:none!important}",
category: "nsfw1"
}, {
name: "依依图片网 www.eemm.cc 精选美女网 www.jxmm.net",
reg: /(www\.eemm\.cc|www\.jxmm\.net)\/pic\/\d+\.html/,
imgs: async () => {
await fun.getNP("#content img", "a.on+a:not(.next)", null, ".page", 0, null, 0);
return [...fun.gae('#content img')];
},
button: [4],
insertImg: ["#content", 1],
customTitle: () => fun.geT(".article>h1"),
css: ".article .content img{max-width:100%!important}",
category: "nsfw1"
}, {
name: "依依图片网M m.eemm.cc 精选美女网M m.jxmm.net",
reg: /(m\.eemm\.cc|m\.jxmm\.net)\/pic\/\d+\.html/,
imgs: () => {
let max = fun.geT(".contentpage").match(/\d+\/(\d+)/)[1];
return fun.getImg(".content img", max, 9);
},
button: [4],
insertImg: [".content", 1],
customTitle: () => fun.geT(".content>h1"),
css: ".topad,.mdiv{display:none!important}",
category: "nsfw1"
}, {
name: "内涵吧 www.neihantu.net",
reg: /(www|wap)\.neihantu\.net\/zhainannvshen\/\d+\.html$/,
imgs: () => {
let max = fun.geT("a[title=Page]>b:last-child");
return fun.getImg("#adcon img,.newsbox img", max, 9);
},
button: [4],
insertImg: ["#adcon,.newsbox", 1],
autoDownload: [0],
next: "//li[@id='pre']/a | //a[text()='上一篇']",
prev: "//li[@id='next']/a | //a[text()='下一篇']",
customTitle: () => fun.geT(".inner>h1,.titbox>h1"),
category: "nsfw1"
}, {
name: "青年美圖 jrants.com",
reg: /^https?:\/\/jrants\.com\/\d+\.html$/,
imgs: () => fun.ge(".page-links") ? fun.getImg(".entry-content img", fun.geT(".page-links>a:last-child"), 7) : [...fun.gae(".entry-content img")],
button: [4],
insertImg: [".entry-content", 1],
autoDownload: [0],
next: "span.prev>a",
prev: "span.next>a",
customTitle: () => fun.geT(".entry-title").replace(/\(\d+P\)|\[\d+P\]|\[\d+P\/\d+1M\]/gi, "").trim(),
css: ".code-block{display:none!important;}",
category: "nsfw2"
}, {
name: "CosBlay cosblay.com 風流雜誌 trendszine.com 泰撲美圖 www.tiplogo.com",
reg: /^https?:\/\/(cosblay\.com|trendszine\.com|www\.tiplogo\.com)\/\d+\.html/i,
imgs: () => fun.getImg(".entry-content img", fun.geT(".pgntn-page-pagination-block>*:last-child", 2) || 1, 7),
button: [4],
insertImg: [".entry-content", 2],
autoDownload: [0],
next: "span.prev>a",
prev: "span.next>a",
customTitle: () => fun.geT(".entry-title").replace(/\(\d+\s?Photos\)|\(\d+p\)/i, "").trim(),
css: ".code-block{display:none!important;}@media (max-width:768px){.separate-containers .inside-article,.separate-containers .comments-area,.separate-containers .page-header,.separate-containers .paging-navigation,.one-container .site-content,.inside-page-header{padding:2px}.entry-content:not(:first-child),.entry-summary:not(:first-child),.page-content:not(:first-child){margin-top:2px}}",
category: "nsfw2"
}, {
name: "MM5MM5美女图片 www.mm5mm5.com",
reg: /www\.mm5mm5\.com\/mm\/\d+/,
imgs: () => picinfo[0].split(","),
button: [4],
insertImg: ["#content", 1],
customTitle: () => fun.geT(".article>h2"),
css: ".article .content img{max-width:100%!important}",
category: "nsfw1"
}, {
name: "MM5MM5美女图片M m.mm5mm5.com",
reg: /m\.mm5mm5\.com\/mm\/\d+/,
imgs: () => {
let max = fun.geT(".contentpage>span>i").match(/\/(\d+)/)[1];
let links = [];
links.push(location.href);
for (let i = 1; i < max; i++) {
links.push(location.href + "/" + i);
}
return fun.getImgA("div>a>img", links, 333);
},
button: [4],
insertImg: ["//div[a[img]]", 2],
customTitle: () => fun.geT(".content>h1"),
css: "union[id],.pag-ts,.contentpage{display:none!important}",
category: "nsfw1"
}, {
name: "可爱小图 www.keaitupian.com m.keaitupian.com",
reg: /(www|m)\.keaitupian\.com\/pic\/\d+\.html/,
imgs: () => {
try {
let max = fun.geT(".entry-title,.desk-tit>h1").match(/\/(\d+)/)[1];
let links = [];
links.push(siteUrl)
let url = siteUrl.replace(".html", "");
for (let i = 1; i < max; i++) {
links.push(url + "-" + i + ".html");
}
return fun.getImgA(".entry-content img,#content_pic img", links, 1000);
} catch (e) {
return [...fun.gae(".entry-content img,#content_pic img")];
}
},
button: [4],
insertImg: [".entry-content,#content_pic", 1],
customTitle: () => fun.geT(".entry-title,.desk-tit>h1").replace(/(\d+\/\d+)/, "").trim(),
category: "nsfw1"
}, {
name: "回车桌面 www.enterdesk.com m.enterdesk.com",
reg: /^https?:\/\/((m\.)?mm?\.|www\.|(m\.)?sj\.)enterdesk\.com\/\w+\/[0-9-]+\.html/,
include: ".arc_pandn .swiper-wrapper img,.marc_pandn .swiper-wrapper img,.arc_main_pic_img,#main_img",
imgs: () => [...fun.gae(".arc_pandn .swiper-wrapper img,.marc_pandn .swiper-wrapper img,.arc_main_pic_img,#main_img")].map(e => e.src.replace("_360_360", "")),
button: [4],
insertImg: [".arc_main_pic,.marc_img", 2],
autoDownload: [0],
next: "//a[div[text()='下一组']]|//div[@id='next_pics']",
prev: 1,
customTitle: () => fun.geT(".arc_location>a:last-child,.m_h1>a"),
css: ".marc_img img{min-height:unset!important}",
category: "nsfw1"
}, {
name: "女人吧 www.nvhai8.com m.nvhai8.com",
reg: /^https?:\/\/(www|m)\.nvhai8\.com\/body\/\d+\/\d+\.htm/,
init: () => {
fun.remove("//div[iframe] | //div[@class='hengfu2'] | //div[@onclick]");
document.body.removeAttribute("style");
},
imgs: () => {
try {
let max = fun.geT(".imgfooter>a").match(/\d+/)[0];
return fun.getImgA(".remark img,.ui-article-detail img", ".imgfooter>a[href]");
} catch (e) {
return [...fun.gae(".remark img,.ui-article-detail img")]
}
},
button: [4],
insertImg: [".remark,.ui-article-detail", 2],
autoDownload: [0],
next: "//label[contains(text(),'下一篇')]/preceding-sibling::a[1]",
prev: "//label[contains(text(),'上一篇')]/following-sibling::a[1]",
customTitle: () => fun.geT(".text_content>h1,.arc_location>a:last-child,.m_h1>a,h1"),
category: "nsfw1"
}, {
name: "3G 壁纸 https://www.3gbizhi.com/meinv",
reg: /(www|m|desk)\.3gbizhi\.com\/meinv\/(\w+\/)?\w+\.html/,
imgs: () => {
thumbnailsSrcArray = [...fun.gae(".swiper-slide>a>img")].map(e => e.src);
return fun.getImgA("#contpic,#mobile_c_img>img", ".swiper-slide:not(:first-child) a");
},
button: [4],
insertImg: ["#showimg", 1],
autoDownload: [0],
next: "a.next[href$=html]",
prev: "a.pver[href$=html]",
customTitle: () => fun.geT("h2.title,.titlew>h2"),
css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}.showcontw #showimg{height:auto!important}[class^=ad_id]{display:none!important}",
category: "nsfw1"
}, {
name: "亿图全景图库 https://www.yeitu.com/meinv/",
reg: /(www|m)\.yeitu\.com\/\w+\/\w+\/\w+\.html/,
imgs: () => {
let max = fun.geT(".imageset-sum,span.num").match(/\/\s?(\d+)/)[1];
let links = [];
links.push(siteUrl);
let url = siteUrl.replace(".html", "");
for (let i = 2; i <= max; i++) {
links.push(url + "_" + i + ".html");
}
return fun.getImgA(".img_box img[alt],.gallery-item img[alt],.article-show img", links, 333);
},
button: [4],
insertImg: [".img_box,.gallery-item,.article-show", 2],
customTitle: () => fun.geT("#title>h1,h1.article-title,.article-info>h1"),
css: ".appbox,.uk-page~section,.yt-pages+.mssp{display:none!important}",
category: "nsfw1"
}, {
name: "优美图库 https://www.umei.cc/meinvtupian/",
reg: /www\.umei\.cc\/meinvtupian\/\w+\/\d+\.htm/i,
imgs: () => {
let a = fun.ge(".pages li:last-child>a");
let max = a.href.match(/_(\d+).htm/)[1];
return fun.getImg(".big-pic img", max, 17);
},
button: [4],
insertImg: [".big-pic", 1],
autoDownload: [0],
next: ".preandnext:not(.connext)>a",
prev: ".preandnext.connext>a[href$=htm]",
customTitle: () => fun.geT("#photos>h1"),
css: ".photo img {max-width:100% !important}",
category: "nsfw1"
}, {
name: "优美图库M wap.umei.cc",
reg: /wap\.umei\.cc\/meinvtupian\/\w+\/\d+\.htm/i,
imgs: () => {
let max = fun.geT("a.noclick").match(/\/(\d+)/)[1];
return fun.getImg("#maincont img", max, 17);
},
button: [4],
insertImg: ["#maincont", 1],
autoDownload: [0],
next: () => {
let next = fun.ge("a.f-r.l3");
return next ? next.href : null;
},
prev: 1,
customTitle: () => fun.geT(".title>h1"),
css: "#maincont>div:not(#FullPictureLoadImgBox),dl:nth-child(n+1):nth-child(-n+2){display:none!important}",
category: "nsfw1"
}, {
name: "MEITU131 www.meitu131.net/nvshen/ www.meitu131.net/meinv/ www.meitu131.net/jigou/ m.meitu131.net",
reg: /(www|m)\.meitu131\.(com|net)\/(\w+\/)?meinv\/\d+\//,
imgs: () => {
let max = fun.geT("a[title],.uk-page>span").match(/\/(\d+)/)[1];
let links = [];
let url = location.href.replace(/index(\w+)?\.html$/, "");
for (let i = 1; i <= max; i++) {
i == 1 ? links.push(url + "index.html") : links.push(url + "index_" + i + ".html");
}
return fun.getImgA(".work-content img,.uk-article-bd img", links, 333);
//return fun.getImg(".work-content img,.uk-article-bd img", max, 15);
},
button: [4],
insertImg: [".work-content>p,.uk-article-bd", 1],
customTitle: () => fun.geT(".contitle-box>h1,h1.uk-article-title"),
css: ".appbox,.uk-page~section{display:none!important}.work-content img{max-width:100%!important}",
category: "nsfw1"
}, {
name: "晴空头像图库 www.qq7k.com",
reg: /www\.qq7k\.com\/\w+\/\w+\/\d+.html/i,
init: () => {
let a = fun.ge(".content a");
a.outerHTML = a.innerHTML;
},
imgs: () => {
let max = parseInt(qingtiancms_Details.Total, 10);
return max > 1 ? fun.getImg(".content img", max, 9) : [...fun.gae(".content img")];
},
button: [4],
insertImg: [".content", 1],
autoDownload: [0],
next: "//a[text()='上一篇']",
prev: 1,
customTitle: () => fun.geT(".contitle-box>h1"),
css: ".content img{cursor:unset!important;margin:0px auto!important;border:none!important}",
category: "nsfw1"
}, {
name: "晴空头像图库M m.qq7k.com",
reg: /m\.qq7k\.com\/\w+\/\w+\/\d+.html/i,
init: () => {
let a = fun.ge(".show-simg a");
a.outerHTML = a.innerHTML;
},
imgs: async () => {
await fun.getNP(".show-simg img", "#playnext[href*=_]", null, ".show-pages", 0, null, 0);
return [...fun.gae(".show-simg img")];
},
button: [4],
insertImg: [".show-simg", 1],
autoDownload: [0],
next: "#playpre",
prev: 1,
customTitle: () => fun.geT(".m-article>h1"),
css: "#bigImg{margin:0px!important}",
category: "nsfw1"
}, {
name: "930图片网 有分頁 www.930tu.com m.930tu.com",
reg: /(www|m)\.930tu\.com\/\w+\/\w+\/\d+.html$/i,
include: ".page a,a[title=Page]",
init: () => {
let a = fun.ge(".pic-main a,.pic-m a");
a.outerHTML = a.innerHTML;
},
imgs: () => {
let max = fun.ge("//a[text()='尾页']").href.match(/_(\d+)/)[1];
return fun.getImg(".pic-main img,.pic-m img", max, 9);
},
button: [4],
insertImg: [".pic-main,.pic-m", 1],
autoDownload: [0],
next: "//a[@class='pic-next']|//a[text()='下一组图']",
prev: "//a[@class='pic-prew']|//a[text()='上一组图']",
customTitle: () => fun.geT(".pic h1,.tit-m h1"),
css: ".pic .pic-main img{max-width:100%!important}",
category: "nsfw1"
}, {
name: "930图片网 無分頁 www.930tu.com m.930tu.com",
reg: /(www|m)\.930tu\.com\/\w+\/\w+\/\d+.html$/i,
include: "//p[img]",
imgs: ".pic-main img,.pic-m img",
button: [4],
insertImg: [
["//p[img]", 1, "//p[img]"], 1
],
autoDownload: [0],
next: "//a[@class='pic-next']|//a[text()='下一组图']",
prev: "//a[@class='pic-prew']|//a[text()='上一组图']",
customTitle: () => fun.geT(".pic h1,.tit-m h1"),
css: ".pic .pic-main img{max-width:100%!important}",
category: "nsfw1"
}, {
name: "爱美女 www.2meinv.com",
reg: /www\.2meinv\.com\/article.+\.html/,
imgs: () => {
let max = fun.geT(".des>h1,.post_title_topimg").match(/\/\s?(\d+)/)[1];
let links = [];
for (let i = 1; i <= max; i++) {
links.push(siteUrl.replace(/\.html$/, "") + "-" + i + ".html");
}
return fun.getImgA(".pp.hh img[alt],#image_div img", links, 200);
},
button: [4],
insertImg: [".pp.hh,.content", 1],
autoDownload: [0],
next: "//a[@class='active' and contains(text(),'下一篇')] | //a[@class='active' and contains(text(),'下一组')]",
prev: "//a[@class='active' and contains(text(),'上一篇')] | //a[@class='active' and contains(text(),'上一组')]",
css: ".pp img{max-width:100%!important}",
customTitle: () => fun.title("_", 1),
category: "nsfw1"
}, {
name: "爱美女M mm.2meinv.com",
reg: /mm\.2meinv\.com\/article-\d+\.html/,
imgs: () => {
let max = fun.geT(".article-page>*:last-child", 2);
let links = [];
for (let i = 1; i <= max; i++) {
links.push(siteUrl.replace(/\.html$/, "") + "-" + i + ".html");
}
return fun.getImgA(".arcmain img,#image_div img", links, 200);
},
button: [4],
insertImg: [".clearfix.arcmain,.content", 1],
autoDownload: [0],
next: "a.f-r.l3",
prev: "a.f-l.l2",
css: "body>a{display:none!important}",
customTitle: () => fun.title("_", 1),
category: "nsfw1"
}, {
name: "绅士猫 www.cos6.net",
reg: /www\.cos6\.net\/\d+\.html/,
exclude: ".tinymce-hide",
imgs: ".wp-posts-content img[data-src]",
button: [4],
insertImg: [".bialty-container", 2],
autoDownload: [0],
next: ".article-nav>div:first-child>a[href$=html]",
prev: ".article-nav>div:last-child>a[href$=html]",
customTitle: () => fun.geT("h1.article-title"),
category: "nsfw1"
}, {
name: "RedBust redbust.com",
reg: /redbust\.com\/[^\/]+\/$/,
include: ".entry-inner img",
imgs: () => {
thumbnailsSrcArray = [...fun.gae(".entry-inner img")].map(e => e.src);
//return fun.getImgA(".image-attachment img", ".gallery a");
return [...fun.gae(".entry-inner img")].map(img => {
let srcset = img.getAttribute("srcset");
if (srcset) {
let splitArr = srcset.split(",");
splitArr = splitArr.sort((a, b) => {
return a.match(/\s(\d+)w/)[1] - b.match(/\s(\d+)w/)[1];
});
return splitArr.pop().trim().split(" ")[0];
} else {
return img.src.replace(/-\d+x\d+\./, ".");
}
});
},
button: [4],
insertImg: [".entry-inner", 2],
autoDownload: [0],
next: ".previous>a",
prev: ".next>a",
customTitle: () => fun.geT("h1.post-title"),
category: "nsfw2"
}, {
name: "妞妞之家 niuniuhome.club",
reg: /niuniuhome\.club\/[^\/]+\/$/,
imgs: ".entry-content img",
button: [4],
insertImg: [".post-content", 2],
autoDownload: [0],
next: "a.post-nav-prev",
prev: "a.post-nav-next",
customTitle: () => fun.geT(".post-title"),
category: "nsfw1"
}, {
name: "PixiBB www.pixibb.com",
reg: /(htps?:\/\/www\.pixibb\.com\/$|https?:\/\/www\.pixibb\.com\/\?list=)/,
icon: 0,
key: 0,
openInNewTab: ".list-item-image a",
category: "nsfw1"
}, {
name: "PixiBB www.pixibb.com",
reg: /www\.pixibb\.com\/album\//,
imgs: () => {
thumbnailsSrcArray = [...fun.gae(".list-item-image img")].map(e => e.src).sort((a, b) => a.match(/---(\d+)\.md\./)[1] - b.match(/---(\d+)\.md\./)[1]);
return [...fun.gae(".list-item-image img")].map(e => e.src.replace(".md.", ".")).sort((a, b) => a.match(/---(\d+)/)[1] - b.match(/---(\d+)/)[1]);
},
button: [4],
insertImg: [
[".pad-content-listing", 2], 2
],
go: 1,
topButton: true,
customTitle: () => fun.title(" - PixiBB", 1),
category: "nsfw1"
}, {
name: "Luscious www.luscious.net",
reg: /https:\/\/www\.luscious\.net\/albums\//,
checkNextEle: () => {
let ele;
if (fun.ge(".o-pagination-item--active")) {
ele = fun.ge(".o-pagination-item--active+div:not(.o-btn)");
return ele;
} else if (fun.ge(".o-pagination-mobile-items")) {
ele = [...fun.gae(".o-pagination-mobile-button")].slice(-2).pop();
return [...ele.classList].pop() == "o-btn--disabled" ? null : ele;
}
},
init: async () => {
await fun.delay(2000);
let buttonArr = [
"//span[text()='Display Inline']/following-sibling::div[@class='o-toggle-wrapper']//div[@class='o-toggle-switch o-toggle-switch--on']",
"//span[text()='Infinite Scroll']/following-sibling::div[@class='o-toggle-wrapper']//div[@class='o-toggle-switch o-toggle-switch--on']"
];
for (let i in buttonArr) {
if (fun.ge(buttonArr[i])) {
fun.ge(buttonArr[i]).click();
await fun.delay(1000, 0);
}
}
let imgEle = "article.o-padding-top-bottom .o-justified-grid .o-justified-box img";
globalImgArray = [...fun.gae(imgEle)].map(e => e.src);
if (siteData.checkNextEle()) {
new MutationObserver(async (mutations, observer) => {
globalImgArray = [...new Set(globalImgArray.concat([...fun.gae(imgEle)].map(e => e.src)))];
console.log(globalImgArray);
let text = fun.geT(".album-info-item");
let num = parseInt(text.match(/((\d+,)?\d+)\s?pictures/)[1].replace(",", ""), 10);
console.log(text);
fun.show(`MutationObserver(${globalImgArray.length}/${num})`, 0);
if (globalImgArray.length >= num && !siteData.checkNextEle()) {
//fun.hide();
console.log("MutationObserver 抓取結束");
observer.disconnect();
}
}).observe(fun.ge("article.o-padding-top-bottom"), {
childList: true,
subtree: true
});
}
},
imgs: async () => {
if (siteData.checkNextEle()) {
fun.show(displayLanguage.str_14, 0);
await new Promise(async resolve => {
let loop = setInterval(async () => {
if (siteData.checkNextEle()) {
siteData.checkNextEle().click();
await fun.delay(1000, 0);
await fun.waitEle("article.o-padding-top-bottom .o-justified-grid .o-justified-box img");
} else {
fun.show(displayLanguage.str_15, 0);
clearInterval(loop);
resolve();
}
}, 2000);
});
}
fun.show(displayLanguage.str_56, 0);
let testBigSrcs = globalImgArray.map(e => {
let storageCloud = "https://storage.bhs.cloud.ovh.net/v1/AUTH_8d36ec6c0460400ca5d88d41cb6b9cd3/images/";
let url = e.replace(/\.\d+x\d+(\.\w+)$/, "$1");
let arr = url.split("/");
if (arr.length == 6) {
return storageCloud + arr.slice(3).join("/");
} else if (arr.length == 9) {
return storageCloud + arr.slice(6).join("/");
} else {
return null;
}
})
let xhrNum = 0;
let xhrArr = [];
for (let i = 0; i < testBigSrcs.length; i++) {
let xhr = fun.xhrHEAD(testBigSrcs[i]).then(async res => {
fun.show(`fun.xhrHEAD(${xhrNum+=1}/${testBigSrcs.length})`, 0);
if (res.status == 200) {
return testBigSrcs[i];
} else if (res.status == 404) {
let mp4Src = testBigSrcs[i].replace(/\.\w+$/i, ".mp4");
let mp4Res = await fun.xhrHEAD(mp4Src);
if (mp4Res.status == 200) {
videosSrcArray.push(mp4Src);
return null;
}
/*
await fun.delay(100);
let gifSrc = testBigSrcs[i].replace(/\.\w+$/i, ".gif");
let gifRes = await fun.xhrHEAD(gifSrc);
if (gifRes.status == 200) return gifSrc;
*/
await fun.delay(1000, 0);
let src = testBigSrcs[i].replace(/(\.\w+)$/i, ".1680x0$1");
let srcRes = await fun.xhrHEAD(src);
if (srcRes.status == 200) return src;
return null;
} else {
return null;
}
});
xhrArr.push(xhr);
await fun.delay(100);
}
let bigSrcs = await Promise.all(xhrArr).then(arr => arr.filter(item => item));
thumbnailsSrcArray = bigSrcs.map(e => /\.1680x0/.test(e) ? e.replace(".1680x0", ".315x0") : e.replace(/(\.\w+)$/i, ".315x0$1"));
return bigSrcs;
},
button: [4],
insertImg: ["article.o-padding-top-bottom", 2],
downloadVideo: true,
customTitle: () => fun.geT(".o-h1"),
css: "#modal-root{display:none!important;}",
category: "nsfw2"
}, {
name: "E次元 www.evacg.org",
reg: /www\.evacg\.org\/archives\/\d+/,
include: ".wp-caption img",
imgs: ".wp-caption img",
button: [4],
insertImg: [
[".inn-singular__post__body__content", 0, ".wp-caption"], 2
],
customTitle: () => fun.geT(".inn-singular__post__title"),
category: "nsfw1"
}, {
name: "3楼猫图库 pic.3loumao.org",
reg: /pic\.3loumao\.org\/[a-z-]+\/\d+\.html/i,
imgs: "article img",
button: [4],
insertImg: ["//p[img]", 2],
customTitle: () => fun.geT("h1"),
fancybox: {
v: 3,
insertLibrarys: 1
},
category: "nsfw1"
}, {
name: "Simply Cosplay www.simply-cosplay.com",
reg: /www\.simply-cosplay\.com\/gallery\//,
imgs: async () => {
fun.show(displayLanguage.str_04, 0);
await fun.waitEle(".swipe-area img", 600);
fun.hide();
return [...fun.gae(".swiper-slide img")].map(e => e.dataset.src.replace("small_square_", ""));
},
button: [4],
insertImg: ["//div[div[div[div[@class='image-wrapper']]]]", 2],
customTitle: async () => {
await fun.waitEle("h1.content-headline", 600);
return fun.geT('h1.content-headline');
},
fetch: 1,
css: ".gallery-view .row{display:block}",
category: "nsfw1"
}, {
name: "COSPLAY ZIP www.coszip.com coszip.com",
reg: /^https?:\/\/(www\.)?coszip\.com\/\d+\.html(#small-1)?$/,
init: () => {
if (/#small-1/.test(location.href)) location.href = location.href.replace("#small-1", "");
},
imgs: () => {
let max;
try {
max = fun.geT(".page_info").match(/\d+$/)[0];
} catch (e) {
max = 1;
}
return fun.getImg(".entry-content img", max, 7);
},
button: [4],
insertImg: [
[".entry-content", 0, "//p[img[@decoding]] | //figure[@class='wp-block-image'] | //div[contains(@class,'jeg_pagelinks')]"], 2
],
go: 1,
autoDownload: [0],
next: "a.prev-post",
prev: "a.next-post",
customTitle: () => fun.geT("h1.jeg_post_title"),
css: "pre{white-space:pre-wrap!important}",
category: "nsfw2"
}, {
name: "COSPLAY ZIP M www.coszip.com coszip.com",
reg: /^https:\/\/(www\.)?coszip\.com\/\d+\.html\?amp=1$/,
imgs: ".amp-wp-article-content amp-img",
button: [4],
insertImg: [
[".amp-wp-article-content", 0, "//p[amp-img] | //figure[@class='wp-block-image']"], 2
],
go: 1,
customTitle: () => fun.geT(".amp-wp-title"),
css: "pre{white-space:pre-wrap!important}",
category: "nsfw2"
}, {
name: "萝莉少女 cosporn.online",
reg: /cosporn\.online\/.+\//,
init: "setTimeout(()=>{fun.gae('.g1-nav-single a').forEach(e=>{e.removeAttribute('target')})},2000)",
include: ".g1-content-narrow",
imgs: () => {
thumbnailsSrcArray = [...fun.gae(".g1-content-narrow img:not([id])")].map(e => e.dataset.lazySrc ? e.dataset.lazySrc : e.src);
return [...fun.gae(".g1-content-narrow img:not([id])")].map(e => e.dataset.lazySrc ? e.dataset.lazySrc.replace(/\?w=\d+&ssl=1/, "") : e.src.replace(/\?w=\d+&ssl=1/, ""));
},
button: [4],
insertImg: [".g1-content-narrow", 2],
autoDownload: [0],
next: "#content .g1-teaser-prev",
prev: "#content .g1-teaser-next",
customTitle: () => fun.geT("h1.entry-title"),
css: "#simple-banner,.touchy-wrapper,.touchy-wrapper~*:not([id^='pv-']):not([class^='pv-']):not(.pagetual_tipsWords):not(#comicRead):not(#fab):not(.FullPictureLoadMsg):not(.FullPictureLoadFixedBtn):not(#FullPictureLoadOptions):not(*[class^=fancybox]),.code-block,#secondary{display:none!important}",
category: "hcomic"
}, {
name: "女神社 nshens.com inewgirl.com",
reg: /(nshens\.com|inewgirl\.com)\/\d+\/\d+\/\d+\/[^/]+$/,
exclude: ".justify-center>button>.v-btn__content",
delay: 800,
imgs: async () => {
fun.show(displayLanguage.str_05, 0);
let links = [];
let resArr = [];
let fetchNum = 0;
let max = fun.geT(".v-pagination li:last-child", 2);
links.push(location.href);
for (let i = 2; i <= max; i++) {
links.push(location.href + "/" + i);
}
for (let i = 0; i < links.length; i++) {
let res = fun.fetchDoc(links[i]).then(doc => {
fun.show(`${displayLanguage.str_06}${fetchNum+=1}/${links.length}`, 0);
let code = [...doc.scripts].find(s => s.innerHTML.search(/photoList/) > -1).innerHTML;
return fun.run(code.match(/photoList:([^\]]+\])/)[1]);
});
resArr.push(res);
}
let photourl = await Promise.all(resArr).then(data => {
fun.hide();
return data.flat().map(e => e.photourl);
});
if (photourl.length > [...new Set(photourl)].length) {
setTimeout(() => {
fun.show("VIP套圖需升級為VIP", 5000);
}, 1200)
}
return photourl;
},
button: [4],
insertImg: ["//div[a[div[@class='v-image v-responsive theme--light']]]", 2],
customTitle: () => fun.geT("h3"),
category: "nsfw2"
}, {
name: "女神社 nshens.com inewgirl.com lovens.cc",
reg: /(nshens\.com|inewgirl\.com)\/latestpost$/,
delay: 500,
icon: 0,
key: 0,
observerClick: "//button[span[text()='加載更多'] or span[text()='加载更多'] or span[text()='Load More'] or span[text()='Tải thêm']]",
category: "nsfw2"
}, {
name: "Chottie chottie.com", //很多都需要VIP,不然只會重複抓到第一頁的圖片
reg: /chottie\.com\/blog\/(\w{2}\/)?archives\/\d+$/,
exclude: ".justify-center>button>.v-btn__content",
delay: 800,
imgs: async () => {
fun.show(displayLanguage.str_05, 0);
let links = [];
let resArr = [];
let fetchNum = 0;
let max = fun.geT(".v-pagination li:last-child", 2);
links.push(location.href);
for (let i = 2; i <= max; i++) {
links.push(location.href + "/" + i);
}
for (let i = 0; i < links.length; i++) {
let res = fun.fetchDoc(links[i]).then(doc => {
fun.show(`${displayLanguage.str_06}${fetchNum+=1}/${links.length}`, 0);
let code, imgs;
try {
code = [...doc.scripts].find(s => s.innerHTML.search(/imgList/) > -1).innerHTML;
imgs = fun.run(code.match(/imgList:([^\]]+\])/)[1]);
} catch (e) {
code = [...doc.scripts].find(s => s.innerHTML.search(/snapshotList/) > -1).innerHTML;
imgs = fun.run(code.match(/snapshotList:([^\]]+\])/)[1]);
}
return imgs;
});
resArr.push(res);
}
let data = await Promise.all(resArr).then(data => {
fun.hide();
return data.flat();
});
if (data.length > [...new Set(data)].length) {
setTimeout(() => {
fun.show("VIP套圖需升級為VIP", 5000);
}, 1200)
}
return data;
},
button: [4],
insertImg: ["//div[a[div[@class='v-image v-responsive theme--light']]]", 2],
//css: ".text-center{display:none!important}",
customTitle: () => fun.geT("h3"),
category: "nsfw2"
}, {
name: "街角图片社 ijjiao.com",
reg: /https?:\/\/ijjiao\.com\/\d+\/\d+\/\d+\/album/,
include: ".v-pagination",
exclude: "//span[text()='加载更多']",
delay: 800,
imgs: async () => {
let max = fun.geT("//li[button[@aria-label='Next page']]", 2);
let links = [];
let url = siteUrl.replace(/\/\d+$/, "");
links.push(url);
for (let i = 2; i <= max; i++) {
links.push(url + "/" + i)
}
fun.show(displayLanguage.str_07, 0);
let check = await fun.fetchDoc(links[1]).then(doc => {
let code = [...doc.scripts].find(s => s.innerHTML.search(/photoList/) > -1).innerHTML;
let photoList = fun.run(code.match(/photoList:([^\]]+\])/)[1]);
return photoList.length < 1 ? false : true;
});
if (check) {
fun.show(displayLanguage.str_05, 0);
let resArr = [];
let fetchNum = 0;
for (let i = 0; i < links.length; i++) {
let res = fun.fetchDoc(links[i]).then(doc => {
fun.show(`${displayLanguage.str_06}${fetchNum+=1}/${links.length}`, 0);
let code = [...doc.scripts].find(s => s.innerHTML.search(/photoList/) > -1).innerHTML;
let photoList = fun.run(code.match(/photoList:([^\]]+\])/)[1]);
return photoList;
});
resArr.push(res);
}
return Promise.all(resArr).then(data => {
fun.hide();
return data.flat().map(e => e.photourl);
});
} else {
fun.hide();
alert("登錄狀態已失效!請手動點擊第2頁,觸發密碼輸入框重新登錄。");
return [];
}
},
button: [4],
insertImg: ["//div[div[@class='image-item']]", 2],
customTitle: () => fun.geT("h3"),
category: "nsfw1"
}, {
name: "美妹妹 www.meimeimei.org",
reg: /www\.meimeimei\.org\/\d+\/\d+\/$|www\.meimeimei\.org\/\d+\/\d+\/\d+\.html/,
imgs: () => {
let max = fun.geT(".chapterpage>a:last-child", 2);
let links = [];
if (/\.html/.test(siteUrl)) {
let url = fun.ge(".pageCurr").href.replace("_1.html", "");
for (let i = 1; i <= max; i++) {
links.push(url + "_" + i + ".html");
}
} else {
let url = fun.ge(".pageCurr").href.replace("1.html", "");
for (let i = 1; i <= max; i++) {
links.push(url + i + ".html");
}
}
return fun.getImgA(".img>img", links, 100);
},
button: [4],
insertImg: [".txt_tcontent", 1],
autoDownload: [0],
next: "//div[contains(text(),'上一篇')]/a[not(@href='#')]",
prev: "//div[contains(text(),'下一篇')]/a[not(@href='#')]",
customTitle: () => fun.geT(".bread>li:last-child>a"),
category: "nsfw1"
}, {
name: "爱死美女图片站 www.24tupian.org",
reg: /^https?:\/\/www\.24tupian\.org\/\w+\/\d+\/\d+\/\d+\.html$/,
include: "img[data-original*='imgs.diercun.com']",
imgs: async () => {
await new Promise(async resolve => {
fun.show(displayLanguage.str_08, 0);
for (let i = 1; i <= 100; i++) {
if (fun.ge("//div[@class='moremsg'][contains(text(),'没有更多图片了')]")) {
fun.hide();
resolve();
break;
}
let ele = fun.ge(".mores>a");
if (ele) ele.click();
await fun.delay(200);
}
});
/*
if (options.fancybox == 1) {
fun.show("預覽縮圖轉DataURL中...", 0);
thumbnailsSrcArray = [...fun.gae("#piclist img[data-original]")].map(e => fun.xhr(e.dataset.original, "blob").then(blob => fun.blobToDataURL(blob)));
thumbnailsSrcArray = await Promise.all(thumbnailsSrcArray).then(arr => {
fun.hide();
return arr;
});
}
*/
thumbnailsSrcArray = [...fun.gae("#piclist img[data-original]")].map(e => e.dataset.original);
return [...fun.gae("#piclist img[data-original]")].map(e => {
let arr = e.dataset.original.split("/");
arr[2] = arr[2].replace("imgs.diercun.com", "big.diercun.com");
arr[arr.length - 1] = arr[arr.length - 1].replace(/^m/, "");
let bigSrc = arr.join("/");
return bigSrc;
});
},
button: [4],
insertImg: [
[".mores", 2], 2
],
go: 1,
topButton: true,
threading: 12,
customTitle: () => fun.geT(".gtitle1>h1"),
css: "body>.mask{display:none!important}",
category: "nsfw1"
}, {
name: "爱死cos美女图片站 www.24cos.org www.lovecos.net",
reg: /(www\.24cos\.org|www\.lovecos\.net)\/\w+\/\d+\.html$/,
imgs: async () => {
let pages = [...fun.gae(".page>a")];
let liImgs = [...fun.gae(".mtp>li")];
if (pages.length > 0 && liImgs.length < 21) {
fun.show(displayLanguage.str_08, 0);
for (let i = 0; i < pages.length; i++) {
await fun.fetchDoc(pages[i].href).then(doc => {
[...fun.gae(".mtp>li", doc)].forEach(ele => {
fun.ge(".mtp").appendChild(ele);
});
});
}
fun.hide();
}
/*
if (options.fancybox == 1) {
fun.show("預覽縮圖轉DataURL中...", 0);
thumbnailsSrcArray = [...fun.gae(".mtp img")].map(e => fun.xhr(decodeURI(e.src), "blob").then(blob => fun.blobToDataURL(blob)));
thumbnailsSrcArray = await Promise.all(thumbnailsSrcArray).then(arr => {
fun.hide();
return arr;
});
debug("\n爱死cos美女图片站 thumbnailsSrcArray", thumbnailsSrcArray)
}
*/
thumbnailsSrcArray = [...fun.gae(".mtp img")].map(e => decodeURI(e.src));
return [...fun.gae(".mtp img")].map(e => decodeURI(e.src.replace("/m", "/")));
},
insertImg: [
[".mtp", 2], 2
],
go: 1,
topButton: true,
threading: 5,
customTitle: () => fun.geT(".tmsg>h1"),
category: "nsfw1"
}, {
name: "Huamao wallpaper 花猫壁纸 en.huamaobizhi.com",
reg: /https?:\/\/[a-z]{2}\.huamaobizhi\.com\/mix\/\d+/,
init: () => {
let load = fun.ge(".load-more-photos");
if (load) load.remove();
},
imgs: async () => {
await fun.getNP(".images-card", "//a[text()='Next' or text()='下一页' or text()='次へ']");
thumbnailsSrcArray = [...fun.gae(".images-card img")].map(e => e.dataset.src ? e.dataset.src : e.src);
let endTid = setTimeout(() => {});
for (let i = 0; i <= endTid; i++) {
clearTimeout(i);
}
fun.show(displayLanguage.str_05, 0);
let fetchNum = 0;
const resBlobUrl = (id) => {
return fetch(`https://${location.host}/normal-download/`, {
"headers": {
"accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
"content-type": "application/x-www-form-urlencoded"
},
"body": `wallpaperId=${id}`,
"method": "POST"
}).then(res => res.blob()).then(blob => {
fun.show(`${displayLanguage.str_06}${fetchNum+=1}/${IDs.length}`, 0);
return URL.createObjectURL(blob);
});
};
let IDs = [...fun.gae("span[data-imgid]")].map(e => e.dataset.imgid);
let bigImgsArr = [];
for (let i = 0; i < IDs.length; i++) {
bigImgsArr.push(resBlobUrl(IDs[i]));
await fun.delay(1500, 0);
}
return Promise.all(bigImgsArr).then(arr => {
fun.hide();
return arr;
});;
},
ex: "jpg",
button: [4],
insertImg: [
["#main", 2], 0
],
go: 1,
customTitle: () => fun.geT(".title>h1"),
fetch: 1,
category: "nsfw1"
}, {
name: "Huamao wallpaper 花猫壁纸 en.huamaobizhi.com 分類自動翻頁",
enable: 1,
reg: /^https:\/\/[a-z]{2}\.huamaobizhi\.com\/(mixs|tags|artists|people-tags)\/\?/,
autoPager: {
ele: "//div[@class='row'][div[div[@class='mixs-card']]] | //div[@class='table-responsive table-sm-no-border'] | //div[div[div[@class='thumbnail']]] | //div[@class='tags-wrap']",
next: ".pagination li.active+li>a",
re: ".pagination",
title: () => "Page " + fun.ge(".pagination li.active", doc).innerText,
bF: () => {
[...fun.gae(".mixs-card-img:not(.lock)", doc)].forEach(e => {
let url = e.attributes[1].value.replaceAll("'", "");
e.outerHTML = `<div class="mixs-card-img" data-src="${url}" lazy="loaded" style="background-image: url("${url}");"></div>`;
});
[...fun.gae(".thumbnail .img-circle[v-lazy]", doc)].forEach(e => {
let url = e.getAttribute("v-lazy").replaceAll("'", "");
e.outerHTML = `<img src="${url}" alt="${e.alt}" class="img-circle" data-src="${url}" lazy="loaded">`;
});
[...fun.gae(".tags-item img[v-lazy]", doc)].forEach(e => {
let url = e.getAttribute("v-lazy").replaceAll("'", "");
e.outerHTML = `<img src="${url}" alt="${e.alt}" data-src="${url}" lazy="loaded">`;
});
}
},
openInNewTab: ".mixs-card-content>a:not([target=_blank])",
category: "autoPager"
}, {
name: "新美图录 www.xinmeitulu.com 臺灣美腿女郎 www.twlegs.com",
reg: /(www\.xinmeitulu\.com|www\.twlegs\.com)\/photo\/.+/,
imgs: "img[data-original]",
button: [4],
insertImg: [".text-center", 2],
customTitle: () => fun.geT("h1.h3"),
category: "nsfw1"
}, {
name: "美图录 meitulu.me",
reg: /meitulu\.me\/item\/\d+\.html/,
imgs: () => fun.getImg(".mb-4>img[alt]", fun.geT(".pagination>li:last-child", 2), 9),
button: [4],
insertImg: [".mb-4", 1],
customTitle: () => fun.geT(".top-title"),
category: "nsfw1"
}, {
name: "jk-coser www.jk-coser.com",
reg: /www.\jk-coser\.com\/m\d\/\d+\.html/,
imgs: ".image_div img",
button: [4],
insertImg: [".image_div", 2],
autoDownload: [0],
next: ".article-nav-prev a,.nav-links .next",
prev: 1,
customTitle: () => fun.geT(".item_title>h1").replace(/\/?\(\d+P\)/i, "").trim(),
css: ".content_left img{cursor:unset}",
category: "nsfw1"
}, {
name: "赞MM www.zanmm.com 恩图集 www.entuji.com",
reg: /www\.zanmm\.com\/tupian\/\d+\.html|www\.entuji\.com\/\w+\/\d+\.html/,
imgs: () => {
let max = fun.geT("//p[contains(text(),'图片数量')]").match(/\d+/)[0];
return fun.getImg("#showimg img", max, 9);
},
button: [4],
insertImg: ["#showimg", 2],
customTitle: () => fun.geT(".weizhi h1"),
css: "@media only screen and (max-width:3840px){.content img{max-width:100%!important}}",
category: "nsfw1"
}, {
name: "秀窝 www.xiuwo.net RMM吧 rmm8.com",
reg: /(www\.xiuwo\.net|rmm8\.com)\/tu\/\d+\.html/,
imgs: () => {
let max;
try {
max = fun.geT(".c_l>p:nth-child(3)").match(/\d+/)[0];
} catch (e) {
max = 1;
}
return fun.getImg('#showimg img', max, 9);
},
button: [4],
insertImg: ["#showimg", 2],
customTitle: () => fun.geT(".weizhi h1"),
css: "@media only screen and (max-width:3840px){.content img{max-width:100%!important}}",
category: "nsfw1"
}, {
name: "妹妹图 mm.tvv.tw",
reg: /mm\.tvv\.tw\/archives\/\d+\.html/,
imgs: ".img-responsive",
button: [4],
insertImg: ["//p[img]", 2],
customTitle: () => fun.geT(".blog-details-headline"),
category: "nsfw1"
}, {
name: "小姐姐 www.nvsheng.cc",
reg: /nvsheng\.cc\/\w+\/\d+\.html/,
imgs: () => fun.getImg(".info-imtg-box>img[alt]", fun.geT(".pagebar>*:last-child", 3)),
button: [4],
insertImg: [".info-imtg-box", 1],
autoDownload: [0],
next: "//a[p[text()='上一篇']]",
prev: "//a[p[text()='下一篇']]",
customTitle: () => fun.title("-", 1),
//threading: 4,
category: "nsfw1"
}, {
name: "洛秀网 loxiu.com",
reg: /loxiu\.com\/post\/\d+\.html/,
imgs: () => fun.getImg(".info-imtg-box>img[alt]", fun.geT(".pagebar>*:last-child", 3)),
button: [4],
insertImg: [".info-imtg-box", 1],
autoDownload: [0],
next: "//a[p[text()='上一篇']]",
prev: "//a[p[text()='下一篇']]",
customTitle: () => fun.geT(".info-title>h1"),
category: "nsfw1"
}, {
name: "遛无写真 www.6evu.com KP写真 www.6kpo.com 美女云图网 www.c0h.net tck天天番号 www.3tck.com 4tck番号库 www.4tck.com 5tck天天番号 www.5tck.com 6K美女 www.6tck.com 7tck番号网 www.7tck.com 1凸5宅男福利 www.1tu5.com 有脾气美图 www.1plq.com 极品番号社 www.wsqap.com",
reg: /(www\.6evu\.com|www\.6kpo\.com|www\.c0h\.net|www\.\dtck\.com|www\.1tu5\.com|www\.1plq\.com|www\.wsqap\.com)\/\d+\.html/,
imgs: () => {
let arr = [];
arr.push(siteUrl);
[...fun.gae(".pagelist a,.pagination a,.article-paging a")].forEach(a => {
arr.push(a.href);
});
let links = [...new Set(arr)];
return fun.getImgA("#post_content img,.article-content img,.entry-content img", links);
},
button: [4],
insertImg: ["#post_content,.article-content,.entry-content", 2],
autoDownload: [0],
next: "a[rel=prev],.article-nav-prev a",
prev: "a[rel=next],.article-nav-next a",
customTitle: () => fun.geT("h1").replace(/\(\d+P\)/i, "").replace(/高品质壁纸图片传疯了|无圣光壁纸图片免费在线|无圣光私房写真良心推荐|超高清私家拍摄作品珍藏版|超高清私房照片在线浏览|无圣光写真作品流出|无水印壁纸图片良心推荐|无水印绝版网图在线浏览|无水印私房照片珍藏版|无水印私房照片个人分享/g, "").trim(),
css: ".article_container{padding:10px 0px!important}#post_content{padding:0px!important}@media only screen and (max-width:640px){.container{max-width:100% !important}}",
category: "nsfw1"
}, {
name: "原创妹子图/尤物私房图/极品美女图/免费私房图/私房网红图/尤物妹妹图 www.ycmzt.com/www.ywsft.com/www.jpmnt.com/www.mfsft.com/www.sfwht.com/www.ywmmt.com",
reg: /www\.(ywmmt|mnwht|ycmeinv|yhsft|yhmnt|mfsft|jpsft|akxzt|flwht|threnti|ywnmt|ztmeinv|mstaotu|tstaotu|ywmtw|mgtaotu|prmzt|xrtaotu|jjtaotu|prmeinv|axtaotu|mgmeinv|xsmeinv|ugtaotu|msmeinv|flxzw|axmeinv|swtaotu|hjtaotu|nsxzw|ugmeinv|hytaotu|xrmeinv|zfmeinv|jpmnt|zttaotu|mfmzt|ykmeinv|qjtaotu|pmtaotu|ddtaotu|plxzw|mfxzt|mtgqt|fltuku|yhtuku|ycmeitu|mttuku|xhtuku|qjtuku|jpflt|ycwht|yctuk|akywt|ywtuk|jctuk|xstuk|xgtuk|mztuk|xztuk|sytuk|gcxzt|tsxzt|gqxzt|mfnmt|spxzt|yhxzt|mtxzt|nsxzt|jdxzt|spmeitu|jpmzw|yhmeitu|mzmeitu|qpmzt|flsft|ywsft|wkmzt|snmzt|thmzt|brtaotu|aimzt|qtmzt|mtmnt|jrmzt|yztaotu|jrmeinv|xsmzt|zbtaotu|yhmnw|zbmzt|xjjtaotu|jpnst|ywmeitu|jrmnt|ftmeinv|xjjmzt|smtaotu|mtywt|sfsnt|jdtaotu|xgyouwu|ywmzt|xgywt|mtflt|nmtaotu|mtmnw|flmeitu|gqtaot|plmeitu|zpmzt|mtmzt|mtwht|sfwht|gqsft|yhmeinv|jdmnt|yctaotu|wkrenti|yzrenti|mtsyt|sptaotu|mttaotu|wsgtu|ywtaotu|sfmzt|sftaotu|gcmeinv|nstaotu|xhtaotu|jdwht|mtmeinv|gqwht|jpywt|jcwht|tptaotu|spyouwu|xgmeitu|nsmeitu|jstaotu|yhtaotu|sytaotu|nsxiez|swmzt|jpmzt|yhflt|sfywt|ywxzt|plmzt|sfmtw|jpyouwu|sfxzt|zftaotu|ycmzt|whtaotu|jpxzt|sftuku|plwht|symzt|sfmnt|sfnmt|jcmeinv|tsmnt|jjmeinv|wsgmzt|gqnmt)\.com\/[a-z]+\/[a-z]+\/\d+\/\d+\.html$/,
include: "#picg",
init: () => {
[...fun.gae(".b a")].forEach(a => {
a.removeAttribute("target");
});
[...fun.gae("#picg a")].forEach(a => {
a.outerHTML = a.innerHTML;
});
fun.remove("iframe", 2000);
},
imgs: async () => {
let max = fun.geT(".pagelist font~*:last-child", 2);
let links = [];
links.push(siteUrl.replace(/(_\d+)?\.html$/, "") + ".html");
let imgsArr = [];
for (let i = 2; i <= max; i++) {
links.push(siteUrl.replace(/(_\d+)?\.html$/, "") + `_${i}.html`);
}
for (let i = 0; i < links.length; i++) {
let doc = await new Promise(async resolve => {
for (let check = 1; check <= 100; check++) {
let res = await fetch(links[i]);
if (res.status == 304 || res.status == 200) {
let buffer = await res.arrayBuffer();
let decoder = new TextDecoder(document.characterSet || document.charset || document.inputEncoding);
let htmlText = decoder.decode(buffer);
let doc = fun.doc(htmlText);
resolve(doc);
break;
} else {
fun.show(`第${parseInt(i, 10) + 1}頁${res.status}重試第${check}次`, 2900);
await fun.delay(3000, 0);
}
}
});
let imgs = [...fun.gae("#picg img[alt]", doc)];
let te = [...fun.gae("#picg img[alt]")].pop();
imgs.forEach(e => {
imgsArr.push(e.cloneNode(true));
if (i != 0) te.parentNode.insertBefore(e.cloneNode(true), te.nextSibling);
});
if (i != 0) {
let ne = [...fun.gae("h1,.page .pagelist")];
let re = [...fun.gae("h1,.page .pagelist", doc)];
if (ne.length == re.length) {
for (let i in ne) {
ne[i].outerHTML = re[i].outerHTML;
}
}
}
await fun.delay(200, 0);
}
return imgsArr;
},
button: [4],
insertImg: ["#picg", 2],
autoDownload: [0],
next: "//div[@class='b' and contains(text(),'上一')]/a",
prev: "//div[@class='b' and contains(text(),'下一')]/a",
customTitle: () => fun.geT("h1").replace(/\/(\d+P)?|\||第\d+页/gi, "").trim(),
topButton: true,
fancybox: {
v: 3,
insertLibrarys: 1
},
css: "#imgc img{margin:0px auto!important}#picg{max-width: 1110px!important;margin: 0 auto;}#picg img:hover{transform:none !important}#picg img{filter:blur(0px)!important}body>br,#apic,#bzs7,.interestline+center,center+#pic,#d4a,#divone,#xzpap1,#divpsgx,#bdivpx,#divfts,#divftsp,#app+div,#xzappsq,div.bg-text,#divpsg,#divStayTopright2,#bdssy,#qrcode2>.erweima-text,#qrcode2>center,#qrcode2>center+div,#d5tig,#pcapicb,#google_translate_element,#d5a>*:not([id]):not([class]),.slide>a+div,.slide>img+div,#xtjpp,.interestline+.nav~*:not([id^='pv-']):not([class^='pv-']):not(.pagetual_tipsWords):not(#comicRead):not(#fab):not(.FullPictureLoadMsg):not(.FullPictureLoadFixedBtn):not(#FullPictureLoadOptions):not(*[class^=fancybox]){display:none !important}",
category: "nsfw2"
}, {
name: "魅狸图片网 www.rosi8.com 美女私房照 www.sfjpg.com 看妹图 www.kanmeitu.net www.kanmeitu1.cc kanmeitu.net kanmeitu1.cc",
reg: /(www\.rosi8\.\w+|www\.sfjpg\.com|www\.sfjpg\.net|kanmeitu\.net|kanmeitu1\.cc)\/\w+\/\d+\.html$/,
init: () => {
[...fun.gae(".b a")].forEach(a => {
a.removeAttribute("target");
});
[...fun.gae("#picg a")].forEach(a => {
a.outerHTML = a.innerHTML;
});
},
imgs: () => {
let max = fun.geT(".pagelist span,.pagelist a[title=Page]").match(/\/(\d+)/)[1];
return fun.getImgO("#picg img", max, 9, [null, null], 200, ".page .pagelist", 0);
},
button: [4],
insertImg: ["#picg", 2],
autoDownload: [0],
next: "//div[@class='b' and contains(text(),'上一')]/a",
prev: "//div[@class='b' and contains(text(),'下一')]/a",
customTitle: () => fun.geT("h1").replace(/\/(\d+P)?/i, ""),
topButton: true,
fancybox: {
v: 3,
insertLibrarys: 1
},
css: "#imgc img{margin:0px auto!important}#picg{max-width: 1110px!important;margin: 0 auto;}#picg img:hover{transform:none !important}#picg img{filter:blur(0px)!important}body>br,.interestline+center,center+#pic,#xzpap1,#divpsgx,#bdivpx,#divfts,#divftsp,#app+div,#xzappsq,div.bg-text,#divpsg,#divStayTopright2,#bdssy,#qrcode2>center,#d5tig,#pcapicb,#pcapic,#google_translate_element,#d5a>*:not([id]):not([class]),union[id]{display:none !important}",
category: "nsfw2"
}, {
name: "爱妹子 xx.knit.bid",
reg: /xx\.knit\.bid\/article\/\d+\//,
init: () => {
fun.clearAllTimer(2);
},
imgs: () => fun.getImg(".item-image img", (fun.geT("li.next-page", 2) || 1)),
button: [4],
insertImg: ["#img-box", 2],
customTitle: () => fun.geT(".focusbox-title").replace(/\[\d+P\]/i, "").replace(/\d+P/i, "").trim(),
css: "a{white-space:unset!important}",
category: "nsfw1"
}, {
name: "爱妹子 xx.knit.bid 反反廣告提示",
reg: /xx\.knit\.bid\//,
icon: 0,
key: 0,
init: () => {
fun.clearAllTimer(2);
},
openInNewTab: ".excerpts-wrapper a:not([target=_blank])",
category: "nsfw1"
}, {
name: "美女写真 portrait.knit.bid",
reg: /portrait\.knit\.bid\/\w+\/\d+$/,
imgs: async () => {
let max = fun.geT("//li[a[text()='下页']]", 2);
let links = [];
for (let i = 1; i <= max; i++) {
links.push(siteUrl + "?page=" + i);
}
return fun.getImgA(".container>.container>img", links, 300);
},
button: [4],
insertImg: [
[".container>.container>nav", 2, "nav[aria-label=pagination],.img-fluid"], 2
],
customTitle: () => fun.geT(".container h1"),
category: "nsfw1"
}, {
name: "萌图社 www.446m.com 446m.com",
reg: /https?:\/\/(www\.)?446m\.com\/index\.php\/\w+\/\d+\.html/,
imgs: ".post-item .img",
button: [4],
insertImg: [".post-content", 2],
customTitle: () => document.title.slice(0, -6),
fancybox: {
v: 3,
css: false
},
category: "nsfw1"
}, {
name: "妹妹美 mmm.red",
reg: /(www\.)?mmm\.red\/art\/\d+$/,
exclude: ".login-tip",
imgs: "div[data-fancybox][data-src]",
autoDownload: [0],
next: "//div[text()='上一篇']/following-sibling::a",
prev: "//div[text()='下一篇']/following-sibling::a",
customTitle: () => fun.geT(".post-info-text"),
category: "nsfw1"
}, {
name: "胴体的诱惑 dongti.blog.2nt.com",
reg: /dongti\.blog\.2nt\.com\/blog-entry-\d+.html/,
imgs: ".inner-contents img",
button: [4],
insertImg: [".entry-content", 2],
autoDownload: [0],
next: "//a[div[@class='pager_entry-box next-justify']]",
prev: "//a[div[@class='pager_entry-image-prev']]",
customTitle: () => fun.geT("#entry-title").replace(/\[\d+P-[\d\.]+MB?\]/i, "").trim(),
category: "nsfw1"
}, {
name: "好圖屋 www.haotuwu.com m.haotuwu.com",
reg: /(www|m)\.haotuwu\.com\/\w+\/\d+(\/page\/\d+)?(\.html)?$/,
include: ".suoyou",
init: () => {
let url = location.href;
if (/\/page\/\d+/.test(url)) {
location.href = url.replace(/\/page\/\d+/, "");
}
},
imgs: () => {
let links = [];
links.push(location.href);
let url = location.href.replace(".html", "");
let max = fun.geT(".suoyou").match(/\d+\/(\d+)/)[1];
for (let i = 2; i <= max; i++) {
links.push(url + "/page/" + i + ".html");
}
return fun.getImgA("#showimg img,.img-box img", links);
},
button: [4],
insertImg: ["#showimg,.img-box", 2],
autoDownload: [0],
next: "//div[contains(text(),'上一篇')]/a | //span[contains(text(),'上一篇')]/following-sibling::a[1]",
prev: "//div[contains(text(),'下一篇')]/a | //span[contains(text(),'下一篇')]/following-sibling::a[1]",
customTitle: () => fun.geT(".showtitle>h2,.imgTitle-name"),
css: "#imgshow .flow-box:nth-child(n+1):nth-child(-n+2){display:none!important}",
category: "nsfw1"
}, {
name: "秀色女神 www.xsnvshen.co",
reg: /www\.xsnvshen\.(co|com)\/album\/\d+/,
imgs: () => {
thumbnailsSrcArray = [...fun.gae("img[id^='imglist'][data-original]")].map(e => e.dataset.original);
return [...fun.gae("img[id^='imglist'][data-original]")].map(e => e.dataset.original.replace("thumb_600x900/", ""));
},
button: [4],
insertImg: ["//li[img[@id='bigImg']]", 2],
customTitle: () => fun.geT("h1"),
css: ".workShow li img{max-width:100%!important}",
category: "nsfw1"
}, {
name: "秀色女神M https://m.xsnvshen.co/album/39844",
reg: /m\.xsnvshen\.(co|com)\/album\/\d+/,
imgs: async () => {
let max = fun.geT(".pg_current").match(/\d+$/)[0];
thumbnailsSrcArray = await fun.getImg("#arcbox img.lazy", max, 6);
return thumbnailsSrcArray.map(e => e.replace("thumb_600x900/", ""));
},
button: [4],
insertImg: [
["#arcbox", 0, "//div[@id='arcbox']/p[img]"], 2
],
customTitle: () => fun.geT("h1>a"),
css: "#arcbox img{max-width:100%!important;margin:10px auto!important;min-height:50px!important;min-width:50px!important}",
category: "nsfw1"
}, {
name: "秀色女神news www.xsnvshen.co m.xsnvshen.co",
reg: /https:\/\/(www|m)\.xsnvshen\.co\/news\/\d+/,
imgs: "#arcbox img",
button: [4],
insertImg: [
["#arcbox>*:first-child", 1, "//p[img]"], 2
],
customTitle: () => fun.geT("h1"),
css: "#arcbox img{max-width:100%!important;margin:auto!important;min-height:50px!important;min-width:50px!important}",
category: "nsfw1"
}, {
name: "HotAsiaGirl hotgirl.asia 分頁模式",
reg: /hotgirl\.asia\/.+\//,
include: ".galeria_img",
imgs: () => fun.getImgA(".galeria_img>img", ".pagination a[href]"),
button: [4],
insertImg: [".mx-auto", 1],
customTitle: () => fun.geT("h3"),
css: ".galeria_img{display:none!important}",
category: "nsfw2"
}, {
name: "HotAsiaGirl hotgirl.asia 幻燈片模式",
reg: /hotgirl\.asia\/.+\//,
include: "#carouselImageIndicators",
imgs: "#carouselImageIndicators img",
button: [4],
insertImg: [".mx-auto", 2],
customTitle: () => fun.geT("h3"),
css: ".galeria_img{display:none!important}",
category: "nsfw2"
}, {
name: "HotGirl World www.hotgirl.world",
reg: /https:\/\/www\.hotgirl\.world\/g\/\w+\.html\//,
imgs: () => {
let max = fun.geT(".pagination__total");
return fun.getImg(".article__image-list img", max);
},
button: [4],
insertImg: [".article__image-list", 2],
go: 1,
customTitle: () => fun.geT(".article-header__title"),
fancybox: {
v: 3,
css: false
},
category: "nsfw1"
}, {
name: "BeautyLeg www.beautyleg6.com",
reg: /www\.beautyleg6\.com\/\w+\/\d+\/\d+\.html/i,
imgs: () => {
let max;
try {
max = fun.geT(".page a").match(/\d+/)[0];
} catch (e) {
max = 1;
}
return fun.getImg(".contents img[alt]", max, 9);
},
button: [4],
insertImg: [".contents", 2],
autoDownload: [0],
next: ".pre>a",
prev: ".next>a",
customTitle: () => fun.geT(".content>h1").replace(/\[\d+P\/\d+M\]/i, ""),
css: ".content .contents img{max-width:100%!important}",
category: "nsfw1"
}, {
name: "BeautyLegM m.beautyleg6.com",
reg: /m\.beautyleg6\.com\/view\.php\?aid=\d+/,
imgs: async () => {
let links = [];
links.push(location.href);
for (let i = 2; i <= totalpage; i++) {
links.push(location.href + "&pageno=" + i);
}
await fun.getEle(links, "#bigImg", ".show-simg", ".show-pages");
return [...fun.gae("#bigImg")];
},
button: [4],
insertImg: [".show-simg", 2],
autoDownload: [0],
next: () => {
let next = fun.ge("a.f-r.l3");
return next ? next.href : null;
},
prev: 1,
customTitle: () => fun.geT(".showcontbt>h1").replace(/\s?\(\d+\/\d+\)/, ""),
category: "nsfw1"
}, {
name: "Asianude4u www.asianude4u.net",
reg: /www\.asianude4u\.net\/.+\/.+\/(#small-1)?$/,
exclude: "//a[@rel='category tag' and text()='Videos' or text()='Madonna-AV']",
imgs: () => fun.ge(".wp-block-image a[href*=attachment_id]") ? [...fun.gae(".wp-block-image img[data-id]")] : [...fun.gae(".wp-block-image>a,.mgl-img-container>a,.gallery a")].map(e => e.href),
button: [4],
//insertImg: ["//li[img[@id='bigImg']]", 1],
insertImg: [
["div.entry>*:last-child", 2], 2
],
go: 1,
customTitle: () => fun.geT("h1.entry-title"),
css: ".single-box,.entry-img-300{display:none!important}@media only screen and (max-width:409px){.entry{width:100%!important}}button.rmp_menu_trigger{z-index:100!important}",
category: "nsfw1"
}, {
name: "Chinese Beauties sxchinesegirlz.one sxchinesegirlz01.xyz",
reg: /sxchinesegirlz(\d+)?\.\w+\/\d+\/\d+\/\d+\/.+\/$/,
imgs: () => fun.getImg(".wp-block-image img", fun.geT(".pagination>*:last-child", 2), 4),
button: [4],
insertImg: [".thecontent", 1],
customTitle: () => fun.geT("h1.entry-title"),
category: "nsfw2"
}, {
name: "爱看 INS www.ikanins.com",
reg: /www\.ikanins\.com\/[\w-]+\//,
imgs: "img[srcset]",
button: [4],
insertImg: [
[".entry-content", 0, "//p[img]"], 2
],
go: 1,
autoDownload: [0],
next: "a[rel=prev]",
prev: "a[rel=next]",
customTitle: () => fun.geT(".entry-title").replace(/\s?\d+P\s?$/i, "").trim(),
category: "nsfw1"
}, {
name: "Dmmtu 美女图 www.dmmtu.com",
reg: /www\.dmmtu\.com\/\w+\/\d+\.html/,
imgs: () => {
let max = fun.geT("a[title=Page]>b").match(/共(\d+)/)[1];
return fun.getImg(".main-body img", max, 9);
},
button: [4],
insertImg: [".main-body", 1],
autoDownload: [0],
next: "//a[text()='上一组']",
prev: 1,
customTitle: () => fun.geT(".main-title"),
css: ".single .main-body img{max-width:100%!important}#showlast1{display:none!important;}",
category: "nsfw2"
}, {
name: "好女神网 www.haonvshen.com",
reg: /www\.haonvshen\.com\/gallery\/\d+\.html/,
imgs: () => {
let max;
fun.ge(".page") ? max = fun.geT(".page").match(/\d+\/(\d+)/)[1] : max = fun.geT("#pages>*:last-child", 3) || 1;
return fun.getImg("#hgallery>img,#imgwrap img", max, 9);
},
button: [4],
insertImg: ["#hgallery,#imgwrap", 1],
customTitle: () => fun.title(" - 第1页-美女图片-好女神网"),
css: ".f_b_c_d{display:none!important}",
category: "nsfw1"
}, {
name: "Jablehk jablehk.com",
reg: /jablehk\.com\/\w+/,
imgs: () => {
thumbnailsSrcArray = [...fun.gae("figure.gallery-strips-item")].map(e => e.dataset.thumb);
return [...fun.gae(".gallery-strips-lightbox-link>img[data-src]")];
},
button: [4],
insertImg: [
[".gallery-strips-wrapper", 2], 2, 2000
],
autoDownload: [0],
next: ".item-pagination-link--next",
prev: ".item-pagination-link--prev",
go: 1,
customTitle: () => fun.geT("h1>strong"),
category: "nsfw1"
}, {
name: "TangMoc tangmoc.com",
reg: /^https:\/\/tangmoc\.com\/blog\/show\/\w+\/view/,
init: async () => {
fun.remove("//div[@class='row mt-3'] | //div[ins[@class='adsbygoogle']] | //div[@class='mt-3'][@id] | //div[@class='row my-5'] | //iframe[@id]");
},
imgs: () => fun.ge(".btn-warning+.btn-secondary") ? fun.getImgA("a[href*=media]>.media-preview", "a.btn-secondary") : [...fun.gae("a[href*=media]>.media-preview")],
button: [4],
insertImg: ["//media[article]", 2],
go: 1,
customTitle: () => fun.geT("h1"),
category: "nsfw1"
}, {
name: "TangMoc tangmoc.com 去廣告",
reg: /^https:\/\/tangmoc\.com\//,
icon: 0,
key: 0,
init: () => {
fun.remove("//div[@class='row mt-3'] | //div[ins[@class='adsbygoogle']] | //div[@class='mt-3'][@id] | //div[@class='row my-5'] | //iframe[@id]");
new MutationObserver(() => {
fun.remove("//div[@class='row mt-3'] | //div[ins[@class='adsbygoogle']] | //div[@class='mt-3'][@id] | //div[@class='row my-5'] | //iframe[@id]");
}).observe(document.body, {
childList: true,
subtree: true
});
},
category: "nsfw1"
}, {
name: "Fapello fapello.com",
reg: /^https:\/\/fapello\.com\/[^\/]+\/$/,
init: async () => {
if (fun.ge("#showmore")) {
scrollMore = () => {};
let ele = fun.ge("#showmore");
let max = ele.dataset.max;
fun.remove("#showmore");
let links = [];
for (let i = 2; i <= max; i++) {
links.push(siteUrl + `page-${i}/`);
}
await fun.getEle(links, "#content>div", ["#content", 0]);
/*
fun.remove("#showmore");
const last = doc => {
let ele = fun.ge("#showmore", doc);
return ele.dataset.page == ele.dataset.max ? true : false;
}
await fun.getNP("#content>div", "#next_page>a", last);
*/
fun.remove("#next_page");
}
},
imgs: () => {
let imgSrcs = [...fun.gae("#content>div")].map(node => {
if (fun.ge("img[src*='icon-play.svg']", node)) {
let videoSrc = fun.ge("img", node).src.replace("https://fapello.com/", "https://cdn.fapello.com/").replace("_300px", "").replace(/\.jpg$/i, ".mp4");
videosSrcArray.push(videoSrc);
return null;
} else {
thumbnailsSrcArray.push(fun.ge("img", node).src);
let imgSrc = fun.ge("img", node).src.replace("_300px", "");
return imgSrc;
}
}).filter(item => item);
return imgSrcs;
},
button: [4],
insertImg: ["#content", 2],
downloadVideo: true,
category: "nsfw2"
}, {
name: "Thotsbay thotsbay.tv",
reg: /^https:\/\/thotsbay\.tv\/\w+(\/photo)?$/i,
init: () => {
//if (/\/photo/.test(location.href)) fun.clearAllTimer();
if (location.href.split("/").length == 4) {
location.href = location.href + "/photo";
}
},
imgs: async () => {
if (/\/photo/.test(location.href)) fun.clearAllTimer();
let ptext = fun.geT('#photos-tab');
let m = ptext.match(/\(([\d\.K]+)\)/)[1];
let num;
if (/\./.test(m) && /K/.test(m)) {
num = (parseInt(m.replace(/\.|K/g, ""), 10) + 1) * 100;
} else if (/K/.test(m)) {
num = parseInt(m.replace(/K/g, ""), 10) * 1000 + 100;
} else {
num = parseInt(m, 10);
}
let pages = Math.ceil(num / 48);
let actorName = location.href.split("/")[3];
let imgsSrcArr = [];
let fetchNum = 0;
fun.show(displayLanguage.str_05, 0);
for (let i = 1; i <= pages; i++) {
let json = await fetch(`https://thotsbay.tv/${actorName}?page=${i}&type=photos&order=0`, {
"headers": {
"x-requested-with": "XMLHttpRequest"
}
}).then(res => {
fun.show(`${displayLanguage.str_06}${fetchNum+=1}/${pages}`, 0);
return res.json();
});
if (json.length == 0) break;
let images = json.map(e => "https://thotsbay.tv/storage/" + e.image);
let thumbnails = json.map(e => e.thumbnail);
imgsSrcArr = imgsSrcArr.concat(images);
thumbnailsSrcArray = thumbnailsSrcArray.concat(thumbnails);
if (json.length < 48) break;
}
return imgsSrcArr;
},
button: [4],
insertImg: ["#photos", 3],
customTitle: () => fun.geT(".actor-name>h1"),
category: "nsfw2"
}, {
name: "นางแบบคือลือ modelsexyth.com",
reg: /^https:\/\/modelsexyth\.com\/[^\/]+\/$/,
include: "//div[div[div[img[@decoding]]]]",
exclude: ".elementor-element-7f34e95",
init: () => {
fun.clearAllTimer();
fun.remove("//b[b/script]");
},
imgs: "//img[@decoding] | //a[contains(@class,'e-gallery-item')]",
button: [4],
insertImg: [
["//div[div[div[img[@decoding]]]]", 0, "//div[img[@decoding] and @class ='elementor-widget-container'] | //div[contains(@class,'elementor-widget-gallery')]"], 2
],
customTitle: () => fun.geT("h1.elementor-heading-title>a").replace(/\(\d+p\)/i, "").trim(),
css: ".elementor-element-2aa59471,.elementor-element-2060f59,.elementor-element-f838527,.elementor-element-988fdac,.elementor-element-3b501ba{display:none!important}.elementor-posts-container .elementor-post__thumbnail{padding-bottom:unset!important}#FullPictureLoadEnd{color:rgb(255, 255, 255)}",
category: "nsfw1"
}, {
name: "นางแบบคือลือ modelsexyth.com 分類自動翻頁",
enable: 1,
reg: /^https:\/\/modelsexyth\.com\//,
include: "nav.elementor-pagination",
init: () => {
fun.clearAllTimer();
fun.remove("//div[div[@class='elementor-element elementor-element-fb0ca65 elementor-widget elementor-widget-heading']] | //b[b/script]");
},
autoPager: {
ele: "#main .elementor-posts-container",
observer: "#main .elementor-posts-container>article",
next: "span.current+a:not(.next)",
re: "nav.elementor-pagination",
title: () => fun.ge("span.current", doc).innerText
},
openInNewTab: ".elementor-posts-container a:not([target=_blank])",
css: ".elementor-element-2aa59471,.elementor-element-2060f59,.elementor-element-f838527,.elementor-element-988fdac,.elementor-element-3b501ba{display:none!important}.elementor-posts-container .elementor-post__thumbnail{padding-bottom:unset!important}",
category: "autoPager"
}, {
name: "นางแบบคือลือ modelsexyth.com 去廣告",
reg: /^https:\/\/modelsexyth\.com\//,
icon: 0,
key: 0,
init: () => {
fun.clearAllTimer();
fun.remove("//div[div[@class='elementor-element elementor-element-fb0ca65 elementor-widget elementor-widget-heading']] | //b[b/script]");
},
css: ".elementor-element-2aa59471,.elementor-element-2060f59,.elementor-element-f838527,.elementor-element-988fdac,.elementor-element-3b501ba{display:none!important}.elementor-posts-container .elementor-post__thumbnail{padding-bottom:unset!important}",
category: "nsfw1"
}, {
name: "Hot Girl Pix www.hotgirlpix.com",
reg: /^https:\/\/www\.hotgirlpix\.com\/p\//,
imgs: () => fun.getImgA("article img", "#singlePostPagination a", 300),
button: [4],
insertImg: ["article", 2],
customTitle: () => fun.geT("#singlePostTitle"),
css: "#modalAdblock{display:none!important}",
category: "nsfw1"
}, {
name: "LUVBP luvbp.com",
reg: /^https:\/\/luvbp\.com\/\d+\//,
exclude: "//a[text()='网盘下载'] | //h4[text()='此文章仅供订阅者阅读']",
imgs: "figure img",
button: [4],
insertImg: [".c-content", 2],
customTitle: () => fun.geT(".c-post-hero__title"),
css: "@media(max-width:39.99em){.c-content img{max-width:100%!important}}",
category: "nsfw1"
}, {
name: "自拍图库 自拍图库.com zipaipic.com",
reg: /^https:\/\/[^\/]+\/content_\d+\.html/i,
include: "//title[contains(text(),'自拍图库')]",
init: () => {
fun.clearAllTimer();
},
imgs: ".showimg",
button: [4],
insertImg: ["#imgviewer", 2],
go: 1,
autoDownload: [0],
next: "//a[text()='下一组']",
prev: "//a[text()='上一组']",
customTitle: () => fun.geT(".ttle").replace(/\n|\d+p/gi, "").trim(),
referer: "",
css: "a[rel]{display:none!important}",
category: "nsfw2"
}, {
name: "美拍 - 我自拍 7aipai.com 35zipai.com",
reg: /^https?:\/\/(\d+aipai\.com|\d+zipai.com)\/\w+\/\d+\/\d+\.html/i,
init: () => {
fun.clearAllTimer();
},
imgs: async () => {
await fun.waitEle("#showCon img");
videosSrcArray = [...fun.gae("#showCon video")].map(e => /\.mp4/.test(e.src) ? e.src : null).filter(item => item);
thumbnailsSrcArray = [...fun.gae("#showCon img")].map(e => /zipai/.test(e.src) ? e.src.replace(/&w=\d+/, "&w=100") : null).filter(item => item);
return [...fun.gae("#showCon img")].map(e => /zipai/.test(e.src) ? e.src.replace(/&output.+/, "") : null).filter(item => item);
},
button: [4],
insertImg: ["#showCon", 2],
go: 1,
autoDownload: [0],
next: ".article-nav-prev a",
prev: 1,
customTitle: () => fun.geT(".item_title>h1").replace(/\[[\d\+PV]+\]/i, "").trim(),
referer: "",
css: ".affs{display:none!important}.content_left img{cursor:unset}",
category: "nsfw2"
}, {
name: "套圖TAOTU.ORG taotu.org",
reg: /https?:\/\/(\w{2}\.)?taotu\.org\/[\w-]+\//i,
include: ".piclist",
imgs: () => {
thumbnailsSrcArray = [...fun.gae("a[data-fancybox=gallery] img")].map(e => e.src);
return [...fun.gae("a[data-fancybox=gallery]")];
},
button: [4],
insertImg: [
["#wrapper-footer", 2], 2
],
autoDownload: [0],
next: ".next a",
prev: ".prev a",
customTitle: () => fun.geT(".suit_title>h1").replace(/\d+p/i, "").trim(),
go: 1,
css: "#right-bottom,#ad,.ad{display:none!important;}",
category: "nsfw1"
}, {
name: "Taotuxp.com www.taotucc.com",
reg: /www\.taotucc\.com\/\d+\.html/,
imgs: () => fun.getImg("#post_content img[alt]", fun.geT(".pagelist>*:last-child"), 7),
button: [4],
insertImg: ["#post_content", 1],
autoDownload: [0],
next: "a[rel=prev]",
prev: "a[rel=next]",
customTitle: () => fun.geT("h1"),
category: "nsfw1"
}, {
name: "MM 范 www.95mm.vip",
reg: /www\.95mm\.\w+\/\d+\.html/,
init: "$(document).unbind('keydown');$(document).unbind('keyup');",
imgs: () => {
let max = fun.geT(".post-title").match(/\/(\d+)/)[1];
return fun.getImg(".post img[alt]", max, 2);
},
button: [4],
insertImg: [".post", 1],
autoDownload: [0],
next: "//div[div[text()='上一组']]/preceding-sibling::div/a",
prev: "//div[div[text()='下一组']]/preceding-sibling::a",
customTitle: () => fun.geT(".post-title").replace(/(\d+\/\d+)$/, ""),
category: "nsfw1"
}, {
name: "推图网 https://www.tuiimg.com/meinv/",
reg: /(www|m)\.tuiimg\.com\/meinv\/\d+\//,
init: "goshowall();",
imgs: () => {
let max = fun.geT("#allbtn").match(/\/(\d+)/)[1];
let path = fun.ge("#content>img").src.match(/.+\//)[0];
let arr = [];
for (let i = 1; i <= max; i++) {
arr.push(path + i + ".jpg");
}
return arr;
},
button: [4],
insertImg: ["#content", 2],
autoDownload: [0],
next: "#nextbtn>a",
prev: "#prebtn>a",
customTitle: () => fun.geT("#main>h1,.main>h1"),
category: "nsfw1"
}, {
name: "18AV https://18av.mm-cg.com/zh/cg_random/all/index.html",
reg: /18av\.mm-cg\.com\/(\w{2}\/)?\w+\/\d+\/content\.html|18av\.mm-cg\.com\/.+\.html/,
include: ".sel_enlarge_page,.sel_enlarge",
imgs: () => Large_cgurl,
button: [4],
insertImg: ["#show_cg_html,#showcg_container", 2],
customTitle: () => fun.geT('.archive-title>h1,h1').replace(/\s?\[\d+p\]|\s?\(\d+p\)/i, "").trim(),
category: "nsfw1"
}, {
name: "Xgirls xgirlscollection.com img3xgirls.com",
reg: /(xgirlscollection\.com|img3xgirls\.com)\/(collection|album)\/\d+/,
imgs: () => fun.getImg("img[id].collection-image,.album-image[data-pin-media]", (fun.geT(".pagination>*:last-child", 2) || 1)),
button: [4],
insertImg: ["//div[img[@data-pin-url]]", 1],
customTitle: () => fun.geT(".container>h1"),
category: "nsfw1"
}, {
name: "SexyAsianGirl www.sexyasiangirl.xyz",
reg: /www\.sexyasiangirl\.xyz\/album\/\d+\.html/,
init: () => {
fun.remove("//article/div[a[img]]");
},
imgs: () => {
let max;
try {
max = fun.geT("span.inline-block").match(/\d+$/)[0];
} catch (e) {
max = 1;
}
return fun.getImg("img.block", max);
},
button: [4],
insertImg: ["//div[img[@title]]", 1],
customTitle: () => fun.geT("header>h2").replace(/\s?\(\d+\s?photos\s?\)/, "").trim(),
category: "nsfw2"
}, {
name: "福利姬美图 fuligirl.net",
reg: /fuligirl\.net\/albums\/\d+/,
imgs: () => fun.getImg("img.block", (fun.geT("a[rel=next]", 2) || 1)),
button: [4],
insertImg: ["//div[@class='my-1' and img[@class='block my-1']]", 1],
customTitle: () => fun.geT("#main h1").replace(/(\d+月\d+打赏群资源)|\[\d+P(\d+v)?-[\d\.]+(M|G)B\]|\[\d+P\]|\d+mb|\s?\d+p/gi, "").trim(),
category: "nsfw2"
}, {
name: "顶尖美女图 djjpg.com",
reg: /https?:\/\/djjpg\.com\/\d+.html/,
imgs: ".post-countent-data img",
autoDownload: [0],
next: "//a[div[h5[text()=' 上一篇']]]",
prev: "//a[div[h5[text()=' 下一篇']]]",
customTitle: () => fun.geT('.multi-single-header>h1').replace(/\(\d+\/\d+\)|(\s–\s)?\(\d+P\)/i, "").trim(),
category: "nsfw1"
}, {
name: "秀人图吧 www.502x.com",
reg: /https?:\/\/www\.502x\.com\/\w+\/\d+\.html/,
button: [4],
//imgs: () => fun.getImg("#image_div img", (fun.geT("a.prev", 2) || 1), 9),
imgs: () => fun.getImgA("#content img", ".post_au>a"),
button: [4],
insertImg: ["#image_div", 2],
customTitle: () => fun.geT(".item_title>h1"),
css: ".affs{display:none!important}.image_div a img{cursor:unset}",
category: "nsfw1"
}, {
name: "Nude Bird nudebird.biz",
reg: /nudebird\.biz\/.+\//,
imgs: ".thecontent a",
button: [4],
insertImg: ["//p[a[img]]", 2],
customTitle: () => fun.geT("h1"),
category: "nsfw1"
}, {
name: "R18 Cosplay r18cosplay.com",
reg: /r18cosplay\.com\/\?p=\d+/,
imgs: ".wp-block-image img",
button: [4],
insertImg: [
[".content-inner", 0, ".wp-block-image"], 2
],
customTitle: () => fun.geT(".entry-header>h1"),
category: "nsfw1"
}, {
name: "NUDECOSPLAY nudecosplaygirls.com",
reg: /nudecosplaygirls\.com\/.+\/$/,
imgs: ".single-thumb>.wp-post-image,img[class*='wp-image'],.icon-overlay>img[decoding],.msacwl-img,.entry-content>img,.gallery-item img",
button: [4],
insertImg: [".entry-content", 2],
autoDownload: [0],
next: ".g1-nav-single-next>a",
prev: ".g1-nav-single-prev>a",
customTitle: () => fun.geT("h1.entry-title").replace(/“[0-9a-z ]+”/i, "").trim(),
category: "nsfw2"
}, {
name: "Cosplaytele cosplaytele.com",
reg: /cosplaytele\.com\/[^/]+\//,
include: "figure.gallery-item",
imgs: "figure.gallery-item a",
button: [4, "21%"],
insertImg: [".gallery", 2],
customTitle: () => fun.geT("h1.entry-title").replace(/\s?“[^”]+”/, "").trim(),
css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}",
category: "nsfw2"
}, {
name: "X Cosplay xcosplay.top",
reg: /xcosplay\.top\/\d+\/\d+\/\d+\//,
imgs: ".galeria_img>img",
button: [4],
insertImg: [".entry-content", 2],
autoDownload: [0],
next: "a[rel=prev]",
prev: "a[rel=next]",
customTitle: () => fun.geT("h1.entry-title"),
category: "nsfw1"
}, {
name: "AsiaOnTop asiaon.top",
reg: /https?:\/\/asiaon\.top\/[^\/]+\/$/,
include: ".modula-items",
imgs: "a[data-image-id]",
button: [4],
insertImg: [
[".modula-items", 2], 2
],
autoDownload: [0],
next: "a#prepost",
prev: "a#nextpost",
customTitle: () => fun.geT(".single_post_title_main").replace(":", " -"),
go: 1,
category: "nsfw2"
}, {
name: "Mitaku mitaku.net",
reg: /mitaku\.net\/.+\/.+\/$/,
imgs: () => [...fun.gae(".msacwl-img")].slice(1, -1),
button: [4],
insertImg: [
[".article-content", 2], 2
],
autoDownload: [0],
next: ".previous>a",
prev: ".next>a",
customTitle: () => fun.geT("h1.entry-title"),
category: "nsfw2"
}, {
name: "Byoru byoru.net",
reg: /https?:\/\/byoru\.net\/[\w-]+\/$/,
imgs: () => {
if (fun.ge(".msacwl-slide>a")) {
return [...fun.gae(".msacwl-slide>a")].map(a => a.dataset.mfpSrc).sort((a, b) => a.match(/(\d+)\.\w+$/)[1] - b.match(/(\d+)\.\w+$/)[1]);
} else if (fun.ge("figure.wp-block-image img[data-src]")) {
return [...fun.gae("figure.wp-block-image img[data-src]")].map(e => e.dataset.src.replace(/-\d+x\d+(\.\w+)/, "$1")).sort((a, b) => {
try {
return a.match(/(\d+)\.\w+$/)[1] - b.match(/(\d+)\.\w+$/)[1];
} catch (e) {
try {
return a.match(/\((\d+)\)\.\w+$/)[1] - b.match(/\((\d+)\)\.\w+$/)[1];
} catch (e) {
return a;
}
}
});
} else {
return [];
}
},
button: [4, "23%"],
insertImg: [".s-post-content", 2],
autoDownload: [0],
next: "a.next-page-link",
prev: "a.prev-page-link",
customTitle: () => fun.geT("h1.entry-title").replace(/Byoru – | \(Cosplay\)/g, ""),
category: "nsfw1"
}, {
name: "nudeslegion.com",
reg: /nudeslegion.com\/[^\/]+\/$/i,
include: ".msacwl-slider-wrap",
imgs: () => [...fun.gae(".msacwl-img")].slice(1, -1),
button: [4],
insertImg: [
[".msacwl-slider-wrap", 2], 2
],
customTitle: () => fun.geT("h1.entry-title").replace(/\([\w\/\s]+\)/i, "").trim(),
css: "footer+script+div[id]{display:none!important}",
category: "nsfw2"
}, {
name: "MrCong.com",
reg: /mrcong\.com\/.+\//,
imgs: () => fun.getImg(".entry img[decoding]", fun.geT(".page-link>*:last-child"), 4),
button: [4],
insertImg: ["//p[img[@decoding]]", 1],
customTitle: () => fun.geT("h1").replace(/\(\d+\s?photos?\s?(\+\s?\d+\s?videos?)?\)/gi, "").trim(),
category: "nsfw1"
}, {
name: "Xiuren xiuren.biz",
reg: /https?:\/\/xiuren\.biz\/[^\/]+\//,
include: ".content-inner a[data-lbwps-srcsmall]",
imgs: ".content-inner a[data-lbwps-srcsmall]",
button: [4],
insertImg: [".content-inner", 2],
autoDownload: [0],
next: "a.post.prev-post",
prev: "a.post.next-post",
customTitle: () => fun.geT('h1.jeg_post_title').replace(/\d+P/i, ""),
category: "nsfw1"
}, {
name: "4KHD www.4khd.com www.4kep.com xjav.cc hhhy.quest",
reg: /(www\.4k(hd|ep)\.com|xjav\.cc|hhhy\.quest)\/\d+\/\d+\/\d+\/.+\.html/,
imgs: async () => {
await fun.getNP("#basicExample>a,figure.wp-block-image", ".current+li>a", null, ".page-link-box");
let mobile = fun.ge("figure.wp-block-image>a");
if (mobile) {
thumbnailsSrcArray = [...fun.gae("figure.wp-block-image>a>img")].map(e => e.src.replace("?w=1000", "?w=100"));
return [...fun.gae("figure.wp-block-image>a")];
} else {
thumbnailsSrcArray = [...fun.gae("#gallery a img")].map(e => e.src.replace("?w=1000", "?w=100"));
return fun.getImgA("#gallery a", "#basicExample>a");
}
},
button: [4],
insertImg: [
[".page-link-box,.wp-block-post-content>*:last-child,#khd", 1, "#basicExample,.wp-block-image"], 2
],
//autoDownload: [0],
//next: ".post-navigation-link-previous>a",
//prev: ".post-navigation-link-next>a",
customTitle: () => fun.geT("h3.wp-block-post-title").replace(/\[(\d+)?mb-\d+photos\]|\[\d+photos\]|\(\d+8MB\)\(\d+photos\)/i, "").trim(),
fetch: 1,
//threading: 4,
css: ".popup,.wp-container-13{display:none!important}.FullPictureLoadImage{max-width:100%!important}",
category: "nsfw2"
}, {
name: "Buon Dua buondua.com",
reg: /buondua\.com\/(?!hot|collection)[^\?]+$/,
imgs: () => {
let max = fun.geT(".pagination-list>span:last-child>a").match(/\d+/)[0];
return fun.getImg(".article-fulltext img[alt]", max);
},
button: [4],
insertImg: [".article-fulltext", 1],
customTitle: () => fun.geT(".article-header>h1").replace(/\(\d+\s?photos\s?\)/i, "").trim(),
category: "nsfw2"
}, {
name: "baobua.com",
reg: /https?:\/\/baobua\.com\/post\/\w+\.html/i,
imgs: () => {
let max;
try {
max = fun.geT(".article-header>h1").match(/Page\s?\d+\/(\d+)/i)[1];
} catch (e) {
max = 1;
}
return /\?m=1/.test(siteUrl) ? fun.getImg(".contentme img", max, "8") : fun.getImg(".contentme img", max);
},
button: [4],
insertImg: [".contentme", 2],
customTitle: () => fun.geT(".article-header>h1").split("|")[0].trim(),
category: "nsfw2"
}, {
name: "BAOBUA.COM",
reg: /www\.baobua\.net\/post\/.+/,
imgs: () => fun.getImg(".wp-block-image img[alt]", (fun.geT(".nav-links>*:last-child") || 1), 6),
button: [4],
insertImg: [".entry-content.read-details", 2],
customTitle: () => fun.title("|", 1),
category: "nsfw2"
}, {
name: "blog.baobua.net",
reg: /(blog|fb|vn)\.baobua\.net\/\w+\/.+/,
imgs: "a.fancybox",
button: [4],
//insertImg: [".article-body", 2],
insertImg: [
[".article-body", 2], 2
],
go: 1,
customTitle: () => fun.title("@BaoBua", 1),
css: "#fix_scale img:hover{transform:none!important}",
category: "nsfw2"
}, {
name: "HOTGIRLchina hotgirlchina.com thechinagirls.com theasiagirl.com anhsec.com sex4viet.com cutexinh.com girlxinhxinh.com asiaceleb.com",
reg: /(hotgirlchina\.com|thechinagirls\.com|theasiagirl\.com|anhsec\.com|sex4viet\.com|cutexinh\.com|girlxinhxinh\.com|asiaceleb\.com)\/.+(photos?|videos?|anh)?\/?/,
include: ".entry-inner img[alt]",
imgs: () => {
let max;
try {
max = fun.geT("span.pages").match(/\d+$/)[0];
} catch (e) {
max = 1
}
return fun.getImg(".entry-inner img[alt]", max, 4);
},
button: [4],
insertImg: [
[".pagination", 1, ".entry-inner>p:not(#FullPictureLoadEnd)"], 2
],
customTitle: () => fun.geT(".post-title").replace(/\(\d+\s?photos\s?\)|(\s?\(\d+\s?photos?\s?\+\s?\d+\s?videos?\))|\([0-9\s]+ảnh[0-9\s\+]+video\)|\([0-9\s]+ảnh\)/i, "").trim(),
css: ".boxzilla-container,.boxzilla-overlay{display:none!important}",
category: "nsfw1"
}, {
name: "FoamGirl foamgirl.net",
reg: /foamgirl\.net\/\d+\.html/,
imgs: () => {
let max;
try {
max = fun.geT(".mbx-nav-right").match(/\d+\/(\d+)/)[1];
} catch (e) {
max = 1;
}
return fun.getImg("a.imageclick-imgbox", max, 9);
},
button: [4],
insertImg: [
["#image_div>*:last-child", 1, "#image_div br,a.imageclick-imgbox"], 1
],
customTitle: () => fun.geT(".item_title>h1").replace(/\(\d+P\)|\n/gi, ""),
css: ".affs{display:none!important}",
category: "nsfw2"
}, {
name: "photo.camcam.cc",
reg: /photo\.camcam\.cc\/[^/]+\/$/,
imgs: "a.rgg-img",
button: [4],
insertImg: [
[".rgg-imagegrid", 2], 2
],
go: 1,
next: "a[rel=prev]",
prev: "a[rel=next]",
customTitle: () => fun.geT(".page-title").replace(/\[\d+P-?\d+MB?\]/i, "").trim(),
category: "nsfw2"
}, {
name: "Everia.club ",
reg: /(everia\.club|everiaeveria\.b-cdn\.net)\/\d+\/\d+\/\d+\/[^/]+\//,
imgs: ".wp-block-image img",
button: [4],
insertImg: [".entry-content", 2],
customTitle: () => fun.geT("h1"),
category: "nsfw2"
}, {
name: "Everia club",
reg: () => {
if (/^https?:\/\/www\.everiaclub\.com\/.+/.test(siteUrl)) {
if (!siteUrl.includes(".html")) {
return true;
}
}
return false;
},
//exclude: ".pagination",
imgs: ".mainleft img",
button: [4],
insertImg: [".mainleft", 2],
customTitle: () => fun.geT(".mainleft h1"),
category: "nsfw2"
}, {
name: "SexyGirl sexygirl.cc",
reg: /sexygirl\.cc\/a\/\d+\.html/,
imgs: "div>img.img-fluid",
button: [4],
insertImg: ["//div[img]", 2],
next: "//a[text()='Previous']",
prev: "//a[text()='Next']",
category: "nsfw2"
}, {
name: "dongojyousan.com",
reg: /www\.dongojyousan\.com\/articles\/\w+\.html/i,
imgs: () => {
let max;
try {
max = fun.geT(".entry-title>a").match(/Page\s1\/(\d+)/)[1];
} catch (e) {
max = 1;
}
return /\?m=1/.test(siteUrl) ? fun.getImg(".entry-content img", max, "8") : fun.getImg(".entry-content img", max);
},
button: [4],
insertImg: [".entry-content", 2],
customTitle: () => fun.geT(".entry-title>a").split("|")[0].trim(),
category: "nsfw1"
}, {
name: "Anh VL xem.anhvl.net",
reg: /xem\.anhvl\.net\/[^/]+\/$/,
init: () => {
fun.run("$(document).off();");
},
imgs: () => {
try {
let url = location.href;
let max = fun.geT(".page-links a[onclick]", 2);
let links = [];
links.push(url);
for (let i = 2; i <= max; i++) {
links.push(url + "p-" + i);
}
return fun.getImgA(".wp-content-ex img[data-src]", links);
} catch (e) {
return [...fun.gae(".wp-content-ex img[data-src]")];
}
},
button: [4],
insertImg: [".wp-content-ex", 2],
css: "#rtb,.float-ck-center-lt,#popupContact,#backgroundPopupp,.col-9>.col-12{display:none!important}",
category: "nsfw2"
}, {
name: "Anh VL 自動翻頁",
enable: 1,
reg: /^https:\/\/xem\.anhvl\.net\/(page\/\d+)?$|https:\/\/xem\.anhvl\.net\/category\//,
init: () => {
fun.run("$(document).off();");
fun.remove("//div[div[a[@title='OnlyFans Videos']]] | //div[@id='tfads']");
},
autoPager: {
ele: "//div[@class='row space-ad'][1]/div[@class='col-6' or @class='col-5'][not(@id='tfads')]",
observer: "//div[@class='row space-ad'][1]/div[@class='col-6' or @class='col-5'][not(@id='tfads')]",
next: "a.next",
re: ".wp-pagenavi",
title: () => "Page " + nextLink.match(/\d+$/)[0],
history: 1
},
openInNewTab: ".space-ad a:not([target=_blank])",
css: ".autoPagerTitle{width:100%!important}#backgroundPopupp,#popupContact,.float-ck-center-lt,center[style*='z-index']{display:none!important}",
category: "autoPager"
}, {
name: "Anh VL xem.anhvl.net",
reg: /xem\.anhvl\.net/,
icon: 0,
key: 0,
init: () => {
fun.run("$(document).off();");
},
css: "#backgroundPopupp,#popupContact,.float-ck-center-lt,center[style*='z-index']{display:none!important}",
category: "nsfw2"
}, {
name: "Phym18 phym18.org https://phym18.org/tag/%E1%BA%A3nh-sex Bongda21h bongda21h.co https://bongda21h.co/anh-hot/",
reg: /phym18\.org\/anh\/[^/]+$|https:\/\/bongda21h\.co\/anh-hot\/[^\/]+\/$/,
init: () => {
fun.run("$(document).off();");
},
imgs: () => {
try {
let url = location.href;
let max = fun.geT("select>option:last-child").match(/\d+/)[0];
let links = [];
links.push(url);
for (let i = 2; i <= max; i++) {
links.push(url + "/phan-" + i);
}
return fun.getImgA(".ndtruyen>img", links);
} catch (e) {
return [...fun.gae(".ndtruyen>img")];
}
},
button: [4],
insertImg: [".ndtruyen", 2],
go: 1,
customTitle: () => fun.geT("h1.header-title,h1.title").replace(/\s?\(\d+\s?photos?\)|\s?\(\d+\s?photos?(\s?\+\s?\d+\s?videos?)\)/g, ""),
css: "#wap_bottombannerr,#wap_bottombanner,#backgroundPopupp,#popupContact,center[style*='z-index']{display:none!important}",
category: "nsfw2"
}, {
name: "Phym18 圖片分類自動翻頁",
enable: 1,
reg: /^https:\/\/phym18\.org\/tag\/[^n]+nh-sex/,
init: () => {
fun.run("$(document).off();");
fun.remove("//div[div[a[div[text()='Free']]]]");
},
autoPager: {
ele: "div.item-list",
observer: "div.item",
next: "a.w-pagination-next",
re: ".w-pagination-wrapper",
lazySrc: "a[data-src]",
title: () => "Page " + nextLink.match(/\d+$/)[0],
aF: () => {
fun.remove("//div[div[a[div[text()='Free']]]]");
},
history: 1
},
openInNewTab: "div.item a:not([target=_blank])",
css: "#bn_top,#backgroundPopupp,#popupContact,#wap_bottombannerr,#wap_bottombanner,center[style*='z-index']{display:none!important}",
category: "autoPager"
}, {
name: "Phym18 phym18.org bongda21h bongda21h.co",
reg: /phym18\.org|bongda21h\.co/,
icon: 0,
key: 0,
init: () => {
fun.run("$(document).off();");
},
css: "#bn_top,#backgroundPopupp,#popupContact,#wap_bottombannerr,#wap_bottombanner,center[style*='z-index']{display:none!important}",
category: "nsfw2"
}, {
name: "Porn Pics www.pornpics.com",
reg: /www\.pornpics\.com\/.*galleries\//,
imgs: () => {
thumbnailsSrcArray = [...fun.gae("#tiles a.rel-link>img")].map(e => e.dataset.src);
return [...fun.gae("#tiles a.rel-link")];
},
button: [4],
insertImg: ["#main", 0],
customTitle: () => fun.geT(".title-section h1"),
category: "nsfw2"
}, {
name: "Freebigtit www.freebigtitpornpics.com",
reg: /www\.freebigtitpornpics\.com\/content\/\d+\//,
imgs: () => {
thumbnailsSrcArray = [...fun.gae("ul#dylan a>img[data-src]")].map(e => e.dataset.src);
return [...fun.gae("//ul[@id='dylan']//a[img[@data-src]]")];
},
button: [4],
insertImg: [
["#dylan", 2], 1
],
go: 1,
category: "nsfw2"
}, {
name: "Freejappic www.freejapanpornpics.com",
reg: /www\.freebigtitpornpics\.com\/content\/\d+\//,
imgs: () => {
thumbnailsSrcArray = [...fun.gae("ul#dylan a>img[data-src]")].map(e => e.dataset.src);
return [...fun.gae("//ul[@id='dylan']//a[img[@data-src]]")];
},
button: [4],
insertImg: [
["#dylan", 2], 1
],
category: "nsfw2"
}, {
name: "NongMo.Zone www.ilovexs.com",
reg: /www\.ilovexs\.com\/post_id\/\d+\//,
imgs: ".separator img",
button: [4],
insertImg: [".entry-content", 2],
customTitle: () => fun.geT(".entry-title"),
category: "nsfw2"
}, {
name: "idol.gravureprincess.date",
reg: /idol\.gravureprincess\.date\/\d+\/\d+\/.+\.html/,
imgs: ".separator img",
button: [4],
insertImg: [
[".entry-content", 0], 2
],
go: 1,
autoDownload: [0],
next: "a.blog-pager-older-link",
prev: "a.blog-pager-newer-link",
customTitle: () => fun.geT(".post-title"),
category: "nsfw2"
}, {
name: "劍心回憶 https://kenshin.hk/category/jnews/photoalbum/",
reg: /kenshin\.hk\/\d+\/\d+\/\d+\/[^/]+\/(#small-1)?$/,
include: "//div[@class='entry-utility']/a[1][text()='寫真組圖'] | //div[@class='cat-tags']/a[1][text()='寫真組圖']",
init: async () => {
let p = fun.ge("//p[contains(text(),'寫真')]");
if (p) {
let tE = fun.ge(".entry-content,.post-page-content");
tE.parentNode.insertBefore(p, tE);
}
let links = [...fun.gae("//a[button[contains(text(),'寫真')]]")].map(e => e.href);
await fun.getEle(links, ".entry-content>p>img,.post-page-content>p>img,.videoWrapper", ".entry-content,.post-page-content");
let v = fun.ge(".videoWrapper");
if (v) {
let tE = fun.ge(".entry-content,.post-page-content");
tE.parentNode.insertBefore(v, tE);
}
},
imgs: ".entry-content>img,.post-page-content>img",
button: [4],
insertImg: [".entry-content,.post-page-content", 2],
go: 1,
customTitle: () => fun.geT("h1.entry-title,h2.post-title").replace(/【寫真】|\s?\(\d+P,片\)/gi, ""),
category: "nsfw1"
}, {
name: "韩剧组 https://www.hanjuzu.com/hantype/23.html",
reg: /www\.hanjuzu\.com\/handetail-\d+\.html/,
imgs: () => {
let max = fun.geT(".num").match(/\d+\/(\d+)/)[1];
return fun.getImg(".hl-article-box>img", max, );
},
button: [4],
insertImg: [".hl-article-box", 2],
autoDownload: [0],
next: ".hl-next",
prev: ".hl-prev",
customTitle: () => fun.geT(".hl-article-title"),
category: "nsfw1"
}, {
name: "J M G T www.qiuyeshudian.com",
reg: /https:\/\/www\.qiuyeshudian\.com\/[^\/]+\/$/,
imgs: () => {
thumbnailsSrcArray = [...fun.gae(".feature-box img,.entry-content img")].map(e => e.dataset.src ? e.dataset.src : e.src);
return thumbnailsSrcArray.length > 1 ? thumbnailsSrcArray.map(e => e.replace(/\?w=\d+&ssl=1/, "").replace(/\?resize.+/, "")) : [];
},
button: [4],
insertImg: [".entry-content", 2],
autoDownload: [0],
next: "a[rel=prev]",
prev: "a[rel=next]",
customTitle: () => fun.geT("article h1"),
category: "nsfw1"
}, {
name: "Gravia gravia.site",
reg: /gravia\.site\/box\/show\.php\?id=\d+$/,
imgs: () => {
thumbnailsSrcArray = [...fun.gae(".thums img")].map(e => e.src);
return [...fun.gae(".slideshow .item>img")];
},
button: [4],
insertImg: [".slideshow.for_box", 2],
customTitle: () => fun.geT(".container>h1").replace(/\s?【\d+枚】/, ""),
css: "img.small{max-width:100% !important;max-height:auto !important}.cmd_bar.wide{display:none!important}",
category: "nsfw1"
}, {
name: "グラビア週刊誌 9 gravurezasshi9.doorblog.jp グラビア週刊誌 5 magazinejapanese5.blog.jp グラビア週刊誌 6 magazinejapanese6.blog.jp",
reg: /(gravurezasshi9\.doorblog\.jp|magazinejapanese(5|6)\.blog\.jp)\/archives\/\d+\.html(\?ref=)?/,
imgs: () => {
thumbnailsSrcArray = [...fun.gae(".article-body-inner>a>img,#article-contents>a>img")].map(e => e.src);
return [...fun.gae(".article-body-inner>a,#article-contents>a")];
},
button: [4],
insertImg: [".article-body-inner,#article-contents", 2],
autoDownload: [0],
next: "//li[text()='前の記事: ']/a | //a[text()='< 前の記事']",
prev: "//li[text()='次の記事: ']/a | //a[text()='次の記事 >']",
customTitle: () => fun.geT("h1.article-title>a,.article-header>h1").trim(),
category: "nsfw1"
}, {
name: "グラビア週刊誌 9 gravurezasshi9.doorblog.jp グラビア週刊誌 5 magazinejapanese5.blog.jp グラビア週刊誌 6 magazinejapanese6.blog.jp 分類自動翻頁",
reg: /^https:\/\/(gravurezasshi9\.doorblog\.jp|magazinejapanese(5|6)\.blog\.jp)\/(\?p=\d+)?$|https:\/\/(gravurezasshi9\.doorblog\.jp|magazinejapanese(5|6)\.blog\.jp)\/archives\/([\d-]+|cat_\d+)\.html(\?p=\d+)?$/,
autoPager: {
ele: ".autopagerize_page_element",
observer: "article.article",
next: "li.current+li>a",
re: ".pager",
history: 1,
title: () => "Page " + fun.ge("li.current", doc).innerText
},
openInNewTab: ".autopagerize_page_element a[href]:not([target=_blank])",
category: "autoPager"
}, {
name: "エロ役場 eroyakuba.com",
reg: /eroyakuba\.com\/[^/]+\/$/,
imgs: () => {
return [...fun.gae(".flexitem_content img[srcset],.entry-content img[srcset]")].map(img => {
if (img.dataset.srcset !== "") {
let splitArr = img.dataset.srcset.split(",");
splitArr = splitArr.sort((a, b) => a.match(/\s(\d+)w/)[1] - b.match(/\s(\d+)w/)[1]);
return splitArr.pop().trim().split(" ")[0];
}
return img.dataset.src ? img.dataset.src : null;
});
},
customTitle: () => fun.geT("h1.entry-title"),
category: "nsfw2"
}, {
name: "エロ画像まとめ geinou-nude.com",
reg: /geinou-nude\.com\/[^/]+\/$/,
imgs: ".post_content>p>a[href*=uploads]",
autoDownload: [0],
next: "a.nav_link_l",
prev: "a.f_row_r",
customTitle: () => fun.geT("h1.post_title"),
category: "nsfw2"
}, {
name: "JANidolig janidolig.com",
reg: /janidolig\.com\/\?p=\d+/,
imgs: ".entry-content img.size-full",
button: [4],
insertImg: [".entry-content", 2],
customTitle: () => fun.geT("h1.entry-title"),
category: "nsfw2"
}, {
name: "Gravure Idols gravureidols.top",
reg: /gravureidols\.top\/\d+\/\d+\/\d+\/[^/]+\//,
imgs: ".content-inner p>a",
autoDownload: [0],
next: "a.prev-post",
prev: "a.next-post",
customTitle: () => fun.geT(".jeg_post_title"),
category: "nsfw2"
}, {
name: "復刻書林 reprint-kh.com",
reg: /reprint-kh\.com\/archives\/\d+/,
imgs: async () => {
await fun.getNP(".gallery-row", "//a[span[text()='次のページ']]");
thumbnailsSrcArray = [...fun.gae(".tiled-gallery a img")].map(e => e.src);
return [...fun.gae(".tiled-gallery a")];
},
button: [4],
insertImg: [
[".single-post-main>.share,.single-post-main .content", 2], 2
],
go: 1,
autoDownload: [0],
next: ".previous_post>a",
prev: ".next_post>a",
customTitle: () => fun.geT(".single-post-title").replace(/\d+photos/, "").trim(),
category: "nsfw2"
}, {
name: "マブい女画像集 mabui-onna.com",
reg: /^https:\/\/mabui-onna\.com\/blog-entry-\d+\.html/,
imgs: ".topentry_text div>a:not([href*='.html']),.entry_body div>a:not([href*='.html'])",
button: [4],
insertImg: [".topentry_text,.entry_body", 2],
autoDownload: [0],
next: "a.pager_next,.next_entry>a",
prev: "a.pager_prev,.prev_entry>a",
customTitle: () => fun.geT(".topentry_title span,.entry_title h1>strong").replace(/\d+枚/, "").replace(/\s\s/g, " ").trim(),
category: "nsfw1"
}, {
name: "Love Asian Babes amazon-love.com",
reg: /^https:\/\/amazon-love\.com\/[^.]+\.html/,
imgs: () => {
let max = fun.geT("//a[text()='Next Page »']", 2) || 1;
return fun.getImg(".entry-content img", max, 7);
},
button: [4],
insertImg: [".entry-content", 2],
autoDownload: [0],
next: "span.prev>a",
prev: "span.next>a",
customTitle: () => fun.geT(".entry-title"),
category: "nsfw1"
}, {
name: "ドッグ速報 dog-sokuhou.com",
reg: /^https:\/\/dog-sokuhou\.com\/archives\/\d+\/[^\/]+\//,
imgs: ".eye-catch>img,.wp_rss_scrapeing_post-content div>a",
button: [4],
insertImg: [".wp_rss_scrapeing_post-content", 2],
customTitle: () => fun.geT(".entry-title").replace(/\d+枚/, "").replace(/\s\s/g, " ").trim(),
css: "#oxzilla-overlay,boxzilla-overlay{display:none!important}",
category: "nsfw1"
}, {
name: "IVPhoto_Gravure ivphoto.tistory.com",
reg: /ivphoto\.tistory\.com\/(m\/)?\d+/,
imgs: ".imageblock img",
button: [4],
insertImg: [".entry-content,.blogview_content", 2],
customTitle: () => fun.geT('.tit_blogview,.hgroup h1').replace(/\[\d+p\]/i, "").trim(),
category: "nsfw1"
}, {
name: "MIC MIC IDOL www.micmicidol.club",
reg: /www\.micmicidol\.club\/\d+\/\d+\/.+\.html/,
imgs: async () => {
thumbnailsSrcArray = [...fun.gae(".entry-content a[href*=googleusercontent]>img")].map(e => {
let arr = e.src.split("/");
arr[7] = "w100";
return arr.join("/");
});
let srcArr = [...fun.gae(".entry-content a[href*=googleusercontent]")].map(a => a.href);
let firstSrcArr = srcArr[0].split("/");
if (firstSrcArr.length === 9) {
firstSrcArr[7] = "s16000";
let testMaxSrc = firstSrcArr.join("/");
let obj = await fun.checkImgStatus(testMaxSrc);
debug("\n確認圖片狀態\n", obj);
if (obj.ok) {
srcArr = srcArr.map(src => {
let arr = src.split("/");
arr[7] = "s16000";
return arr.join("/");
});
return srcArr;
} else {
return srcArr;
}
} else {
return srcArr;
}
},
button: [4],
insertImg: [
[".entry-content", 0, ".entry-content a[href*=googleusercontent]:not([data-fancybox]),.entry-content br"], 2
],
customTitle: () => fun.geT(".entry-title").trim(),
topButton: true,
css: ".post img{max-width:100% !important}.post-body{margin:0px!important;}",
category: "nsfw2"
}, {
name: "MIC MIC IDOL www.micmicidol.club micmicunc unc.micmicdoll.com 分類自動翻頁",
reg: /^https:\/\/www\.micmicidol\.club\/(\?m=1)?$|^https:\/\/www\.micmicidol\.club\/search|^https:\/\/unc\.micmicdoll\.com\/(\?m=1)?$|^https:\/\/unc\.micmicdoll\.com\/search/,
init: () => {
if (siteUrl.includes("unc.micmicdoll.com")) {
setTimeout(() => {
[...document.querySelectorAll("a[href*='www.micmicdoll.com']")].forEach(a => {
a.href = a.href.replace("www.micmicdoll.com", "unc.micmicdoll.com");
});
}, 1000);
fun.css(".autoPagerTitle{width:950px!important}");
}
},
autoPager: {
//mode: 1,
ele: ".blog-posts",
next: "a.blog-pager-older-link",
http: "https",
observer: ".post.hentry",
re: "#blog-pager",
stop: () => fun.ge(".date-outer", doc) ? false : true,
history: 1,
aF: () => {
[...fun.gae("//div[@class='snips-image']/a[not(img)]")].forEach(a => {
let script = fun.ge("script", a);
if (script) {
let code = script.innerText;
if (/document\.write/.test(code)) {
let arr = code.split('"');
let url = arr[1];
let alt = arr[3];
let img = new Image();
img.src = url.replace("/s72-c/", "/w400/").replace("=s72-c", "=w400");
img.alt = alt;
script.parentNode.insertBefore(img, script.nextSibling);
}
}
});
},
title: () => {
let num;
if (/start=/.test(nextLink)) {
if (siteUrl.includes("unc.micmicdoll.com")) {
num = parseInt(nextLink.match(/start=(\d+)/)[1], 10);
num % 2 == 0 ? num = num / 50 + 1 : num = num / 39 + 1;
} else {
num = parseInt(nextLink.match(/start=(\d+)/)[1], 10) / 50 + 1;
}
} else {
num = 1;
}
return doc.title + ` - Page ${num}`;
}
},
openInNewTab: ".date-outer a[href]:not([target=_blank])",
category: "autoPager"
}, {
name: "Kemono https://kemono.su/fantia/user/17148/post/1633768 coomer.party",
reg: /(kemono\.party|kemono\.su|coomer\.party|coomer\.su)\/.+\/post/,
delay: 300,
include: "a.fileThumb.image-link",
imgs: () => {
videosSrcArray = [...fun.gae("video>source")].map(e => e.src);
thumbnailsSrcArray = [...fun.gae("a.fileThumb.image-link>img")].map(e => {
if (e.dataset.src) {
return /^\/\//.test(e.dataset.src) ? location.protocol + e.dataset.src : e.dataset.src;
} else {
return e.src;
}
});
return [...fun.gae("a.fileThumb.image-link")];
},
button: [4],
insertImg: [
[".post__body", 0], 2
],
go: 1,
autoDownload: [0],
next: "a.next",
prev: "a.prev",
customTitle: () => fun.geT(".post__title"),
downloadVideo: true,
topButton: true,
threading: 4,
category: "nsfw2"
}, {
name: "半次元 bcy.net",
reg: /bcy\.net\/item\/detail\/\d+\?_source_page=\w+/,
imgs: ".inner-container img",
customTitle: () => fun.title(" - ", 1),
category: "none"
}, {
name: "套图之家 taotuhome.com",
reg: /taotuhome\.com\/\d+\.html/i,
imgs: () => fun.getImg(".single-content img[alt]", (fun.geT(".page-links>*:last-child", 2) || 1), 7),
button: [4],
insertImg: [".single-content", 1],
autoDownload: [0],
next: "a[rel=prev]:not([href^=j])",
prev: "a[rel=next]:not([href^=j])",
customTitle: () => fun.geT('.entry-title').replace("-套图之家", ""),
category: "nsfw1"
}, {
name: "俊美图 www.meijuntu.com www.junmeitu.com www.jeya.de www.jeya.jp",
reg: /(www\.meijuntu\.com|www\.junmeitu\.com|www\.jeya\.\w+)\/\w+\/\w+\.html/i,
imgs: async () => {
let imgsArr = [];
let max = fun.geT("#pages>*:last-child", 2) || 1;
let links = [];
let url = siteUrl.replace(/(-\d+)?\.html$/, "");
for (let i = 1; i <= max; i++) {
links.push(url + "-" + i + ".html");
}
for (let i = 0; i < links.length; i++) {
let doc = await new Promise(async resolve => {
for (let check = 1; check <= 100; check++) {
let res = await fetch(links[i]);
if (res.status == 304 || res.status == 200) {
let buffer = await res.arrayBuffer();
let decoder = new TextDecoder(document.characterSet || document.charset || document.inputEncoding);
let htmlText = decoder.decode(buffer);
let doc = fun.doc(htmlText);
resolve(doc);
break;
} else {
fun.show(`第${parseInt(i, 10) + 1}頁${res.status}重試第${check}次`, 2900);
await fun.delay(3000, 0);
}
}
});
let imgs = [...fun.gae(".pictures img[alt]", doc)];
let te = [...fun.gae(".pictures img[alt]")].pop();
imgs.forEach(e => {
imgsArr.push(e.cloneNode(true));
if (i != 0) te.parentNode.insertBefore(e.cloneNode(true), te.nextSibling);
});
if (i != 0) {
let ne = [...fun.gae("#pages")];
let re = [...fun.gae("#pages", doc)];
if (ne.length == re.length) {
for (let i in ne) {
ne[i].outerHTML = re[i].outerHTML;
}
}
}
await fun.delay(1000, 0);
}
return imgsArr;
},
button: [4],
insertImg: [".pictures", 1],
autoDownload: [0],
next: "//span[contains(text(),'下一')]/following-sibling::a",
prev: "//span[contains(text(),'上一')]/following-sibling::a",
customTitle: () => fun.geT("h1.title"),
css: ".pre_picture,.next_picture{display:none!important}",
category: "nsfw1"
}, {
name: "x6o https://x6o.com/topics/14#articles",
reg: /(www\.)?x6o\.com\/articles\/\d+/,
delay: 500,
imgs: ".content img",
button: [4],
insertImg: [".content", 2, 2000],
customTitle: () => fun.geT("h1.title").replace(/\[\d+P-\d+MB\]|\[\d+P\]|\s?\d+P$/gi, "").trim(),
category: "nsfw2"
}, {
name: "妹子图 mt316.com",
reg: /mt316\.com\/\w+\/\d+\.html/,
imgs: ".m-list-content img",
button: [4],
insertImg: [".m-list-content", 1],
autoDownload: [0],
next: ".sxpage_l>a",
prev: 1,
customTitle: () => fun.geT(".m-list-tools>h2").replace(/\/?\(\d+P\)/i, "").trim(),
css: ".m-list-content img{max-width:100%!important}",
category: "nsfw1"
}, {
name: "硬盘少女 diskgirl.com",
reg: /diskgirl\.com\/image\/\w+/,
imgs: "a[data-fancybox]",
button: [4],
insertImg: [
[".flexauto>*:last-child", 1, "a[data-fancybox=gallery]"], 2
],
customTitle: () => fun.geT(".image-title").replace(/\[\d+(\+\d+)?PB?\]|\(\d+(\+\d+)?PB?\)/i, ""),
fancybox: {
v: 3,
css: false
},
category: "nsfw1"
}, {
name: "心动美图 www.wai76.com",
reg: /https:\/\/www\.wai\d+\.com\/[^\/]+\//,
include: ".entry-content div[data-src]",
imgs: async () => {
let divDataSrcs = await fun.getImgA(".entry-content div[data-src]", ".page-links a");
thumbnailsSrcArray = divDataSrcs.map(src => {
let arr = src.split("/");
arr[arr.length - 1] = "thumbnail/s" + arr[arr.length - 1];
return arr.join("/");
});
return divDataSrcs;
},
button: [4],
insertImg: [".entry-content", 2],
customTitle: () => fun.geT(".entry-title"),
category: "nsfw1"
}, {
name: "美女库 www.meinvku.org.cn",
reg: /www\.meinvku\.org\.cn\/album\/\d+(\/)?(\.html)?$/,
imgs: async () => {
let firstImg = fun.ge("#img_src img").src;
let path = firstImg.match(/.+\//)[0];
let arr = [];
let max = fun.geT("//span[contains(text(),'页次')]").match(/\/(\d+)/)[1];
for (let i = 1; i <= max; i++) {
arr.push(path + i + ".jpg");
}
let a = fun.ge("#img_src");
if (a) a.outerHTML = `<div class="CustomPictureBox">${fun.ge("img", a).outerHTML}</div>`;
return arr;
/*
let links = [];
let url = location.href;
links.push(url);
let max = fun.geT("//span[contains(text(),'页次')]").match(/\/(\d+)/)[1];
for (let i = 2; i <= max; i++) {
links.push(url + "/page/" + i + ".html");
}
return fun.getImgA(".post-content img", links);
*/
/*
await fun.getNP(".CustomPictureBox img,#img_src img", ".pagination li.active+li>a", null, ".pagination", 0, null, 0);
return [...fun.gae(".CustomPictureBox img")];
*/
},
button: [4],
insertImg: [".CustomPictureBox", 1],
css: ".CustomPictureBox>img{max-width:100%}",
category: "nsfw1"
}, {
name: "图宅网 www.tuzac.com dev.tuzac.com 咔咔西三 www.kkc3.com YouFreeX www.youfreex.com",
reg: /(www\.tuzac\.com|dev\.tuzac\.com|www\.kkc3\.com|www\.youfreex\.com)\/file\/.+/,
imgs: async () => {
let a = fun.ge("#the-photo-link");
if (a) a.outerHTML = a.innerHTML;
await fun.getNP("#fdp-photo img,#fdp-photo-old img,.file-detail img", ".page-curr+a", null, "#pager", 0, null, 0);
return [...fun.gae("#fdp-photo img,#fdp-photo-old img,.file-detail img")];
},
button: [4, "22%"],
insertImg: ["#task,#fdp-photo,#fdp-photo-old", 2],
customTitle: () => fun.geT(".fc-text-content>h1").replace(/(\[\d+P\]|\n|\(\d+P\))/gi, "").trim(),
css: ".content-container .content{margin-right:0px!important}.fdp-click-area,.ad-side-right,.footer{display:none!important}",
category: "nsfw2"
}, {
name: "七仙子图片 www.qixianzi.com",
reg: /www\.qixianzi\.com\/\w+\/\d+\.html$/,
imgs: async () => {
let a = fun.ge(".picture_content>a");
a.outerHTML = a.innerHTML;
await fun.getNP(".picture_content img", "//a[text()='下一页']", null, ".pagination", 0, null, 0);
return [...fun.gae(".picture_content img")];
},
button: [4],
insertImg: [".picture_content", 2],
next: "//li[contains(text(),'上一篇')]/a",
prev: "//li[contains(text(),'下一篇')]/a",
customTitle: () => fun.geT("h1.diy-h1").replace(/\d+p/i, "").trim(),
category: "nsfw1"
}, {
name: "七仙子图片M www.qixianzi.com/e/wap/",
reg: /www\.qixianzi\.com\/e\/wap\/show\.php\?/,
imgs: ".arcmain img",
button: [4],
insertImg: [".arcmain", 1],
customTitle: () => fun.geT(".header>span"),
category: "nsfw1"
}, {
name: "嘿~色女孩 heysexgirl.com",
reg: /heysexgirl\.com\/archives\/\d+$/,
imgs: () => {
let max = fun.geT(".page-links>*:last-child");
return fun.getImg(".entry-content p>a,.entry-content p>img", max, "4");
},
button: [4],
insertImg: [".entry-container", 2],
autoDownload: [0],
next: ".nav-previous>a",
prev: ".nav-next>a",
customTitle: () => fun.geT("h1.page-title"),
category: "nsfw2"
}, {
name: "2LSP 2lsp.xyz",
reg: /2lsp\.xyz\/[^/]+\/$/,
include: ".entry-content img[data-srcset]",
exclude: ".content-hide-tips",
observerClick: ".swal2-close",
imgs: () => [...fun.gae(".entry-content img[data-srcset]")].map(e => e.dataset.srcset),
button: [4],
insertImg: [".entry-content", 2],
autoDownload: [0],
next: ".article-nav-prev>a",
prev: ".article-nav-next>a",
customTitle: () => fun.geT("h1.entry-title"),
category: "nsfw1"
}, {
name: "2LSP 2lsp.xyz",
reg: /2lsp\.xyz\//,
icon: 0,
key: 0,
observerClick: ".swal2-close",
category: "nsfw1"
}, {
name: "性趣套图 myjkwd.com 534798.xyz H漫画 123548.xyz",
reg: /(myjkwd\.com|534798\.xyz|123548\.xyz)\/e\/action\/ShowInfo\.php/i,
include: ".entry img",
imgs: () => fun.getImg(".entry img", fun.geT("a[title=总数]"), 8),
button: [4],
insertImg: ["//div[@class='entry']//img/parent::*", 1],
autoDownload: [0],
next: "//p[contains(text(),'上一')]/a",
prev: "//p[contains(text(),'下一')]/a",
customTitle: () => fun.geT(".contitle"),
css: "aside.side{display:none!important;}.main-content{margin-left:0px!important;}body{background:#EDEDED!important;}",
category: "nsfw2"
}, {
name: "苍井优图片 www.28tyu.com www.28wer.com sldlxz.com",
reg: /(www\.(\d+tyu|\d+wer)\.com|sldlxz\.com)\/e\/action\/ShowInfo\.php/i,
imgs: "img[id^='aimg'],.entry img",
button: [4],
insertImg: [".entry", 2],
autoDownload: [0],
next: "//p[contains(text(),'上一')]/a",
prev: "//p[contains(text(),'下一')]/a",
customTitle: () => fun.geT(".contitle").replace(/【\d+P】|\(\d+P\)/i, "").trim(),
category: "nsfw2"
}, {
name: "YY美女图片 www.yyzhenshun.com 美眉大宝贝 www.mmdabaobei.com",
reg: /(www\.yyzhenshun\.com|www.mmdabaobei\.com)\/\d+\.html/i,
imgs: ".wzy_body img[alt]",
button: [4, "22%"],
insertImg: ["//p[img] | //p[strong[img]] | //div[@class='wzy_body']", 2],
autoDownload: [0],
next: "//li[contains(text(),'上一篇')]/a",
prev: "//li[contains(text(),'下一篇')]/a",
customTitle: () => fun.geT(".wzy_tit"),
css: "body>section[id],a[href*=download]{display:none!important}header{margin-top:0px!important}",
category: "nsfw1"
}, {
name: "羞涩姬 xiuseaa.com xiusea.com",
reg: /(xiuseaa?\.com)\/index\.php\/art\/detail\/id\/\d+\.html$/i,
imgs: ".embed-responsive>img,.embed-responsive P>img",
button: [4],
insertImg: [".embed-responsive", 2],
customTitle: () => fun.geT("h1.h3").replace(/\[\d+P\]/i, ""),
category: "nsfw2"
}, {
name: "爱看美图网 www.ikmt.net m.ikmt.net",
reg: /(www|m)\.ikmt\.net\/\w+\/\w+\/\d+\/\d+\.html/i,
imgs: () => {
let mouse_page = fun.ge("#mouse_page");
if (mouse_page) {
let max = fun.geT("//li[a[text()='下一页']]", 2) || fun.geT("//a[text()='下一张']", 2).match(/\/(\d+)/)[1];
return fun.getImg("#picBody img,.post-content img", max, 9);
} else {
return [...fun.gae("#picBody img,.post-content img")];
}
},
button: [4],
insertImg: ["#picBody,.post-content", 2],
autoDownload: [0],
next: "//div[contains(text(),'上一篇')]/a",
prev: "//div[contains(text(),'下一篇')]/a",
customTitle: () => fun.geT(".articleV2Title>h1,.mm-title"),
css: ".articleV2Body img{max-width:100% !important}",
category: "nsfw1"
}, {
name: "妮兔美图 www.nitutu.com m.nitutu.com",
reg: /(www|m)\.nitutu\.com\/\w+\/\w+\/\d+\.html/i,
imgs: () => fun.getImg(".pic-body img,.picshow-second img", totalpage, 9),
button: [4],
insertImg: [".pic-body,.picshow-second", 2],
autoDownload: [0],
next: "//li[@class='next']/a | //a[text()='下一篇']",
prev: "//li[@class='prev']/a | //a[text()='上一篇']",
customTitle: () => fun.geT(".pictitle>h1,.picart-title").replace(/\[\d+P\]/i, ""),
css: ".FullPictureLoadImage.small{width:unset!important}",
category: "nsfw1"
}, {
name: "犀牛图片网 www.xintp.com",
reg: /www\.xintp\.com\/(\w+\/\w+\/\d+\.html|\w+\/\d+\.html)/i,
imgs: async () => {
let page = fun.ge(".page-links");
if (page) {
/*
let max = fun.geT(".page-links>a.post-page-numbers:last-child", 2);
return fun.getImg(".single-content img", max, 7)
*/
await fun.getNP(".single-content img", "//span[@class='post-page-numbers current']/following-sibling::a[span][1]", null, ".page-links");
return [...fun.gae(".single-content img")];
} else {
return [...fun.gae(".single-content img")];
}
},
button: [4],
insertImg: [
[".single-content", 0, ".wp-block-image,.single-content>p~p:not(#FullPictureLoadEnd)"], 2
],
customTitle: () => fun.geT(".entry-title"),
fancybox: {
v: 3,
css: false
},
css: ".header-sub,.tg-box{display:none!important}",
category: "nsfw1"
}, {
name: "小姐姐图库 xjjtk.link",
reg: /xjjtk\.link\/posts\/\w+\/$/i,
imgs: "img.block",
button: [4],
insertImg: ["//div[img]", 2],
customTitle: () => fun.geT("h1"),
category: "nsfw2"
}, {
name: "AVJB https://avjb.com/albums/",
reg: /https?:\/\/(avjb\.com|avjb\.fun|av\d{2}\.fun|bav\d{2}\.xyz|bbav\d{3}\.com|onebookcms\.com)\/(\w{2}\/)?albums\/\d+\/[\w-]+\/$/i,
init: () => {
new MutationObserver((mutations, observer) => {
if (fun.ge(".chatra--webkit")) {
fun.ge(".chatra--webkit").remove();
observer.disconnect();
}
}).observe(document.body, {
childList: true,
subtree: true
});
},
imgs: () => {
thumbnailsSrcArray = [...fun.gae(".images>a>img")].map(e => e.dataset.original ? e.dataset.original : e.src);
return [...fun.gae(".images>a")];
},
button: [4],
insertImg: [
[".images", 2], 2
],
go: 1,
customTitle: () => fun.geT(".headline>h1"),
css: ".sponsor,.chatra--webkit{display:none!important}",
category: "nsfw2"
}, {
name: "AVJB 去廣告",
reg: /https?:\/\/(avjb\.com|avjb\.fun|av\d{2}\.fun|bav\d{2}\.xyz|bbav\d{3}\.com|onebookcms\.com)\//i,
init: () => {
new MutationObserver((mutations, observer) => {
if (fun.ge(".chatra--webkit")) {
fun.ge(".chatra--webkit").remove();
observer.disconnect();
}
}).observe(document.body, {
childList: true,
subtree: true
});
},
css: ".sponsor,.chatra--webkit{display:none!important}",
category: "nsfw2"
}, {
name: "Asian To Lick asiantolick.com",
reg: /asiantolick\.com\/post/,
imgs: () => {
thumbnailsSrcArray = [...fun.gae("div[data-src]>img")].map(e => e.src);
return [...fun.gae("div[data-src]")];
},
button: [4],
insertImg: [
["#categoria_tags_post", 1], 2
],
go: 1,
customTitle: () => fun.geT("h1"),
css: "#touch_to_see{display:none!important}",
category: "nsfw2"
}, {
name: "Models Vibe www.modelsvibe.com",
reg: /^https?:\/\/www\.modelsvibe\.com\/[^/]+\/$/,
include: ".td-post-content img",
init: () => {
let ele = fun.ge("//p[br and not(contains(text(),'[ad_1]'))]");
if (ele) {
ele = ele.cloneNode(true);
ele.querySelectorAll("img").forEach(img => {
img.remove();
});
let tE = fun.ge(".td-post-content");
tE.parentNode.insertBefore(ele, tE);
}
let ele2 = fun.ge("//p[contains(text(),'Number of pictures')]");
if (ele2) {
if (ele2.previousSibling.tagName == "P") {
ele2.previousSibling.innerHTML = ele2.previousSibling.innerHTML + "<br>" + ele2.innerText;
let e = ele2.previousSibling;
let te = ele2.previousSibling.parentNode;
te.parentNode.insertBefore(e, te);
}
}
},
imgs: () => {
if (fun.ge(".page-nav")) {
let max = fun.geT(".page-nav>*:last-child", 2);
return fun.getImg(".td-post-content img", max, 4);
} else if (fun.ge(".td-post-content img[srcset]")) {
let srcs = [...fun.gae(".td-post-content img[src]")].map(e => e.src);
let srcsets = [...fun.gae(".td-post-content img[srcset]")].map(img => {
let splitArr = img.getAttribute("srcset").split(",");
splitArr = splitArr.sort((a, b) => a.match(/\s(\d+)w/)[1] - b.match(/\s(\d+)w/)[1]);
return splitArr.pop().trim().split(" ")[0];
});
return [...new Set(srcs.concat(srcsets))];
} else {
return [...fun.gae(".td-post-content img")];
}
},
button: [4],
insertImg: [".td-post-content .tdb-block-inner", 2],
go: 1,
customTitle: () => fun.geT("h1.tdb-title-text"),
css: ".tdb_header_menu .tdb-menu .tdb-mega-menu-inactive,.tdb_header_menu .tdb-menu .tdb-menu-item-inactive{pointer-events:auto!important}.tdb_header_menu .tdb-menu .tdb-mega-menu-inactive > ul,.tdb_header_menu .tdb-menu .tdb-menu-item-inactive>ul{visibility:unset!important;opacity:1!important}.tdb_header_menu .tdb-normal-menu ul .tdb-menu-item{list-style-type:auto!important}",
category: "nsfw1"
}, {
name: "Models Vibe www.modelsvibe.com 分類自動翻頁",
reg: /^https:\/\/www\.modelsvibe\.com\/(albums\/.+)?(page\/\d+\/)?$/,
init: () => {
/page\/\d+\//.test(location.pathname) ? currentPageNum = parseInt(location.pathname.match(/\/page\/(\d+)/)[1], 10) : currentPageNum = 1;
},
autoPager: {
ele: ".td_flex_block:not(.td-flex-radius),.td_block_inner.tdb-block-inner",
observer: ".td-cpt-post",
next: () => {
let url = location.href.replace(/page\/\d+\/?/, "") + `page/${currentPageNum += 1}/`;
return url;
},
re: ".page-nav",
stop: () => fun.ge(".td-404-title", doc) ? true : false,
history: 1,
bF: () => {
[...fun.gae("span[data-img-url]", doc)].forEach(span => {
span.classList.add("td-animation-stack-type0-2");
span.style.backgroundImage = `url('${span.dataset.imgUrl}')`;
});
},
title: () => doc.title.replace(" - Models Vibe", "").replace(/\s-\sPage\s\d+/, "") + ` - Page ${currentPageNum}`
},
openInNewTab: ".td-module-thumb>a:not([target=_blank])",
css: ".tdi_60.td-a-rec{display:none!important;}.tdb_header_menu .tdb-menu .tdb-mega-menu-inactive,.tdb_header_menu .tdb-menu .tdb-menu-item-inactive{pointer-events:auto!important}.tdb_header_menu .tdb-menu .tdb-mega-menu-inactive > ul,.tdb_header_menu .tdb-menu .tdb-menu-item-inactive>ul{visibility:unset!important;opacity:1!important}.tdb_header_menu .tdb-normal-menu ul .tdb-menu-item{list-style-type:auto!important}",
category: "autoPager"
}, {
name: "Models Vibe www.modelsvibe.com 分類自動翻頁",
reg: /^https:\/\/www\.modelsvibe\.com\//,
css: ".tdi_60.td-a-rec{display:none!important;}.tdb_header_menu .tdb-menu .tdb-mega-menu-inactive,.tdb_header_menu .tdb-menu .tdb-menu-item-inactive{pointer-events:auto!important}.tdb_header_menu .tdb-menu .tdb-mega-menu-inactive > ul,.tdb_header_menu .tdb-menu .tdb-menu-item-inactive>ul{visibility:unset!important;opacity:1!important}.tdb_header_menu .tdb-normal-menu ul .tdb-menu-item{list-style-type:auto!important}",
category: "autoPager"
}, {
name: "goddess247.com bestprettygirl.com",
reg: /(goddess247|bestprettygirl)\.com\/.+\//,
imgs: ".elementor-widget-container p img[alt]",
button: [4],
insertImg: ["//p[img]", 2],
go: 1,
customTitle: async () => {
let ele = "#content h1.elementor-heading-title";
await fun.waitEle(ele);
return fun.geT(ele);
},
fancybox: {
v: 3,
css: false
},
category: "nsfw1"
}, {
name: "BestGirlSexy bestgirlsexy.com",
reg: /bestgirlsexy\.com\/.+\//,
imgs: ".elementor-widget-theme-post-content img",
button: [4],
insertImg: ["//p[img]", 2],
go: 1,
customTitle: async () => {
let ele = "#content h1.elementor-heading-title";
await fun.waitEle(ele);
return fun.geT(ele);
},
fancybox: {
v: 3,
css: false
},
category: "nsfw1"
}, {
name: "PhimVu m.phimvuspot.com",
reg: /m\.phimvuspot\.com\/\d+\/\d+\/[\w-]+\.html/,
imgs: ".separator>a",
button: [4],
insertImg: [".post-content", 2],
customTitle: () => fun.geT("h1.post-title").replace(/\s?\(\d+\s?photos(\s?\+\s?\d+\s?videos?)?\)/i, ""),
category: "nsfw1"
}, {
name: "Chinese Nude Art Photos chinesenudeart.blogspot.com",
reg: /^https?:\/\/chinesenudeart\.blogspot\.com\/\d+\/\d+\/[\w-]+\.html/i,
imgs: () => {
thumbnailsSrcArray = [...fun.gae(".entry-content a[href]>img")].map(e => e.src);
return [...fun.gae(".entry-content a[href]")];
},
button: [4],
insertImg: [".entry-content", 2],
autoDownload: [0],
next: "a.blog-pager-older-link",
prev: "a.blog-pager-newer-link",
customTitle: () => fun.geT(".entry-title").trim().replace("Chinese beautiful model Amanda -", "").replace("Beautiful Chinese girl -", "").replace("Beautiful Chinese girl ", "").replace("Chinese Beautiful girl -", "").replace(" |18+ Nude model Amateur", ""),
css: "@media only screen and (max-width:479px){#outer-wrapper{margin:0px!important;width:100%!important}}",
category: "nsfw1"
}, {
name: "CUTE GIRLS ADDICT cutegirlsaddict.blogspot.com",
reg: /cutegirlsaddict\.blogspot\.com\/\d+\/\d+\/[a-z0-9-]+\.html/i,
imgs: async () => {
thumbnailsSrcArray = [...fun.gae(".separator>a>img")].map(e => {
let arr = e.src.split("/");
arr[7] = "w100";
return arr.join("/");
});
let srcArr = [...fun.gae(".separator>a")].map(a => a.href);
let firstSrcArr = srcArr[0].split("/");
if (firstSrcArr.length === 9) {
firstSrcArr[7] = "s16000";
let testMaxSrc = firstSrcArr.join("/");
let obj = await fun.checkImgStatus(testMaxSrc);
debug("\n確認圖片狀態\n", obj);
if (obj.ok) {
srcArr = srcArr.map(src => {
let arr = src.split("/");
arr[7] = "s16000";
return arr.join("/");
});
return srcArr;
} else {
return srcArr;
}
} else {
return srcArr;
}
},
button: [4],
insertImg: [".entry-content", 2],
customTitle: () => fun.geT("h1.post-title,h3.entry-title").trim(),
category: "nsfw1"
}, {
name: "4KUP 4kup.net",
reg: /https:\/\/4kup\.net\/(?!getlink)[^\/]+\/$/,
exclude: "//button[text()='Click here to continue']",
imgs: () => {
thumbnailsSrcArray = [...fun.gae("a.thumb-photo>img")].map(e => e.src);
return [...fun.gae("a.thumb-photo")];
},
button: [4],
insertImg: ["#gallery", 2],
go: 1,
autoDownload: [0],
next: "a[rel=prev]",
prev: "a[rel=next]",
customTitle: () => fun.geT(".entry-title"),
category: "nsfw2"
}, {
name: "Fliporn fliporn.biz",
reg: /fliporn\.biz\/videos\//,
include: "//span[@class='entry-category']/a[text()='亚洲贴图' or text()='写真' or text()='动漫贴图' or text()='性感贴图' or text()='欧美贴图' or text()='网友自拍']",
imgs: () => [...fun.gae(".entry-content img")].map(e => e.dataset.src ? e.dataset.src.replace(/\?w=858(&ssl=1)?/, "") : e.src.replace("%3C/center%3E%3C/p%3E%3Cdiv%20class=", "").replace(/\?w=858(&ssl=1)?/, "")),
button: [4],
insertImg: ["//center[img] | //center[p[img]] | //div[@id='conttpc' and img] | //div[@id='conttpc' and p[img]]", 2],
customTitle: () => document.title.replace(/\s?\[[0-9p\s]+\]|\[\d+P\]/i, "").trim(),
category: "nsfw2"
}, {
name: "91图录 www.91tulu.com",
reg: /^https?:\/\/www\.91tulu\.com\/\d+\.html/,
imgs: ".wp-posts-content img",
button: [4],
insertImg: [".wp-posts-content", 2],
autoDownload: [0],
next: "//a[p[text()='上一篇']]",
prev: "//a[p[text()='下一篇']]",
customTitle: () => fun.geT(".article-title"),
css: ".wp-posts-content{max-height:unset!important}",
category: "nsfw1"
}, {
name: "人妻租借所 jingunav.info",
reg: /jingunav\.info\/index\.php\/artdetail-\d+\.html/,
imgs: ".embed-responsive img",
button: [4],
insertImg: [".embed-responsive", 2],
customTitle: () => fun.title(/ - 貼圖| - 歐美美女/, 1).replace(/【\d+P】\s?\n?/i, "").replace(/\s?完整版無水印寫真/, ""),
css: "body>.wrap{display:none!important}.player img{max-width:100% !important}",
category: "nsfw2"
}, {
name: "ACGN小鎮 www.bbsacgn.com",
reg: /www\.bbsacgn\.com\/archives\/\d+/,
imgs: ".entry-content img",
button: [4],
insertImg: ["//p[img]", 0],
autoDownload: [0],
next: ".entry-page-prev",
prev: ".entry-page-next",
customTitle: () => fun.geT("h1.entry-title"),
fancybox: {
blacklist: 1
},
category: "nsfw1"
}, {
name: "皮皮动漫社 pipidm.top www.pipidm.top",
reg: /pipidm\.top\/\d+\.html/,
imgs: ".content_left img",
button: [4],
insertImg: ["//p[img]", 2],
autoDownload: [0],
next: ".entry-page-prev",
prev: ".entry-page-next",
customTitle: () => fun.geT("h1.entry-title"),
fancybox: {
v: 3,
css: false
},
category: "nsfw1"
}, {
name: "成人图片 Qinimg www.qinimg.com",
reg: /www\.qinimg\.com\/image\/\d+\.html/,
imgs: () => {
thumbnailsSrcArray = [...fun.gae("#image a>img")].map(e => e.getAttribute("img") != "" ? e.getAttribute("img") : e.src);
return [...fun.gae("#image a")];
},
button: [4],
insertImg: [
["#image", 2], 2
],
go: 1,
customTitle: () => fun.geT(".box>h1").replace(/\[\d+P\]/i, "").trim(),
category: "nsfw2"
}, {
name: "零零COS 00cos.com",
reg: /00cos\.com\/\d+\.html/,
exclude: ".tinymce-hide,.fa-info-circle[aria-hidden=true]",
imgs: ".article-content img",
customTitle: () => fun.geT(".article-title>a").replace(/\s?\[\d+P-\d+MB\]|\s\[\d+P\s?\d+V\s?\d+M\]\s?/gi, "").trim(),
category: "nsfw1"
}, {
name: "Elite Babes www.elitebabes.com PmateHunter pmatehunter.com www.jperotica.com www.metarthunter.com www.femjoyhunter.com",
reg: /(www\.)?(elitebabes|pmatehunter|jperotica|metarthunter|femjoyhunter)\.com\/.+\//,
exclude: "#content video",
imgs: () => {
thumbnailsSrcArray = [...fun.gae(".list-gallery a[data-fancybox]>img")].map(e => e.src);
return [...fun.gae(".list-gallery a[data-fancybox]")];
},
button: [4, "23%"],
insertImg: [
[".list-gallery", 2], 2
],
go: 1,
customTitle: () => fun.geT("#content>p"),
fancybox: {
v: 3,
css: false
},
category: "nsfw2"
}, {
name: "Good Sex Porn goodsexporn.org",
reg: /^https?:\/\/goodsexporn\.org\/galleries\/\d+\.html/,
init: () => {
[...fun.gae("#gallery>*:not(#galleryImages)")].forEach(e => {
let x = e.parentNode.parentNode.parentNode.nextElementSibling;
x.parentNode.insertBefore(e, x);
});
},
imgs: () => {
thumbnailsSrcArray = [...fun.gae("#galleryImages>.blockItem img")].map(e => e.dataset.src ? e.dataset.src : e.src).sort((a, b) => a.match(/(\d+)\.\w+$/)[1] - b.match(/(\d+)\.\w+$/)[1]);
return thumbnailsSrcArray.map(e => e.replace("thumbs/", ""));
},
button: [4],
insertImg: [".content", 2],
customTitle: () => fun.geT(".player-title"),
css: "@media only screen and (max-width:450px){.related-block .block .blockItem.blockItemBox{width:120px !important}.block .blockItem{display:inline-block !important}}",
category: "nsfw2"
}, {
name: "R18hub https://r18hub.com/photos",
reg: /^https:\/\/r18hub\.com\/photo\/[\w-]+/,
imgs: () => {
thumbnailsSrcArray = [...fun.gae("#photos>li")].map(e => e.dataset.thumb);
return [...fun.gae("#photos>li")].map(e => e.dataset.src);
},
button: [4],
insertImg: ["#photos", 2],
customTitle: () => fun.title(" - R18hub"),
category: "nsfw2"
}, {
name: "FreeXcafe www.freexcafe.com",
reg: /www\.freexcafe\.com\/erotica\/[\w-]+\/[\w-]+\/index\.php/,
imgs: () => {
thumbnailsSrcArray = [...fun.gae(".thumbs>a>img")].map(e => e.src);
return fun.getImgA("#imagelink>img", ".thumbs>a", 500);
},
button: [4],
insertImg: [
["#content>*:last-child", 2], 2
],
go: 1,
category: "nsfw2"
}, {
name: "EPORNER Photo www.eporner.com/profile/namaiki/ www.eporner.com/profile/janekhansen/",
reg: /\w{2,3}\.eporner\.com\/gallery\/.+\//,
imgs: () => {
thumbnailsSrcArray = [...fun.gae("#container img")].map(e => e.src);
return thumbnailsSrcArray.map(e => e.replace("_296x1000", ""));
},
button: [4],
insertImg: [
[".photosgrid", 2], 2
],
go: 1,
customTitle: () => fun.geT("#galleryheader>h1"),
css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}",
category: "nsfw2"
}, {
name: "Xasiat www.xasiat.com/albums/ https://www.xasiat.com/albums/3346/sidam-yeeun-vol-001-event/",
reg: /www\.xasiat\.com\/([\w]{2}\/)?albums\/\d+\/[\w-]+\//i,
init: () => {
[...fun.gae("img.thumb[data-original]")].forEach(img => {
img.src = img.dataset.original;
});
fun.remove(".sponsor,.footer-margin");
},
imgs: () => {
thumbnailsSrcArray = [...fun.gae(".images>a>img[data-original]")].map(e => e.dataset.original ? e.dataset.original : e.src);
return [...fun.gae(".images>a")];
},
button: [4],
insertImg: [
[".album-holder", 2], 2
],
go: 1,
customTitle: () => fun.geT(".headline>h1"),
css: ".block-album{display:block!important}.block-album>.table,.top,.footer~*:not([id^='pv-']):not([class^='pv-']):not(.pagetual_tipsWords):not(#comicRead):not(#fab):not(.FullPictureLoadMsg):not(.FullPictureLoadFixedBtn):not(#FullPictureLoadOptions):not(*[class^=fancybox]){display:none!important}",
category: "nsfw2"
}, {
name: "Xasiat loadMore www.xasiat.com/albums/",
reg: /www\.xasiat\.com\/albums\//,
icon: 0,
key: 0,
include: "#list_albums_common_albums_list_pagination",
init: () => {
setInterval(() => {
fun.remove("//div[iframe] | //iframe");
if (document.body.getAttribute("class").length > 13) {
document.body.setAttribute("class", "big-container");
}
}, 500);
},
observerClick: ".load-more>a",
category: "nsfw2"
}, {
name: "Xasiat https://www.xasiat.com/albums/",
reg: /(www\.xasiat\.com\/albums\/$|www\.xasiat\.com\/albums\/categories\/)/,
icon: 0,
key: 0,
init: () => {
[...fun.gae("img.thumb[data-original]")].forEach(img => {
img.src = img.dataset.original;
});
fun.remove(".footer~*", 2000);
},
css: ".footer~*{display:none!important}",
category: "nsfw2"
}, {
name: "xHamster gallery xhamster.com/users/eros721_official/photos",
reg: /xhamster\.com\/photos\/gallery\/[^/]+$/,
include: ".gallery-section",
imgs: async () => {
await fun.getNP(".photo-thumb", "//div[@class='gallery-section']//li[a[contains(@class,'active')]]/following-sibling::li[1]/a", null, ".gallery-section .pager-section");
thumbnailsSrcArray = [...fun.gae("div.image-thumb[data-lazy]")].map(e => e.dataset.lazy);
[...fun.gae(".photo-thumb")].forEach(ele => {
let width, height;
if (parseInt(ele.dataset.w, 10) > parseInt(ele.dataset.h, 10)) {
width = 374;
height = 251;
} else {
width = 168;
height = 251;
}
ele.style = `margin-right:10px;width:${width}px;height:${height}px;display:block;`;
fun.ge(".dots-loader", ele).remove();
let thumb = fun.ge(".image-thumb", ele);
thumb.style.backgroundImage = `url('${thumb.dataset.lazy}')`;
});
let links = [...fun.gae("a.photo-thumb")].map(a => a.href);
let resArr = [];
let fetchNum = 0;
for (let i = 0; i < links.length; i += 3) {
let res = fun.fetchDoc(links[i]).then(doc => {
fun.show(`${displayLanguage.str_06}${fetchNum+=1}/${Math.ceil(links.length/3)}`, 0);
let items = JSON.parse(fun.ge("#initials-script", doc).innerHTML.replace(/window.initials=|;/g, "")).photosGalleryModel.photos.items;
return items;
});
resArr.push(res);
await fun.delay(300, 0);
}
let imageURLs = await Promise.all(resArr).then(data => {
fun.hide();
return data.flat().map(e => e.imageURL);
});
return [...new Set(imageURLs)];
/*
const callback = async n => {
let resArr = [];
let fetchNum = 0;
for (let i = n; i < links.length; i += 16) {
let res = fun.fetchDoc(links[i]).then(doc => {
fun.show(`${displayLanguage.str_06}${fetchNum+=1}/${Math.ceil(links.length/16)}`, 0);
let items = JSON.parse(fun.ge("#initials-script", doc).innerHTML.replace(/window.initials=|;/g, "")).photosGalleryModel.photos.items;
return items;
});
resArr.push(res);
await fun.delay(300, 0);
}
let imageURLs = await Promise.all(resArr).then(data => {
fun.hide();
return data.flat().map(e => e.imageURL);
});
debug(`\n起始為第${parseInt(n, 10) + 1}張圖片的imageURLs\n`, imageURLs);
debug(`\n起始為第${parseInt(n, 10) + 1}張圖片去重複後的imageURLs\n`, [...new Set(imageURLs)]);
return imageURLs;
};
for (let i = 0; i <= 16; i++) {
if (i == 16) {
return [];
}
let images = await callback(i);
if (parseInt(images.length, 10) === parseInt(fun.geT(".page-title__count"), 10)) {
return images;
} else if (parseInt(images.length, 10) < 16) {
console.clear();
let one = await callback(0);
let concat = one.concat(images);
debug(`\n起始為第${parseInt(i, 10) + 1}張圖片的imageURLs\n`, images);
debug(`\n起始為第${parseInt(i, 10) + 1}張圖片並合併起始為1的imageURLs\n`, concat);
debug(`\n合併後去重複的imageURLs\n`, [...new Set(concat)]);
return concat;
} else {
fun.show("圖片數量不正確重新獲取", 1900);
await fun.delay(2000, 0);
}
}
return [];
*/
},
init: "fun.remove('.mixed-list>.flex-element')",
button: [4],
insertImg: [
["main>article", 2], 2
],
go: 1,
customTitle: () => fun.geT(".page-title h1"),
css: "div[data-role=promo-messages-wrapper]{display:none!important}",
category: "nsfw2"
}, {
name: "xHamsterM gallery xhamster.com/users/eros721_official/photos",
reg: /xhamster\.com\/photos\/gallery\/[^/]+$/,
imgs: async () => {
await fun.getNP(".items[data-role='gallery-photos']>.item-container", "//ol[@class='page-list']/li[@class='page-button' and a[@class='page-button-link page-button-link--active']]/following-sibling::li[1]/a", null, "//ol[@class='page-list']");
return fun.getImgA("#photoCurr", "a.item.slided", 1, [null, null], 0);
},
button: [4],
insertImg: [".items[data-role=gallery-photos]", 1],
customTitle: () => fun.geT("h1.page-title"),
css: ".items[data-role=gallery-photos]>.item-container{width:100%!important}aside[data-role=yld-mdtop],.yld-md--bottom,.yld-pc--bottom,aside[data-role=yld-pctop],div[data-role=promo-messages-wrapper]{display:none!important}",
category: "nsfw2"
}, {
name: "PornHub photo pornhub.com/albums", //很容易會被短暫封IP
enable: 1,
reg: /pornhub\.com\/album\/\d+/,
imgs: () => fun.getImgA("#photoImageSection img", ".js_lazy_bkg a", 200),
button: [4],
insertImg: [
[".photoBlockBox .clear", 1], 1
],
go: 1,
customTitle: () => fun.geT(".photoAlbumTitleV2").trim(),
category: "nsfw2"
}, {
name: "BITCHES GIRLS bitchesgirls.com",
reg: /https:\/\/bitchesgirls\.com\/[^\/]+\/[^\/]+\/[^\/]+\/$/,
init: async () => {
await fun.getNP(".albumgrid a,.popup-element", "a#loadMore");
},
imgs: () => {
const selector = "script[type='application/ld+json']";
const getUrls = (ele, doc) => {
let text = fun.ge(ele, doc).innerText;
let thumbnailUrls = text.match(/"thumbnailUrl":\s?"[^"]+/g).map(e => e.replace(/"thumbnailUrl":\s?"/, "")).filter(e => !/\/logos\//.test(e));
thumbnailsSrcArray = thumbnailsSrcArray.concat(thumbnailUrls);
let urls = text.match(/"url":\s?"[^"]+/g).map(e => e.replace(/"url":\s?"/, ""));
return urls.filter(e => !/\/logos\//.test(e));
}
const max = adConstants.pagesAmount;
if (max > 1) {
let links = [];
links.push(siteUrl);
for (let i = 2; i <= max; i++) {
links.push(siteUrl + `${i}/`);
}
let resArr = [];
let fetchNum = 0;
for (let i = 0; i < links.length; i++) {
let res = fun.fetchDoc(links[i]).then(doc => {
fun.show(`${displayLanguage.str_06}${fetchNum+=1}/${max}`, 0);
return getUrls(selector, doc);
});
resArr.push(res);
}
return Promise.all(resArr).then(data => {
fun.hide();
return data.flat();
});
} else {
return getUrls(selector, document);
}
},
repeat: 1,
button: [4],
insertImg: [
[".button-container", 2], 2
],
go: 1,
css: "a#loadMore{display:none!important}",
category: "nsfw2"
}, {
name: "EroMe www.erome.com",
reg: /^https:\/\/www\.erome\.com\/a\/\w+$/i,
imgs: "div[data-src],.img>img[data-src]",
customTitle: () => fun.geT(".page-content h1"),
category: "nsfw2"
}, {
name: "DirtyChicks dirtychicks.net",
reg: /^https:\/\/dirtychicks\.net\/gallery\/[^\/]+\/$/i,
imgs: () => [...fun.gae("#album img")].map(e => e.src.replace(/-\d+x\d+./, ".")),
button: [4],
insertImg: [".gallery_grid", 2],
customTitle: () => fun.title(" - DirtyChicks"),
category: "nsfw2"
}, {
name: "Amateur Likes amateurlikes.com",
reg: /^https:\/\/amateurlikes\.com\/n\/[^\/]+\/\d+$/i,
imgs: "#gallery img",
button: [4],
insertImg: ["#gallery .masonry", 2],
customTitle: () => fun.geT(".full_h1").replace(/\([\d\s]+Photos\)/i, "").trim(),
css: "#gallery .masonry{display:block!important}",
category: "nsfw2"
}, {
name: "Nakedsex nakedsex.pics",
reg: /^https:\/\/nakedsex\.pics\/.+\.php$/i,
imgs: ".gallerycontent a",
button: [4],
insertImg: [
[".tags", 2], 2
],
go: 1,
customTitle: () => fun.title(" - Best adult videos and photos"),
css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}",
category: "nsfw2"
}, {
name: "Onlyfans Leaks topleaks.net",
reg: /^https:\/\/topleaks\.net\/[^\/]+\/$/i,
imgs: () => [...fun.gae(".entry-content img")].map(e => e.src.replace(/-\d+x\d+./, ".")),
customTitle: () => fun.geT(".entry-title"),
category: "nsfw2"
}, {
name: "ThotHub Leaks thothub.vip",
reg: /^https:\/\/thothub\.vip\/[^\/]+\/$/i,
imgs: ".entry-content img",
customTitle: () => fun.geT(".entry-title").replace(/\([\d\s]+Photos\)/i, "").trim(),
category: "nsfw2"
}, {
name: "MrDeepFakes mrdeepfakes.com",
reg: /https?:\/\/mrdeepfakes\.com\/photo\/\d+\//,
imgs: "a[data-fancybox-type=image]",
button: [4],
insertImg: [
[".info-holder", 2], 1
],
customTitle: () => fun.geT(".headline>h1"),
go: 1,
category: "nsfw2"
}, {
name: "PicHunter www.pichunter.com",
reg: /www\.pichunter\.com\/gallery\/\d+\/.+/,
imgs: () => {
thumbnailsSrcArray = [...fun.gae(".flex-images figure>a>img")].map(e => e.getAttribute("xs"));
return [...fun.gae(".flex-images figure>a")];
},
button: [4],
insertImg: [
[".flex-images", 2], 1
],
go: 1,
customTitle: () => fun.geT("h1"),
category: "nsfw2"
}, {
name: "Pictoa www.pictoa.com",
reg: /www\.pictoa\.com\/(thumbs|albums)\/.+\.html/i,
imgs: () => {
thumbnailsSrcArray = [...fun.gae(".thumb-nav-img img")].map(e => e.dataset.src);
return fun.getImgA("#player img", ".thumb-nav-img a");
},
button: [4],
insertImg: ["#player", 2],
customTitle: () => fun.geT(".title>h1"),
css: "#gallery #player{cursor:unset!important}",
category: "nsfw2"
}, {
name: "PimpAndHost https://pimpandhost.com/site/trending",
reg: /pimpandhost\.com\/(image|album)\/\d+/,
init: () => {
if (/image/.test(location.href)) location.href = fun.ge('a[title=Album]').href;
fun.remove(".flex-block-1,.flex-block-2,#comments,.ano_po");
},
imgs: async () => {
await fun.getNP("#album-images>.image-block", "li.active+li:not(.next)>a", null, ".pagination");
return [...fun.gae("#album-images .image-block a[data-src]")];
},
button: [4, "18%"],
insertImg: [
[".summary", 2], 2
],
go: 1,
customTitle: () => fun.geT(".author-header__album-name"),
category: "nsfw2"
}, {
name: "PimpAndHost 隱藏廣告",
reg: /pimpandhost\.com\//,
icon: 0,
key: 0,
init: "fun.remove('.flex-block-1,.flex-block-2,#comments,.ano_po')",
css: ".list-view:not(#main-list-view) .item:not(.image-block){display:none!important}",
category: "nsfw2"
}, {
name: "BabeSource babesource.com",
reg: /babesource\.com\/galleries\/.+\.html/i,
imgs: ".box-massage__card-link",
button: [4],
insertImg: [
[".albaums-box", 1], 2
],
go: 1,
customTitle: () => fun.title("|", 1),
category: "nsfw2"
}, {
name: "Pornpaw 圖片清單頁 www.pornpaw.com",
reg: /www\.pornpaw\.com\/gallery\/[\w-]+\.html/i,
delay: 500,
imgs: () => {
thumbnailsSrcArray = [...fun.gae("img[data-src]")].map(e => e.dataset.src);
return [...fun.gae("img[data-src]")].map(e => e.dataset.src.replace("x160.", "."));
},
button: [4],
insertImg: [
[".container>.row", 2], 2
],
go: 1,
customTitle: () => fun.geT("h1"),
category: "nsfw2"
}, {
name: "ImageFap 圖片清單頁 www.imagefap.com https://www.imagefap.com/pictures/11084503/SIDAM%20Son%20Ye-Eun%20Vol.001%20Event",
reg: /www\.imagefap\.com\/(gallery|pictures)\/\d+/i,
icon: 0,
key: 0,
init: () => {
fun.getNP('//tr[td[@id]]', 'b+a.link3', null, '#gallery>font>span');
},
category: "nsfw2"
}, {
name: "ImageFap www.imagefap.com",
reg: /www\.imagefap\.com\/photo\/\d+\//i,
imgs: async () => {
let max = fun.ge("div[data-total]").dataset.total;
await fun.waitEle(".image-wrapper img");
let arr = [];
arr.push(fun.ge(".image-wrapper img").cloneNode(true));
fun.show(`${displayLanguage.str_02}1/${max}`, 0);
let n = 1;
for (let i = 1; i < max; i++) {
fun.ge("a.next[title=Next]").click();
await fun.delay(1000, 0);
if (await fun.waitEle(".image-wrapper img")) {
arr.push(fun.ge(".image-wrapper img").cloneNode(true));
fun.show(`${displayLanguage.str_02}${n+=1}/${max}`, 0);
}
}
fun.hide();
return arr;
},
button: [4],
insertImg: [".mainouter", 1],
customTitle: () => fun.geT("#main h1"),
category: "nsfw2"
}, {
name: "fuskator.com 圖片清單頁",
reg: /fuskator\.com\/thumbs\/[\w-~]+\/[\w-~]+\.html/i,
imgs: async () => {
fun.show(displayLanguage.str_04, 0);
await fun.waitEle(".pic_pad");
fun.hide();
thumbnailsSrcArray = [...fun.gae("#thumbimages a>img,.swipebox a>img")].map(e => e.src);
return [...fun.gae("#thumbimages a,.swipebox a")];
},
insertImg: [
["//a[text()='View full images']", 2], 2
],
go: 1,
//customTitle: "return fun.geT('#info+h1')",
category: "nsfw2"
}, {
name: "fuskator.com 大圖頁",
reg: /^https:\/\/fuskator\.com\//i,
include: "//a[text()='View gallery thumbnails']",
imgs: "img.full",
insertImg: ["#fullimages", 2, 1000],
category: "nsfw2"
}, {
name: "TOKYO Motion www.tokyomotion.net",
reg: /^https:\/\/www\.tokyomotion\.net\/album\/\d+\/.+/,
imgs: async () => {
await fun.getNP("div[id^=album_photo]", ".pagination li.active+li>a", null, ".pagination");
thumbnailsSrcArray = [...fun.gae(".thumb-overlay img")].map(e => e.src);
return thumbnailsSrcArray.map(e => e.replace("tmb/", ""));
},
button: [4],
insertImg: [
["//div[div[div[contains(@id,'album_photo')]]]", 0], 2
],
go: 1,
customTitle: () => [...fun.gae(".pull-left")][2].innerText.trim(),
category: "nsfw2"
}, {
name: "javbangers.com",
reg: /www\.javbangers\.com\/albums\/.+/,
imgs: async () => {
thumbnailsSrcArray = [...fun.gae(".images img")].map(e => e.dataset.original ? e.dataset.original : e.src);
return [...fun.gae(".images a")];
},
button: [4],
insertImg: [
[".album-info", 2], 2
],
go: 1,
customTitle: () => fun.geT(".headline>h1").trim(),
category: "nsfw2"
}, {
name: "multi.xnxx.com",
reg: /multi\.xnxx\.com\/gallery\/.+/,
imgs: ".galleryPage .boxImg",
button: [4],
insertImg: [
[".originalLink", 2], 1
],
go: 1,
category: "nsfw2"
}, {
name: "色情圖片網 www.photos18.com",
reg: /www\.photos18\.com\/(\w+-hans\/)?\w+\/\w+/i,
imgs: ".imgHolder a[data-fancybox]",
button: [4],
insertImg: ["#content", 1],
customTitle: () => fun.geT("h1.title").replace(/\d+P|\s?\(\d+P\)/i, ""),
fancybox: {
v: 3,
css: false
},
category: "nsfw2"
}, {
name: "GavPorn 相冊 https://cav103.com/albums/",
reg: /cav\d+\.com\/albums\/\d+\/\w+\//,
imgs: "a[data-fancybox-type]",
button: [4],
insertImg: [".sponsor", 2],
customTitle: () => fun.geT(".headline>h1"),
css: ".top{display:none!important}",
category: "nsfw2"
}, {
name: "BuzzAV www.buzzav.com",
reg: /old\.buzzav\.com\/album\/\d+\//,
imgs: async () => {
await fun.getNP("//div[a[div[img[contains(@id,'album_photo')]]]]", ".pagination li.active+li>a", null, ".d-sm-block>.pagination");
return [...fun.gae("[id^=album_photo]")].map(e => e.src.replace("tmb/", ""));
},
button: [4],
insertImg: [
[".well-info+.content-row", 2], 1
],
go: 1,
//customTitle: "return fun.geT('.box>h1').replace(/\\[\\d+P\\]/i,'').trim();",
//css: ".well-info+.content-row{display: block!important;}#FullPictureLoadEnd{color:rgb(255, 255, 255)}",
css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}",
category: "nsfw2"
}, {
name: "Hentai Image hentai-img.com hentai-cosplays.com porn-images-xxx.com porn-gravure-idol.com",
reg: /(hentai-img|hentai-cosplays|porn-images-xxx|porn-gravure-idol)\.com\/image\/[^/]+\//,
include: "//a[text()='DETAIL PAGE' or text()='DETAIL HALAMAN' or text()='詳細へ' or text()='详细信息页面' or text()='Страница сведений' or text()='상세 페이지' or text()='página de detalles' or text()='หน้ารายละเอียด' or text()='TRANG CHI TIẾT']",
imgs: async () => {
let max = document.title.split("/").pop().match(/\d+/)[0];
let links = [];
let url = siteUrl.replace(/\/\d+\/$/, "");
for (let i = 1; i <= max; i++) {
links.push(url + `/${i}/`);
}
thumbnailsSrcArray = await fun.getImgA("#display_image_detail a,#detail_list a", links, 100);
thumbnailsSrcArray = thumbnailsSrcArray.map(e => {
let arr = e.split("/");
arr[arr.length - 2] = "p=305";
return arr.join("/");
});
return thumbnailsSrcArray.map(e => e.replace(/\/p=(700|305)/, ""));
/*
let max = document.title.split("/").pop().match(/\d+/)[0];
let srcs = [];
let mode = location.href.split("/").slice(0, -1).pop();
let firstSrc = fun.ge("#display_image_detail a,#detail_list a").href;
let path = firstSrc.replace(/(image-)?\d+\.\w+$/i, "");
for (let i = 1; i <= max; i++) {
if (/image/.test(mode)) {
srcs.push(path + "image-" + String(i).padStart(3, "0") + ".jpg");
} else {
srcs.push(path + i + ".jpg");
}
}
return srcs;
*/
},
button: [4],
insertImg: ["#display_image_detail,#detail_list", 2],
customTitle: () => fun.geT("#title>h2,#page h3").replace(/\s?Photo\s?\d+P|\s?-\s?\d+\/\d+\s?|\([0-9\s]+ảnh\)/i, "").trim(),
css: "#display_image_detail img{max-width:100% !important}",
category: "nsfw2"
}, {
name: "Hentai Image hentai-img.com hentai-cosplays.com porn-images-xxx.com porn-gravure-idol.com",
reg: /(hentai-img|hentai-cosplays|porn-images-xxx|porn-gravure-idol)\.com\/image\/[^/]+\/(page\/\d+\/)?$/,
init: () => {
let ele = fun.ge("//div[span[a]]");
if (ele) {
let tE = fun.ge("#display_image_detail,#detail_list");
tE.parentNode.insertBefore(ele, tE);
}
},
imgs: async () => {
let max = fun.geT("#paginator>*:last-child", 3) || fun.geT(".paginator_page[rel=next]", 2) || 1;
let links = [];
let url = siteUrl.replace(/page\/\d+\/$/, "");
for (let i = 1; i <= max; i++) {
links.push(url + `page/${i}/`);
}
thumbnailsSrcArray = await fun.getImgA(".icon-overlay img,#display_image_detail img", links, 100);
thumbnailsSrcArray = thumbnailsSrcArray.map(e => {
let arr = e.split("/");
arr[arr.length - 2] = "p=305";
return arr.join("/");
});
return thumbnailsSrcArray.map(e => e.replace(/\/p=(700|305)/, ""));
/*
let currentName = location.href.split("/")[4];
let last;
try {
last = fun.ge(".paginator_page[rel=next]").previousElementSibling;
} catch (e) {
last = fun.ge("#paginator>*:last-child>a");
}
let lastUrl;
try {
lastUrl = last.href;
} catch (e) {
return [...fun.gae(".icon-overlay img,#display_image_detail img")].map(e => e.src.replace(/\/p=(700|305)/, ""));
}
debug("\nlastURL\n", lastUrl);
let lastUrlName = lastUrl.split("/")[4];
if (last && currentName === lastUrlName) {
let srcs = [];
fun.show(displayLanguage.str_09, 0);
let timeId = setTimeout(() => {
location.reload();
}, 30000);
let lastFileName = await fun.fetchDoc(lastUrl).then(doc => {
clearTimeout(timeId);
let ele = [...fun.gae(".icon-overlay img,#display_image_detail img", doc)].pop();
let fileName = ele.src.match(/.+\/(.+)/)[1];
return fileName;
});
fun.hide();
let max = parseInt(lastFileName.match(/\d+/)[0], 10);
let path = fun.ge(".icon-overlay img,#display_image_detail img").src.match(/.+\//)[0].replace(/\/p=\d+\//, "/");
for (let i = 1; i <= max; i++) {
if (/image/.test(lastFileName)) {
srcs.push(path + "image-" + String(i).padStart(3, "0") + ".jpg");
} else {
srcs.push(path + i + ".jpg");
}
}
return srcs;
} else {
return [...fun.gae(".icon-overlay img,#display_image_detail img")].map(e => e.src.replace(/\/p=(700|305)/, ""));
}
*/
},
button: [4],
insertImg: ["#display_image_detail,#detail_list", 2],
autoDownload: [0],
next: () => {
let next = fun.ge("//a[text()='Prev Article' or text()='前の記事' or text()='前一篇']");
return next ? next.href : null;
},
prev: "//a[text()='Next Article' or text()='次の記事' or text()='下一篇文章']",
customTitle: () => fun.geT("#title>h2,#page h3").replace(/\s?Photo\s?\d+P|\s?-\s?\d+\/\d+\s?|\([0-9\s]+ảnh\)/i, "").trim(),
css: "#display_image_detail img{max-width:100% !important}",
category: "nsfw2"
}, {
name: "Hentai Cosplay www.hentaicos.com",
reg: /https:\/\/www\.hentaicos\.com\/\w+\/\d+\.html/,
include: ".main-picture",
imgs: () => {
let max = fun.geT("//a[text()='Next']", 2) || 1;
return fun.getImg(".main-picture img", max, 9);
},
button: [4],
insertImg: [".main-picture", 2],
next: ".next_pics>.fr>a",
prev: ".next_pics>.fl>a",
customTitle: () => fun.geT(".content-title"),
category: "nsfw1"
}, {
name: "Fapator 圖片清單頁",
reg: /www\.fapator\.com\/\?content_id=/i,
init: () => {
fun.remove("//div[@class='img' and a[@target and img]]");
},
imgs: () => {
thumbnailsSrcArray = [...fun.gae("a[data-lightbox]>img")].map(e => e.src);
return [...fun.gae("a[data-lightbox]")];
},
button: [4],
insertImg: [".fcon+.fapad", 1],
next: "//a[contains(text(),'next photos')]",
prev: 1,
go: 1,
css: ".fapad{width:auto !important;height:auto !important}",
category: "nsfw2"
}, {
name: "SMUTPOND www.smutpond.com",
reg: /www\.smutpond\.com\/gallery-pics\/\?uid=/i,
imgs: () => {
thumbnailsSrcArray = [...new Set([...fun.gae(".viewerPreview img")].slice(5).map(e => e.dataset.lazy ? e.dataset.lazy : e.src))]
return [...fun.gae("img[alt=Pic]")];
},
button: [4],
insertImg: [".viewerBox", 2],
customTitle: async () => {
await fun.delay(2000, 0);
return fun.geT("h2.sectionTitleLeft");
},
fancybox: {
v: 3,
css: false
},
category: "nsfw2"
}, {
name: "SexyGirlsPics sexygirlspics.com",
reg: /sexygirlspics\.com\/pics\/[\w-]+\//i,
imgs: () => {
thumbnailsSrcArray = [...fun.gae("a.ss-image>img")].map(e => e.src);
return [...fun.gae("a.ss-image")];
},
button: [4],
insertImg: [
[".sponsor-button", 2], 1
],
go: 1,
category: "nsfw2"
}, {
name: "PornPic www.pornpic.com",
reg: /www\.pornpic\.com\/gallery\/[\w-]+/i,
imgs: () => {
thumbnailsSrcArray = [...fun.gae(".gallery-grid a.item-link img")].map(e => e.src);
return [...fun.gae(".gallery-grid a.item-link")];
},
button: [4],
insertImg: [
[".gallery-info", 2], 1
],
go: 1,
fancybox: {
v: 3,
css: false
},
category: "nsfw2"
}, {
name: "Girlsreleased 載入更多",
icon: 0,
key: 0,
delay: 1000,
reg: /girlsreleased\.com\//,
include: "//button[text()='more']",
observerClick: "//button[text()='more']",
openInNewTab: ".content .main a",
category: "nsfw2"
}, {
name: "Girlsreleased",
reg: /girlsreleased\.com\/set\/\d+/,
imgs: async () => {
let ele = ".images .imageContainer .image img";
await fun.waitEle(ele);
thumbnailsSrcArray = [...fun.gae(".images .imageContainer .image img")].map(e => e.src);
let src = fun.ge(ele).src;
let images = [...fun.gae(ele)];
if (/imx\.to/.test(src)) {
let tempSrc = src.replace("https://imx.to/u/t/", "https://i.imx.to/i/");
return new Promise(async resolve => {
let obj = await fun.checkImgStatus(tempSrc);
if (obj.ok && obj.width > 200) {
resolve(images.map(e => e.src.replace("https://imx.to/u/t/", "https://i.imx.to/i/")));
} else {
resolve(images.map(e => e.src.replace("/t/", "/i/")));
}
});
} else if (/imgadult\.com/.test(src)) {
return images.map(e => e.src.replace("small-medium/", "big/"));
} else if (/pixhost\.to/.test(src)) {
return images.map(e => e.src.replace("https://t", "https://img").replace("/thumbs/", "/images/"));
} else {
return [];
}
},
button: [4],
insertImg: [
[".images", 2], 2
],
go: 1,
referer: "src",
category: "nsfw2"
}, {
name: "Eropics eropics.to eropics.co",
reg: /eropics\.\w+\/\d+\/\d+\/\d+\//i,
include: "a[href*='pixhost.to'],a[href*='www.turboimagehost.com'],a[href*='imgbox.com'],a[href*='www.imagevenue.com']",
imgs: () => {
if (fun.gae("a[href*='imx.to']").length > 3) {
let yes = confirm(displayLanguage.str_10);
if (yes) {
let arr = [...fun.gae(".entry-content a")].map(a => a.href);
let str = arr.join("\n");
console.log(str);
copyToClipboard(str);
fun.show(displayLanguage.str_11);
}
return [];
}
let links = [...fun.gae(".entry-content a:not([href*='imx.to'])")].map(a => a.href);
let resArr = [];
let xhrNum = 0;
for (let i = 0; i < links.length; i++) {
let res = fun.xhr(links[i], "document").then(doc => {
fun.show(`${displayLanguage.str_02}${xhrNum+=1}/${links.length}`, 0);
return fun.ge("#image,.pic.img.img-responsive,#imageid,#img.image-content,.card-body img", doc);
});
resArr.push(res);
}
return Promise.all(resArr).then(arr => {
fun.hide();
return arr;
});
},
button: [4],
insertImg: [
[".entry-footer", 2], 2
],
go: 1,
referer: "src",
customTitle: () => fun.geT("h1.entry-title"),
category: "nsfw2"
}, {
name: "Eropics",
reg: /eropics\.to\/\d+\/\d+\/\d+\//i,
include: "a[href*='imx.to']",
init: () => {
fun.show(displayLanguage.str_12, 5000);
},
imgs: ".entry-content p>a",
category: "nsfw2"
}, {
name: "imx.to gallery",
reg: /https?:\/\/imx\.to\/g\/\w+$/i,
imgs: () => [...fun.gae("img.imgtooltip")].map(e => e.src.replace("/u/t/", "/u/i/")),
button: [4],
insertImg: [
["#content", 2], 2
],
go: 1,
category: "nsfw2"
}, {
name: "imx.to",
reg: /https?:\/\/imx\.to\/i\/\w+$/i,
icon: 0,
key: 0,
autoClick: ".button.blue.large,#continuebutton,a[title='Show gallery']",
category: "nsfw2"
}, {
name: "ShowGirlx showgirlx.net",
reg: /https?:\/\/showgirlx\.net\/[^/]+\/(\d+\/)?$/,
init: "Function.prototype.constructor=()=>{}",
imgs: () => {
return [...fun.gae(".wp-block-gallery img")].map(img => {
let srcset = img.getAttribute("srcset");
if (srcset) {
let splitArr = srcset.split(",");
splitArr = splitArr.sort((a, b) => a.match(/\s(\d+)w/)[1] - b.match(/\s(\d+)w/)[1]);
return splitArr.pop().trim().split(" ")[0];
} else {
return img.src;
}
});
},
button: [4],
insertImg: [
[".penci-single-link-pages", 2], 2
],
go: 1,
category: "nsfw2"
}, {
name: "Ngắm Gái Xinh ngamgaixinh.us album",
reg: /ngamgaixinh\.\w+\/album\/.+/,
imgs: () => [...fun.gae(".list-item-image img")].map(img => img.src.replace(/\.(th|md)\./, ".")),
button: [4],
insertImg: [
[".pad-content-listing", 2], 2
],
go: 1,
category: "nsfw2"
}, {
name: "Degoo Cloud app.degoo.com",
reg: /^https?:\/\/app\.degoo\.com\/share\//,
imgs: async () => {
let max = prompt(displayLanguage.str_13, "100");
let img = ".preview-media .hidden";
await fun.waitEle(img);
let arr = [];
arr.push(fun.ge(img).cloneNode(true));
fun.show(`${displayLanguage.str_02}1/${max}`, 0);
let n = 1;
for (let i = 1; i < max; i++) {
fun.ge("#nextFileButton").click();
await fun.delay(200, 0);
if (await fun.waitEle(img)) {
arr.push(fun.ge(img).cloneNode(true));
fun.show(`${displayLanguage.str_02}${n+=1}/${max}`, 0);
}
}
fun.hide();
arr = arr.map(e => e.src);
return [...new Set(arr)];
},
category: "nsfw2"
}, {
name: "xher.net",
reg: /xher\.net\/index\.php\?\/category\/\d+$/i,
imgs: async () => {
await fun.getNP("#thumbnails>li", ".pageNumberSelected+a", null, ".navigationBar");
return [...fun.gae("#thumbnails img")].map(e => e.src.replace("_data/i/", "").replace(/-(2s|xs|sm||me|la|xl)\./, "."));
},
button: [4],
insertImg: [
[".navigationBar", 2], 2
],
go: 1,
category: "nsfw2"
}, {
name: "Bunkr bunkrr.su",
reg: /^https:\/\/bunkrr\.su\/a\/\w+/i,
imgs: () => {
return fun.getImgA(".lightgallery img", "a[href^='/i/']");
},
button: [4],
insertImg: [
[".grid-images", 2], 2
],
go: 1,
customTitle: () => fun.geT("h1"),
category: "nsfw2"
}, {
name: "Bunkr bunkr-albums.io 列表自動翻頁",
reg: /^https:\/\/bunkr-albums\.io\//,
autoPager: {
ele: ".table-auto>tbody",
next: "a.bg-gray-300+a",
re: ".justify-center",
observer: ".table-auto>tbody",
history: 1,
title: () => "Page " + fun.ge("a.bg-gray-300", doc).innerText
},
category: "autoPager"
}, {
name: "girlgirlgo.org girlgirlgo.net girlgirlgo.top girlgirlgo.icu girlgirlgo.biz girlygirlpic.com",
reg: /https?:\/\/\w{2}\.(girlgirlgo|girlygirlpic)\.(org|net|icu|com|biz|top)\/a\/\w+/,
imgs: ".figure-link",
button: [4],
insertImg: [".post-media-body", 2],
next: async () => {
await fun.waitEle("a[rel=next]", 30);
let next = fun.ge("a[rel=next]");
return next ? next.href : null;
},
prev: "a[rel=prev]",
customTitle: async () => {
await fun.waitEle(".figure-link");
return fun.geT(".entry-title a").split(" No.")[0].trim();
},
category: "nsfw1"
}, {
name: "QGirlz qgirlz.com CuteLadyPic cuteladypic.com",
reg: /https?:\/\/(\w{2}\.)?(qgirlz|cuteladypic)\.(com)\/a\/[\w-]+/,
imgs: () => fun.getImg("//a[@data-title and picture/source]", (fun.geT(".next", 2) || 1), 16),
button: [4],
insertImg: [".main-image", 2],
customTitle: () => fun.geT(".main-title").split(" No.")[0].trim(),
category: "nsfw1"
}, {
name: "cn.angirlz.com", //SPA
reg: /https?:\/\/\w{2}\.angirlz\.com\/album\/\w+/,
imgs: async () => await fun.waitEle(".loading[style$=hidden]") ? [...fun.gae("#divGallery a")] : [],
button: [4],
insertImg: ["div[key=album_main]", 2],
customTitle: () => fun.geT("h1"),
category: "nsfw2"
}, {
name: "bunnyxgirl.com letsgirlz.com bootyxgirl.com xbeautyzone.com",
reg: /https?:\/\/(bunnyxgirl|letsgirlz|bootyxgirl|xbeautyzone)\.com\/[^/]+\/.+/,
include: ".separator>a",
imgs: ".separator>a",
button: [4],
insertImg: [
[".album-post-inner,.album-postmeta-primarypix", 2, ".separator"], 2
],
customTitle: () => fun.geT(".breadcrumbs>span:last-child"),
category: "nsfw2"
}, {
name: "cn.bunnyxgirl.com cn.letsgirlz.com cn.bestxleg.com cn.xbeautyzone.com",
reg: /https?:\/\/\w{2}\.(bunnyxgirl|letsgirlz|bestxleg|xbeautyzone)\.com\/[^/]+\/\w+/,
include: ".separator>a",
imgs: () => fun.getImg(".separator>a", (fun.geT(".nav-links>*:last-child", 2) || 1), 16),
insertImg: [
[".album-post-body .clear,.album-post-share-wrap", 1, "div[itemprop='description articleBody'],.album-post-body>*:not(.album-post-inner):not(.album-post-share-wrap):not(.FullPictureLoadImage):not(#FullPictureLoadEnd)"], 2
],
customTitle: () => fun.geT(".breadcrumbs>span:last-child"),
category: "nsfw2"
}, {
name: "kawaiix.com kawaiixgirl.com kawaiixpic.com kinkygirlz.com kawaiimetas.com assxpic.com metaxgirl.com eroticxgirl.com sexyxpic.com hottyxpic.com thongxxx.com juicexgirl.com adultmetas.com eroticxpic.com bustyxgirl.com beautyxgirl.com bellexpic.com pantyxpic.com www.peachgirlz.com peachgirlz.com pantyxart.com beautyxpic.com cutemetas.com cutexpic.com perfectxbody.com sexyqgirl.com bestxhips.com assgirlz.com beautifulmetas.com pantyxgirl.com greatxpic.com xartpic.com perfectxpic.com bestxboobs.com artthong.com hotbeautypic.com greatxgirl.com asianxpic.com bestxleg.com tokyohotgirl.com bestxass.com",
reg: /https?:\/\/(r18\.|www\.)?(kawaiix|kawaiixgirl|kawaiixpic|kinkygirlz|kawaiimetas|assxpic|metaxgirl|eroticxgirl|sexyxpic|hottyxpic|thongxxx|juicexgirl|adultmetas|eroticxpic|bustyxgirl|beautyxgirl|bellexpic|pantyxpic|peachgirlz|pantyxart|beautyxpic|cutemetas|cutexpic|perfectxbody|sexyqgirl|bestxhips|assgirlz|beautifulmetas|pantyxgirl|greatxpic|xartpic|perfectxpic|bestxboobs|artthong|hotbeautypic|greatxgirl|asianxpic|bestxleg|tokyohotgirl|bestxass)\.com\/[^/]+\/.+/,
include: "//a[@data-title and picture/source]",
imgs: "//a[@data-title and picture/source]",
button: [4],
insertImg: [".hero+.hero,.entry-content,.d-flex>.col-24,.album-post,.album-h1", 2],
customTitle: () => fun.title(/( - Kawa| - KinkyGirlz| - BelleXPic| - Peach| - Panty| - Beauty| - Cute| - Ass| - Beaut| - Great| - Xart| - Perfect| - Art| - GreatXGirl)/i, 1).replace(/\s?\(\d+\s?photos\)/, "").trim(),
category: "nsfw2"
}, {
name: "cn.kawaiix.com cn.kawaiixgirl.com cn.kawaiixpic.com cn.kinkygirlz.com cn.kawaiimetas.com cn.assxpic.com cn.metaxgirl.com cn.eroticxgirl.com cn.sexyxpic.com cn.hottyxpic.com cn.thongxxx.com cn.juicexgirl.com cn.eroticxpic.com cn.bustyxgirl.com cn.beautyxgirl.com cn.bellexpic.com cn.pantyxpic.com cn.peachgirlz.com cn.pantyxart.com cn.beautyxpic.com cn.cutemetas.com cn.cutexpic.com cn.perfectxbody.com cn.sexyqgirl.com cn.bestxhips.com cn.bestxass.com cn.assgirlz.com cn.bestxbum.com cn.adultmetas.com cn.eroticxpic.com cn.xxxthong.com cn.thongxgirl.com cn.bestxlingerie.com cn.sexyxart.com cn.hotxhips.com cn.hotbeautypic cn.greatxgirl.com cn.asianxpic.com cn.bootyxgirl.com cn.tokyohotgirl.com",
reg: /https?:\/\/\w{2}\.(kawaiix|kawaiixgirl|kawaiixpic|kinkygirlz|kawaiimetas|assxpic|metaxgirl|eroticxgirl|sexyxpic|hottyxpic|thongxxx|juicexgirl|eroticxpic|bustyxgirl|beautyxgirl|bellexpic|pantyxpic|peachgirlz|pantyxart|beautyxpic|cutemetas|cutexpic|perfectxbody|sexyqgirl|bestxhips|bestxass|assgirlz|bestxbum|adultmetas|eroticxpic|xxxthong|thongxgirl|bestxlingerie|sexyxart|hotxhips|hotbeautypic|greatxgirl|asianxpic|bootyxgirl|tokyohotgirl)\.com\/[^/]+\/\w+/,
include: "//a[@data-title and picture/source]",
imgs: () => fun.getImg("//a[@data-title and picture/source]", (fun.geT(".nav-links>*:last-child", 2) || 1), 16),
button: [4],
insertImg: [".hero+.hero,.entry-content,.d-flex>.col-24,.album-post", 2],
customTitle: () => fun.geT(".entry-title,.album-title,.album-post-title,.col-12>h1,.album-h1").split(" No.")[0].trim(),
css: ".flex-grid:not(.masonry){display:block!important;}",
category: "nsfw2"
}, {
name: "gogo人体艺术M",
reg: /\/(wap|mip|m)\.(gogortrt|gogo38|956n|48mp|133rt|xixirt|488xm|rtys96|renti92|rt211|gogo44|xixi78|816mm|999zv|28rtys|454t|454t|784z|34tp|28xv|22bb|444rp|03hb|39um|45xm|444wp|005mm|188rt|7m11|61ak|34bu|344F|23bp|rty6|22gs|44aq|291103|508332|693350|660183|702038|873750|981070)\.(com|org)\/\w+\/\d+\/$/i,
init: () => {
fun.remove("//div[div[@class='ad-16 clearfix']]");
},
imgs: () => fun.getImg(".tal a>img[alt]", fun.gae(".p_select option").length, 11),
button: [4],
insertImg: [".tal", 2],
category: "nsfw2"
}, {
name: "gogo人体艺术M2",
reg: /\/(m)\.(98ah|02aj|139tu)\.com\/\w+\/(\d+\/)?\d+\.html$/i,
imgs: () => fun.getImg(".tal a>img[alt]", fun.gae(".p_select option").length, 9),
button: [4],
insertImg: [".tal", 2],
css: "div[style='margin:3px 0 0 0;']{display:none!important}",
category: "nsfw2"
}, {
name: "666人体艺术M",
reg: /\/(m)\.(6666rt)\.com\/\w+\/\d+\/1\.html$/i,
imgs: () => {
let max = fun.geT(".article_page a").match(/\/(\d+)/)[1];
return fun.getImg(".tal a>img[alt]", max, 11);
},
button: [4],
insertImg: [".tal", 2],
customTitle: () => fun.title("-第1张", 1),
css: "div[style='margin:2px 0 0 0;']{display:none!important}",
category: "nsfw2"
}, {
name: "gogo人体艺术 gogortrt.com 956n.com",
reg: /\/(gogortrt|956n)\.[a-z]{2,3}\/[a-z]+\/\d+\//i,
imgs: () => {
let max = fun.geT("//span[@class='current']/preceding-sibling::a|//a[@class='thisclass']/preceding-sibling::a").match(/\d+/)[0];
return fun.getImg(".main>div>a>img[alt],.warp .content>a>img[alt]", max, 11);
},
button: [4],
insertImg: ["//div[contains(@class,'main')]/div/a/parent::* | //div[contains(@class,'content') and a/img[@alt]]", 2],
autoDownload: [0],
next: ".crc_l_pic.left>a:not([href^=j])",
prev: ".crc_r_pic.right>a:not([href^=j])",
customTitle: () => /gogortrt\.com/.test(location.origin) ? fun.geT(".content_title") : fun.title(",", 1),
category: "nsfw2"
}, {
name: "GOGO人体艺术 48mp.com 133rt.com 816mm.com",
reg: /(48mp\.com|133rt\.com|816mm\.com)\/\w+\/\d+\//i,
imgs: () => {
let max = fun.geT(".main span", 2).match(/\d+/)[0];
return fun.getImg(".main>div>a>img[alt]", max, 11);
},
button: [4],
insertImg: ["//div[contains(@class,'main')]/div[a/img[@alt]]", 2],
autoDownload: [0],
next: ".crc_l_pic.left>a:not([href^=j])",
prev: ".crc_r_pic.right>a:not([href^=j])",
customTitle: () => fun.geT(".content_title"),
category: "nsfw2"
}, {
name: "6666rt.com 只翻預覽圖",
reg: /6666rt\.com\/\w+\/\d+\/(index\.html)?/i,
enable: 0,
include: "//div[@class='boxx']//li[a[@target]/img]",
init: () => {
fun.getNP("//div[@class='boxx']//li[a[@target]/img]", "a.curent+a[href]", null, ".pagelist");
},
category: "nsfw2"
}, {
name: "6666rt.com 大圖頁聚圖",
reg: /6666rt\.com\/\w+\/\d+\//i,
enable: 0,
init: "document.onkeydown=null;",
imgs: () => {
let max = fun.geT(".page>span#hover", 3).match(/\d+$/)[0];
return fun.getImg(".imgbox>a>img[alt]", max, 11);
},
button: [4],
insertImg: ["//div[@class='imgbox' and a/img[@alt]]", 2],
customTitle: () => fun.geT(".contitle h1>a"),
css: "#FullPictureLoadEnd{color:rgb(0, 0, 0)}",
category: "nsfw2"
}, {
name: "6666rt.com 翻完預覽圖立即插入大圖 getNP搭配getImgA",
reg: /6666rt\.com\/\w+\/\d+\/(index\.html)?/i,
enable: 1,
include: "//div[@class='boxx']//li[a[@target]/img]",
imgs: async () => {
await fun.getNP("//div[@class='boxx']//li[a[@target]/img]", "a.curent+a[href]", null, ".pagelist");
thumbnailsSrcArray = [...fun.gae("//div[@class='boxx']//li/a[@target]/img")].map(e => e.src);
return fun.getImgA(".imgbox>a>img[alt]", "//div[@class='boxx']//li/a[@target and img]");
},
button: [4],
//insertImg: [".boxx ul", 1],
insertImg: [
[".footdh", 1], 2
],
go: 1,
autoDownload: [0],
next: "//li[contains(text(),'上一')]/a",
prev: "//li[contains(text(),'下一')]/a",
customTitle: () => fun.title("_", 1),
css: ".fzltp img{height:auto!important;width:100%!important}",
category: "nsfw2"
}, {
name: "508人体艺术 508332.com",
reg: /508332\.com\/\w+\/\d+\//i,
imgs: () => {
let max = fun.geT(".pagelist>a").match(/\d+/)[0];
return fun.getImg(".imgbox>a>img[alt]", max, 11);
},
button: [4],
insertImg: ["//div[contains(@class,'imgbox') and a/img[@alt]]", 1],
autoDownload: [0],
next: "//li[contains(text(),'下一')]/a",
prev: 1,
customTitle: () => fun.title(" - 508", 1),
category: "nsfw2"
}, {
name: "444人体艺术 444rp.com",
reg: /444rp\.com\/\w+\/\d+\//i,
imgs: () => {
let max = fun.geT(".pagelist>a").match(/\d+/)[0];
return fun.getImg(".imgbox>a>img[alt]", max, 11);
},
button: [4],
insertImg: ["//div[contains(@class,'imgbox') and a/img[@alt]]", 2],
autoDownload: [0],
next: ".zuopre>a",
prev: ".younext>a",
customTitle: () => fun.geT("font>a:nth-child(3)"),
category: "nsfw2"
}, {
name: "64人体艺术 www.64ay.com",
reg: /www\.64ay\.com\/\w+\/\d+/i,
imgs: () => {
let max = fun.geT(".page-show>span.current", 2).match(/\d+/)[0];
return fun.getImg(".tu>a>img[alt]", max, 9);
},
button: [4],
insertImg: ["//div[@class='tu' and a/img[@alt]]", 2],
autoDownload: [0],
next: "//div[contains(text(),'下一')]/a[1]",
prev: "//div[contains(text(),'上一')]/a[2]",
customTitle: () => fun.title(",", 1),
category: "nsfw2"
}, {
name: "45人体艺术 45xm.com 873人体艺术 873750.com",
reg: /(45xm\.com|873750\.com)\/\w+\/\d+/i,
imgs: () => {
let max = fun.geT(".page-show>span.current", 2).match(/\d+/)[0];
return fun.getImg(".tu>a>img[alt]", max, 11);
},
button: [4],
insertImg: ["//div[contains(@class,'tu') and a/img[@alt]]", 2],
autoDownload: [0],
next: "//div[contains(text(),'下一')]/a[1]",
prev: "//div[contains(text(),'上一')]/a[2]",
customTitle: () => {
try {
return fun.geT(".wzbody>h1").split(/,|_/)[0];
} catch (e) {
return fun.geT(".wzbody>h1");
}
},
category: "nsfw2"
}, {
name: "98人体艺术 www.98ah.com",
reg: /www\.98ah\.com\/\w+\/\d+\.html/i,
imgs: () => {
let max = fun.geT(".current", 2).match(/\d+/)[0];
return fun.getImg(".content-pic img[alt]", max, 9);
},
button: [4],
insertImg: [".content-pic", 2],
autoDownload: [0],
next: "//div[contains(text(),'下一')]/a[1]",
prev: "//div[contains(text(),'下一')]/a[2]",
customTitle: () => fun.geT("h5").split(",")[0],
category: "nsfw2"
}, {
name: "54人体艺术 www.54aj.com",
reg: /www\.54aj\.com\/\w+\/\d+\.html/i,
imgs: () => {
let max = fun.geT("#hover", 2).match(/\d+/)[0];
return fun.getImg(".content img[alt]", max, 9);
},
button: [4],
insertImg: [".content", 2],
autoDownload: [0],
next: "//span[contains(text(),'下一')]/a",
prev: "//span[contains(text(),'上一')]/a",
customTitle: () => fun.geT(".content>h1").split(",")[0],
category: "nsfw2"
}, {
name: "03人体艺术网 03hb.com",
reg: /03hb\.com\/\w+\/\d+\//i,
imgs: () => {
let max = fun.geT("#hover", 2).match(/\d+/)[0];
return fun.getImg(".content img[alt]", max, 11);
},
button: [4],
insertImg: [".content", 2],
autoDownload: [0],
next: "//span[contains(text(),'下一')]/a",
prev: "//span[contains(text(),'上一')]/a",
customTitle: () => fun.geT(".currentpath span:nth-child(2)>a:nth-child(2)").split(",")[0],
category: "nsfw2"
}, {
name: "48人体艺术 www.48gd.com",
reg: /www\.48gd\.com\/\w+\/\d+\.html/i,
init: "document.onkeydown=null",
imgs: () => {
let max = fun.geT('.pagelist>strong', 2).match(/\d+/)[0];
return fun.getImg('#content img[alt]', max, 9);
},
button: [4],
insertImg: ["#content", 2],
autoDownload: [0],
next: "//span[contains(text(),'下一')]/a",
prev: "//span[contains(text(),'上一')]/a",
customTitle: () => fun.geT(".photo-tit>h3").split(",")[0],
category: "nsfw2"
}, {
name: "693人体艺术 693350.com",
reg: /693350\.com\/\w+\/\d+\//i,
imgs: () => {
let max = fun.geT(".pagelist>a").match(/\d+/)[0];
return fun.getImg("#content img[alt]", max, 11);
},
button: [4],
insertImg: ["#content", 2],
autoDownload: [0],
next: "//span[contains(text(),'下一')]/a",
prev: "//span[contains(text(),'上一')]/a",
customTitle: () => fun.geT(".photo-tit>h3").split(",")[0],
category: "nsfw2"
}, {
name: "42人体艺术 www.42jd.com",
reg: /www\.42jd\.com\/\w+\/\d+\.html/i,
imgs: () => {
let max = fun.geT(".pagelist>.curent", 2).match(/\d+/)[0];
return fun.getImg(".imgbox img[alt]", max, 9);
},
button: [4],
insertImg: [".imgbox", 2],
autoDownload: [0],
next: "//li[contains(text(),'下一')]/a",
prev: "//li[contains(text(),'上一')]/a",
customTitle: () => fun.geT(".imgbox h1").split(",")[0],
category: "nsfw2"
}, {
name: "36人体艺术 www.36ut.com",
reg: /www\.36ut\.com\/\w+\/\d+\.html/i,
init: "document.onkeydown=null",
imgs: () => {
let max = fun.geT(".page-show>.current", 2).match(/\d+/)[0];
return fun.getImg(".pp.hh img[alt]", max, 9);
},
button: [4],
insertImg: [".pp.hh", 2],
customTitle: () => fun.geT(".des>h1").split(",")[0],
category: "nsfw2"
}, {
name: "西西人体艺术 xixirt.org 291103.com",
reg: /(xixirt\.org|291103\.com)\/\w+\/\d+\//i,
init: "document.onkeydown=null",
imgs: () => {
let max = fun.geT(".page-show>.current", 2).match(/\d+/)[0];
return fun.getImg(".pp.hh img[alt]", max, 11);
},
button: [4],
insertImg: [".pp.hh", 2],
customTitle: () => fun.geT(".des>h1").split(",")[0],
category: "nsfw2"
}, {
name: "366人体艺术 366807.com 660人体艺术 18人体艺术",
reg: /(366807\.com|660183\.com|18renti\.com)\/\w+\/\d+\//i,
imgs: () => {
let max = fun.geT(".page-show>a,.page>a").match(/\d+/)[0];
return fun.getImg(".content img[alt]", max, 11);
},
button: [4],
insertImg: [".content", 2],
autoDownload: [0],
next: "//span[contains(text(),'下一')]/a",
prev: "//span[contains(text(),'上一')]/a",
customTitle: () => fun.title(/_西西| - 660| - 18/, 1),
category: "nsfw2"
}, {
name: "702人体艺术 211人体艺术",
reg: /(702038\.com|rt211.com)\/\w+\/\d+\//i,
imgs: () => {
let max = fun.geT(".page-show>a").match(/\d+/)[0];
return fun.getImg(".content-pic img[alt],#bomei img[alt]", max, 11);
},
button: [4],
insertImg: [".content-pic,#bomei", 2],
autoDownload: [0],
next: ".updown>a,#prenext a",
prev: 1,
customTitle: () => fun.title(/- 702| - 211/, 1),
category: "nsfw2"
}, {
name: "188人体艺术 188rt.com",
reg: /188rt\.com\/\w+\/\d+\//i,
imgs: () => {
let max = fun.geT(".page-show>a").match(/\d+/)[0];
return fun.getImg("#bomei img[alt]", max, 11);
},
button: [4],
insertImg: ["#bomei", 2],
autoDownload: [0],
next: "#prenext a",
prev: "#prenext li:last-child>a",
customTitle: () => fun.geT("#bobox>h1").split(",")[0],
category: "nsfw2"
}, {
name: "39人体艺术 39um.com",
reg: /39um\.com\/\w+\/\d+\//i,
imgs: () => {
let max = fun.geT(".page-show>a").match(/\d+/)[0];
return fun.getImg(".content-pic img[alt],#bomei img[alt]", max, 11);
},
button: [4],
insertImg: [".content-pic", 2],
autoDownload: [0],
next: ".updown>a",
prev: 1,
customTitle: () => fun.geT(".content>h5"),
category: "nsfw2"
}, {
name: "23人体艺术 www.23fe.com",
reg: /www\.23fe\.com\/\w+\/\d+\.html/i,
imgs: () => {
let max = fun.geT(".thispg", 2).match(/\d+/)[0];
return fun.getImg("#content-p img[alt]", max, 9);
},
button: [4],
insertImg: ["#content-p", 2],
autoDownload: [0],
next: "//span[contains(text(),'下一')]/a",
prev: "//span[contains(text(),'上一')]/a",
customTitle: () => fun.geT("#ctt>h1").split(",")[0],
category: "nsfw2"
}, {
name: "AJ人体艺术 www.02aj.com",
reg: /www\.02aj\.com\/\w+\/\d+\.html/i,
imgs: () => {
let max = fun.geT(".thisclass", 2).match(/\d+/)[0];
return fun.getImg(".content img[alt]", max, 9);
},
button: [4],
insertImg: [".content", 2],
autoDownload: [0],
next: "//div[contains(text(),'下一')]/a",
prev: "//div[contains(text(),'上一')]/a",
customTitle: "return fun.geT('.title>h1');",
category: "nsfw2"
}, {
name: "gogo人体艺术 gogo44.com",
reg: /gogo44\.com\/\w+\/\d+\//i,
init: "fun.ge('.content a').removeAttribute('href')",
imgs: () => {
let max = fun.geT(".thisclass", 2).match(/\d+/)[0];
return fun.getImg(".content img[alt]", max, 11);
},
button: [4],
insertImg: [".content a", 2],
autoDownload: [0],
next: ".updown a",
prev: ".updown span:last-child>a",
customTitle: () => fun.title(/ - gogo/, 1),
category: "nsfw2"
}, {
name: "28人体艺术 28rtys.com 4F人体艺术 344f.com",
reg: /(28rtys\.com|344f\.com)\/\w+\/\d+\//i,
imgs: () => {
let max = fun.geT(".thisclass", 2).match(/\d+/)[0];
return fun.getImg(".picbox img[alt]", max, 11);
},
button: [4],
insertImg: [".picbox", 2],
autoDownload: [0],
next: ".page+.content-msg a",
prev: 1,
customTitle: () => fun.title(/ - 28| - 4F/, 1),
category: "nsfw2"
}, {
name: "西西人体艺术 44aq.com",
reg: /44aq\.com\/\w+\/\d+\//i,
imgs: () => {
let max = fun.geT(".page a").match(/\d+/)[0];
return fun.getImg(".picbox img[alt]", max, 11);
},
button: [4],
insertImg: [".picbox", 2],
autoDownload: [0],
next: ".updown_r>a",
prev: ".updown_l>a",
customTitle: () => fun.title(/,/, 1),
category: "nsfw2"
}, {
name: "139人体艺术 www.139tu.com",
reg: /www\.139tu\.com\/\w+\/\d+\/\d+\.html/i,
imgs: () => {
let max = fun.geT("#hover", 2).match(/\d+/)[0];
return fun.getImg(".img_content img[alt]", max, 9);
},
button: [4],
insertImg: [".img_content", 2],
customTitle: () => fun.geT("#title>h1"),
category: "nsfw2"
}, {
name: "GOGO人体艺术网 gogo38.com",
reg: /(gogo38\.com|981070\.com)\/\w+\/\d+\//i,
imgs: () => {
let max = fun.geT(".current", 2).match(/\d+/)[0];
return fun.getImg(".content_pic img[alt]", max, 11);
},
button: [4],
insertImg: [".content_pic", 2],
customTitle: () => fun.geT(".content>h1>a"),
category: "nsfw2"
}, {
name: "488人体艺术 488xm.com",
reg: /488xm\.com\/\w+\/\d+\//i,
imgs: () => {
let max = fun.geT(".pagelist>strong", 2).match(/\d+/)[0];
return fun.getImg("#content img[alt]", max, 11)
},
button: [4],
insertImg: ["#content", 2],
autoDownload: [0],
next: "//span[contains(text(),'下一')]/a",
prev: "//span[contains(text(),'上一')]/a",
customTitle: () => fun.geT("h3>a").split(",")[0],
category: "nsfw2"
}, {
name: "92人体艺术 renti92.com",
reg: /renti92\.com\/\w+\/\d+\//i,
imgs: () => {
let max = fun.geT(".pagination>a").match(/\d+/)[0];
return fun.getImg("#gallery img[alt]", max, 11);
},
button: [4],
insertImg: ["#gallery", 2],
autoDownload: [0],
next: ".other-prev a",
prev: ".other-next a",
customTitle: () => fun.title(/ - 92/, 1),
category: "nsfw2"
}, {
name: "005人体艺术 005mm.com",
reg: /005mm\.com\/\w+\/\d+\//i,
imgs: () => {
let max = fun.geT(".pagination>a").match(/\d+/)[0];
return fun.getImg("#gallery img[alt]", max, 11);
},
button: [4],
insertImg: ["#gallery", 2],
autoDownload: [0],
next: ".other-prev a",
prev: ".other-next a",
customTitle: () => fun.geT(".post-nav>a:nth-child(3)"),
category: "nsfw2"
}, {
name: "西西人体艺术 xixi78.com 711人体艺术 7m11.com",
reg: /(xixi78\.com|7m11\.com)\/\w+\/\d+\//i,
imgs: () => {
let max = fun.geT(".content-page>a").match(/\d+/)[0];
return fun.getImg("#content img[alt]", max, 11);
},
button: [4],
insertImg: ["#content", 2],
customTitle: () => fun.title(/ - 西西| - 711/, 1),
category: "nsfw2"
}, {
name: "96人体艺术 rtys96.com 61人体艺术 61ak.com",
reg: /(rtys96\.com|61ak.com)\/\w+\/\d+\//i,
imgs: () => {
let max = fun.geT(".bigpages>a").match(/\d+/)[0];
return fun.getImg("#showimages img[alt]", max, 11);
},
button: [4],
insertImg: ["#showimages", 2],
autoDownload: [0],
next: "#pageNum a",
prev: 1,
customTitle: () => fun.title(/ - 96| - 61/, 1),
category: "nsfw2"
}, {
name: "999人体艺术 999zv.com 西西人体艺术 34bu.com",
reg: /(999zv\.com|34bu.com)\/\w+\/\d+\//i,
imgs: () => {
let max = fun.geT(".pages a").match(/\d+/)[0];
return fun.getImg(".section.fix.tc img[alt]", max, 11);
},
button: [4],
insertImg: [".section.fix.tc", 2],
autoDownload: [0],
next: ".arcLocal.r a",
prev: 1,
customTitle: () => fun.title(",", 1),
category: "nsfw2"
}, {
name: "454人体艺术 454t.com 爱上人体艺术 23bp.com",
reg: /(454t\.com|23bp\.com)\/\w+\/\d+\//i,
imgs: () => {
let max = fun.geT(".page a").match(/\d+/)[0];
return fun.getImg("#content-p img[alt]", max, 11);
},
button: [4],
insertImg: ["#content-p", 2],
customTitle: () => fun.title(",", 1),
category: "nsfw2"
}, {
name: "748人体艺术 784z.com 66人体艺术 rty6.com",
reg: /(784z\.com|rty6.com)\/\w+\/\d+\//i,
imgs: () => {
let max = fun.geT(".pages a").match(/\d+/)[0];
return fun.getImg(".image-view img[alt]", max, 11);
},
button: [4],
insertImg: [".image-view", 2],
autoDownload: [0],
next: ".i-digg>.article-adbottom a",
prev: 1,
customTitle: () => fun.title(/,|_/, 1),
category: "nsfw2"
}, {
name: "34人体艺术 34tp.com 高清人体艺术 22gs.com",
reg: /(34tp\.com|22gs.com)\/\w+\/\d+\//i,
imgs: () => {
let max = fun.geT(".gengduo a").match(/\d+/)[0];
return fun.getImg("#content-p img[alt]", max, 11);
},
button: [4],
insertImg: ["#content-p p", 2],
autoDownload: [0],
next: ".gg a",
prev: 1,
customTitle: () => fun.title(/ - 34|,/, 1),
category: "nsfw2"
}, {
name: "22bb人体艺术 22bb.org",
reg: /22bb\.org\/\w+\/\d+\//i,
imgs: () => {
let max = fun.geT(".page-show>a").match(/\d+/)[0];
return fun.getImg(".content img[alt]", max, 11);
},
button: [4],
insertImg: [".content", 2],
autoDownload: [0],
next: "//span[contains(text(),'下一')]/a",
prev: "//span[contains(text(),'上一')]/a",
customTitle: () => fun.title(",", 1),
category: "nsfw2"
}, {
name: "444人体艺术 444wp.com",
reg: /444wp\.com\/\w+\/\d+\//i,
imgs: () => {
let max = fun.geT(".page a").match(/\d+/)[0];
return fun.getImg(".content img[alt]", max, 11);
},
button: [4],
insertImg: [".content", 2],
autoDownload: [0],
next: ".page+.page a",
prev: ".page+.page a+a",
customTitle: () => fun.geT("h2"),
category: "nsfw2"
}, {
name: "爱人体艺术 28xv.com",
reg: /28xv\.com\/\w+\/\d+\//i,
imgs: () => {
let max = fun.geT(".page a").match(/\d+/)[0];
return fun.getImg(".imgTip+a>img[alt]", max, 11);
},
button: [4],
insertImg: [".imgTip+a", 2],
autoDownload: [0],
next: ".updown_r>a",
prev: ".updown_l>a",
customTitle: () => fun.geT("h1").split(",")[0],
category: "nsfw2"
}, {
name: "E-Hentai圖片清單頁 e-hentai.org exhentai.org",
reg: /(e-hentai|exhentai).org\/g\/\d+\/\w+\/$/,
exclude: "//h1[text()='Content Warning']",
init: async () => {
await fun.getNP(".gdtm,.gdtl", ".ptds+td>a", null, "//tr[td[@class='ptds']]");
//預覽縮圖網址需要裁剪難弄...
//[...new Set([...document.querySelectorAll(".gdtm>div,.gdtl>div")].map(div => div.getAttribute("style").split("url(")[1].split(")")[0]))]
},
imgs: () => fun.getImgA("#img", ".gdtm a,.gdtl a", 100),
button: [4],
insertImg: [
["#gdt", 0], 2
],
customTitle: () => {
let t = fun.geT("#gj").replace(/\//, "");
return t.length > 0 ? t : fun.geT("#gn").replace(/\|.+/, "").trim();
},
go: 1,
topButton: true,
threading: 4,
category: "hcomic"
}, {
name: "E-Hentai圖片清單頁 https://e-hentai.org/lofi/",
reg: /https?:\/\/e-hentai\.org\/lofi\/g\/\w+\/\w+\//,
init: async () => {
await fun.getNP(".gi", "//a[text()='Next Page >']", null, "#ia");
},
imgs: () => fun.getImgA("#sm", ".gi>a", 100),
button: [4],
insertImg: [
["#ia", 2], 2
],
customTitle: () => fun.title(" - E-Hentai", 1).replace(/\|.+/, "").replace(/\//, "").trim(),
go: 1,
topButton: true,
threading: 4,
category: "hcomic"
}, {
name: "nhentai圖片清單頁 nhentai.net nyahentai.red www.hentai.name nhentai.xxx nhentai.to",
reg: /(nhentai\.net|nyahentai\.red|www\.hentai\.name|nhentai\.xxx|nhentai\.to)\/g\/\d+\/?$/,
imgs: () => {
thumbnailsSrcArray = [...fun.gae("a.gallerythumb>img")].map(e => e.dataset.src ? e.dataset.src : e.src);
if (/nhentai\.net/.test(siteUrl)) {
return fun.getImgA("#image-container img", "a.gallerythumb", 300);
} else if (/nyahentai\.red|nhentai\.xxx|nhentai\.to/.test(siteUrl)) {
return [...fun.gae(".thumbs img,.thumb-container img")].map(e => e.dataset.src.replace(/t\.jpg/, ".jpg").replace(/t\.png/, ".png"));
} else if (/www\.hentai\.name/.test(siteUrl)) {
return [...fun.gae(".thumb-container img")].map(e => e.src.replace("_thumb\.jpg", ".jpg"));
}
},
button: [4, "100%"],
insertImg: [
[".thumbs,#thumbnail-container", 0], 2
],
autoClick: ["#show-all-images-button"],
customTitle: () => {
let h2 = fun.geT("h2.title,h2");
return h2.length > 4 ? h2 : fun.geT("h1.title,h1");
},
threading: 2,
go: 1,
topButton: true,
css: ".advt{display:none!important}",
category: "hcomic"
}, {
name: "Cathentai/Hentaibeeg/Hentaicolor/圖片清單頁showAll cathentai.net hentaibeeg.com hentaicolor.net",
reg: /(cathentai\.net|hentaibeeg\.com|hentaicolor\.net)\/[^/]+\/(#collapse)?$/i,
icon: 0,
key: 0,
autoClick: ["#showAll"],
category: "hcomic"
}, {
name: "Cathentai/Hentaibeeg/Hentaicolor/List Read頁 cathentai.net hentaibeeg.com hentaicolor.net",
reg: /(cathentai\.net|hentaibeeg\.com|hentaicolor\.net)\/read\/\d+\.html$/i,
imgs: () => fun.run(fun.geT("#listImgH")),
button: [4],
insertImg: ["#image-container", 2],
customTitle: () => fun.title(/ - Cathentai| - Hentaicolor| - Hentaibeeg/, 1),
category: "hcomic"
}, {
name: "3hentai圖片清單頁 3hentai.net",
reg: /(www\.3hentai1\.buzz|3hentai\.net)\/\??d\/\d+$/,
imgs: () => {
thumbnailsSrcArray = [...fun.gae(".single-thumb>a>img")].map(e => e.dataset.src ? e.dataset.src : e.src);
return fun.getImgA(".js-main-img", ".single-thumb>a", 100);
},
button: [4, "100%"],
insertImg: [
["#thumbnail-gallery", 0], 2
],
customTitle: () => fun.geT("#main-info>h2"),
go: 1,
topButton: true,
threading: 4,
//css: "#header-ban-agsy,#middle-ban-agsy,#footer-ban-agsy{display:none!important}.single-thumb-col{padding:0px!important;width:100%!important}",
category: "hcomic"
}, {
name: "HentaiFox圖片清單頁 hentaifox.com",
reg: /hentaifox\.com\/gallery\/\d+\/$/,
include: ".view_group",
imgs: async () => {
fun.show(displayLanguage.str_04, 0);
await fun.waitEle(".view_group[style]");
fun.hide();
thumbnailsSrcArray = [...fun.gae(".gallery_thumb img")].map(e => e.dataset.src ? e.dataset.src : e.src);
return [...fun.gae(".gallery_thumb img")].map(e => e.dataset.src.replace("t.", "."));
//return fun.getImgA("#gimg", ".g_thumb>a", 300);
},
button: [4, "100%"],
insertImg: [
["#append_thumbs", 0], 2
],
autoClick: ["#load_all"],
customTitle: () => fun.geT(".info>h1"),
go: 1,
topButton: true,
threading: 4,
category: "hcomic"
}, {
name: "HentaiFox圖片清單頁 hentaifox.com",
reg: /hentaifox\.com\/gallery\/\d+\/$/,
imgs: () => {
return [...fun.gae(".gallery_thumb img")].map(e => e.dataset.src.replace("t.", "."));
//return fun.getImgA("#gimg", ".g_thumb>a", 300);
},
button: [4, "100%"],
insertImg: [
["#append_thumbs", 0], 2
],
customTitle: () => fun.geT(".info>h1"),
go: 1,
topButton: true,
threading: 4,
category: "hcomic"
}, {
name: "nhentai閱讀頁 nhentai.com",
reg: /nhentai\.com\/\w+\/comic\/[^/]+\/reader\//i,
imgs: ".vertical-image img[data-src]",
button: [4],
insertImg: [".reader", 2],
customTitle: async () => {
await fun.delay(1000, 0);
return fun.geT(".router-link-active")
},
category: "hcomic"
}, {
name: "Pururin圖片清單頁 pururin.to",
reg: /pururin\.to\/gallery\/\d+\/.+/,
enable: 1,
icon: 0,
key: 0,
autoClick: ["//button[contains(text(),'View all')]"],
category: "hcomic"
}, {
name: "Pururin閱讀頁 pururin.to",
reg: /pururin\.to\/read\/\d+\/\d+\/.+/,
imgs: () => {
let ele = fun.ge(".img-viewer");
let svr = ele.dataset.svr;
let data = JSON.parse(ele.dataset.img);
//按頁數排列
let arr = data.images.sort((a, b) => a.page - b.page);
arr = arr.map(e => svr + "/" + data.directory + "/" + e.filename);
thumbnailsSrcArray = arr.map(e => e.replace(/(\.\w+)$/, "t$1"));
return arr;
},
button: [4],
insertImg: [".img-viewer", 2],
customTitle: () => fun.ge("[placeholder=Japanese]").value,
css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}.box.img-reader .img-viewer{position:unset!important;white-space:unset!important}",
category: "hcomic"
}, {
name: "9hentai閱讀頁 9hentai.to",
reg: /9hentai\.to\/g\/\d+\/\d+\/$/,
delay: 300,
imgs: () => {
let arr = [];
let path = fun.ge(".image-viewer .img-fluid").src.match(/.+\//)[0];
let max = fun.attr(".number-input__input", "max");
for (let i = 1; i <= max; i++) {
arr.push(path + i + ".jpg");
}
thumbnailsSrcArray = arr.map(e => e.replace(/(\d+)(\.\w+)$/, "preview/$1t$2"));
return arr;
},
button: [4],
insertImg: [".image-viewer", 2],
customTitle: () => fun.title(" - Page", 1),
css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}",
category: "hcomic"
}, {
name: "AsmHentai閱讀頁 asmhentai.com",
reg: /asmhentai\.com\/gallery\/\d+\/\d+\/$/,
imgs: () => {
let arr = [];
let path = document.querySelector("#fimg").dataset.src.match(/.+\//)[0];
let max = $("#pages").val();
for (let i = 1; i <= max; i++) {
arr.push(path + i + ".jpg");
}
thumbnailsSrcArray = arr.map(e => e.replace(/(\.\w+)$/, "t$1"));
return arr;
},
insertImg: [".rd_fimg", 2],
customTitle: () => fun.title(" Page", 1),
css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}",
category: "hcomic"
}, {
name: "AsmHentai View All asmhentai.com",
reg: /asmhentai\.com\/g\/\d+\/$/,
icon: 0,
key: 0,
autoClick: ["#load_all"],
category: "hcomic"
}, {
name: "MultPorn閱讀頁 multporn.net",
reg: /multporn\.net\//,
include: "//script[contains(text(),'configUrl')]",
imgs: () => {
let str = [...document.scripts].find(s => s.innerHTML.search(/configUrl/) > -1).innerHTML.match(/configUrl":"[^,]+/g)[0].slice(12, -1).replaceAll("\\", "");
let url = location.origin + str;
return fetch(url).then(res => res.text()).then(res => {
let xml = fun.xml(res);
let imgs = [...fun.gae("image", xml)];
thumbnailsSrcArray = imgs.map(e => e.getAttribute("thumbURL"));
return imgs.map(e => e.getAttribute("linkURL"));
});
},
button: [4],
insertImg: [
[".juicebox-parent", 2], 2
],
go: 1,
autoDownload: [0],
next: "//a[text()='Next Part']",
prev: "//a[text()='Previous Part']",
customTitle: () => fun.geT("#page-title"),
css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}",
category: "hcomic"
}, {
name: "HentaiHere閱讀頁 hentaihere.com",
reg: /hentaihere\.com\/m\/\w+\/\d+\/\d+\/$/i,
include: "//script[contains(text(),'rff_imageList')]",
imgs: () => rff_imageList.map(e => "https://hentaicdn.com/hentai" + e),
button: [4],
insertImg: ["#reader-content", 2],
autoDownload: [0],
next: "//li[a[@class='bg-info']]/following-sibling::li[1]/a",
prev: 1,
customTitle: () => fun.geT("#detail span") + " - " + fun.geT("#chapter span"),
css: ".afs_ads,[data-type]{display:none!important}",
category: "hcomic"
}, {
name: "HentaiPaw圖片清單頁 hentaipaw.com",
reg: /hentaipaw\.com\/articles\/\d+/i,
delay: 2000,
imgs: async () => {
fun.show("獲取數據中...", 0);
let url = fun.ge(".gallery-image-container a").href;
let doc = await fun.fetchDoc(url);
let data = [...doc.scripts].find(s => s.innerHTML.search(/startingPage/) > -1).innerHTML.replace(/\\/g, "").match(/\[{.+"}]/)[0];
fun.hide();
thumbnailsSrcArray = [...fun.gae(".gallery-image-container a>img")].map(e => e.src);
return JSON.parse(data).map(e => e.src);
},
button: [4, "100%"],
insertImg: [
[".detail-gallery-list", 2], 2
],
go: 1,
customTitle: () => fun.geT(".detail-ttl").replace(/\/|\|/g, " "),
category: "hcomic"
}, {
name: "HDpornComics圖片清單頁 hdporncomics.com",
reg: /hdporncomics\.com\/[^/]+\/([^/]+\/)?$/i,
include: ".my-gallery.scrollmenu",
imgs: () => {
thumbnailsSrcArray = [...fun.gae(".my-gallery a[data-size] img")].map(e => e.src);
return [...fun.gae(".my-gallery a[data-size]")];
},
button: [4],
insertImg: [
[".postContent>.items-center,#likeDislikeVue", 2], 2
],
go: 1,
customTitle: () => fun.geT("#infoBox>h1").replace(" – Gay Manga", "").replace(" Comic Porn", ""),
category: "hcomic"
}, {
name: "HDpornComics閱讀頁 hdporncomics.com",
reg: /hdporncomics\.com\/manhwa\/[^/]+\/chapter/i,
imgs: "#imageContainer>img",
button: [4],
insertImg: ["#imageContainer", 2],
autoDownload: [0],
next: "//a[contains(text(),'Next')]",
prev: "//a[contains(text(),'Prev')]",
customTitle: () => fun.geT(".list-reset li:nth-child(5)>a") + " - " + fun.geT("option[selected]"),
category: "hcomic"
}, {
name: "Doujins圖片清單頁 doujins.com",
reg: /doujins\.com\/.+\/.+/i,
include: "#thumbnails",
autoClick: ["button.loadmore"],
imgs: () => {
thumbnailsSrcArray = [...fun.gae("#thumbnails img")].map(e => e.src);
return [...fun.gae(".swiper-wrapper>div:not(:first-of-type):not(:last-of-type) .swiper-lazy")];
},
button: [4],
insertImg: [
["#thumbnails", 2], 2, 2000
],
go: 1,
customTitle: () => fun.geT(".folder-title>a:last-child"),
category: "hcomic"
}, {
name: "Simply Hentai圖片清單頁 www.simply-hentai.com",
reg: /www\.simply-hentai\.com\/[0-9a-z-]+\/.+/i,
include: "//main[@class='container' and div[div[a[div[@class='image-wrapper' and img]]]]]",
exclude: "nav.pagination,#reader-image",
imgs: () => {
thumbnailsSrcArray = [...fun.gae("img[data-src]")].map(e => e.dataset.src);
return [...fun.gae("img[data-src]")].map(e => e.dataset.src.replace("small_thumb_", ""));
},
button: [4],
insertImg: [
["//main[@class='container']/*[last()]", 2], 2, 2000
],
go: 1,
autoClick: "a[href$='all-pages']",
customTitle: () => {
try {
return fun.geT("h1.content-headline>a").replace(/\/|\|/g, "-");
} catch (e) {
return fun.geT("h1").replace(/\/|\|/g, "-");
}
},
css: ".text-center{display:none!important}",
category: "hcomic"
}, {
name: "Hanime1圖片清單頁 https://hanime1.me/comics",
reg: /hanime1\.me\/comic\/\d+$/,
imgs: () => {
thumbnailsSrcArray = [...fun.gae(".comics-thumbnail-wrapper img[data-srcset]")].map(e => e.dataset.srcset);
return [...fun.gae(".comics-thumbnail-wrapper img[data-srcset]")].map(e => e.dataset.srcset.replace("t.n", "i.n").replace("t.jpg", ".jpg").replace("t.png", ".png"));
},
button: [4],
insertImg: [".comics-thumbnail-wrapper", 2, 1000],
go: 1,
autoClick: "#show-all-comics-btn",
customTitle: () => fun.geT("h4.title"),
threading: 4,
referer: "src",
css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}",
category: "hcomic"
}, {
name: "IMHentai imhentai.xxx 圖片清單頁",
reg: /imhentai\.xxx\/gallery\/\d+\//,
delay: 1000,
autoClick: "#load_all",
imgs: async () => {
/*
let links = [...fun.gae("#append_thumbs a")];
let fetchNum = 0;
let resArr = [];
for (let i = 0; i < links.length; i++) {
let url = links[i].href;
let res = fun.fetchDoc(url).then(doc => {
fun.show(`${displayLanguage.str_02}${fetchNum+=1}/${links.length}`, 0);
return fun.ge("#gimg", doc);
});
resArr.push(res);
await fun.delay(300, 0);
}
return Promise.all(resArr).then(arr => {
fun.hide();
return arr;
});
*/
thumbnailsSrcArray = [...fun.gae("#append_thumbs img")].map(e => e.dataset.src ? e.dataset.src : e.src);
return [...fun.gae("#append_thumbs img")].map(e => e.dataset.src.replace("t.jpg", ".jpg").replace("t.png", ".png"));
},
button: [4, "100%"],
insertImg: [
["#append_thumbs", 0], 2, 3000
],
customTitle: () => {
let t = fun.geT(".subtitle");
return t.length > 0 ? t : fun.geT('h1').replace(/\||\+/g, "");
},
go: 1,
topButton: true,
threading: 4,
category: "hcomic"
}, {
name: "IMHentai imhentai.xxx",
reg: /imhentai\.xxx\/view\/\d+\/\d+\//,
init: "setTimeout(()=>{fun.ge('.pre_img').removeAttribute('style');$('a.next_img').unbind('click');},1000)",
imgs: () => fun.getImgO("#gimg", fun.geT(".total_pages"), 14, [null, null], 0, ".nav_pagination", 0),
button: [4],
insertImg: [".pre_img", 1, 2000],
customTitle: () => fun.title("-", 1),
threading: 4,
category: "hcomic"
}, {
name: "Hentai2Read hentai2read.com",
reg: /hentai2read\.com\/\w+\/\d+\/(\d+\/)?$/,
imgs: () => gData.images.map(e => "https://static.hentai.direct/hentai" + e),
button: [4],
insertImg: ["#js-reader", 2],
autoDownload: [0],
next: "//li[a[contains(@class,'bg-info')]]/preceding-sibling::li[1]/a",
prev: 1,
customTitle: () => fun.geT(".reader-left-text.text-ellipsis").replace(/\//g, "-"),
//threading: 4,
category: "hcomic"
}, {
name: "XlecX xlecx.one",
reg: /xlecx\.one\/[\w-]+\.html$/,
imgs: ".ug-thumb-image,img[data-src]",
button: [4],
insertImg: [
[".page__col-left", 0], 2
],
go: 1,
customTitle: () => fun.geT(".page__col-left>h1"),
category: "hcomic"
}, {
name: "HentaiPorns hentaiporns.net",
reg: /hentaiporns\.net\/[\w-]+\/$/,
include: ".gallery",
imgs: () => {
thumbnailsSrcArray = [...fun.gae(".gallery-item a>img")].map(e => e.dataset.src ? e.dataset.src : e.src);
return [...fun.gae(".gallery-item a")];
},
button: [4, "100%"],
insertImg: [
[".gallery", 0], 2, 1000
],
go: 1,
customTitle: () => {
let ele = fun.ge("#gn+h1");
return ele ? fun.geT("#gn+h1") : fun.geT("#gn,.entry-title");
},
fancybox: {
v: 3,
css: false
},
category: "hcomic"
}, {
name: "8muses comics.8muses.com",
reg: /https?:\/\/comics\.8muses\.com\/comics\/album\/[\w-]+\/[\w-]+\//i,
include: ".gallery",
exclude: ".image-title>.title-text",
imgs: () => {
let th = [...fun.gae("img[data-src]")].map(e => e.dataset.src.replace("/image/th/", "https://comics.8muses.com/image/fl/"));
let arr = [];
let loadnum = 0;
fun.show("Loading...", 0);
for (let i in th) {
let promise = new Promise(resolve => {
let temp = new Image();
temp.src = th[i];
temp.onload = () => {
loadnum++;
fun.show(`Loading ${loadnum}/${th.length}`, 0);
resolve(th[i]);
}
temp.onerror = () => {
loadnum++;
fun.show(`Loading ${loadnum}/${th.length}`, 0);
resolve(th[i].replace("/fl/", "/fm/"));
}
});
arr.push(promise);
}
return Promise.all(arr).then(arr => {
fun.hide();
return arr;
});
},
button: [4],
insertImg: [
[".gallery", 2], 1
],
go: 1,
css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}",
category: "hcomic"
}, {
name: "H漫畫貼圖 - 7mmtv.sx",
reg: /7mmtv\.sx\/.*hcomic/,
include: "//script[contains(text(),'Large_cgurl')]",
imgs: () => {
let arr = Large_cgurl.map(e => /imgur/.test(e) ? e : null).filter(item => item);
return arr.length == 0 ? Large_cgurl : arr;
},
button: [4],
insertImg: ["#show_cg_html", 2],
customTitle: () => fun.title(" - 7mmtv.sx", 1).replace(/\s?\(\d+P\)/i, ""),
css: ".ut1_img_content_js,.ut_cg1_top{display:none!important}",
category: "hcomic"
}, {
name: "18H 18h.mm-cg.com",
reg: /18h\.mm-cg\.com\/(zh\/?)\w+_content\/\d+\/content\.html/i,
imgs: () => Large_cgurl,
button: [4],
insertImg: ["#show_cg_html", 2],
customTitle: () => fun.title("-", 1),
category: "hcomic"
}, {
name: "H 次元 h-ciyuan.com",
reg: /h-ciyuan\.com\/\d+\/\d+\/.+\//,
include: "a[data-fancybox],.rl-gallery-container a",
imgs: () => {
thumbnailsSrcArray = [...fun.gae("a[data-fancybox] img,.rl-gallery-container a img")].map(e => e.src);
return [...fun.gae("a[data-fancybox],.rl-gallery-container a")]
},
button: [4],
//insertImg: [".entry-content", 2],
insertImg: [
[".entry-content,.rl-gallery-container", 2], 2
],
go: 1,
next: ".nav-previous>a",
prev: ".nav-next>a",
customTitle: () => fun.geT(".post-title"),
category: "hcomic"
}, {
name: "淫漫画 www.yinmh.com www.yinmh.top www.yinmh.xyz",
reg: /www\.yinmh\.(com|top|xyz)\/\d+\.html/,
imgs: () => {
let arr = [];
[...fun.gae(".left>.image img.lazy")].forEach(e => {
!/loading/.test(e.src) ? arr.push(e.src) : arr.push(e.getAttribute("img"));
});
return arr;
},
button: [4],
insertImg: [".left", 2],
customTitle: () => fun.geT(".box>h1"),
category: "hcomic"
}, {
name: "漫畫聯合國 www.comicun.com",
reg: /www\.comicun\.com\/index-look(-cid)?-name-.+/,
FixURL: url => {
if (/index-look-cid-name-/.test(url)) {
let arr = url.split("-");
let str = "";
for (let i = 0; i < arr.length; i++) {
if (i == 7) {
str += arr[i];
} else if (i == 5) {
str += "cid-" + arr[i] + "-";
} else if (i != 2) {
str += arr[i] + "-";
}
}
return decodeURI(str);
} else {
return decodeURI(url);
}
},
init: () => {
$(document).unbind("click");
if (/index-look-cid-name-/.test(siteUrl)) location.href = siteData.FixURL(siteUrl);
[...fun.gae("//a[text()='下一章'] | //a[text()='上一章']")].forEach(a => {
a.href = siteData.FixURL(a.href);
});
},
imgs: () => fun.getImg("#ComicPic", $("#total").val(), 20),
button: [4],
insertImg: [".e", 1],
autoDownload: [0],
next: "//a[text()='下一章']",
prev: 1,
css: "body{overflow:unset!important}",
category: "comic"
}, {
name: "丽图·污漫画 litu100.xyz",
reg: /litu\d+\.xyz\/comic\/id-\w+\/\d+\.html/,
imgs: ".article.comic img",
button: [4],
insertImg: [".article.comic", 2],
autoDownload: [0],
next: "a.next",
prev: "a.prev",
customTitle: () => fun.geT(".breadcrumb span:nth-child(2)").replace("首页", ""),
css: ".banner_ad{display:none!important;}",
category: "hcomic"
}, {
name: "韩国污漫画 www.ikanmh.xyz www.hmfby.com",
reg: /(www\.ikanmh\.xyz|www\.mxshm\.site|www\.92hm\.life|www\.ikanhm\.xyz|592mh\.top|592hm\.top|52wxz\.top|52kanmh\.top|52kanhm\.top|52hmw\.top|92comic\.top|91comic\.top|18comic2\.top|ikanyy\.top|18hm\.top|yycomic\.top|18hcomic\.top|18xcomic\.top|18xmh\.top|18xhm\.top|iikanwxz\.top|ikwxz\.top|wxzmh\.top)\/chapter\/\d+/,
imgs: "img[data-original]",
button: [4],
insertImg: [".comicpage,#cp_img", 2],
autoDownload: [0],
next: "//a[text()='下一章']",
prev: "//a[text()='上一章']",
customTitle: () => fun.geT("h1.title"),
referer: "src",
category: "hcomic"
}, {
name: "Avbebe.com https://avbebe.com/archives/category/%e6%88%90%e4%ba%bah%e6%bc%ab%e7%95%ab",
reg: /avbebe\.com\/archives\/\d+/,
include: "//a[@rel='category tag' and text()='成人漫畫']",
imgs: "img[decoding]",
button: [4],
insertImg: [".content-inner", 2],
customTitle: () => fun.geT(".jeg_post_title").replace(/\[\d+P\]/i, ""),
fancybox: {
v: 3,
css: false
},
category: "hcomic"
}, {
name: "ACG漫画网 www.acgomh.com www.acgxmh.com www.acgomh.com www.cool-manga.com www.porn-comic.com",
reg: /(www\.acg(x|o)mh\.com|www\.cool-manga\.com|www\.porn-comic\.com)\/(h|hentai)\/\d+\.html/,
imgs: () => fun.getImg(".manga-page img", fun.geT("#pages>*:last-child", 2), 5),
button: [4],
insertImg: [".manga-page", 1],
autoDownload: [0],
next: ".next_pics>.fr>a[href$=html]",
prev: ".next_pics>.fl>a[href$=html]",
customTitle: () => fun.geT("h2.title,h1.title").replace(/_\d+P$/i, ""),
category: "hcomic"
}, {
name: "紳士漫畫 圖片清單頁 wnacg.com www.wnacg.com www.wnacg.org m.wnacg.org m.wnacg.com www.wnacglink.top wn01.ru wn02.ru www.htmanga3.top www.htmanga4.top www.htmanga5.top www.hentaicomic.ru www.wn3.lol",
reg: /https:\/\/(wnacg\.com|www\.wnacg\.com|www\.wnacg\.org|m\.wnacg\.com|m\.wnacg\.org|www\.htmanga\d\.top|www\.hentaicomic\.ru|www\.wn3\.lol)\/photos-index(-page-\d+)?-aid-\d+\.html/,
icon: 0,
key: 0,
init: async () => {
fun.remove(".dlh,iframe:not(#FullPictureLoadIframe)");
fun.remove("//body/div[a[img]] | //div[@class='Introduct']/a[div[img]]");
new MutationObserver(() => {
fun.remove(".dlh,iframe:not(#FullPictureLoadIframe)");
}).observe(document.body, {
childList: true,
subtree: true
});
await fun.getNP(".gallary_item", ".thispage+a", null, ".paginator", 0, null, 0);
},
/*
button: [4],
imgs: async () => {
thumbnailsSrcArray = [...fun.gae(".gallary_wrap img")].map(e => e.src);
fun.show("Iframe loading...");
let doc = await fun.iframeDoc(fun.ge("a[href*='photos-slide-aid'],a[href*='photos-slist-aid']").href, "#img_list img");
fun.hide();
return [...fun.gae("#img_list img", doc)].slice(0,-1);
},
insertImg: [
[".grid,.Introduct", 0], 2
],
go: 1,
*/
category: "nsfw2"
}, {
name: "紳士漫畫 下拉閱讀頁 wnacg.com www.wnacg.com www.wnacg.org m.wnacg.org m.wnacg.com www.wnacglink.top wn01.ru wn02.ru www.htmanga3.top www.htmanga4.top www.htmanga5.top www.hentaicomic.ru www.wn3.lol",
reg: /https:\/\/(wnacg\.com|www\.wnacg\.com|www\.wnacg\.org|m\.wnacg\.com|m\.wnacg\.org|www\.htmanga\d\.top|www\.hentaicomic\.ru|www\.wn3\.lol)\/photos-(slide|slidelow|list|slist)-aid-\d+\.html/,
imgs: () => imglist.map(e => e.url),
button: [4],
insertImg: ["#img_list", 2],
customTitle: () => fun.title(" - 列表", 1),
css: "div[align=center],#control_block{display:none!important;}",
category: "hcomic"
}, {
name: "VN漫画网 下拉阅读 www.vnacg.com",
reg: /(www|m)\.vnacg\.com\/show\/\d+\.html/,
imgs: async () => {
fun.show(displayLanguage.str_05, 0);
let api = `/e/extend/api/show.php?id=${info.id}&page=`;
let max = await fetch(`${api}1`).then(res => res.json()).then(res => res.pages);
let resArr = [];
let fetchNum = 0;
for (let i = 1; i <= max; i++) {
let res = fetch(`${api+i}`).then(res => res.json()).then(res => {
fun.show(`${displayLanguage.str_06}${fetchNum+=1}/${max}`, 0);
return res.data;
});
resArr.push(res);
}
return Promise.all(resArr).then(data => {
fun.hide();
return data.flat().map(e => e.src);
});
},
button: [4],
insertImg: [".show,.read", 2],
customTitle: () => fun.title("_免费阅读", 1),
category: "hcomic"
}, {
name: "VN漫画网 清單頁 www.vnacg.com",
reg: /www\.vnacg\.com\/detail\/\d+\.html/,
icon: 0,
key: 0,
observerClick: ".layui-flow-more>a",
category: "hcomic"
}, {
name: "TWHentai 圖片清單頁 twhentai.com",
reg: /twhentai\.com\/hentai_manga\/\d+\/$/,
imgs: async () => {
await fun.getNP(".recommended-grids:not(.english-grid)", ".pagination li.active+li:not(.disabled)>a", null, ".pagination");
thumbnailsSrcArray = [...fun.gae(".recommended img")].map(e => e.src);
return thumbnailsSrcArray.map(e => e.replace("-thumb265x385", ""));
},
button: [4, "100%"],
insertImg: [
[".footer", 1], 2
],
go: 1,
customTitle: () => fun.geT(".recommended-info h3"),
category: "hcomic"
}, {
name: "松鼠症倉庫 ahri8.top",
reg: /\/readOnline\d\.php\?ID=\d+&host_id=\d+/,
include: "//div[@id='logo-group']//a[contains(text(),'松鼠症倉庫') or contains(text(),'松鼠症仓库')]",
imgs: () => Original_Image_List.map(e => HTTP_IMAGE + e.new_filename + "_w1500." + e.extension),
button: [4],
insertImg: ["#Big_Image", 2],
customTitle: () => fun.geT(".page-header").replace("線上閱讀", ""),
css: "#content>.col-lg-12,[id^=read_online_ads_area],#Big_Image~*{display:none!important}",
category: "hcomic"
}, {
name: "Caitlin.top",
reg: /caitlin\.top\/index\.php\?route=comic\/readOnline&comic_id=\d+/,
imgs: () => Image_List.map(e => location.protocol + HTTP_IMAGE + e.sort + "." + e.extension),
button: [4],
insertImg: ["#Big_Image", 2],
customTitle: () => fun.geT(".page-header"),
css: "#content>.col-lg-12,[id^=read_online_ads_area],#Big_Image~*{display:none!important}",
category: "hcomic"
}, {
name: "Roku Hentai rokuhentai.com",
reg: /https:\/\/rokuhentai\.com\/\w+\/\d+$/,
imgs: ".site-reader__image",
button: [4],
insertImg: [".site-reader", 2],
css: ".site-reader--right-to-left,.site-reader--left-to-right{overflow-x:auto!important;overflow-y:auto!important}.site-reader{padding-bottom:0px!important}.site-reader{display:block!important;}.site-bottom-ad-slot{display:none!important}",
category: "hcomic"
}, {
name: "177 漫画/XXIAV寫真館 www.177pica.com www.177picyy.com www.xxiav.com",
reg: /www\.(177pica|177picyy|xxiav)\.com\/html\/\d+\/\d+\/\d+\.html/,
imgs: () => fun.getImg(".single-content img[data-lazy-src]", (fun.geT(".page-links>*:last-child", 2) || 1), 10),
button: [4],
insertImg: [".single-content", 2],
autoDownload: [0],
next: "a[rel=prev]",
prev: 1,
customTitle: () => fun.geT(".entry-title").replace(/\[\d+P\]$/i, ""),
category: "hcomic"
}, {
name: "18H 宅宅愛動漫 18h.animezilla.com",
reg: /18h\.animezilla\.com\/manga\/\d+/,
imgs: () => {
let max;
try {
max = fun.ge(".last").href.split("/").pop();
} catch (e) {
max = 1;
}
return fun.getImgO("#comic", max, "4", [null, null], 0, ".entry-title,.wp-pagenavi", 0);
},
button: [4],
insertImg: ["#page-current", 1],
customTitle: () => fun.geT("h1.entry-title").replace(/\s?\[\d+P\](\s?-\s?\d+\/\d+\s?)?/i, ""),
category: "hcomic"
}, {
name: "18 禁漫 www.18mh.cc",
reg: /www\.18mh\.cc\/index-look-name-/,
imgs: () => {
let url = fun.attr("img[data-url]", "data-url");
let m = url.match(/(^.+\/)(\d+)(\.\w{2,4})$/);
let path = m[1];
let start = m[2];
let ex = m[3];
let ps = fun.gae("select[onchange]>option").length;
let end = parseInt(start, 10) + ps;
let arr = [];
for (let i = start; i < end; i++) {
arr.push(path + i + ex);
}
return arr;
},
button: [4],
insertImg: [".e", 2],
autoDownload: [0],
next: "//a[text()='下一章']",
prev: "//a[text()='上一章']",
customTitle: () => {
let s = fun.geT(".b").split(" - ");
return s[2] + " - " + s[3];
},
css: ".p.fanye,select[onchange],.c_p.k_pag{display:none!important}",
category: "hcomic"
}, {
name: "18 禁漫M m.18mh.cc",
reg: /^https?:\/\/m\.18mh\.cc\/look\/name\//,
imgs: () => {
let url = fun.ge("#manga img").src;
let m = url.match(/(^.+\/)(\d+)(\.\w{2,4})$/);
let path = m[1];
let start = m[2];
let ex = m[3];
let ps = parseInt(fun.geT(".manga-page").match(/(\d+)P/)[1], 10);
let end = parseInt(start, 10) + ps;
let arr = [];
for (let i = start; i < end; i++) {
arr.push(path + i + ex);
}
return arr;
},
button: [4],
insertImg: ["#manga", 2],
autoDownload: [0],
next: "//a[text()='下一章']",
prev: "//a[text()='上一章']",
customTitle: () => fun.geT("#mangaTitle"),
css: ".action-list li{width:50% !important}#action>ul>li:nth-child(n+2):nth-child(-n+3){display:none !important}",
category: "hcomic"
}, {
name: "色漫网 www.cartoon18.com",
reg: /www\.cartoon18\.com\/story\/\d+\/full/,
imgs: "img[data-src]",
button: [4],
insertImg: ["#lightgallery", 2],
category: "hcomic"
}, {
name: "韓漫射 h-webtoon.com 绅士同人H漫 h-doujinshi.xyz",
reg: /(h-webtoon\.com|h-doujinshi\.xyz)\/.+\//,
init: "setTimeout(()=>{fun.gae('.g1-nav-single a').forEach(e=>{e.removeAttribute('target')})},2000)",
include: ".g1-content-narrow",
imgs: ".g1-content-narrow p img",
button: [4],
insertImg: [".g1-content-narrow", 2],
autoDownload: [0],
next: "#content .g1-teaser-next",
prev: "#content .g1-teaser-prev",
customTitle: () => fun.geT("h1.entry-title"),
css: "#simple-banner,.touchy-wrapper,.touchy-wrapper~*:not([id^='pv-']):not([class^='pv-']):not(.pagetual_tipsWords):not(#comicRead):not(#fab):not(.FullPictureLoadMsg):not(.FullPictureLoadFixedBtn):not(#FullPictureLoadOptions):not(*[class^=fancybox]),.code-block,#secondary{display:none!important}",
category: "hcomic"
}, {
name: "18H漫画 18hmanga.click",
reg: /(18hmanga\.click)\/.+\//,
init: "setTimeout(()=>{fun.gae('.g1-nav-single a').forEach(e=>{e.removeAttribute('target')})},2000)",
include: ".g1-content-narrow",
imgs: ".g1-content-narrow p img",
autoDownload: [0],
next: "#content .g1-teaser-prev",
prev: "#content .g1-teaser-next",
customTitle: () => fun.geT("h1.entry-title"),
css: "#simple-banner,.touchy-wrapper,.touchy-wrapper~*:not([id^='pv-']):not([class^='pv-']):not(.pagetual_tipsWords):not(#comicRead):not(#fab):not(.FullPictureLoadMsg):not(.FullPictureLoadFixedBtn):not(#FullPictureLoadOptions):not(*[class^=fancybox]),.code-block,#secondary{display:none!important}",
category: "hcomic"
}, {
name: "hitomi hitomi.la",
reg: /hitomi\.la\/reader\/\d+\.html/,
init: "setTimeout(()=>{$(document).unbind('keydown');$(document).unbind('click')},1000)",
imgs: async () => {
await fun.waitEle("#mobileImages .lillie", 11);
fun.ge("#comicImages").setAttribute("class", "fitVertical");
fun.ge("#mobileImages").setAttribute("class", "hidden");
if (options.fancybox == 1) {
fun.show("Get Thumbnailsing...");
let url = fun.ge("//a[text()='Gallery Info']").href;
let doc = await fun.iframeDoc(url, ".gallery-preview img");
thumbnailsSrcArray = [...fun.gae(".gallery-preview img", doc)].map(e => e.dataset.src ? e.dataset.src : e.src);
fun.hide();
}
return galleryinfo.files.map((e, i) => url_from_url_from_hash(galleryinfo["id"], our_galleryinfo[i], "webp", undefined, "a"));
},
button: [4],
insertImg: ["#comicImages", 2],
customTitle: () => fun.title("|", 1),
css: "body{overflow:unset!important}#FullPictureLoadEnd{color:rgb(255, 255, 255)}",
threading: 5,
category: "hcomic"
}, {
name: "Orzqwq List模式 orzqwq.com",
reg: /orzqwq\.com\/manga\/.+style=list/,
include: "//option[@selected and text()='List style']",
imgs: async () => {
fun.show(displayLanguage.str_04, 0);
await fun.waitEle(".img-responsive", 600);
fun.hide();
return [...fun.gae("img[data-src]")];
},
insertImg: [".reading-content", 2],
customTitle: () => fun.geT(".breadcrumb>li:nth-child(2)").trim(),
category: "hcomic"
}, {
name: "Orzqwq 分頁模式 orzqwq.com",
reg: /orzqwq\.com\/manga\/.+\/p\//,
include: "//option[@selected and text()='Paged style']",
imgs: async () => {
fun.show(displayLanguage.str_04, 0);
await fun.waitEle("#chapter_preloaded_images", 600);
fun.hide();
return chapter_preloaded_images;
},
insertImg: [".reading-content", 2],
customTitle: () => fun.geT(".breadcrumb>li:nth-child(2)").trim(),
category: "hcomic"
}, {
name: "Orzqwq 圖片清單頁聚集所有預覽縮圖 orzqwq.com",
reg: /orzqwq\.com\/manga\/[^/]+\/$/,
icon: 0,
key: 0,
init: () => {
fun.getNP(".chapter-images-list>.image-item", "li.active+li>a", null, ".pagination", 0, "data-src", 0);
},
category: "hcomic"
}, {
name: "HO5HO www.ho5ho.com",
reg: /www\.ho5ho\.com\/.+\/.+\/server.+\//,
include: "//script[contains(text(),'chapter_preloaded_images')]",
imgs: () => chapter_preloaded_images,
button: [4],
insertImg: [".entry-content", 2],
customTitle: () => fun.geT(".breadcrumb>li:nth-child(2)").trim(),
category: "hcomic"
}, {
name: "成人漫画 bad.news/mh 圖片清單頁",
reg: /https?:\/\/bad\.news\/mh\/\w+\/id-\d+/,
imgs: () => {
thumbnailsSrcArray = [...fun.gae("img.img-responsive")].map(e => e.dataset.echo ? e.dataset.echo : e.src);
let link = [fun.ge("a.post-thumb").href];
return fun.getImgA("img.img-responsive", link);
},
button: [4],
insertImg: [
["//div[div[article[div[div[a[img[@class='img-responsive']]]]]]]", 2], 2
],
go: 1,
threading: 4,
category: "hcomic"
}, {
name: "成人漫画 bad.news/mh 閱讀頁",
reg: /bad\.news\/mh\/view\/id-\d+/,
imgs: ".img-responsive",
button: [4],
insertImg: ["//div[img[@class='img-responsive']]", 2],
threading: 4,
category: "hcomic"
}, {
name: "H漫画 mhdnf.xyz www.mhdnf.xyz mhqwe.xyz www.mhqwe.xyz",
reg: /https?:\/\/(www\.)?(mhdnf|mhqwe)\.xyz\/play\?linkId=\d+&bookId=\d+&path=\d+&key=.+/,
imgs: "#imgList>img:not([src*=QRCode])",
button: [4],
insertImg: ["#imgList", 2],
autoDownload: [0],
next: "//a[text()='下一話']",
prev: "//a[text()='上一話']",
customTitle: () => fun.attr("meta[name='apple-mobile-web-app-title']", "content"),
css: "#hfad{display:none!important;}",
category: "hcomic"
}, {
name: "JComic jcomic.net",
reg: /https?:\/\/jcomic\.net\/page\/[^\/]+$/,
imgs: ".comic-view,.comic-thumb",
button: [4],
insertImg: ["//div[img[@class='img-responsive comic-thumb']]", 2],
threading: 10,
customTitle: () => fun.geT("//ol/li[2]/a"),
category: "hcomic"
}, {
name: "JComic jcomic.net",
reg: /https?:\/\/jcomic\.net\/page\/[^\/]+\/[0-9\.]+$/,
imgs: ".comic-view,.comic-thumb",
button: [4],
insertImg: ["//div[img[@class='img-responsive comic-thumb']]", 2],
autoDownload: [0],
next: () => {
let next = fun.ge("//a[button[text()='下一章']]");
return next && next.href != location.href ? next.href : null;
},
prev: 1,
threading: 10,
customTitle: () => fun.geT("//ol/li[2]/a") + " - " + fun.geT("//ol/li[3]"),
category: "hcomic"
}, {
name: "一之涩漫画 1zse.com",
reg: /^https?:\/\/1zse\.com\/index\.php\/\d+\.html/,
imgs: () => {
let max = fun.ge("a.last").href.split("/").pop();
return fun.getImg(".context img", max, 7);
},
button: [4],
insertImg: [".context", 2],
autoDownload: [0],
next: ".post-previous a",
prev: ".post-next a",
customTitle: () => fun.geT("#content h1").replace(/\[\d+P\]/i, ""),
category: "hcomic"
}, {
name: "那露漫画 naluhd.com",
reg: /^https?:\/\/naluhd\.com\/index\.php\/\d+\.html/,
imgs: () => fun.getImgA(".article-content img", "a.post-page-numbers"),
button: [4],
insertImg: [".article-content", 2],
autoDownload: [0],
next: "//a[p[text()='上一篇'] and not(starts-with(@href,'java'))]",
prev: "//a[p[text()='下一篇'] and not(starts-with(@href,'java'))]",
customTitle: () => fun.geT(".article-title>a").replace(/\[\d+P\]/i, ""),
category: "hcomic"
}, {
name: "色色漫画 www.manhuasese.com 最新韩漫网 www.zuixinhanman.com",
reg: /^https:\/\/www\.manhuasese\.com\/index\.php\/chapter\/\d+|https:\/\/www\.zuixinhanman\.com\/chapter_\d+\.html/,
include: ".rd-article-wr,.comic-list",
imgs: ".rd-article-wr img,.comic-list img",
button: [4],
insertImg: [".rd-article-wr,.comic-list", 2],
autoDownload: [0],
next: ".j-rd-next,.next-btn",
prev: ".j-rd-prev,.prev-btn",
customTitle: () => fun.geT(".comic-title>a,.comic-name,.mip-shell-header-title"),
category: "hcomic"
}, {
name: "最新韩漫网M www.zuixinhanman.com",
reg: /^https:\/\/www\.zuixinhanman\.com\/chapter_\d+\.html/,
delay: 300,
imgs: "#comic_pic",
button: [4],
insertImg: [
[".bo_tit", 2, "#comic_pic"], 2,
],
autoDownload: [0],
next: "//a[contains(text(),'下一章')][contains(@href,'html')]",
prev: "//a[contains(text(),'上一章')][contains(@href,'html')]",
customTitle: () => fun.geT(".mip-shell-header-title"),
fancybox: {
blacklist: 1
},
category: "hcomic"
}, {
name: "韩漫100 hanman100.com",
reg: /^https:\/\/hanman100\.com\/index\.php\/chapter-\d+\.html/,
imgs: "#img-content img,.comic-list img",
button: [4, "24%", 4],
insertImg: ["#img-content,.comic-list", 1],
autoDownload: [0],
next: ".pnext.next+a[href$=html],.next-btn",
prev: 1,
customTitle: () => fun.geT("h1.text-center,.comic-name").replace("漫画 ", ""),
css: "#left,#right{display:none!important;}",
category: "hcomic"
}, {
name: "免费韩漫看 www.hanmanfree.com",
reg: /^https:\/\/www\.hanmanfree\.com\/index\.php\/chapter\/\d+/,
imgs: "#ChapterContent img,.readForm img",
button: [4],
insertImg: ["#ChapterContent,.readForm", 2],
autoDownload: [0],
next: "//a[text()='下一章'][starts-with(@href,'/')]",
prev: "//a[text()='上一章'][starts-with(@href,'/')]",
customTitle: () => fun.ge("#ChapterContent") ? fun.geT(".arthor") + " - " + fun.geT(".title") : fun.title("免费观看 "),
category: "hcomic"
}, {
name: "韩漫推荐 okhanman.com",
reg: /^https:\/\/okhanman\.com\/index\.php\/chapter\/\d+/,
include: "//div/div[@style]/img[@style]",
imgs: "//div/div[@style]/img[@style]",
button: [4],
insertImg: ["//div[div[@style]/img[@style]]", 2],
autoDownload: [0],
next: "//a[text()='下一章'][starts-with(@href,'/')]",
prev: "//a[text()='上一章'][starts-with(@href,'/')]",
customTitle: () => fun.geT("h1[style]"),
category: "hcomic"
}, {
name: "韩漫推荐M okhanman.com",
reg: /^https:\/\/okhanman\.com\/index\.php\/chapter\/\d+/,
imgs: ".chapterbox img",
button: [4],
insertImg: [
[".chapterbox>*:first-child", 1, ".pic"], 2
],
autoDownload: [0],
next: "//a[text()='继续阅读下一章节']",
prev: 1,
customTitle: () => fun.title("韩漫 "),
category: "hcomic"
}, {
name: "韓漫天堂 18jin.top",
reg: /^https:\/\/18jin\.top\/index\.php\/chapter\/\d+/,
imgs: () => fun.ge(".rd-article-wr") ? [...fun.gae(".rd-article-wr img")] : [...fun.gae(".comic-list img:not([src$='empty.png'])")],
button: [4],
insertImg: [".rd-article-wr,.comic-list", 1],
autoDownload: [0],
next: ".j-rd-next,.next-btn",
prev: ".j-rd-prev,.prev-btn",
customTitle: () => {
if (fun.ge(".rd-article-wr")) {
return fun.geT(".j-comic-title") + " - " + fun.geT(".comic-title>a")
} else {
let t = fun.geT("h1.comic-name");
let tArr = t.split(":");
return tArr[1] + " - " + tArr[0];
}
},
css: ".image-container{display:none!important;}",
category: "hcomic"
}, {
name: "琴瑟漫畫 sixcomic.com 琴瑟書庫 sixacg.com",
reg: /^https?:\/\/(sixcomic\.com|sixacg\.com)\/chapter\/\d+$/,
imgs: ".comicpage img:not([data-original*='qssk.top']),#cp_img img:not([data-original*='qssk.top'])",
button: [4],
insertImg: [".comicpage,#cp_img", 2],
autoDownload: [0],
next: "//a[@href and not(starts-with(@href,'java')) and text()='下一章']",
prev: "//a[@href and not(starts-with(@href,'java')) and text()='上一章']",
customTitle: () => fun.title(/免费阅读|在线阅读/, 1),
category: "hcomic"
}, {
name: "香香腐宅 boylove.cc boylove1.mobi",
reg: /^https:\/\/boylove\d?\.\w+\/home\/book\/capter\/id\/\d+/,
imgs: "img[data-original]",
button: [4],
insertImg: [".reader-cartoon-chapter", 2],
autoDownload: [0],
next: "a[data-value=next]",
prev: "a[data-value=prev]",
customTitle: () => fun.geT(".title a").trim(),
category: "hcomic"
}, {
name: "一耽女孩 yidan.in yidan.one yidan.app",
reg: /^https:\/\/yidan\.(in|one|app)\/#\/pages\/read\/read\?no=\d+&id=\d+(&episodesId=\d+)?/,
delay: 1000,
init: () => {
$("uni-view.last-bum").on("click", () => {
setTimeout(() => {
location.reload();
}, 300);
});
},
imgs: () => {
let m = siteUrl.split("&");
let no = m[0].match(/\d+$/)[0];
let mhid = m[1].match(/\d+/)[0];
return fetch(`${location.origin}/prod-api/app-api/vv/mh-episodes/get?jiNo=${no}&mhid=${mhid}`).then(res => res.json()).then(json => json.data.pics.split(",").map(e => location.origin + e));
},
button: [4],
insertImg: [".read-article", 2],
autoDownload: [0],
next: () => {
let next = fun.ge("//a[text()='继续看下一话']");
if (next) {
let m = siteUrl.split("&");
let no = parseInt(m[0].match(/\d+$/)[0], 10);
let mhid = m[1].match(/\d+/)[0];
let url = `https://yidan.in/#/pages/read/read?no=${no+=1}&id=${mhid}`;
return url;
} else {
return null;
}
},
prev: 1,
customTitle: () => fun.title(" - 一耽女孩_好看的一耽漫画官网").trim(),
css: ".page-pagination{display:none!important}",
category: "hcomic"
}, {
name: "久久漫画网 www.99hanman.top",
reg: /https:\/\/www\.99hanman\.top\/chapter\/\d+/,
include: ".rd-article-wr",
imgs: ".comiclist img",
button: [4],
insertImg: [".comiclist", 2],
autoDownload: [0],
next: "//a[text()='下一章' and @href]",
prev: "//a[text()='上一章' and @href]",
customTitle: () => fun.geT("h1.title"),
category: "hcomic"
}, {
name: "久久漫画网M www.99hanman.top",
reg: /https:\/\/www\.99hanman\.top\/chapter\/\d+/,
imgs: "#cp_img img",
insertImg: ["#cp_img", 2],
autoDownload: [0],
next: "//a[text()='下一章' and @href]",
prev: "//a[text()='上一章' and @href]",
customTitle: () => {
let code = fun.geT("//script[contains(text(),'bookInfo')]");
let bookInfo = code.match(/bookInfo\s?=\s?([^;]+)/g)[0];
bookInfo = fun.run(bookInfo);
return bookInfo.book_name + " - " + bookInfo.chapter_name;
},
category: "hcomic"
}, {
name: "91禁漫 www.91jinman.com",
reg: /^https?:\/\/www\.91jinman\.com\/\d+\.html/,
imgs: ".wp-posts-content img",
button: [4],
insertImg: [".wp-posts-content", 2],
autoDownload: [0],
next: "//a[p[text()='上一篇']]",
prev: "//a[p[text()='下一篇']]",
customTitle: () => fun.geT(".article-title"),
css: ".wp-posts-content{max-height:unset!important}",
category: "hcomic"
}, {
name: "嗨皮漫畫閱讀 https://m.happymh.com/manga/daiwangraoming",
enable: 0,
reg: /m\.happymh\.com\/reads/,
include: "#root",
xhr: async () => {
let lps = location.pathname.split("/");
let mangaCode = lps[2];
let id = lps[3];
let api = `https://m.happymh.com/v2.0/apis/manga/read?code=${mangaCode}&cid=${id}`;
let json = await fetch(api).then(res => res.json());
debug("\n此頁JSON資料\n", json);
siteJson = json;
},
init: async () => {
await siteData.xhr();
let fragment = new DocumentFragment();
let imgs = siteJson.data.scans.map(e => e.url);
imgs.forEach(url => {
let img = new Image();
img.src = url;
fragment.appendChild(img);
});
debug("\n圖片預讀\n", fragment);
if (await fun.waitEle("#page-area")) {
new IntersectionObserver((entries, observer) => {
if (entries[0].isIntersecting) {
observer.unobserve(entries[0].target);
let f = ge("footer>article");
let c1 = f.firstChild.cloneNode(true);
c1.firstChild.href = "/latest";
c1.firstChild.firstChild.innerText = "更新";
f.appendChild(c1);
let c2 = f.firstChild.cloneNode(true);
c2.firstChild.href = "/bookcase";
c2.firstChild.firstChild.innerText = "收藏";
f.appendChild(c2);
let p = gx("//a[span[text()='上一话' or text()='上一話'] and contains(@href,'reads')]");
if (p) {
p.classList.add("MuiButton-containedPrimary");
}
let n = gx("//a[span[text()='下一话' or text()='下一話'] and contains(@href,'readMore')]");
if (n) {
n.classList.remove("MuiButton-containedPrimary");
n.firstChild.innerText = "^_^感谢您的阅读~已经没有下一话了哦~";
}
}
}).observe(ge('#page-area'));
}
},
imgs: () => siteJson.data.scans.map(e => e.url),
referrerpolicy: "origin",
button: [4],
insertImg: ["//article[div[contains(@id,'imageLoader')]]", 3],
go: 1,
autoDownload: [0],
next: "//a[span[text()='下一話' or text()='下一话']]",
prev: "//a[span[text()='上一話' or text()='上一话']]",
customTitle: () => siteJson.data.manga_name + " - " + siteJson.data.chapter_name,
category: "comic"
}, {
name: "嗨皮漫畫更新頁,自動點擊載入更多,鏈接新分頁打開",
enable: 0,
icon: 0,
key: 0,
reg: /m\.happymh\.com\/latest/,
observerClick: ".more-div-btn",
openInNewTab: ".manga-cover>a:not([target=_blank])",
category: "comic"
}, {
name: "嗨皮漫畫展開目錄",
reg: /m\.happymh\.com\/manga\//,
enable: 0,
icon: 0,
key: 0,
autoClick: "#expandButton",
category: "comic"
}, {
name: "嗨皮漫畫,鏈接新分頁打開",
reg: /m\.happymh\.com\//,
enable: 0,
icon: 0,
key: 0,
openInNewTab: ".home-banner a:not([target=_blank]),.manga-rank a:not([target=_blank]),.manga-cover a:not([target=_blank])",
category: "comic"
}, {
name: "COLAMANHUA www.colamanga.com", //方向鍵上一章下一章、反反偵錯,下載需先手動觸發全部載入圖片,圖址如為blob函式會使用到canvas需要繪製過程會有點卡。
enable: 1,
reg: /www\.(colamanga|colamanhua)\.com\/manga-.+\.html$/,
init: () => {
fun.clearAllTimer(1);
},
imgs: () => fun.ge(".mh_comicpic img[src^=blob]") ? fun.imgBlobArr(".mh_comicpic img[src^=blob]") : [...fun.gae(".mh_comicpic img[src]")],
scrollEle: [".mh_comicpic img", 600],
next: "//a[text()='下一章']",
prev: "//a[text()='上一章']",
customTitle: () => fun.title(" COLAMANGA", 1),
threading: 10,
css: ".mh_wrap{width:100%!important;min-width:100%!important}",
category: "comic"
}, {
name: "8Comic無限動漫 https://a.twobili.com/ReadComic/103/471/471_3_Q_atq24.html",
enable: 1,
reg: /(a|www)\.(comicabc|twobili)\.com\/(ReadComic|online)/,
imgs: () => {
let code = [...document.scripts].find(s => s.innerHTML.search(/ge\(e\)/) > -1).innerHTML;
let cM = code.match(/ge\([^.]+\.src\s?=\s?([^;]+)/);
let keyCode = cM[1];
let arr = [];
for (let i = 1; i <= ps; i++) {
let r = "(" + i + ")";
let src = location.protocol + fun.run(keyCode.replace(/\(pp?\)/g, r));
arr.push(src);
}
return arr;
},
button: [4],
insertImg: ["//td[img[@id='TheImg']]", 2],
go: 1,
autoDownload: [0],
next: "#nextvol:not([style])",
prev: "#prevvol",
customTitle: () => {
let t = document.title.split(" ")[0];
return `${t}-第${ch}集`;
},
css: "td[style^=width]{display:none!important}",
category: "comic"
}, {
name: "8Comic無限動漫 手機版 https://8.twobili.com/comic/insurance_103.html?ch=471",
enable: 1,
reg: /8\.twobili\.com\/comic\/insurance/,
init: () => {
fun.ge("#pageindex").parentNode.appendChild(fun.ge("#prevvol").cloneNode(true));
fun.ge('#pageindex').parentNode.appendChild(fun.ge("#nextvol").cloneNode(true));
let ul = fun.ge("#TheTable>ul");
let v1 = fun.ge(".view_tmenu").cloneNode(true);
let v2 = fun.gae(".view_menut")[1];
ul.appendChild(v2);
ul.appendChild(v1);
let b1 = fun.ge(".book_inc_title");
let b2 = fun.ge(".book_link_item");
ul.appendChild(b1);
ul.appendChild(b2);
},
button: [4],
imgs: () => {
let arr = [];
for (let i = 1; i <= ps; i++) {
let imgSrc = "https://img" + ss(c, 4, 2) + ".8comic.com/" + ss(c, 6, 1) + "/" + ti + "/" + ss(c, 0, 4) + "/" + nn([i]) + "_" + ss(c, mm([i]) + 10, 3, f) + ".jpg";
arr.push(imgSrc);
}
return arr;
},
button: [4],
insertImg: ["//li[img[@id='TheImg']]", 2],
go: 1,
autoDownload: [0],
next: "#nextvol:not([style])",
prev: "#prevvol",
customTitle: () => {
let t = document.title.split(" ")[0];
let n = fun.geT("#chapter");
return t + " - " + n;
},
css: ".pinch-zoom-container{height:auto !important;display:contents !important}.view_tmenu+div[style],#pagenum,[onclick^='j'],#pageindex,ico+a+.material-icons.right-logo{display:none !important}.view_menut a{width:33.3% !important;max-width:33.3% !important}",
category: "comic"
}, {
name: "Mangabz https://www.mangabz.com/m38701/",
enable: 0,
reg: /^https:\/\/(www\.)?mangabz\.com\/m\d+/,
include: ".container",
init: () => {
const hidetoolbar = () => {
var e = e || window.event;
if (e.wheelDelta < 0 || e.detail > 0) {
$(".top-bar").attr("style", "top: -74px;");
} else {
$(".top-bar").removeAttr("style");
}
};
document.addEventListener("wheel", hidetoolbar);
document.addEventListener("DOMMouseScroll", hidetoolbar);
const keyhidetoolbar = (e) => {
let key = window.event ? e.keyCode : e.which;
if (key == "34" || key == "32" || key == "40") {
$(".top-bar").attr("style", "top: -74px;");
} else {
$(".top-bar").removeAttr("style");
}
};
document.addEventListener("keydown", keyhidetoolbar);
},
imgs: () => {
if (!mkey) var mkey = "";
let resArr = [];
let fetchNum = 0;
for (let i = 1; i <= MANGABZ_IMAGE_COUNT; i++) {
let apiUrl = location.origin + MANGABZ_CURL + "chapterimage.ashx" + `?cid=${MANGABZ_CID}&page=${i}&key=${mkey}&_cid=${MANGABZ_CID}&_mid=${MANGABZ_MID}&_dt=${MANGABZ_VIEWSIGN_DT}&_sign=${MANGABZ_VIEWSIGN}`;
let res = fetch(apiUrl).then(res => res.text()).then(res => {
fun.show(`${displayLanguage.str_06}(${fetchNum+=1}/${MANGABZ_IMAGE_COUNT})`, 0);
return fun.run(res)[0];
});
resArr.push(res);
}
return Promise.all(resArr).then(arr => {
fun.hide();
return arr;
});
},
button: [4],
insertImg: ["#cp_img", 2],
go: 1,
autoDownload: [0],
next: "//a[img[contains(@src,'xiayizhang')]][starts-with(@href,'/m')]",
prev: "//a[img[contains(@src,'shangyizhang')]][starts-with(@href,'/m')]",
customTitle: () => fun.title("_", 2).replace("漫畫", ""),
css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}a[href^='j']{display:none !important}body{overflow:unset!important}",
category: "comic"
}, {
name: "Xmanhua https://xmanhua.com/m10344/",
enable: 0,
reg: /^https:\/\/(www\.)?xmanhua\.com\/m\d+/,
include: ".reader-bottom-page-list",
init: () => {
const showtoolbar = () => {
let t = fun.ge(".header.toolbar");
if (t) {
$(".header").removeClass("toolbar");
$(".header").removeAttr("style");
} else {
$(".header").addClass("toolbar");
$(".header").attr("style", "top: -64px;");
}
let b = fun.ge(".reader-bottom.toolbar");
if (b) {
$(".reader-bottom").removeClass("toolbar");
$(".reader-bottom").removeAttr("style");
} else {
$(".reader-bottom").addClass("toolbar");
$(".reader-bottom").attr("style", "bottom: -50px;");
}
};
document.addEventListener("click", showtoolbar);
const hidetoolbar = () => {
var e = e || window.event;
if (e.wheelDelta < 0 || e.detail > 0) {
$(".header").addClass("toolbar");
$(".header").attr("style", "top: -64px;");
$(".reader-bottom").addClass("toolbar");
$(".reader-bottom").attr("style", "bottom: -50px;");
} else {
$(".header").removeClass("toolbar");
$(".header").removeAttr("style");
$(".reader-bottom").removeClass("toolbar");
$(".reader-bottom").removeAttr("style");
}
};
document.addEventListener("wheel", hidetoolbar);
document.addEventListener("DOMMouseScroll", hidetoolbar);
const keyhidetoolbar = (e) => {
let key = window.event ? e.keyCode : e.which;
if (key == "34" || key == "32" || key == "40") {
$(".header").addClass("toolbar");
$(".header").attr("style", "top: -64px;");
$(".reader-bottom").addClass("toolbar");
$(".reader-bottom").attr("style", "bottom: -50px;");
} else {
$(".header").removeClass("toolbar");
$(".header").removeAttr("style");
$(".reader-bottom").removeClass("toolbar");
$(".reader-bottom").removeAttr("style");
}
};
document.addEventListener("keydown", keyhidetoolbar);
},
imgs: () => {
if (!mkey) var mkey = "";
let resArr = [];
let fetchnUm = 0;
for (let i = 1; i <= XMANHUA_IMAGE_COUNT; i++) {
let apiUrl = location.origin + XMANHUA_CURL + "chapterimage.ashx" + `?cid=${XMANHUA_CID}&page=${i}&key=${mkey}&_cid=${XMANHUA_CID}&_mid=${XMANHUA_MID}&_dt=${XMANHUA_VIEWSIGN_DT}&_sign=${XMANHUA_VIEWSIGN}`;
let res = fetch(apiUrl).then(res => res.text()).then(res => {
fun.show(`${displayLanguage.str_06}(${fetchnUm+=1}/${XMANHUA_IMAGE_COUNT})`, 0);
return fun.run(res)[0];
});
resArr.push(res);
}
return Promise.all(resArr).then(arr => {
fun.hide();
return arr;
});
},
button: [4],
insertImg: ["#cp_img", 2],
go: 1,
autoDownload: [0],
next: "//a[img[contains(@src,'reader-bottom-right-2')]][starts-with(@href,'/m')]",
prev: "//a[img[contains(@src,'reader-bottom-right-1')]][starts-with(@href,'/m')]",
customTitle: () => fun.title('_', 2).replace("漫畫", ""),
css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}.relative>a{display:none!important}.reader-img-con{padding:64px 0 50px !important;}",
category: "comic"
}, {
name: "DM5/極速 分頁模式 https://www.dm5.com/m755073/ https://hk.1kkk.com/ch1-1266817/",
enable: 0,
reg: /^https:\/\/(www|tel|en|cnc|hk|m)?\.?(dm5|1kkk)\.(com|cn)\/(m|ch|vol|other)[-_0-9p]+\//,
include: "#chapterpager",
imgs: () => {
if (!mkey) var mkey = "";
let resArr = [];
let fetchNum = 0;
for (let i = 1; i <= DM5_IMAGE_COUNT; i++) {
let apiUrl = location.origin + DM5_CURL + "chapterfun.ashx" + `?cid=${DM5_CID}&page=${i}&key=${mkey}&language=1>k=6&_cid=${DM5_CID}&_mid=${DM5_MID}&_dt=${DM5_VIEWSIGN_DT}&_sign=${DM5_VIEWSIGN}`;
let res = fetch(apiUrl).then(res => res.text()).then(res => {
fun.show(`${displayLanguage.str_06}(${fetchNum+=1}/${DM5_IMAGE_COUNT})`, 0);
return fun.run(res)[0];
});
resArr.push(res);
}
return Promise.all(resArr).then(arr => {
fun.hide();
return arr;
});
},
button: [4],
insertImg: ["#cp_img", 2],
go: 1,
autoDownload: [0],
next: "//a[text()='下一章']",
prev: "//a[text()='上一章']",
customTitle: () => fun.title("_", 2),
topButton: true,
css: "body{overflow:unset!important}",
category: "comic"
}, {
name: "DM5/極速 條漫模式 https://www.dm5.com/m1343377/ https://hk.1kkk.com/ch1-1343377/",
enable: 0,
reg: /^https:\/\/(www|tel|en|cnc|hk|m)?\.?(dm5|1kkk)\.(com|cn)\/(m|ch|vol|other)[-_0-9]+\//,
include: ["#barChapter"],
imgs: "#barChapter>img",
button: [4],
insertImg: ["#barChapter", 2],
go: 1,
autoDownload: [0],
next: "//a[text()='下一章']",
prev: "//a[text()='上一章']",
customTitle: () => fun.title("_", 2),
css: "body{overflow:unset!important}",
category: "comic"
}, {
name: "yymanhua https://www.yymanhua.com/",
enable: 0,
reg: /(www\.)?yymanhua\.com\/m\d+/,
include: ".reader-bottom-page-list",
init: () => {
const showtoolbar = () => {
let t = fun.ge(".header.toolbar");
if (t) {
$(".header").removeClass("toolbar");
$(".header").removeAttr("style");
} else {
$(".header").addClass("toolbar");
$(".header").attr("style", "top: -64px;")
}
let b = fun.ge(".reader-bottom.toolbar");
if (b) {
$(".reader-bottom").removeClass("toolbar");
$(".reader-bottom").removeAttr("style");
} else {
$(".reader-bottom").addClass("toolbar");
$(".reader-bottom").attr("style", "bottom: -50px;");
}
};
document.addEventListener("click", showtoolbar);
const hidetoolbar = () => {
var e = e || window.event;
if (e.wheelDelta < 0 || e.detail > 0) {
$(".header").addClass("toolbar");
$(".header").attr("style", "top: -64px;");
$(".reader-bottom").addClass("toolbar");
$(".reader-bottom").attr("style", "bottom: -50px;");
} else {
$(".header").removeClass("toolbar");
$(".header").removeAttr("style");
$(".reader-bottom").removeClass("toolbar");
$(".reader-bottom").removeAttr("style");
}
};
document.addEventListener("wheel", hidetoolbar);
document.addEventListener("DOMMouseScroll", hidetoolbar);
const keyhidetoolbar = (e) => {
let key = window.event ? e.keyCode : e.which;
if (key == "34" || key == "32" || key == "40") {
$(".header").addClass("toolbar");
$(".header").attr("style", "top: -64px;");
$(".reader-bottom").addClass("toolbar");
$(".reader-bottom").attr("style", "bottom: -50px;");
} else {
$(".header").removeClass("toolbar");
$(".header").removeAttr("style");
$(".reader-bottom").removeClass("toolbar");
$(".reader-bottom").removeAttr("style");
}
};
document.addEventListener("keydown", keyhidetoolbar);
},
imgs: () => {
if (!mkey) var mkey = "";
let resArr = [];
let fetchnUm = 0;
for (let i = 1; i <= YYMANHUA_IMAGE_COUNT; i++) {
let apiUrl = location.origin + YYMANHUA_CURL + "chapterimage.ashx" + `?cid=${YYMANHUA_CID}&page=${i}&key=${mkey}&_cid=${YYMANHUA_CID}&_mid=${YYMANHUA_MID}&_dt=${YYMANHUA_VIEWSIGN_DT}&_sign=${YYMANHUA_VIEWSIGN}`;
let res = fetch(apiUrl).then(res => res.text()).then(res => {
fun.show(`${displayLanguage.str_06}(${fetchnUm+=1}/${YYMANHUA_IMAGE_COUNT})`, 0);
return fun.run(res)[0];
});
resArr.push(res);
}
return Promise.all(resArr).then(arr => {
fun.hide();
return arr;
});
},
button: [4],
insertImg: ["#cp_img", 2],
go: 1,
autoDownload: [0],
next: "//a[img[contains(@src,'reader-bottom-right-2')]][starts-with(@href,'/m')]",
prev: "//a[img[contains(@src,'reader-bottom-right-1')]][starts-with(@href,'/m')]",
customTitle: () => fun.title("_", 2).replace("漫畫", ""),
css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}.relative>a{display:none!important}.reader-img-con{padding:64px 0 50px !important;}",
category: "comic"
}, {
name: "DM5/極速/Mangabz/Xmanhua/yymanhua/漫画人/奇漫屋/漫画星球(PC)/6 漫画/漫本 手機版 https://m.dm5.com/m755073/",
enable: 0,
reg: /(www|tel|en|cnc|hk|m)?\.?(dm5|1kkk|mangabz|xmanhua|yymanhua|manhuaren|qiman\d{1,2}|mhxqiu\d|6mh6\d|manben)\.(com|cn)\/(m|ch|vol|other)?[-_0-9]+\//,
delay: 300,
include: "//script[contains(text(),'newImgs')]",
init: () => {
if (fun.gae(".view-bottom-bar>li").length == 4) fun.css(".view-bottom-bar>li:nth-child(n+2):nth-child(-n+3){display:none!important}.view-bottom-bar li{width:50%!important}");
},
imgs: () => newImgs,
button: [4],
insertImg: ["#cp_img,.main_img,#comicContain,.comic-list", 2],
go: 1,
autoDownload: [0],
next: "//a[text()='下一章'] | //a[img[@alt='下一章']]",
prev: "//a[text()='上一章'] | //a[img[@alt='上一章']]",
customTitle: () => {
let host = location.hostname;
if (/dm5|manhuaren|1kkk|mangabz|xmanhua|yymanhua/.test(host)) {
return fun.title("_", 2);
} else if (/qiman|mhxqiu|6mh/.test(host)) {
return fun.title("_", 3);
} else if (/manben/.test(host)) {
if (fun.ge("#comicTitle")) {
return fun.geT("#chapter") + " " + fun.geT(".title-comicHeading");
} else {
return fun.title(" ", 2);
}
}
},
category: "comic"
}, {
name: "动漫之家M m.idmzj.com",
enable: 0,
reg: /m\.i?dmzj\.com\/view\/\d+\/\d+\.html/,
init: "$('body').unbind('keydown');",
imgs: () => {
let code = [...document.scripts].find(s => s.innerHTML.search(/initData/) > -1).innerHTML;
let arr = fun.run(code.match(/page_url.+(\[.+\])/)[1]);
return arr;
},
button: [4, "24%", 3],
insertImg: ["#commicBox", 2],
go: 1,
autoDownload: [0],
next: ".afterChapter",
prev: ".beforeChapter",
customTitle: () => fun.title("-", 1),
css: "#khdDown,.appTil,#m_r_bottom,#m_r_panelbox,.control_panel.alpha{display:none!important}",
category: "comic"
}, {
name: "漫画星球M m.mhxqiu2.com",
enable: 0,
reg: /m\.mhxqiu\d\.com\/\d+\/\d+\.html/,
imgs: ".main_img img",
autoDownload: [0],
next: "//a[p[text()='下一篇']][contains(@href,'html')]",
prev: "//a[p[text()='上一篇']][contains(@href,'html')]",
customTitle: () => {
let s = document.title.split("_");
return (s[1] + " - " + s[0]).replace(" - 漫画星球", "");
},
category: "comic"
}, {
name: "漫畫狗 dogemanga.com",
enable: 1,
reg: /dogemanga\.com\/p\/[\w-]+/i,
init: () => {
fun.ge(".site-reader").setAttribute("class", "CustomPictureBox");
fun.addUrlHtml("https://dogemanga.com/", ".CustomPictureBox", 1, "首頁");
let url = siteData.next();
if (url) fun.addUrlHtml(url, ".CustomPictureBox", 1);
},
imgs: () => [...fun.gae(".site-reader__image")].map(e => e.dataset.pageImageUrl),
button: [4, "24%", 1],
insertImg: [".CustomPictureBox", 2],
go: 1,
autoDownload: [0],
next: () => {
let next = fun.ge("//select[@data-kind='publication']/option[@selected]/preceding-sibling::option[1]");
return next ? next.value : null;
},
prev: 1,
customTitle: () => fun.title(" - 漫畫狗"),
threading: 1,
css: ".CustomPictureBox{height:auto!important}.fixed-bottom{display:none!important}",
category: "comic"
}, {
name: "白绒Yuri www.ponpomu.com",
enable: 1,
delay: 1000,
reg: /https:\/\/www\.ponpomu\.com\/topic\/\d+\/comic\//,
imgs: () => fun.ge(".comic-page-container data") ? [...fun.gae(".comic-page-container data")].map(e => e.value) : [...fun.gae(".comic-page-container img")].map(e => e.dataset.srcset),
autoDownload: [0],
next: () => {
let ele = fun.ge("//div[text()='已经到尽头了']");
if (!ele) {
let s = siteUrl.split("/");
s[s.length - 1] = parseInt(s[s.length - 1], 10) + 1;
return s.join("/");
} else {
return null;
}
},
prev: 1,
customTitle: () => fun.geT(".comic-info").replace(/\n/, " ").replace("连载:", "-").replace("单行本: ", "").replace("完结: ", ""),
category: "comic"
}, {
name: "明日方舟泰拉记事社 terra-historicus.hypergryph.com",
enable: 1,
reg: /https:\/\/terra-historicus\.hypergryph\.com\/comic\/\d+\/episode\/\d+/,
imgs: () => {
let max = fun.geT(".HG_COMIC_READER_indicator>div:last-child");
let resArr = [];
let fetchNum = 0;
for (let i = 1; i <= max; i++) {
let res = fetch(`https://terra-historicus.hypergryph.com/api${location.pathname}/page?pageNum=${i}`).then(res => res.json()).then(json => {
fun.show(`${displayLanguage.str_06}${fetchNum+=1}/${max}`, 0);
return json.data.url;
});
resArr.push(res);
}
return Promise.all(resArr).then(data => {
fun.hide();
return data;
});
},
autoDownload: [0],
next: () => {
let next = fun.ge("//a[text()='下一话']") || fun.ge("//a[text()='下一张']");
return next ? next.href : null;
},
prev: 1,
customTitle: async () => {
await fun.waitEle(".HG_COMIC_READER_episodeTitle");
return fun.geT(".HG_COMIC_READER_comicTitle") + " - " + fun.geT(".HG_COMIC_READER_episodeTitle");
},
category: "comic"
}, {
name: "Manhuagui看漫画M https://m.manhuagui.com/comic/17023/176171.html",
enable: 0,
reg: /m\.manhuagui\.com\/comic\/\d+\/\d+.html/,
imgs: () => {
let code = [...document.scripts].find(s => s.innerHTML.search(/x6c/) > -1).innerHTML.trim().slice(26);
let json = JSON.parse(fun.run(code).slice(11, -12));
let domain = "https://i.hamreus.com";
return json.images.map(e => `${domain+e}?e=${json.sl.e}&m=${json.sl.m}`);
},
button: [4],
insertImg: ["#manga", 2],
go: 1,
autoDownload: [0],
next: "//a[text()='下一章']",
prev: "//a[text()='上一章']",
customTitle: () => fun.geT("#mangaTitle"),
threading: 3,
css: ".action-list li{width:50% !important}#action>ul>li:nth-child(n+2):nth-child(-n+3),.manga-page,.clickforceads{display:none !important}",
category: "comic"
}, {
name: "Manhuagui看漫画M 点击查看下20条记录",
enable: 0,
reg: /m\.manhuagui\.com\/(update|list|rank|user)\//,
icon: 0,
key: 0,
observerClick: "#more:not([style*=none])>.more-go",
category: "comic"
}, {
name: "Manhuagui看漫画 www.manhuagui.com tw.manhuagui.com",
enable: 0,
reg: /(www|tw)\.manhuagui\.com\/comic\/\d+\/\d+.html/,
init: "$(document).unbind('keydown');",
imgs: () => {
let code = [...document.scripts].find(s => s.innerHTML.search(/x6c/) > -1).innerHTML.slice(26, -1);
let json = fun.run(fun.run(code).slice(11, -11));
let domain = "https://i.hamreus.com";
return json.files.map(e => `${domain+json.path+e}?e=${json.sl.e}&m=${json.sl.m}`);
},
button: [4],
insertImg: ["#tbBox", 2],
go: 1,
autoDownload: [0],
threading: 3,
next: "//a[text()='下一章']",
prev: "//a[text()='上一章']",
customTitle: () => fun.geT("h1>a") + " - " + fun.geT("h2"),
category: "comic"
}, {
name: "包子漫画 閱讀 https://www.kukuc.co/comic/chapter/yushenyitongshengji-ohyeonbain/0_2.html",
enable: 0,
reg: /\/comic\/chapter\/[^/]+\/\w+\.html/i,
include: "//title[contains(text(),'包子')]",
init: async () => {
document["onkeydown"] = null;
await fun.getNP(".comic-contain>div:not(.mobadsq)", "//a[contains(text(),'下一頁') or contains(text(),'下一页')]", null, ".comic-chapter>.next_chapter");
},
imgs: () => [...new Set([...fun.gae(".comic-contain amp-img")].map(e => e.getAttribute("src")))],
button: [4],
insertImg: [".comic-contain", 2],
go: 1,
autoDownload: [0],
next: "//div[@class='next_chapter']/a[contains(text(),'下一話') or contains(text(),'下一话')]",
prev: 1,
customTitle: () => fun.title(" - ", 3),
css: ".chapter-main.scroll-mode~*:not(.next_chapter):not(.bottom-bar){display:none!important}",
category: "comic"
}, {
name: "包子漫画 展開目錄",
enable: 0,
icon: 0,
key: 0,
reg: /\/comic\/[-\w]+$/i,
include: "//title[contains(text(),'包子')]",
autoClick: "#button_show_all_chatper",
category: "comic"
}, {
name: "包子漫画,鏈接新分頁打開",
enable: 0,
icon: 0,
key: 0,
reg: /(cn|tw|www)\.(baozimh|webmota|kukuc)\.(co|com)/,
openInNewTab: ".comics-card a:not([target=_blank]),.bookshelf-items a:not(.remove-img):not([target=_blank])",
category: "comic"
}, {
name: "Komiic komiic.com",
enable: 1,
reg: /komiic\.com\/comic\/\d+\/chapter\//,
imgs: async () => {
let chapterId = siteUrl.match(/chapter\/(\d+)\/images/)[1];
let body = {
operationName: "imagesByChapterId",
variables: {
chapterId: `${chapterId}`
},
query: "query imagesByChapterId($chapterId: ID!) {\n imagesByChapterId(chapterId: $chapterId) {\n id\n kid\n height\n width\n __typename\n }\n}\n"
};
let json = await fetch("/api/query", {
"headers": {
"content-type": "application/json"
},
"body": JSON.stringify(body),
"method": "POST"
}).then(res => res.json());
debug("\nimages JSON\n", json);
return json.data.imagesByChapterId.map(e => "https://komiic.com/api/image/" + e.kid);
},
autoDownload: [0],
next: async () => {
let mhId = siteUrl.match(/comic\/(\d+)/)[1];
let body = {
operationName: "chapterByComicId",
variables: {
comicId: `${mhId}`
},
query: "query chapterByComicId($comicId: ID!) {\n chaptersByComicId(comicId: $comicId) {\n id\n serial\n type\n dateCreated\n dateUpdated\n size\n __typename\n }\n}\n"
};
let json = await fetch("/api/query", {
"headers": {
"content-type": "application/json"
},
"body": JSON.stringify(body),
"method": "POST"
}).then(res => res.json());
debug("\nchapter JSON\n", json);
let chapterId = siteUrl.match(/chapter\/(\d+)\/images/)[1];
let chapters = json.data.chaptersByComicId;
let nextUrl;
for (let i = 0; i < chapters.length; i++) {
if (new RegExp(chapterId).test(chapters[i].id)) {
try {
let nextId = chapters[parseInt(i, 10) + 1].id;
nextUrl = siteUrl.replace(new RegExp(`/${chapterId}/`), `/${nextId}/`).replace(/\?page=\d+/, "");
} catch (e) {
nextUrl = null;
}
break;
}
}
return nextUrl;
},
prev: 1,
customTitle: async () => {
await fun.delay(2000, 0);
return fun.geT("li.breadcrumbs__item:nth-child(3)>a").trim() + " - " + fun.geT("li.breadcrumbs__item:nth-child(5)>div").trim();
},
threading: 4,
category: "comic"
}, {
name: "LINE WEBTOON / 咚漫 www.webtoons.com www.dongmanmanhua.cn https://www.webtoons.com/zh-hant/time-slip/estatedeveloper/%E7%AC%AC1%E8%A9%B1/viewer?title_no=4354&episode_no=1",
enable: 0,
reg: /www\.(webtoons|dongmanmanhua)\.(com|cn)\/[^&]+&episode/,
imgs: "._images[data-url]",
insertImg: ["#_imageList", 2],
go: 1,
autoDownload: [0],
next: "//div[@class='episode_cont']//li[a[starts-with(@class,'on')]]/following-sibling::li[1]/a",
prev: "//div[@class='episode_cont']//li[a[starts-with(@class,'on')]]/preceding-sibling::li[1]/a",
customTitle: () => fun.title("|", 3).replace(/ - \d+/, "").replace("|", " - "),
category: "comic"
}, {
name: "LINE WEBTOON 目錄聚集所有章節",
enable: 0,
icon: 0,
key: 0,
reg: /www\.webtoons\.com\/.+\/list\?title_no=\d+/,
init: "fun.getNP('._episodeItem',\"//div[@class='paginate']/a[span[@class='on']]/following-sibling::a[1]\",null,'.paginate',0,null,0);",
category: "comic"
}, {
name: "動漫狂M",
enable: 0,
reg: /www\.cartoonmad\.(cc|com)\/m\/comic\/\d+\.html/,
init: async () => {
let url = await siteData.next();
if (url) fun.addUrlHtml(url, "//tr[td[a[@class='onpage']]]", 1);
},
imgs: () => {
let src = fun.ge("img[oncontextmenu]").src.match(/.+\//)[0];
let max = fun.ge(".onpage").parentNode.lastElementChild.previousElementSibling.innerText;
let arr = [];
for (let i = 1; i <= max; i++) {
let imgSrc = src + String(i).padStart(3, "0");
arr.push(imgSrc);
};
return arr;
},
button: [4],
insertImg: ["//td[a[img[@oncontextmenu]]]", 2],
go: 1,
autoDownload: [0],
next: async () => {
let lastPage = fun.ge(".onpage").parentNode.lastElementChild.previousElementSibling;
return await fun.fetchDoc(lastPage.href).then(async doc => {
let ele = fun.ge("body>table>tbody>tr:nth-child(3)>td>a", doc);
return await fun.fetchDoc(ele.href).then(doc => {
let next = fun.ge(".pages", doc);
return next ? next.href : null;
});
});
},
prev: 1,
customTitle: () => fun.title(" - ", 2),
category: "comic"
}, {
name: "動漫狂 https://www.cartoonmad.com/comic/438700012046001.html",
enable: 0,
reg: /www\.cartoonmad\.com\/comic\/\d+\.html/,
init: "document.onkeydown=null;",
imgs: () => {
let src = fun.ge("img[onload]").src.match(/.+\//)[0];
let max = fun.gae("option[value]").length;
let arr = [];
for (let i = 1; i <= max; i++) {
let imgSrc = src + String(i).padStart(3, "0");
arr.push(imgSrc);
};
return arr;
},
button: [4],
insertImg: ["//td[a[img[@oncontextmenu]]]", 2],
go: 1,
autoDownload: [0],
next: "//td[@width='150' and a[img[@src='/image/rad.gif']]]/a",
prev: "//td[@width='150' and a[img[@src='/image/rad1.gif']]]/a",
customTitle: () => fun.title(" - ", 2),
category: "comic"
}, {
name: "動漫戲說 https://comic.acgn.cc/view-202.htm",
enable: 0,
reg: /comic\.acgn\.cc\/view/,
imgs: () => [...fun.gae(".pic[_src][id]")].map(e => e.getAttribute("_src")),
button: [4],
insertImg: ["#pic_list", 2],
go: 1,
autoDownload: [0],
next: ".display_right>a",
prev: ".display_left>a",
customTitle: () => fun.geT(".hotrmtexth1>a"),
css: ".btn_wrap{display:none!important}",
category: "comic"
}, {
name: "98漫畫網 www.98comic.com",
enable: 0,
reg: /www\.98comic\.com\/comic\/\d+\/\w+\.html$/,
imgs: () => cInfo.fs.map(e => "https://www.98comic.com/g.php?" + cInfo.cid + "/" + e),
button: [4],
insertImg: ["//td[img[@id='manga']]", 2],
go: 1,
autoDownload: [0],
next: ".nextC",
prev: ".prevC",
customTitle: () => cInfo.btitle + " - " + cInfo.ctitle,
css: ".bd_960_90{display:none!important}",
category: "comic"
}, {
name: "57漫画网 www.wuqimh.net m.wuqimh.net 国漫吧 www.guoman8.cc m.guoman8.cc",
enable: 0,
reg: /((www|m)\.wuqimh\.net)|(www|m)\.guoman8\.cc\/\d+\/\d+\.html$/,
imgs: () => cInfo.fs,
button: [4],
insertImg: ["//td[img[@id='manga']]", 2],
go: 1,
autoDownload: [0],
next: ".nextC",
prev: ".prevC",
customTitle: () => cInfo.btitle + " - " + cInfo.ctitle,
css: ".action-list li{width:50%!important}#action>ul>li:nth-child(n+2):nth-child(-n+3),.bd_960_90,body>section,#action~*:not(#pageNo),footer~*{display:none!important}",
category: "comic"
}, {
name: "亲亲漫画/古风漫画网 www.acgwd.com www.acgud.com m.acgqd.com www.gufengmh.com m.gufengmh.com",
enable: 0,
reg: /(www|m|w111)\.(acg(u|q|w)d|gufengmh|mhd100)\.com\/manhua\/\w+\/\d+\.html/,
init: () => {
if (/acg|mhd100/.test(location.host)) {
$("#images").unbind("click");
_0x5097 = null;
fun.clearAllTimer(3);
} else if (/gufengmh/.test(location.host)) {
$(document).unbind("keydown");
$(document).unbind("keyup");
}
},
imgs: () => chapterImages.map(e => SinConf.resHost[0].domain + "/" + chapterPath + e),
button: [4],
insertImg: ["#images", 2],
go: 1,
autoDownload: [0],
next: "//a[contains(text(),'下一章')]",
prev: "//a[contains(text(),'上一章')]",
customTitle: () => {
if (/(acg|mhd100)/.test(location.host)) {
return fun.title("_", 1);
} else if (/gufengmh/.test(location.host)) {
return fun.title("在线观看", 1);
} else {
return fun.title(" - ", 3);
}
},
css: ".img_land_prev,.img_land_next,#action li:nth-child(2),#action li:nth-child(3),.control_bottom~*,.chapter-view~*:not([id^='pv-']):not([class^='pv-']):not(.pagetual_tipsWords):not(#comicRead):not(#fab):not(.FullPictureLoadMsg):not(.FullPictureLoadFixedBtn):not(#FullPictureLoadOptions):not(*[class^=fancybox]){display:none!important}#action li{width:50%!important}",
category: "comic"
}, {
name: "漫画456 www.manhua456.com",
enable: 0,
reg: /www\.manhua456\.com\/manhua\/\w+\/\d+\.html/,
delay: 1000,
init: "setTimeout(()=>{$(document).unbind('keyup');$(document).unbind('keydown')},4000)",
imgs: async () => {
await fun.waitEle("//script[contains(text(),'chapterImages')]");
return chapterImages.map(e => /^http/.test(e) ? e : SinConf.resHost1 + "/" + chapterPath + e);
},
button: [4],
insertImg: ["#images", 2],
go: 1,
next: "//a[text()='下一章']",
prev: "//a[text()='上一章']",
customTitle: () => fun.title(" - ", 3),
css: ".img_land_prev,.img_land_next{display:none!important}",
category: "comic"
}, {
name: "漫画456M m.manhua456.com",
enable: 0,
reg: /m\.manhua456\.com\/manhua\/\w+\/\d+\.html/,
delay: 300,
init: async () => {
await fun.waitEle("//script[contains(text(),'chapterImages')]");
$('#images').unbind('click');
},
imgs: async () => {
await fun.waitEle("//script[contains(text(),'chapterImages')]");
return chapterImages.map(e => /^http/.test(e) ? e : SinConf.resHost1 + "/" + chapterPath + e);
},
insertImg: ["#images", 2],
go: 1,
next: "//a[text()='下一章']",
prev: "//a[text()='上一章']",
customTitle: () => {
let s = pageTitle.split(" - ");
return s[1] + " - " + s[0];
},
css: ".img_land_prev,.img_land_next{display:none!important}",
category: "comic"
}, {
name: "漫画1234 www.ymh1234.com www.hmh1234.com",
enable: 0,
reg: /(www|m)\.\wmh1234\.com\/comic\/\d+\/\d+\.html/i,
init: "$(document).unbind('keydown');$(document).unbind('keyup');$('#images').unbind('click');",
imgs: async () => {
let url = await siteData.next();
if (location.hostname == "www.ymh1234.com") {
if (url) fun.addUrlHtml(url, "#images", 1);
}
return chapterImages.map(e => SinConf.resHost[0].domain + "/" + chapterPath + e);
},
button: [4],
insertImg: ["#images", 2],
go: 1,
autoDownload: [0],
next: () => nextChapterData.id > 0 ? nextChapterData.url : null,
prev: 1,
customTitle: () => {
let s = pageTitle.split(" - ");
return location.hostname == "m.ymh1234.com" ? s[1] + " - " + s[0] : s[0];
},
category: "comic"
}, {
name: "90漫画 www.90mh.com www.90mh.org",
enable: 0,
reg: /www\.90mh\.(com|org)\/manhua\/\w+\/\d+\.html/i,
imgs: () => chapterImages.map(e => SinConf.resHost[0].domain + "/" + chapterPath + e),
insertImg: ["#images", 2],
go: 1,
autoDownload: [0],
next: ".nextC",
prev: ".prevC",
customTitle: () => fun.title(" - ", 3),
category: "comic"
}, {
name: "90漫画M wap.90mh.com m.90mh.org",
enable: 0,
reg: /(wap|m)\.90mh\.(com|org)\/manhua\/\w+\/\d+\.html/i,
init: () => {
let url = siteData.next();
if (url) fun.addUrlHtml(url, "#chapter-image", 1);
},
imgs: () => fun.getImg("#chapter-image img", fun.geT("#k_total"), 5),
insertImg: ["#chapter-image", 2],
go: 1,
autoDownload: [0],
next: () => {
let next = fun.ge("//a[text()='下一章'][contains(@href,'html')]");
return next ? next.href : null;
},
prev: 1,
customTitle: () => fun.title("在线", 1),
css: ".a-90mh{display:none!important}",
category: "comic"
}, {
name: "优酷漫画 www.ykmh.com",
enable: 0,
reg: /www\.ykmh\.com\/manhua\/\w+\/\d+\.html/i,
init: "$(document).unbind('keydown');$(document).unbind('keyup');",
imgs: () => chapterImages.map(e => SinConf.resHost[0].domain + e),
button: [4],
insertImg: ["#images", 2],
go: 1,
autoDownload: [0],
next: ".next>a",
prev: ".pre>a",
customTitle: () => fun.title(" - ", 3),
css: ".img_land_prev,.img_land_next{display:none!important}",
category: "comic"
}, {
name: "优酷漫画M h5.ykmh.com",
enable: 0,
reg: /h5\.ykmh\.com\/manhua\/\w+\/\d+\.html/i,
init: "$('#images').unbind('click');",
imgs: () => chapterImages.map(e => SinConf.resHost[0].domain + e),
button: [4],
insertImg: ["#images", 2],
go: 1,
autoDownload: [0],
next: "//a[text()='下一章'][contains(@href,'html')]",
prev: "//a[text()='上一章'][contains(@href,'html')]",
customTitle: () => {
let s = pageTitle.split(" - ");
return s[1] + " - " + s[0];
},
css: ".letchepter>div,.letchepter>section,#FullPictureLoad~*{display:none!important}",
category: "comic"
}, {
name: "漫画芯M m.mhxin.com",
enable: 0,
reg: /(m|coco)\.mhxin\.com\/manhua\/\w+\/\d+\.html/i,
imgs: () => {
let max = fun.geT(".image-content p").match(/\/(\d+)/)[1];
return fun.getImg("#manga-image", max, 5);
},
button: [4],
insertImg: ["#images", 2],
go: 1,
autoDownload: [0],
next: () => {
let code = [...document.scripts].find(s => s.innerHTML.search(/下一章/) > -1).innerHTML;
let url = code.match(/<li><a href="(.+)">下一章/)[1];
return /html$/.test(url) ? url : null;
},
prev: 1,
customTitle: () => fun.title("在线", 1),
css: ".action-list li{width:50% !important}div[style*='text-align: left;'],.UnderPage~*:not([id^='pv-']):not([class^='pv-']):not(.pagetual_tipsWords):not(#comicRead):not(#fab):not(.FullPictureLoadMsg):not(.FullPictureLoadFixedBtn):not(#FullPictureLoadOptions):not(*[class^=fancybox]),.action-list>ul>li:nth-child(n+2):nth-child(-n+3){display:none!important}body{padding:0!important}",
category: "comic"
}, {
name: "最漫画M / 拼拼漫画M m.zuimh.com m.pinmh.com",
enable: 0,
reg: /(m\.zuimh\.com|m.pinmh.com)\/manhua\/\w+\/\d+\.html/i,
imgs: () => {
let max = fun.geT(".image-content p").match(/\/(\d+)/)[1];
return fun.getImg("#image", max, 5);
},
insertImg: ["#images", 2],
go: 1,
autoDownload: [0],
next: "//a[text()='下一章'][contains(@href,'html')]",
prev: "//a[text()='上一章'][contains(@href,'html')]",
customTitle: () => fun.title("在线", 1),
css: "body{padding:0!important}div[style*='text-align'],.UnderPage~*:not([id^='pv-']):not([class^='pv-']):not(.pagetual_tipsWords):not(#comicRead):not(#fab):not(.FullPictureLoadMsg):not(.FullPictureLoadFixedBtn):not(#FullPictureLoadOptions):not(*[class^=fancybox]){display:none!important}",
category: "comic"
}, {
name: "零点漫画M m.0dmh.com",
enable: 0,
reg: /(m\.0dmh\.com)\/manhua\/\w+\/\d+\.html/i,
imgs: () => {
let max = Math.ceil(fun.geT("#images p").match(/\/(\d+)/)[1] / 3);
return fun.getImg("#images img", max, 5);
},
insertImg: ["#images", 2],
go: 1,
autoDownload: [0],
next: "//a[text()='下一章'][contains(@href,'html')]",
prev: "//a[text()='上一章'][contains(@href,'html')]",
customTitle: () => fun.title("-零点漫画").trim(),
css: ".action-list li{width:50% !important}div[style*='text-align'],.action-list>ul>li:nth-child(n+2):nth-child(-n+3){display:none!important}",
category: "comic"
}, {
name: "漫画吧M / 漫画连M m.dmhua8.com m.100mhl.com",
enable: 0,
reg: /(m\.dmhua8\.com|m\.100mhl\.com)\/manhua\/\w+\/\d+\.html/i,
imgs: () => {
let num = fun.geT("#images p").match(/\/(\d+)/)[1];
let max = Math.ceil(num / 5);
return fun.getImg("#images img", max, 5);
},
insertImg: ["#images", 2],
go: 1,
autoDownload: [0],
next: () => {
try {
let code = [...document.scripts].find(s => s.innerHTML.search(/下一章/) > -1).innerHTML;
let url = code.match(/<li><a href="(.+)">下一章/)[1];
return /html$/.test(url) ? url : null;
} catch (e) {
let next = fun.ge("//a[text()='下一章'][contains(@href,'html')]");
return next ? next.href : null;
}
},
prev: 1,
customTitle: () => {
if (location.hostname == "m.dmhua8.com") {
let s = document.title.split("_");
return (s[1] + " - " + s[0]).replace("漫画", "");
} else if (location.hostname == "m.100mhl.com") {
return document.title.replace("-漫画连", "");
}
},
css: "#addMoney,#images~div[style*=blur],div[style*='text-align: left;']{display:none!important}",
category: "comic"
}, {
name: "蔷薇漫画M/爱米推漫画M/下拉式漫画M/奇妙漫画M/冰氪漫画M/狗狗漫画M/奇奇漫画M/悠闲漫画M/不卡漫画M/多熙漫画M m.qwmanhua.com m.imitui.com m.xlsmh.com m.qmiaomh.com m.icekr.com m.gougoumh.com m.qimhua.com m.yxtun.com m.bukamh.com m.duoximh.com",
enable: 0,
reg: /(m\.qwmanhua\.com|m\.imitui\.com|m\.xlsmh\.com|m\.qmiaomh\.com|m\.icekr\.com|m\.gougoumh\.com|m\.qimhua\.com|m\.yxtun\.com|m\.bukamh\.com|m\.duoximh\.com)\/manhua\/\w+\/\d+\.html/i,
imgs: () => {
let imgs = [...fun.gae("#images img:not([src*=loading]),#scroll-image img")];
fun.remove("#scroll-image");
return imgs;
},
button: [4],
insertImg: ["#images", 2],
go: 1,
autoDownload: [0],
next: () => {
try {
return nextChapterData.id > 0 ? nextChapterData.url : null;
} catch (e) {
let next = fun.ge("//a[text()='下一章 > '][contains(@href,'html')]");
return next ? next.href : null;
}
},
prev: 1,
customTitle: () => /xlsmh|qmiaomh|gougoumh|qimhua|yxtun|bukamh|duoximh/.test(location.hostname) ? fun.geT("#panel-title span,.title3 span").replace(">", " - ") : fun.title("在线", 1),
css: "body{padding:0!important}.UnderPage~*:not([id^='pv-']):not([class^='pv-']):not(.pagetual_tipsWords):not(#comicRead):not(#fab):not(.FullPictureLoadMsg):not(.FullPictureLoadFixedBtn):not(#FullPictureLoadOptions):not(*[class^=fancybox]),.bottom~*:not([id^='pv-']):not([class^='pv-']):not(.pagetual_tipsWords):not(#comicRead):not(#fab):not(.FullPictureLoadMsg):not(.FullPictureLoadFixedBtn):not(#FullPictureLoadOptions):not(*[class^=fancybox]),div[style*='text-align: left;']{display:none!important}",
category: "comic"
}, {
name: "前未漫画/漫画芯/蔷薇漫画/最漫画/爱米推漫画/下拉式漫画/漫画吧/漫画连/拼拼漫画/零点漫画/雪儿漫画/狗狗漫画/奇奇漫画/悠闲漫画/不卡漫画/多熙漫画 www.qianmh.com www.mhxin.com www.qwmanhua.com www.zuimh.com www.imitui.com imitui.com www.xlsmh.com www.dmhua8.com www.100mhl.com www.pinmh.com www.0dmh.com www.xuermh.com www.gougoumh.com www.qimhua.com www.yxtun.com www.bukamh.com www.duoximh.com",
enable: 0,
reg: /www\.(mhxin|qianmh|qwmanhua|zuimh|imitui|xlsmh|dmhua8|100mhl|pinmh|0dmh|xuermh|gougoumh|qimhua|yxtun|bukamh|duoximh)\.com\/manhua\/\w+\/\d+\.html/i,
init: "try{$(document).unbind('keydown');$(document).unbind('keyup')}catch(e){}",
imgs: () => chapterImages,
button: [4],
insertImg: ["#images,#imagesOld", 2],
go: 1,
autoDownload: [0],
next: ".next>a,a.next,a.nextC",
prev: ".pre>a,a.prev,a.prevC",
autoClick: "#chapter-pagination:not(.active),#mode_pagination",
customTitle: () => {
let host = location.hostname;
if (/mhxin|qwmanhua|pinmh/.test(host)) {
return fun.geT(".head_title").replace("-", " -");
} else if (/qianmh|xlsmh|100mhl|0dmh|xuermh|gougoumh|qimhua|bukamh|duoximh/.test(host)) {
return fun.geT("h1").trim();
} else if (/zuimh|imitui|dmhua|yxtun/.test(host)) {
return fun.geT(".title h1") + " - " + fun.geT(".title h2");
}
},
css: "#qTcms_picID{display:none!important}",
category: "comic"
}, {
name: "雪儿漫画M m.xuermh.com",
enable: 0,
reg: /m\.xuermh\.com\/manhua\/\w+\/\d+\.html/i,
init: async () => {
let a = fun.ge(".erPag a");
let img = fun.ge(".erPag a img:last-child");
a.outerHTML = img.outerHTML;
await fun.getNP(".erPag mip-link img:not([style*=position])", "//mip-link[text()='下一页'][contains(@href,'-')] | //a[text()='下一页'][contains(@href,'-')]", null, "#action", 0, null, 0);
},
imgs: () => [...fun.gae(".erPag mip-link img:not([style*=position])")],
button: [4],
insertImg: [".erPag", 2],
go: 1,
autoDownload: [0],
next: "//a[text()='下一章']",
prev: "//a[text()='上一章']",
customTitle: () => fun.geT("h1").replace(">", " - ").trim(),
css: "div[style*='text-align: left;'],#action li:nth-child(2),#action li:nth-child(3),span.right{display:none!important}#action li{width:50%!important}",
category: "comic"
}, {
name: "来漫画 www.laimanhua8.com",
enable: 0,
reg: /www\.laimanhua\d?\.(net|com)\/kanmanhua\/\w+\/\d+\.html/i,
imgs: () => base64_decode(picTree).split("$qingtiandy$").map(e => getpicdamin() + e),
button: [4],
insertImg: ["#pic-list", 2],
go: 1,
autoDownload: [0],
next: ".btn-next[href^=j]",
prev: ".btn-prev",
customTitle: () => fun.title(",", 1).replace("漫画", ""),
css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}",
category: "comic"
}, {
name: "来漫画M m.laimanhua8.com",
enable: 0,
reg: /m\.laimanhua8\.com\/kanmanhua\/\w+\/\d+\.html/i,
imgs: () => mhInfo.images.map(e => realurl + mhInfo.path + e),
button: [4],
insertImg: ["#manga", 2],
go: 1,
autoDownload: [0],
next: "//a[text()='下一章']",
prev: "//a[text()='上一章']",
customTitle: () => fun.geT("#mangaTitle"),
css: "#jusha1{display:none!important}",
category: "comic"
}, {
name: "奇妙漫画 www.qmiaomh.com",
enable: 0,
reg: /www\.qmiaomh\.com\/manhua\/\w+\/\d+\.html/i,
imgs: () => chapterImages.map(e => e.indexOf("http") != -1 ? e : SinConf.resHost[0].domain + e),
insertImg: ["#images", 2],
go: 1,
autoDownload: [0],
next: "a.next",
prev: "a.prev",
customTitle: () => fun.title(" - ", 1),
category: "comic"
}, {
name: "漫客栈 www.mkzhan.com",
enable: 0,
reg: /www\.mkzhan\.com\/\d+\/\d+\.html/i,
init: async () => {
let lps = location.pathname.split("/");
let comic_id = lps[1];
let chapter_id = lps[2].match(/\d+/)[0];
let apiUrl = `https://comic.mkzcdn.com/chapter/content/v1/?chapter_id=${chapter_id}&comic_id=${comic_id}&format=1&quality=1&type=1`;
siteJson = await fetch(apiUrl).then(res => res.json());
debug("\n此頁JSON資料\n", siteJson);
},
imgs: () => siteJson.data.page.map(e => e.image),
insertImg: ["#pages-tpl", 1],
go: 1,
autoDownload: [0],
next: ".rd-aside a.j-rd-next",
prev: ".rd-aside a.j-rd-prev",
autoClick: "//div[@class='rd-aside__item j-rd-mod'][span[text()='卷轴']]",
customTitle: () => fun.title(" - ", 1),
category: "comic"
}, {
name: "漫画屋 www.mhua5.com www.mhw1.com www.manhw.com www.360mh.cc www.mhzj54.com www.bingmh.com www.manshiduo.net mh.manhw.com comics.veryim.com www.38manhua.com 797mh.com",
enable: 0,
reg: /www\.(mhua5|mhw\d|manhw|360mh)\.(com|cc)\/(chapter.+\.html|index\.php\/chapter\/\d+)|www\.mhzj54\.com\/chapter\/\d+$|www\.bingmh\.com\/chapter\/\d+\.html$|www\.manshiduo\.net\/chapter_\d+\.html$|mh\.manhw\.com\/index\.php\/chapter\/\d+$|comics\.veryim\.com\/\w+\/\d+\/\d+\.html$|(www\.38manhua\.com|797mh\.com)\/chapter_\d+\.html$/i,
include: ".rd-article-wr",
init: () => {
document.onkeydown = null;
},
imgs: "img[data-original]:not([data-original*='/template/pc/default/']),.lazy-read:not([data-original*='/template/pc/default/']),img[data-src]",
button: [4],
insertImg: [".rd-article-wr", 3],
go: 1,
autoDownload: [0],
next: ".btn--next-chapter,.rd-aside a.j-rd-next",
prev: ".rd-aside a.j-rd-prev",
autoClick: "//div[@class='rd-aside__item j-rd-mod'][span[text()='卷轴']]",
customTitle: () => {
if (/www\.mhua5\.com|www\.mhw\d\.com/.test(location.host)) {
return fun.title(" - 漫画屋").replace("-", " - ");
} else if (/www\.manhw\.com|mh\.manhw\.com/.test(location.host)) {
return fun.attr("meta[name=description]", "content").split(" - 漫画屋")[0].replace("当前阅读的是", "").replace("的", " - ");
} else if (/www\.360mh\.cc|www\.38manhua\.com|797mh\.com/.test(location.host)) {
return fun.geT(".j-comic-title") + " - " + fun.geT(".last-crumb");
} else {
return fun.title(/下拉|在线/, 1).replace("-", " - ").replace(/漫画|\[\d+P\]/i, "");
}
},
css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}",
category: "comic"
}, {
name: "漫画屋M www.mhua5.com www.manhw.com www.360mh.cc www.mhzj54.com www.bingmh.com www.manshiduo.net m.mkzhan.com mh.manhw.com www.mhw1.com www.38manhua.com 797mh.com",
enable: 0,
reg: /(www\.(mhua5|manhw)\.com|mh\.manhw\.com)\/(chapter.+\.html|index\.php\/chapter\/\d+)|(www\.360mh\.cc|www\.mhw\d\.com)\/chapter-\d+.html|www\.mhzj54\.com\/chapter\/\d+$|www\.bingmh\.com\/chapter\/\d+\.html$|www\.manshiduo\.net\/chapter_\d+\.html$|m\.mkzhan\.com\/\d+\/\d+.html|(www\.38manhua\.com|797mh\.com)\/chapter_\d+\.html$/i,
imgs: ".comic-page img,#cp_img img[data-original]",
autoDownload: [0],
next: async () => {
if (/www\.mhua5\.com|www\.360mh\.cc|www\.bingmh\.com|www\.mhw\d\.com|www\.38manhua\.com/.test(location.host)) {
let next = fun.attr(".next-chapter", "_href");
return next !== "" ? location.origin + next : null;
} else if (/m\.mkzhan\.com/.test(location.host)) {
await fun.waitEle(".next-chapter[data-href]", 10)
let next = fun.ge(".next-chapter").dataset.href;
return next !== "" || next != 0 ? location.origin + next : null;
} else if (/www\.mhzj54\.com/.test(location.host)) {
let next = fun.attr(".next-chapter", "_href");
return next !== "" ? next : null;
} else if (/www\.manshiduo\.net|www\.manhw\.com|mh\.manhw\.com/.test(location.host)) {
let next = fun.attr(".next-chapter", "_href");
return next !== "" ? location.origin + next : null;
} else if (/797mh\.com/.test(location.host)) {
let next = fun.attr(".prev-chapter", "_href");
return next !== "" ? location.origin + next : null;
} else {
let next = fun.ge("//a[text()='下一章']");
return next ? next.href : null;
}
},
prev: 1,
customTitle: () => {
if (/www\.mhua5\.com|www\.manhw\.com|mh\.manhw\.com/.test(location.host)) {
return fun.title(" - 漫画屋").replace("-", " - ");
} else if (/m\.mkzhan\.com/.test(location.host)) {
return fun.title(" - 漫客栈").trim();
} else if (/www\.360mh\.cc|www\.mhw\d\.com|www\.38manhua\.com|797mh\.com/.test(location.host)) {
return shareArr[0].match(/《([^》]+)/)[1] + " - " + fun.geT(".comic-name");
} else if (/www\.bingmh\.com/.test(location.host)) {
return fun.geT("title+title").split("在线")[0].replace("-", " - ").trim();
} else {
return fun.title("下拉", 1).trim().replace("-", " - ");
}
},
css: "body>ins,#mainView>.read,.chapter-end .read,#chapter1,#chapter3,.cnt-4,.comic-list a,.chapter-end>a,div[style^=height]{display:none!important}",
category: "comic"
}, {
name: "爱国漫 www.aiguoman.com",
enable: 0,
reg: /www\.aiguoman\.com\/chapter\/.+\.html/i,
imgs: ".main-item>img",
autoDownload: [0],
next: ".J_next_eposide_btn",
prev: ".J_prev_eposide_btn",
customTitle: () => fun.geT(".cartoon-title>a:first-child") + " - " + fun.geT(".cartoon-title>a:last-child"),
category: "comic"
}, {
name: "爱国漫M m.aiguoman.com",
enable: 0,
reg: /m\.aiguoman\.com\/chapter\/.+\.html/i,
imgs: ".lazy-image[data-original]",
autoDownload: [0],
next: "//a[text()='下一章'][contains(@href,'html')]",
prev: "//a[text()='上一章'][contains(@href,'html')]",
customTitle: () => document.title.split("免费")[0].replace("漫画", ""),
category: "comic"
}, {
name: "新新漫画 www.77mh.xyz",
enable: 0,
reg: /(www|m)\.77mh\.[a-z]{2,3}\/\d+\/\d+\.html/i,
init: "try{$(document).unbind('keydown');$(document).unbind('keyup')}catch(e){}",
imgs: () => msg.split("|").map(e => location.hostname.indexOf("m.77mh") != -1 ? ImgSvrList + e : img_qianz + e),
button: [4],
insertImg: ["#comicImg,.mg-co", 2, 1000],
go: 1,
autoDownload: [0],
next: "//a[contains(text(),'下一章')]",
prev: "//a[contains(text(),'上一章')]",
customTitle: () => fun.title(" - ", 3),
category: "comic"
}, {
name: "漫漫聚/KuKu动漫 www.manmanju.com manhua.kukudm.com",
enable: 1,
reg: /(a|b|www|manhua)\.(manmanju|i?kukudm)\.com\/comiclist\/\d+\/\d+\/1\.htm/i,
include: "td img",
comicListUrl: () => {
let comicId = location.href.split("/")[4];
return /(www|a|b)\.manmanju\.com/.test(location.origin) ? `http://www.manmanju.com/comiclist/${comicId}/index.htm` : `http://manhua.kukudm.com/comiclist/${comicId}/index.htm`;
},
init: async () => {
let cUrl = siteData.comicListUrl();
let url = await siteData.next();
if (url) {
fun.addUrlHtml(url, "body", 2);
fun.addUrlHtml(cUrl, "body", 2, "目錄");
} else {
if (/manmanju/.test(location.origin)) {
fun.addUrlHtml(cUrl, "body", 2, "目錄");
fun.addUrlHtml("http://www.manmanju.com/", "body", 2, "首頁");
} else {
fun.addUrlHtml(cUrl, "body", 2, "目錄");
fun.addUrlHtml("https://manhua.kukudm.com/", "body", 2, "首頁");
}
}
},
imgs: () => fun.getKukudmSrc(),
button: [4],
insertImg: ["//td[input]", 2],
go: 1,
autoDownload: [0],
next: () => {
let chapterId = location.href.split("/")[5];
let host;
if (/www\.manmanju\.com|manhua\.kukudm\.com/.test(location.origin)) {
host = 1;
} else if (/a\.manmanju\.com|a\.ikukudm\.com/.test(location.origin)) {
host = 2;
} else if (/b\.manmanju\.com|b\.ikukudm\.com/.test(location.origin)) {
host = 3;
}
let nextXPath = `//dd[a[contains(@href,'${chapterId}')]]/following-sibling::dd[1]/a[${host}]`;
return fun.fetchDoc(siteData.comicListUrl()).then(doc => {
let next = fun.ge(nextXPath, doc);
return next ? next.href : null;
})
},
prev: 1,
css: "body{background-image:unset}body>table:nth-child(1),body>table:nth-child(3){display:none!important}body>table:nth-child(2),body>table:nth-child(2)>tbody>tr>td{width:100%!important;}body{scrollbar-width:none;-ms-overflow-style:none;overflow-x:hidden;overflow-y:auto}",
category: "comic"
}, {
name: "漫漫聚M/KuKu动漫M m.manmanju.com m.ikuku.cc s1.m.ikkdm.com s2.m.ikkdm.com 1pc570gfrd9z.ihhmh.com s2.wap.ikukudm.com s3.wap.ikukudm.com mh123.dypro.xyz",
enable: 1,
reg: /(m\.manmanju\.com|m\.ikuku\.cc|\w+\.ihhmh\.com|s\d\.m\.ikkdm\.com|s\d.wap.ikukudm.com|mh123\.dypro\.xyz)\/comiclist\/\d+\/\d+\/1\.htm/i,
include: ".classBox img,.imgBox",
init: async () => {
fun.remove("//center[iframe]");
let url = await siteData.next();
if (url) fun.addUrlHtml(url, ".bottom .subNav", 1);
let nav = fun.ge("ul.subNav").cloneNode(true);
let tE = fun.ge("div.bottom");
tE.parentNode.insertBefore(nav, tE);
fun.remove("meta[name=viewport]");
$("head").append('<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=2.0,user-scalable=no"/>');
setTimeout(() => {
let nextDivEle = fun.ge(".bottom div");
let bottomEle = fun.ge(".bottom");
nextDivEle ? bottomEle.innerHTML = fun.ge("div", bottomEle).outerHTML + fun.ge("p", bottomEle).outerHTML : bottomEle(".bottom").innerHTML = fun.ge("p", bottomEle).outerHTML;
}, 500);
},
imgs: () => {
fun.remove("//a[img] | //ul[center[li]]");
fun.remove(".bottom .subNav~div[style*=height],.bottom .pageLine,.bottom .subNav");
return fun.getKukudmSrc();
},
button: [4],
insertImg: [".imgBox", 2],
go: 1,
autoDownload: [0],
next: () => {
let comicListUrl = fun.ge(".subNav a").href;
let chapterId = location.href.split("/")[5];
let nextXPath = `//li[a[contains(@href,'${chapterId}')]]/preceding-sibling::li[1]/a`;
return fun.fetchDoc(comicListUrl).then(doc => {
let next = fun.ge(nextXPath, doc);
return next ? next.href : null;
})
},
prev: 1,
customTitle: () => fun.title("在线", 1),
css: ".imgBox{margin-bottom:0px!important}.subNav{border-top:1px solid #dcdcde}body{scrollbar-width:none;overflow-x:hidden;overflow-y:auto}",
category: "comic"
}, {
name: "仙漫网 www.gaonaojin.com",
enable: 0,
reg: /www\.gaonaojin\.com\/\w+\/\d+\.html/i,
imgs: () => picdata.map(e => imgDomain + e),
button: [4],
insertImg: [".comicpage", 2],
go: 1,
autoDownload: [0],
next: "//li[a[@class='active']]/preceding-sibling::li[1]/a",
prev: "//li[a[@class='active']]/following-sibling::li[1]/a",
customTitle: () => fun.geT("h1.title").replace(/\(\d+\/\d+\)/, "").trim(),
category: "comic"
}, {
name: "仙漫网M m.gaonaojin.com",
enable: 0,
reg: /m\.gaonaojin\.com\/\w+\/\d+\.html/i,
imgs: () => {
let code = [...document.scripts].find(s => s.innerHTML.search(/eval/) > -1).innerHTML.match(/eval.+\)\)/)[0].slice(4);
let imgData = fun.run(fun.run(code).match(/picdata[^;]+/)[0]);
return imgData.map(e => "https://res.xiaoqinre.com/" + e);
},
button: [4],
insertImg: ["#cp_img", 2],
go: 1,
autoDownload: [0],
next: ".btn.next",
prev: ".btn.prev",
customTitle: () => fun.title("免费", 1),
category: "comic"
}, {
name: "漫画牛 manhua666.cc www.manhua666.cc 漫画台 manhuatai.org www.manhuatai.org",
enable: 0,
reg: /manhua666\.\w+\/\w+\/\d+\.html|manhuatai\.org\/manhua\/\d+\/\d+\.html/i,
imgs: () => [...fun.doc(imgs.join("")).images],
button: [4],
insertImg: ["#content", 2],
go: 1,
autoDownload: [0],
next: "a[rel=next][href$=html],#next_url",
prev: "a[rel=prev][href$=html],#prev_url",
customTitle: () => {
let s = fun.geT(".info-title,.con_top").split(/\s?>/);
return (s[2] + s[3]).trim();
},
category: "comic"
}, {
name: "大树漫画 www.dashumanhua.com",
enable: 0,
reg: /www\.dashumanhua\.com\/comic\/\w+\/.+\.html/i,
imgs: () => {
let code = [...document.scripts].find(s => s.innerHTML.search(/picTree/) > -1).innerHTML;
let m = code.match(/eval.+\)\)/)[0].slice(4);
return fun.run(fun.run(m).slice(12, -1));
},
button: [4],
insertImg: ["#pic-list", 2],
go: 1,
autoDownload: [0],
next: "//a[text()='下一话' and not(contains(@href,'--1'))]",
prev: "//a[text()='上一话' and not(contains(@href,'--1'))]",
customTitle: () => fun.title(/\(/, 1),
category: "comic"
}, {
name: "GODA漫画 cocomanga.org godamanga.art",
enable: 0,
reg: /https?:\/\/(cocomanga\.org|godamanga\.art)\/manga\/[a-z0-9-_]+\/[a-z0-9-_]+(\/|\.html)$/i,
delay: 300,
imgs: "//img[@decoding and @layout] | //img[@decoding and contains(@class,'img_content_jpg')]",
insertImg: ["//div[div[div[div[div[img[@decoding and @layout]]]]]] | //div[div[div[div[div[img[@decoding and contains(@class,'img_content_jpg')]]]]]]", 2],
autoDownload: [0],
next: "//a[span[text()='下一话']] | //a[span[text()='NEXT']]",
prev: "//a[span[text()='上一话']] | //a[span[text()='PREV']]",
customTitle: () => fun.geT("h1"),
category: "comic"
}, {
name: "GODA漫畫 godamanga.com cn.godamanga.site gd.godamanga.art cn.godamanga.art cn.godamanga.com 包子漫畫 baozimh.org bz.godamanga.art cn.baozimh.org",
enable: 0,
reg: /https?:\/\/((www|gd|bz|cn)\.)(baozimh|godamanga)\.(art|com|org)\/manga\/[a-z0-9-_]+\/[a-z0-9-_]+/i,
init: async () => {
try {
let script = "//script[contains(text(),'currentManga')]";
await fun.waitEle(script);
let code = fun.geT(script);
let id = code.match(/\\"id\\":(\d+)/)[1];
let api = `https://papi.mgsearcher.com/api/chapters/${id}?fields[0]=chapter_img&encodeValuesOnly=true`;
siteJson = await fetch(api, {
"headers": {
"Authorization": "Bearer b69efef9280150ba3c29ebd02f1dd08b78d9d76a646fea85442c8f806f0037512d3bfab40a27528769b52373f9857edae1b8d74a3198c60f583f223bcccd8fde586cbc8420570a34570b62d2bef66c6aa82da8a3fd0c3dd2dedb18b8ea276f55d56151fe72317f2f38c9f888475f7433e24edebd7775c4aafa98ec9694789da9"
}
}).then(res => res.json());
debug("\n此頁JSON資料\n", siteJson);
} catch (e) {}
fun.remove("//div[ins[@class='adsbygoogle']]");
},
imgs: async () => {
await fun.waitEle(".touch-manipulation");
try {
return siteJson.data == null ? [] : siteJson.data.attributes.chapter_img.map(e => e.url);
} catch (e) {
return [...fun.gae(".touch-manipulation img")];
}
},
button: [4],
insertImg: [".touch-manipulation", 2],
autoDownload: [0],
next: () => {
let next = fun.ge("//a[button[text()='下一話' or text()='下一话']]");
return next ? next.href : null;
},
prev: 1,
customTitle: () => fun.geT("ol.inline-flex>li:nth-child(2) a") + " - " + fun.geT("ol.inline-flex>li:nth-child(3) a"),
category: "comic"
}, {
name: "漫畫屋 mh5.tw",
enable: 0,
reg: /mh5\.tw\/(series|seriesvip)-\w+-\d+-\d+/i,
imgs: () => {
let max;
/seriesvip/.test(location.href) ? max = fun.geT("a.cur~a:last-child") - 2 : max = fun.geT("a.cur~a:last-child") - 1;
return fun.getImgIframe(".ptview>img[alt]:not([style])", max, 13, [null, null], ".setnmh-pagedos", 1000, 0);
},
insertImg: [".ptview", 1, 0],
autoDownload: [0],
next: "//a[text()='下一話']",
prev: "//a[text()='上一話']",
customTitle: () => {
let ele = fun.ge("h2");
return ele ? fun.geT("h1") + " - " + fun.geT("h2") : fun.geT(".setnmh-bookname>a:nth-child(5)") + " - " + fun.geT(".setnmh-bookname>a:nth-child(7)");
},
css: ".ptview>img{width:100%!important;height:auto!important;max-width:1000px!important;border:none!important;box-shadow:none!important;padding:0!important;margin:0 auto!important}",
category: "comic"
}, {
name: "七夕漫画 www.qiximh2.com",
enable: 0,
reg: /www\.qiximh\d+\.com\/\d+\/\d+\.html/i,
imgs: ".main_img img",
insertImg: [".main_img", 2],
go: 1,
autoDownload: [0],
next: "//a[img[@alt='下一章'] and contains(@href,'html')]",
prev: "//a[img[@alt='上一章'] and contains(@href,'html')]",
customTitle: () => fun.title("_", 3),
category: "comic"
}, {
name: "七夕漫画M m.qiximh2.com",
enable: 0,
reg: /m\.qiximh\d+\.com\/\d+\/\d+\.html/i,
imgs: ".main_img img",
insertImg: [".main_img", 2],
go: 1,
autoDownload: [0],
next: "//a[p[text()='下一篇'] and contains(@href,'html')]",
prev: "//a[p[text()='上一篇'] and contains(@href,'html')]",
customTitle: () => {
let s = document.title.replace(" - 七夕漫画", "").split("_");
return s[1] + " - " + s[0];
},
css: ".ad_js{display:none!important}",
category: "comic"
}, {
name: "爱漫之家 www.17fuman.com www2.17fuman.com www.fumanhua-1.com www.fumanhua-2.com www.fumanhua-3.com www2.fumanhua-1.com m.fumanhua-1.com m.fumanhua44.com m.fumanhua66.com m.fumanhua77.com m1.fumanhua-1.com m1.fumanhua44.com m1.fumanhua66.com m1.fumanhua77.com",
enable: 0,
reg: /(www|m)\d?\.(17fuman|fumanhua-?\d+)\.com\/\w+\/\d+\/\d+\.html/i,
init: "document.onkeydown=null",
imgs: () => base64_decode(qTcms_S_m_murl_e).split("$qingtiandy$").map(e => qTcms_m_weburl + e),
insertImg: ["//td[img[@id='qTcms_pic']]", 2],
go: 1,
autoDownload: [0],
next: "#k_Pic_nextArr",
prev: "#k_Pic_backArr",
customTitle: () => fun.title(' - ', 3).replace("漫画", ""),
css: ".bd_980_90{display:none!important}",
category: "comic"
}, {
name: "73漫画 www.73mh.net",
enable: 0,
reg: /www\.73mh\.net\/mh\/\w+\//i,
imgs: ".v_con_box img",
insertImg: ["section .v_con_box", 2],
go: 1,
autoDownload: [0],
next: "//a[text()='下一话']",
prev: "//a[text()='上一话']",
customTitle: () => fun.geT(".p_select>h2") + " - " + fun.geT(".v-page>span"),
category: "comic"
}, {
name: "漫画160 www.mh160.cc",
enable: 0,
reg: /www\.mh160\.cc\/kanmanhua\/\w+\/\d+\.html/i,
init: "document.onkeydown=null",
imgs: () => base64_decode(qTcms_S_m_murl_e).split("$qingtiandy$").map(e => f_qTcms_Pic_curUrl_realpic(e)),
button: [4],
insertImg: ["//td[//img[@onclick]]", 2],
go: 1,
autoDownload: [0],
next: "#k_Pic_nextArr",
prev: "#k_Pic_backArr",
customTitle: () => qTcms_S_m_name + " - " + qTcms_S_m_playm,
category: "comic"
}, {
name: "733 动漫 www.733.so",
enable: 0,
reg: /www\.733\.so\/mh\/\d+\/\d+\/1\.html/i,
imgs: () => [...fun.doc(temp_pic_all).images],
insertImg: ["#pic_box p", 2],
go: 1,
autoDownload: [0],
next: "//a[text()='下一话']",
prev: "//a[text()='上一话']",
customTitle: () => fun.geT(".p_select>h2") + " - " + fun.geT(".v-page .ispubu"),
category: "comic"
}, {
name: "733 动漫M m.733.so",
enable: 0,
reg: /m\.733\.so\/mh\/\d+\/\d+\/\d+\.html/i,
imgs: () => [...fun.doc(temp_pic_all).images],
insertImg: [".select_con", 2],
go: 1,
autoDownload: [0],
next: "//a[text()='下一话' and contains(@href,'html')]",
prev: "//a[text()='上一话' and contains(@href,'html')]",
customTitle: () => {
let s = document.title.split("-");
return s[1] + " - " + s[0];
},
category: "comic"
}, {
name: "漫画160M m.mh160.cc",
enable: 0,
reg: /m\.mh160\.cc\/kanmanhua\/\w+\/\d+\.html/i,
imgs: () => base64_decode(qTcms_S_m_murl_e).split("$qingtiandy$").map(e => f_qTcms_Pic_curUrl_realpic(e)),
button: [4],
insertImg: [".UnderPage", 2],
go: 1,
autoDownload: [0],
next: "#k_Pic_nextArr",
prev: "#k_Pic_backArr",
customTitle: () => qTcms_S_m_name + " - " + qTcms_S_m_playm,
category: "comic"
}, {
name: "漫画库 www.mhko.net",
enable: 0,
reg: /www\.mhko\.net\/comic\/\d+\/\d+\.html/i,
init: () => {
document.onkeydown = null;
let url = siteData.next();
if (url) fun.addUrlHtml(url, ".tbCenter", 1);
},
imgs: () => {
try {
return base64_decode(qTcms_S_m_murl_e).split("$qingtiandy$");
} catch (e) {
return window.atob(qTcms_S_m_murl_e).split("$qingtiandy$");
}
},
button: [4],
insertImg: ["//td[img[@id='qTcms_pic']]", 2],
go: 1,
autoDownload: [0],
next: () => qTcms_Pic_nextArr !== "" ? location.origin + qTcms_Pic_nextArr : null,
prev: 1,
customTitle: () => qTcms_S_m_name + " - " + qTcms_S_m_playm,
css: ".iFloat,#mypic_k0{display:none!important}",
category: "comic"
}, {
name: "笨狗漫画 www.bengou.co m.bengou.co",
enable: 0,
reg: /(www|m)\.bengou\.co\/\w+\/\w+\/\d+\.html/i,
init: () => {
document.onkeydown = null;
},
imgs: () => base64_decode(qTcms_S_m_murl_e).split("$qingtiandy$").map(e => f_qTcms_Pic_curUrl_realpic(e)),
insertImg: ["//td[img[@id='qTcms_pic']]", 2],
go: 1,
autoDownload: [0],
next: () => qTcms_Pic_nextArr !== "" ? location.origin + qTcms_Pic_nextArr : null,
prev: 1,
customTitle: () => qTcms_S_m_name + " - " + qTcms_S_m_playm,
css: ".action-list li{width:50% !important}#mypic_k0,.action-list>ul>li:nth-child(n+2):nth-child(-n+3){display:none!important}",
category: "comic"
}, {
name: "星辰漫画网 www.xcmh.com m.xcmh.com",
enable: 1,
reg: /(www|m)\.xcmh\.com\/\w+\/\w+\/\d+\.html/i,
init: () => {
document.onkeydown = null;
},
imgs: () => base64_decode(qTcms_S_m_murl_e).split("$qingtiandy$").map(e => location.origin + f_qTcms_Pic_curUrl_realpic(e)),
insertImg: ["//td[img[@id='qTcms_pic']]", 2],
go: 1,
autoDownload: [0],
next: () => qTcms_Pic_nextArr !== "" ? location.origin + qTcms_Pic_nextArr : null,
prev: 1,
customTitle: () => qTcms_S_m_name + " - " + qTcms_S_m_playm,
css: "#mypic_k0{display:none!important}",
category: "comic"
}, {
name: "酷酷屋 www.kukuwumh.com m.kukuwumh.com",
enable: 0,
reg: /(www|m)\.kukuwumh\.com\/manhua\/\w+\/\d+\.html/,
init: "document.onkeydown=null",
imgs: () => base64_decode(qTcms_S_m_murl_e).split("$qingtiandy$"),
insertImg: ["//td[//img[@onclick]]", 2],
go: 1,
autoDownload: [0],
next: "#k_Pic_nextArr",
prev: "#k_Pic_backArr",
customTitle: () => {
if (/www\.kukuwumh\.com/.test(location.origin)) {
return fun.geT("#skin~h1") + " - " + fun.geT("#skin~h2");
} else {
let s = document.title.split(" - ");
return (s[1] + " - " + s[0]).replace("漫画", "");
}
},
category: "comic"
}, {
name: "木马漫画 www.omyschool.com",
enable: 0,
reg: /www\.omyschool\.com\/article_detail\/\d+\/\d+\/.+\/.+\//i,
imgs: "#imgs amp-img",
button: [4],
insertImg: ["#imgs", 2],
go: 1,
autoDownload: [0],
next: ".nav_button.next",
prev: ".nav_button.prev",
customTitle: () => fun.geT("//a/span[@property and not(i)]") + " - " + fun.geT("//li/span[@property and not(i)]"),
category: "comic"
}, {
name: "砂之船动漫家 www.szcdmj.com",
enable: 0,
reg: /www\.szcdmj\.com\/szcchapter\/\d+/i,
include: ".comiclist",
imgs: async () => {
await fun.getNP(".comicpage>div", "//a[@href and text()='下一页']", null, ".fanye");
return [...fun.gae("img.lazy")];
},
button: [4],
insertImg: [".comiclist", 2],
go: 1,
autoDownload: [0],
next: "//a[text()='下一话']",
prev: "//a[text()='上一话']",
customTitle: () => fun.geT("h1.title"),
category: "comic"
}, {
name: "砂之船动漫家M www.szcdmj.com",
enable: 0,
reg: /www\.szcdmj\.com\/szcchapter\/\d+/i,
include: "#cp_img",
imgs: async () => {
await fun.getNP("#cp_img>img[data-original]", "//a[@href and text()='下一页']", null, ".view-bottom-bar");
return [...fun.gae("#cp_img>img[data-original]")];
},
insertImg: ["#cp_img", 2],
go: 1,
autoDownload: [0],
next: "//a[text()='下一话']",
prev: "//a[text()='上一话']",
customTitle: () => bookInfo.book_name + " - " + bookInfo.chapter_name,
category: "comic"
}, {
name: "雪人漫画 www.xuerenmanhua.com",
enable: 0,
reg: /www\.xuerenmanhua\.com\/chapter\/\d+/i,
include: ".comiclist",
imgs: ".comiclist img",
button: [4],
insertImg: [".comicpage", 2],
go: 1,
autoDownload: [0],
next: "//a[text()='下一章']",
prev: "//a[text()='上一章']",
customTitle: () => fun.geT("h1.title"),
category: "comic"
}, {
name: "雪人漫画M www.xuerenmanhua.com",
enable: 0,
reg: /www\.xuerenmanhua\.com\/chapter\/\d+/i,
imgs: "#cp_img>img[data-original]",
button: [4],
insertImg: ["#cp_img", 2],
go: 1,
autoDownload: [0],
next: "//a[text()='下一章']",
prev: "//a[text()='上一章']",
customTitle: () => bookInfo.book_name + " - " + bookInfo.chapter_name,
category: "comic"
}, {
name: "好漫6 www.haoman6.com",
enable: 0,
reg: /www\.haoman6\.com\/chapter\/\d+/,
imgs: "img[data-ecp]",
insertImg: [".rd-article-wr", 2],
go: 1,
autoDownload: [0],
next: ".j-rd-next",
prev: ".j-rd-prev",
customTitle: () => fun.geT(".j-comic-title").replace("(最新在线)", "") + " - " + fun.geT(".last-crumb"),
category: "comic"
}, {
name: "好漫8 haoman8.com",
enable: 0,
reg: /haoman8\.com\/comic\/\d+\/\d+/,
imgs: "img[data-echo]",
insertImg: ["#reader-scroll", 2],
go: 1,
autoDownload: [0],
next: "#js_pageNextBtn",
prev: "#js_pagePrevBtn",
customTitle: () => fun.geT("#crumbComicLink") + " - " + fun.geT("#js_headChapterName"),
category: "comic"
}, {
name: "拷貝漫畫 www.copymanga.site copymanga.site www.mangacopy.com mangacopy.com",
enable: 1,
reg: /(www\.)?(copymanga\.site|mangacopy\.com)\/comic\/\w+\/chapter\/.+/,
delay: 300,
init: async () => {
document[_0x1f93("0x1b")][_0x1f93("0x27")] = null;
$(document).unbind("click");
$(document).unbind("keydown");
$(document).unbind("keyup");
const hidetoolbar = () => {
var e = e || window.event;
if (e.wheelDelta < 0 || e.detail > 0) {
$("h4.header").attr("style", "top: -30px;");
$("div.footer").attr("style", "bottom: -41px;");
} else {
$("h4.header").removeAttr("style");
$("div.footer").removeAttr("style");
}
};
document.addEventListener("wheel", hidetoolbar);
document.addEventListener("DOMMouseScroll", hidetoolbar);
const keyhidetoolbar = (e) => {
let key = window.event ? e.keyCode : e.which;
if (key == "34" || key == "32" || key == "40") {
$("h4.header").attr("style", "top: -30px;");
$("div.footer").attr("style", "bottom: -41px;");
} else {
$("h4.header").removeAttr("style");
$("div.footer").removeAttr("style");
}
};
document.addEventListener("keydown", keyhidetoolbar);
let api;
if (/mangacopy/.test(location.origin)) {
api = location.href.replace(/.*?(?=\/comic\/)/, "https://api.mangacopy.com/api/v3");
} else {
api = location.href.replace(/.*?(?=\/comic\/)/, "https://api.copymanga.site/api/v3");
}
let json = await fetch(api).then(res => res.json());
siteJson = json;
debug("\n此頁JSON資料\n", json);
},
button: [4],
imgs: () => siteJson.results.chapter.contents.map(e => e.url),
insertImg: [".comicContent-list", 2],
go: 1,
autoDownload: [0],
next: "//a[text()='下一話'][starts-with(@href,'/comic/')]",
prev: "//a[text()='上一話'][starts-with(@href,'/comic/')]",
customTitle: () => siteJson.results.comic.name + " - " + siteJson.results.chapter.name,
topButton: true,
css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}.header+div[style],.comicContainerAds{display:none!important}",
category: "comic"
}, {
name: "拷貝漫畫M www.copymanga.site copymanga.site www.mangacopy.com mangacopy.com",
enable: 1,
reg: /(www\.)?copymanga\.site\/h5\/comicContent\/\w+\/.+/,
xhr: () => {
let s = location.href.split("/").slice(-2);
let api;
/mangacopy/.test(location.origin) ? api = `https://api.mangacopy.com/api/v3/comic/${s[0]}/chapter/${s[1]}` : api = `https://api.copymanga.site/api/v3/comic/${s[0]}/chapter/${s[1]}`;
return new Promise(resolve => {
_GM_xmlhttpRequest({
method: "GET",
url: api,
responseType: "json",
headers: {
"Referer": `https://${location.hostname}/comic/${s[0]}/chapter/${s[1]}`,
"User-Agent": PcUa
},
onload: data => {
resolve(data.response);
}
});
});
},
init: async () => {
if (typeof aboutBlank === "function") aboutBlank = () => {};
fun.clearAllTimer();
siteJson = await siteData.xhr();
debug("\n此頁JSON資料\n", siteJson);
const addHtml = (url, text) => {
let str = `<div style="padding: 10px 0; text-align: center;"><a href="${url}"style="width: 100%;font-size: 26px;line-height: 50px;height: 50px;text-align: center;">${text}</a></div>`;
fun.ge(".comicContentPopupImageList").insertAdjacentHTML("afterend", str);
};
let s = location.href.split("/").slice(-2);
let url = `https://${location.hostname}/h5/details/comic/${s[0]}`;
addHtml(`https://${location.hostname}/h5/index`, "首頁");
addHtml(url, "目錄");
let nUrl = siteData.next();
if (nUrl) addHtml(nUrl, "點選進入下一話");
},
imgs: () => siteJson.results.chapter.contents.map(e => e.url),
button: [4],
insertImg: [".comicContentPopupImageList", 2],
go: 1,
next: () => {
let next = siteJson.results.chapter.next;
return next ? location.href.replace(/[\w-]+$/, "") + next : null;
},
customTitle: () => siteJson.results.comic.name + " - " + siteJson.results.chapter.name,
css: ".comicFixed{display:none!important}",
fancybox: {
blacklist: 1
},
category: "comic"
}, {
name: "二次元動漫 www.2animx.com",
enable: 0,
reg: /www\.2animx\.com\/index-look-name-.+/,
init: "$(document).unbind('click');",
imgs: () => fun.getImgO("#ComicPic", $("#total").val(), 20, [null, null], 0, "div.b,.e>p", 0),
button: [4],
insertImg: ["#img_ad_img", 1],
autoDownload: [0],
next: ".n.zhangjie",
prev: ".p.zhangjie",
customTitle: () => fun.geT(".e>p").replace(/(\d+P) - 第 \d+ \/ \d+ 頁/, ""),
topButton: true,
css: ".c>*:not(.n.zhangjie):not(.p.zhangjie){display:none!important;}#ComicPic{display:block!important;margin: 0 auto !important;}",
category: "comic"
}, {
name: "酷漫屋 www.kumw9.com m.kumw9.com",
enable: 0,
reg: /(www|m)\.kumw\d\.com\/\d+\/\d+\.html/,
imgs: ".main_img img",
button: [4],
insertImg: [".main_img", 2],
go: 1,
autoDownload: [0],
next: "//a[img[@alt='下一章']] | //a[i[@class='i-rd-next'] and contains(@href,'html')]",
prev: "//a[img[@alt='上一章']] | //a[i[@class='i-rd-prev'] and contains(@href,'html')]",
customTitle: () => {
try {
return fun.geT(".chaptitle").replace(">", "-");
} catch (e) {
let s = document.title.replace(" - 酷漫屋", "").split("_");
return s[1] + " - " + s[0];
}
},
category: "comic"
}, {
name: "速漫库 qumanku.com www.sumanku.com",
enable: 0,
reg: /https?:\/\/(www.)?\w+manku\.com\/\w+\/\w+\.html/i,
imgs: ".main_img img",
button: [4],
insertImg: [".main_img", 2],
go: 1,
autoDownload: [0],
next: "//a[span[text()='下一章']]",
prev: "//a[span[text()='上一章']]",
customTitle: () => fun.attr("meta[itemprop=mhname]", "content") + " - " + fun.geT(".chaptitle"),
category: "comic"
}, {
name: "漫画DB www.manhuadb.com",
enable: 0,
reg: /www\.manhuadb\.com\/manhua\/\d+\/\w+\.html$/,
imgs: () => img_data_arr.map(e => is_webp && e.img_webp ? img_host + img_pre + e.img_webp : img_host + img_pre + e.img),
button: [4],
insertImg: ["#all", 2],
go: 1,
autoDownload: [0],
next: async () => {
return fetch("https://www.manhuadb.com/book/goNumPage", {
"headers": {
"content-type": "application/x-www-form-urlencoded; charset=UTF-8"
},
"body": `ccid=${p_ccid}&id=${p_id}&num=${parseInt(vg_r_data.data("num"), 10) + 1}&d=${p_d}&type=next`,
"method": "POST"
}).then(res => res.json()).then(json => json.state == 0 ? null : location.origin + json.url);
},
prev: "//a[text()='上集']",
customTitle: () => fun.title("-漫画DB"),
category: "comic"
}, {
name: "快岸漫画 kanbook.net",
enable: 0,
reg: /kanbook\.net\/comic\/\d+\/\d+/,
delay: 1000,
init: "$(document).unbind('keydown');$(document).unbind('keyup');",
imgs: () => is_refresh == 0 ? x_tokens.map(e => Gm.getImgUrl(comic_id + "/" + version_id + "/" + part_id + "/" + my_sha2(e))) : data.url.map(e => Gm.getImgUrl(e)),
button: [4],
insertImg: ["#all", 2],
go: 1,
autoDownload: [0],
next: "//a[text()='下一章' and not(starts-with(@href,'javascript'))]",
prev: "//a[text()='上一章' and not(starts-with(@href,'javascript'))]",
customTitle: () => fun.geT("h2.h2>a") + " - " + fun.geT("span.h4:nth-child(5)"),
//threading: 4,
css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}",
category: "comic"
}, {
name: "樱花漫画 www.yinghuamh.net",
enable: 1,
reg: /^https:\/\/www\.yinghuamh\.net\/comic\/\w+\/\d+\/\d+/i,
delay: 1000,
init: () => {
$(document).unbind("keydown");
$(document).unbind("keyup");
const hidetoolbar = () => {
var e = e || window.event;
if (e.wheelDelta < 0 || e.detail > 0) {
fun.ge(".view-title").style.top = "-60px";
} else {
fun.ge(".view-title").style.top = "0px";
}
};
document.addEventListener("wheel", hidetoolbar);
document.addEventListener("DOMMouseScroll", hidetoolbar);
const keyhidetoolbar = (e) => {
let key = window.event ? e.keyCode : e.which;
if (key == "34" || key == "32" || key == "40") {
fun.ge(".view-title").style.top = "-60px";
} else {
fun.ge(".view-title").style.top = "0px";
}
};
document.addEventListener("keydown", keyhidetoolbar);
if (("ontouchstart" in window) || (navigator.maxTouchPoints > 0) || (navigator.msMaxTouchPoints > 0)) {
let startY, moveY, Y;
$("body").on("touchstart", (e) => {
startY = e.originalEvent.changedTouches[0].pageY;
});
$("body").on("touchmove", (e) => {
moveY = e.originalEvent.changedTouches[0].pageY;
Y = moveY - startY;
if (Y < 0) {
fun.ge(".view-title").style.top = "-60px";
} else if (Y > 0) {
fun.ge(".view-title").style.top = "0px";
}
});
}
},
imgs: () => x_tokens.map(e => Gm.getImgUrl(Gm.fitImgUrl(e))),
button: [4],
insertImg: ["#all", 2],
autoDownload: [0],
next: "a.next_part:not([href^=java])",
prev: ".paginationContent>a:first-child:not([href^=java])",
customTitle: () => comic_name + " - " + part_name,
threading: 4,
css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}",
category: "comic"
}, {
name: "快看漫画 www.kuaikanmanhua.com",
enable: 0,
reg: /www\.kuaikanmanhua\.com\/web\/comic\/\d+\//,
imgs: ".imgList img[data-src]",
insertImg: [".imgList", 2],
autoDownload: [0],
next: "//a[text()='下一话']",
prev: "//a[text()='上一话']",
customTitle: () => fun.geT("h3.title"),
category: "comic"
}, {
name: "腾讯漫画 ac.qq.com",
enable: 0,
reg: /ac\.qq\.com\/ComicView\/index\/id\/\d+\/cid\/\d+/,
imgs: () => {
let nonce = [...document.scripts].find(s => s.innerHTML.search(/^\s+window\[/) > -1).innerHTML.match(/\s*window.*?=(.*?)?;/)[1];
nonce = fun.run(nonce);
const data = DATA.split("");
nonce = nonce.match(/\d+[a-z]+/gi);
let n = nonce.length;
let locate = null;
let str = "";
while (n--) {
locate = parseInt(nonce[n]) & 255;
str = nonce[n].replace(/\d+/g, "");
data.splice(locate, str.length);
}
const base64 = data.join("");
const json = JSON.parse(window.atob(base64));
return json.picture.map(e => e.url);
},
autoDownload: [0],
next: "#nextChapter",
prev: "#prevChapter",
customTitle: () => fun.geT("#chapter") + " - " + fun.geT(".title-comicHeading"),
category: "comic"
}, {
name: "哔哩哔哩漫画 manga.bilibili.com",
enable: 1,
reg: /manga\.bilibili\.com\/mc\d+\/\d+\?from=manga_detail/,
init: () => {
setTimeout(() => {
fun.ge(".load-next-btn").addEventListener("click", () => {
setTimeout(() => {
location.reload();
}, 500)
})
}, 1000)
},
imgs: async () => {
let ep_id = siteUrl.split("/").pop().match(/\d+/)[0];
let headers = {
"content-type": "application/json;charset=UTF-8"
};
let imgsRes = await fetch("/twirp/comic.v1.Comic/GetImageIndex?device=pc&platform=web", {
"headers": headers,
"body": JSON.stringify({
ep_id: `${ep_id}`
}),
"method": "POST"
}).then(res => res.json()).then(json => json.data.images.map(e => e.path));
return fetch("/twirp/comic.v1.Comic/ImageToken?device=pc&platform=web", {
"headers": headers,
"body": JSON.stringify({
urls: JSON.stringify(imgsRes)
}),
"method": "POST"
}).then(res => res.json()).then(json => json.data.map(e => `${e.url}?token=${e.token}`));
},
insertImg: [".image-list", 2],
next: ".load-next-btn",
prev: 1,
customTitle: async () => {
await fun.delay(1500, 0);
return fun.geT(".manga-title") + " - " + fun.geT(".episode");
},
css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}",
category: "comic"
}, {
name: "看漫画 www.kanman.com",
enable: 0,
reg: /www\.kanman\.com\/\d+\/[\w-]+\.html/,
imgs: () => {
let s = location.pathname.split("/");
let comic_id = s[1];
let chapter_newid = s[2].replace(".html", "");
let api = `/api/getchapterinfov2?product_id=1&productname=kmh&platformname=pc&comic_id=${comic_id}&chapter_newid=${chapter_newid}&isWebp=1&quality=middle`;
return fetch(api).then(res => res.json()).then(json => json.data.current_chapter.chapter_img_list);
},
customTitle: async () => {
await fun.delay(1500, 0);
return fun.geT('#crumbComicLink') + " - " + fun.geT('.chapter-title').trim();
},
category: "comic"
}, {
name: "漫蛙 manwa.me", //方向鍵上一章下一章、清除擋廣告警告、向下滾動隱藏工具列、反反偵錯,,下載需先手動觸發全部載入圖片,函式使用到canvas需要繪製過程會有點卡。
enable: 1,
reg: /manwa\.me\/chapter\/\d+(\?img_host=\d)?$/,
init: async () => {
Function.prototype.constructor = () => {};
//await fun.scrollEles(".img-content img", 200);
fun.css(".ad-area{opacity:0!important;}#cp_img>.two-ad-area:nth-child(1)>.ad-area,#cp_img>.two-ad-area:nth-child(2){display:none!important}");
fun.remove(".ad-area,body>div[id]:not([id^='pv-']):not([class^='pv-']):not(.pagetual_tipsWords):not(#comicRead):not(#fab):not(.FullPictureLoadMsg):not(.FullPictureLoadFixedBtn):not(#FullPictureLoadOptions):not(a):not(*[class^=fancybox])", 5000);
const hidetoolbar = () => {
var e = e || window.event;
if (e.wheelDelta < 0 || e.detail > 0) {
$(".view-fix-top-bar").attr("style", "top: -60px;");
$(".view-fix-bottom-bar").attr("style", "bottom: -60px;");
$(".detail-comment-fix-bottom").hide("fast");
} else {
$(".view-fix-top-bar").attr("style", "top: 0px;");
$(".view-fix-bottom-bar").attr("style", "bottom: 0px;");
$(".detail-comment-fix-bottom").show("fast");
}
};
document.addEventListener("wheel", hidetoolbar);
document.addEventListener("DOMMouseScroll", hidetoolbar);
const keyhidetoolbar = (e) => {
let key = window.event ? e.keyCode : e.which;
if (key == "34" || key == "32" || key == "40") {
$(".view-fix-top-bar").attr("style", "top: -60px;");
$(".view-fix-bottom-bar").attr("style", "bottom: -60px;");
$(".detail-comment-fix-bottom").hide("fast");
} else {
$(".view-fix-top-bar").attr("style", "top: 0px;");
$(".view-fix-bottom-bar").attr("style", "bottom: 0px;");
$(".detail-comment-fix-bottom").show("fast");
}
};
document.addEventListener("keydown", keyhidetoolbar);
if (("ontouchstart" in window) || (navigator.maxTouchPoints > 0) || (navigator.msMaxTouchPoints > 0)) {
let startY, moveY, Y;
$("body").on("touchstart", (e) => {
startY = e.originalEvent.changedTouches[0].pageY;
});
$("body").on("touchmove", (e) => {
moveY = e.originalEvent.changedTouches[0].pageY;
Y = moveY - startY;
if (Y < 0) {
$(".view-fix-top-bar").attr("style", "top: -60px;");
$(".view-fix-bottom-bar").attr("style", "bottom: -60px;");
$(".detail-comment-fix-bottom").hide("fast");
} else if (Y > 0) {
$(".view-fix-top-bar").attr("style", "top: 0px;");
$(".view-fix-bottom-bar").attr("style", "bottom: 0px;");
$(".detail-comment-fix-bottom").show("fast");
}
});
}
await fun.waitEle(".content-img.lazy_img[src^=blob]");
},
imgs: () => fun.imgBlobArr(".content-img[src^=blob]"),
next: ".view-fix-bottom-bar-item-menu-next",
prev: ".view-fix-bottom-bar-item-menu-prev",
customTitle: () => fun.title("在线阅读", 1),
css: "body{padding-bottom:0px!important}",
category: "comic"
}, {
name: "漫蛙選目錄展開全部章節 manwa.me",
enable: 1,
icon: 0,
key: 0,
reg: /manwa\.me\/book\/\d+$/,
init: "Function.prototype.constructor=()=>{};titleSelect(this,'#chapter_indexes');charpterMore(this);",
category: "comic"
}, {
name: "漫蛙自動載入更多 manwa.me",
enable: 1,
icon: 0,
key: 0,
reg: /manwa\.me\/update$/,
init: "Function.prototype.constructor=()=>{};",
observerClick: "#loadMore",
category: "comic"
}, {
name: "開車漫画 18p.fun",
enable: 1,
reg: /^https?:\/\/(www\.)?(18p|gohaveababy|imynest|healthway|beforeout)\.[a-z]{2,5}\/(ForInject\/|Article\/|content\/)/,
imgs: async () => {
await fun.waitEle("//script[contains(text(),'_curChap')]");
if (location.hostname != "18p.fun") {
location.replace("https://18p.fun/ForInject/Chapter/?id=" + $_curChap.id);
await fun.delay(3000, 0);
}
await fun.getNP("img[data-src].lazy:not(.demo-lazy)", "//a[@data-url and contains(text(),'下一頁')] | //a[@data-url and contains(text(),'下一章')]", null, "div[class^=picnext]");
return [...fun.gae("img[data-src].lazy:not(.demo-lazy)")];
},
insertImg: ["div[class^=pictures]", 3],
fetch: 1,
css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}",
category: "comic"
}, {
name: "開車漫画 18p.fun",
enable: 0,
icon: 0,
key: 0,
reg: /^https:\/\/18p\.fun\//,
include: ".loadmore>button",
init: () => {
const setImgSrc = () => [...gae("img.lazy[src$=svg]")].forEach(img => {
img.src = img.dataset.src;
});
setImgSrc();
new MutationObserver(() => {
setImgSrc()
}).observe(document.body, {
childList: true,
subtree: true
});
},
observerClick: ".loadmore>button",
openInNewTab: "#itemlist li>a:not([target=_blank])",
css: ".page{display:none!important}.loadmore{display:block!important}",
category: "comic"
}, {
name: "风之动漫 www.fffdm.com",
enable: 1,
reg: /(www\.fffdm\.com|manhua\.fffdm\.com)\/(manhua\/)?\d+\/[^/]+\/$/i,
init: async () => {
let s = location.pathname.split("/").slice(-3);
let mhId = s[0];
let mhcId = s[1];
let api = `https://${location.hostname}/api/manhua/${mhId}/${mhcId}`;
let json = await fetch(api).then(res => res.json());
debug("\n此頁JSON資料\n", json);
siteJson = json;
let url = await siteData.next();
if (url) {
let text = `<div style="padding: 36px 0; text-align: center;"><a href="${url}"style="font-size: 26px;line-height: 50px;height: 50px;text-align: center;">點選進入下一話</a></div>`;
fun.ge("#mh").insertAdjacentHTML("afterend", text);
fun.ge("#mh+div").addEventListener("click", () => {
setTimeout(() => {
location.reload();
}, 200)
});
}
},
imgs: async () => {
let hostArr = ["https://p5.fffdm.live/", "https://p6.fffdm.live/", "https://p1.fffdm.live/"];
let firstPic = siteJson.cont[0];
let testArr = hostArr.map(e => e + firstPic);
let ok = false;
let host;
for (let i = 0; i < testArr.length; i++) {
let obj = await fun.checkImgStatus(testArr[i]);
console.log(`確認圖片[${i}]`, obj);
if (obj.ok) {
ok = true;
host = hostArr[i];
break;
}
}
return ok ? siteJson.cont.map(e => host + e) : [];
},
insertImg: ["#mh", 2],
go: 1,
next: () => {
let comicListUrl = location.href.replace(/[\w-]+\/$/i, "");
let chapter = location.href.match(/[\w-]+\/$/)[0];
let nextXPath = `//div[@id='content']/li[a[@href='${chapter}']]/preceding-sibling::li[1]/a`;
return fun.fetchDoc(comicListUrl).then(doc => {
let next = fun.ge(nextXPath, doc);
return next ? comicListUrl + next.getAttribute("href") : null;
});
},
prev: 1,
customTitle: () => fun.title("第1页", 1),
category: "comic"
}, {
name: "大古漫画 www.dgmanhua.com",
enable: 1,
reg: /www\.(dgmanhua|dagumanhua)\.\w+\/manhua\/\d+\/\d+\.html$/i,
init: async () => {
document.onkeydown = null;
document.onkeyup = null;
let url = await siteData.next();
if (url) fun.addUrlHtml(url, ".mh_list", 1);
},
imgs: () => fun.getImg(".mh_list img", fun.ge("//script[contains(text(),'totalpage')]").innerHTML.match(/totalpage\s?=\s?(\d+)/)[1], 9),
button: [4],
insertImg: [".mh_list", 2],
go: 1,
next: () => {
let comicListUrl = location.href.replace(/\d+\.html$/, "");
let chapter = location.pathname;
let nextXPath = `//li[a[@href='${chapter}']]/preceding-sibling::li[1]/a`;
return fun.fetchDoc(comicListUrl).then(doc => {
let next = fun.ge(nextXPath, doc);
return next ? location.origin + next.getAttribute("href") : null;
})
},
prev: 1,
customTitle: () => fun.geT(".mh_cont>h1"),
category: "comic"
}, {
name: "大古漫画M m.dgmanhua.com",
enable: 1,
reg: /m\.(dgmanhua|dagumanhua)\.\w+\/manhua\/\d+\/\d+\.html$/i,
init: async () => {
let content = fun.ge("#content,.content");
if (content) content.innerHTML = fun.ge("img", content).outerHTML;
let url = await siteData.next();
if (url) fun.addUrlHtml(url, "#content,.content", 1);
},
imgs: async () => {
await fun.getNP("#content img,.content img", "//a[@href and text()='下一页']", null, ".pager,.cpages", 0, null, 0);
return [...fun.gae("#content img,.content img")];
},
button: [4],
insertImg: ["#content,.content", 1],
msg: 0,
next: () => {
let comicListUrl = location.href.replace(/\d+\.html$/, "");
let chapter = location.pathname;
let nextXPath = `//li[a[@href='${chapter}']]/preceding-sibling::li[1]/a`;
return fun.fetchDoc(comicListUrl).then(doc => {
let next = fun.ge(nextXPath, doc);
return next ? location.origin + next.getAttribute("href") : null;
})
},
//next: "//a[@href and text()='下一章']",
prev: "//a[@href and text()='上一章']",
customTitle: () => fun.geT("#bookname") + " - " + fun.geT(".headline"),
css: "#content~a,.content~a,.apjg,.pager a:nth-child(n+2):nth-child(-n+3){display:none!important}.pager a{width:44%!important}#content,.content{width:100%}",
category: "comic"
}, {
name: "大古漫画M m.dgmanhua.com loadMore",
enable: 1,
icon: 0,
key: 0,
reg: /m\.(dgmanhua|dagumanhua)\.\w+\/manhua\//i,
include: "//div[text()='点击加载更多']",
observerClick: "//div[text()='点击加载更多']",
category: "comic"
}, {
name: "哈哈漫画 www.hahacomic.com",
enable: 0,
reg: /^https:\/\/www\.hahacomic\.com\/manhua\/\d+\/\d+\.html/,
imgs: "img[data-original]",
button: [4],
insertImg: [".chapter-images", 2],
go: 1,
autoDownload: [0],
next: "//a[label[text()='下一章'] and not(starts-with(@href,'java'))]",
prev: "//a[label[text()='上一章'] and not(starts-with(@href,'java'))]",
category: "comic"
}, {
name: "哈哈漫画 www.hahacomic.com 分類自動翻頁",
enable: 1,
reg: /^https:\/\/www\.hahacomic\.com\/manhua\/list\.html/,
autoPager: {
ele: ".mdui-col-lg-2",
observer: ".mdui-col-lg-2",
next: () => fun.ge("span.current+a", doc) ? location.href.replace(/\?page=\d+/, "") + "?page=" + fun.ge("span.current+a", doc).getAttribute("href").match(/\d+/)[0] : null,
re: ".pages",
history: 1
},
openInNewTab: ".mdui-col-lg-2>a",
category: "autoPager"
}, {
name: "爱看漫画 www.qt1588.com m.qt1588.com",
enable: 0,
reg: /^https:\/\/(www|m)\.qt1588\.com\/comic\/[0-9_]+\.html/,
imgs: ".chapter-content img,.hide-scrollbars img",
button: [4],
insertImg: [".chapter-content,.hide-scrollbars", 2],
go: 1,
autoDownload: [0],
next: "//span[starts-with(@class,'next-chapter')]/a[contains(@href,'html')] | //a[p[text()='下一话'] and contains(@href,'html')]",
prev: "//span[starts-with(@class,'prev-chapter')]/a[contains(@href,'html')] | //a[p[text()='上一话'] and contains(@href,'html')]",
customTitle: () => fun.title("-在线", 1),
category: "comic"
}, {
name: "漫畫類 自動展開目錄",
enable: 1,
icon: 0,
key: 0,
reg: /((mangabz|xmanhua|dm5|1kkk|qiman\d+|mhxqiu\d|6mh\d+|manben|mkzhan|xianmanwang|qiximh\d|kumw\d|sumanku)\.com\/[\w-]+\/$)|(m\.dmzj\.com|m\.ymh1234\.com)\/(info|comic)\/\d+\.html$|(dgmanhua|acgud|acgwd|manhua456|mhxin|qwmanhua|zuimh|imitui|xlsmh|dmhua8|pinmh|qmiaomh|dashumanhua|kukuwumh|mh160|szcdmj|haoman6)\.(com|cc)\/(comic|manhua|manga|kanmanhua|szcbook)\/[\w-]+\/?$|www\.mhua5\.com\/[\w-]+\.html|m\.aiguoman\.com\/comic\/\w+|(www|m)\.77mh\.\w+\/colist_\d+\.html|www\.manhw\.com\/index\.php\/comic\/\w+$/,
init: async () => {
if (location.hostname == "m.acgud.com" || location.hostname == "m.acgwd.com") fun.css(".Introduct_Sub{background:url(https://m.idmzj.com/images/int_bg.png)!important;background-size:100% 100%!important}");
if (location.hostname == "m.mhxqiu2.com") await fun.delay(600, 0);
},
autoClick: "span.more,a.detail-list-form-more,a.detail-list-more,.deatil-list-more>a,.detail-more,.moreChapter,.show-more,a#zhankai,.gengduo_dt1>button,.morechapter>button,.gengduo_dt1>a,.chapterList+.more,li.add,a.extend,a.action-collapse:not(.on),.chapter__more .down,.listmore,.more.chapLiList-cont>a,.m-load-more-sm>a,.more>a,.allmulu,.show-more>a,.morechp,.nnmore>a",
css: ".comic-info-box+a,.cartoon-introduction.cmg,.cartoon-introduction+a,.msloga,.comic_intro>a,.Introduct+a,[class^='ad']{display:none!important}",
category: "comic"
}, {
name: "94i.in 自動簽到",
reg: /^https?:\/\/94i\.in\//,
autoClick: "#pper_a:not([style='display: none;'])",
category: "none"
}, {
name: "Supjav 立即顯示影片縮圖",
delay: 300,
reg: /^https?:\/\/supjav\.com\/(zh\/|ja\/)?\d+\.html/,
init: async () => {
let t = fun.ge("title");
t.innerText = t.innerText.replace(/-\sSupjav.com.+/, "").trim();
let ele = "#vserver.play-button";
if (await fun.waitEle(ele)) fun.ge(ele).click();
},
category: "none"
}, {
name: "ouo.io 自動跳轉",
reg: /^https?:\/\/ouo\./,
init: async () => {
let ele = "#btn-main:not(.disabled)";
if (await fun.waitEle(ele)) fun.ge(ele).click();
},
category: "none"
}, {
name: "cuty.io 自動跳轉",
reg: /^https:\/\/cutt?y\.(io|app)\/\w+/i,
init: async () => {
let ele = "//button[@id='submit-button' and text()= 'Continue' or text()= 'I am not a robot' or text()= 'Go ->']";
if (await fun.waitEle(ele)) fun.ge(ele).click();
},
category: "none"
}, {
name: "m.4khd.com 自動跳轉",
reg: /^https?:\/\/m\.4khd\.com\//,
init: () => {
location.href = fun.ge("//a[text()='GET LINK']").href;
},
category: "none"
}, {
name: "4kup.net 自動跳轉",
reg: /^https:\/\/4kup\.net\/getlink\/$/,
init: async () => {
let eleArr = ["#output:not([style*=none]) button", "#gotolink:not([disabled])"];
for (let i in eleArr) {
await fun.waitEle(eleArr[i]);
fun.ge(eleArr[i]).click();
await fun.delay(200);
}
},
category: "none"
}, {
name: "MediaFire 自動下載",
reg: /^https?:\/\/www\.mediafire\.com\//,
autoClick: ".download_link:not(.started) #downloadButton",
category: "none"
}, {
name: "anonfiles 自動下載",
reg: /^https?:\/\/anonfiles\.com\//,
autoClick: ["#download-url"],
category: "none"
}, {
name: "letsupload 自動下載",
reg: /^https?:\/\/letsupload\.cc\//,
autoClick: ["#download-url"],
category: "none"
}, {
name: "stfly.me 半自動跳轉",
reg: /^http/,
include: "img[src^='https://stfly.me/']",
init: async () => {
if (await fun.waitEle(".btn-captcha:not(.disable)")) {
setInterval(() => {
fun.ge(".btn-captcha:not(.disable)").click();
}, 3000);
}
},
category: "none"
}, {
name: "link1s 自動跳轉",
reg: /^http/,
include: "a.site-logo[href='https://link1s.com/'],a.logo-image[href='https://link1s.com/']",
init: async () => {
if (await fun.waitEle("//button[@onclick='link1sgo()'] | //button[@id='link' and contains(@style,'none')] | //a[text()='Get Link']")) fun.ge("//button[@onclick='link1sgo()'] | //a[@id='link1s'] | //a[text()='Get Link']").click();
},
category: "none"
}, {
name: "網址清單新分頁開啟",
delay: 1000,
reg: /github\.com\/skofkyo\/AutoPager\/tree\/main\/CustomPictureDownload/,
openInNewTab: ".entry-content a[href]:not([target=_blank]):not([id])",
category: "none"
}, {
name: "google search loadmore",
enable: 1,
reg: /^https:\/\/(?:www\.)?google\..*\/search/,
include: "a[aria-label='更多搜尋結果']",
observerClick: "//a[@aria-label='更多搜尋結果' and div[not(@style='display: none;')]]",
openInNewTab: "#center_col a[ping][data-ctpacw]",
category: "none"
}, {
name: "測試 test",
enable: 0,
reg: /^https?:\/\/\w+\.hathitrust\.org\/cgi\/pt\?id=/,
imgs: () => {
return fun.imgBlobArr(".image>img");
//return fun.imgBlobArr(".image>img", 2);
//return fun.imgBlobArr(".image>img", 2, "image/png");
},
category: "none"
}, {
name: "測試2 test2",
enable: 0,
reg: /www.htmleaf.com|idoitmyself.xyz/,
init: async () => {
await fun.delay(4000, 0);
/*
html2canvas(document.querySelector("canvas")).then(canvas => {
let base64Url = canvas.toDataURL("image/jpeg");
console.log("base64Url", base64Url);
});
*/
},
category: "none"
}, {
name: "Civitai models civitai.com",
reg: /^https:\/\/civitai\.com\/models\/\d+/,
delay: 2000,
init: async () => {
await fun.waitEle(".mantine-u0eh0m");
let div = document.createElement("div");
div.className = "imgBox";
let x = fun.ge(".mantine-u0eh0m");
x.parentNode.insertBefore(div, x.nextSibling);
fun.CivitAiAutoShowNSFW();
},
imgs: () => [...fun.gae(".mantine-116dglk .mantine-7aj0so")].map(e => e.src.replace(/\/width=\d+\//, "/").replace("transcode=true,width=450", "transcode=true")),
repeat: 1,
button: [4],
insertImg: [".imgBox", 3],
go: 1,
fetch: 1,
customTitle: () => fun.geT(".mantine-Title-root").replace(/\|\s/, "").replace(/\//g, "-") + " - " + fun.geT(".mantine-z8ikjj"),
openInNewTab: "a[href]:not([target=_blank])",
observerTitle: true,
category: "AI"
}, {
name: "Civitai posts civitai.com",
reg: /^https:\/\/civitai\.com\/posts\/\d+/,
delay: 2000,
init: () => {
fun.CivitAiAutoShowNSFW();
},
imgs: async () => {
await fun.waitEle("a[rel='nofollow noindex'] img,video[src]");
await fun.delay(200, 0);
return [...fun.gae("a[rel='nofollow noindex'] img,video[src]")].map(e => e.src.replace(/\/width=\d+\//, "/").replace("transcode=true,width=450", "transcode=true"));
},
repeat: 1,
button: [4],
insertImg: [
[".mantine-Stack-root", 0], 2
],
go: 1,
fetch: 1,
openInNewTab: "a[href]:not([target=_blank])",
category: "AI"
}, {
name: "CivitAi Auto Show NSFW civitai.com",
reg: /^https:\/\/civitai\.com\//,
delay: 2000,
icon: 0,
key: 0,
init: () => {
fun.CivitAiAutoShowNSFW();
},
openInNewTab: "a[href]:not([target=_blank])",
category: "AI"
}];
const debug = (str, obj = "", title = "debug") => {
console.log(`%c[Full Picture Load] ${title}:`, "background-color: #C9FFC9;", str, obj);
};
const hasTouchEvents = () => ("ontouchstart" in window) || (navigator.maxTouchPoints > 0) || (navigator.msMaxTouchPoints > 0) ? true : false;
const addLibrarysV3 = async () => {
try {
const jsdelivrLibrarys = [
"https://cdn.jsdelivr.net/npm/[email protected]/dist/jszip.min.js",
"https://cdn.jsdelivr.net/npm/[email protected]/dist/html2canvas.min.js",
"https://cdn.jsdelivr.net/npm/[email protected]/dist/jquery.min.js",
"https://cdn.jsdelivr.net/npm/@fancyapps/[email protected]/dist/jquery.fancybox.min.js",
"https://cdn.jsdelivr.net/npm/@fancyapps/[email protected]/dist/jquery.fancybox.min.css"
];
const bootcdnLibrarys = [
"https://cdn.bootcdn.net/ajax/libs/jszip/3.9.1/jszip.min.js",
"https://cdn.bootcdn.net/ajax/libs/html2canvas/1.4.1/html2canvas.min.js",
"https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.min.js",
"https://cdn.bootcdn.net/ajax/libs/fancybox/3.5.7/jquery.fancybox.min.js",
"https://cdn.bootcdn.net/ajax/libs/fancybox/3.5.7/jquery.fancybox.min.css"
];
let librarysArr;
try {
const check = await fetch(jsdelivrLibrarys[0]).then(res => res.status);
check == 200 ? librarysArr = jsdelivrLibrarys : librarysArr = bootcdnLibrarys;
} catch (error) {
console.error("\ncdn.jsdelivr.netV3 函式庫取得失敗", error);
librarysArr = bootcdnLibrarys;
}
for (let i in librarysArr) {
if (/\.js$/.test(librarysArr[i])) {
if (siteData.fancybox && siteData.fancybox.js === false) continue;
const script = document.createElement("script");
const code = await fetch(librarysArr[i]).then(res => res.text());
script.type = "text/javascript";
script.innerHTML = code;
document.body.appendChild(script);
} else if (/\.css$/.test(librarysArr[i])) {
if (siteData.fancybox && siteData.fancybox.css !== false) {
const css = await fetch(librarysArr[i]).then(res => res.text());
fun.css(css);
}
}
}
} catch (error) {
console.error("\naddLibrarysV3() 注入函式庫失敗", error);
}
};
const addLibrarysV5 = async () => {
try {
const jsdelivrLibrarys = [
"https://cdn.jsdelivr.net/npm/[email protected]/dist/jszip.min.js",
"https://cdn.jsdelivr.net/npm/[email protected]/dist/html2canvas.min.js",
"https://cdn.jsdelivr.net/npm/[email protected]/dist/jquery.min.js",
"https://cdn.jsdelivr.net/npm/@fancyapps/[email protected]/dist/fancybox/fancybox.umd.js",
"https://cdn.jsdelivr.net/npm/@fancyapps/[email protected]/dist/fancybox/fancybox.css"
];
const bootcdnLibrarys = [
"https://cdn.bootcdn.net/ajax/libs/jszip/3.9.1/jszip.min.js",
"https://cdn.bootcdn.net/ajax/libs/html2canvas/1.4.1/html2canvas.min.js",
"https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.min.js",
"https://cdn.bootcdn.net/ajax/libs/fancyapps-ui/5.0.22/fancybox/fancybox.umd.js",
"https://cdn.bootcdn.net/ajax/libs/fancyapps-ui/5.0.22/fancybox/fancybox.css"
];
let librarysArr;
try {
const check = await fetch(jsdelivrLibrarys[0]).then(res => res.status);
check == 200 ? librarysArr = jsdelivrLibrarys : librarysArr = bootcdnLibrarys;
} catch (error) {
console.error("\ncdn.jsdelivr.netV5 函式庫取得失敗", error);
librarysArr = bootcdnLibrarys;
}
for (let i in librarysArr) {
if (/\.js$/.test(librarysArr[i])) {
const script = document.createElement("script");
const code = await fetch(librarysArr[i]).then(res => res.text());
script.type = "text/javascript";
script.innerHTML = code;
document.body.appendChild(script);
} else if (/\.css$/.test(librarysArr[i])) {
const css = await fetch(librarysArr[i]).then(res => res.text());
fun.css(css);
}
}
} catch (error) {
console.error("\naddLibrarysV5() 注入函式庫失敗", error);
}
};
let FancyboxOptions;
let slideIndex = null;
if (hasTouchEvents()) {
FancyboxOptions = {
idle: false,
Images: {
Panzoom: {
maxScale: 2
}
},
Thumbs: {
showOnStart: false
},
Toolbar: {
display: {
left: ["infobar"],
middle: ["flipX", "flipY"],
right: [ /*"downloa", */ "iterateZoom", "slideshow", "thumbs", "close"]
}
},
on: {
done: (fancybox, slide) => {
if (fancybox.isCurrentSlide(slide)) {
slideIndex = slide.index;
fun.scrollEvent(slideIndex);
} else {
fun.scrollEvent(fancybox.getSlide().index);
}
},
close: (fancybox, slide) => {
slideIndex = fancybox.getSlide().index;
fun.scrollEvent(slideIndex);
}
}
};
} else {
FancyboxOptions = {
idle: false,
wheel: "slide",
Images: {
Panzoom: {
maxScale: 2
}
},
Thumbs: {
showOnStart: false
},
Toolbar: {
display: {
left: ["infobar"],
middle: ["iterateZoom", "toggle1to1", "rotateCCW", "rotateCW", "flipX", "flipY", "fitX", "fitY", "reset"],
right: [ /*"downloa", */ "slideshow", "fullscreen", "thumbs", "close"]
}
},
on: {
done: (fancybox, slide) => {
if (fancybox.isCurrentSlide(slide)) {
slideIndex = slide.index;
fun.scrollEvent(slideIndex);
} else {
fun.scrollEvent(fancybox.getSlide().index);
}
},
close: (fancybox, slide) => {
slideIndex = fancybox.getSlide().index;
fun.scrollEvent(slideIndex);
}
}
};
}
const fancyboxBlackList = () => siteData.fancybox && siteData.fancybox.blacklist === 1 ? true : false;
switch (language) {
case "zh-TW":
displayLanguage = {
str_01: "獲取圖片元素中...",
str_02: "獲取圖片中 ",
str_03: "獲取圖片逾時",
str_04: "等待關鍵元素中...",
str_05: "獲取資料中...",
str_06: "獲取資料中 ",
str_07: "確認登錄狀態中...",
str_08: "獲取預覽圖中...",
str_09: "獲取最後一張圖...",
str_10: "是否複製鏈接至剪貼簿?",
str_11: "已複製鏈接至剪貼簿",
str_12: "只有複製鏈接功能",
str_13: "請輸入圖片抓取最大次數",
str_14: "獲取下一頁中...",
str_15: "獲取下一頁結束",
str_16: "獲取元素中...",
str_17: "獲取元素中 ",
str_18: "已聚集所有圖片",
str_19: "用來定位插入的元素不存在",
str_20: "沒有能插入的圖片",
str_21: "延遲",
str_22: "毫秒",
str_23: "第",
str_24: "張下載",
str_25: "完成",
str_26: "錯誤",
str_27: "下載失敗了",
str_28: "張",
str_29: "\n是否只保存目前下載成功的圖片?\n只要圖片不是100%掛掉,可以F5重新載入後重新下載試試看。",
str_30: "圖片extension錯誤",
str_31: "壓縮進度: ",
str_32: "自動下載倒數",
str_33: "秒",
str_34: "nextJS前往下一頁",
str_35: "已點擊下一頁",
str_36: "自動下載完畢",
str_37: "沒有下一頁元素",
str_38: "返回上一頁",
str_39: "已點擊上一頁",
str_40: "沒有上一頁元素",
str_41: "已取消",
str_42: "字數小於3已取消",
str_43: "下載失敗數據為空...",
str_44: "沒有任何圖片元素...",
str_45: "網址已複製",
str_46: "即將進行捲動...",
str_47: "左鍵:進行下載打包壓縮\n中鍵:儲存網址URLs.txt文件\n右鍵:複製圖片網址和標題或聚集所有圖片",
str_48: "下載&壓縮中請稍後再操作!",
str_49: "獲取圖片中請稍後再操作!",
str_50: "請輸入自訂CSS/Xpath選擇器:\n範例:img#TheImg OR //img[@id='TheImg']\n也能使用JS代碼自己生成的IMG元素陣列\n範例:js;return [...document.images];",
str_51: "請輸入自訂壓縮檔資料夾名稱",
str_52: "聚圖數量",
str_53: "圖片繪製中...",
str_54: "403,未登錄網站?",
str_55: "下載載入中...",
str_56: "確認圖片狀態中...",
str_57: "自動翻頁載入中...",
str_58: "已到達最後一頁",
str_59: "沒有任何主體元素",
str_60: "圖片縮放",
str_61: "取消縮放",
str_62: "前往第一張圖",
str_63: "左鍵:前往最後一張圖\n右鍵:儲存網址URLs.txt文件",
str_64: "即將開始自動下載!!!",
str_65: "已停止自動下載!!!",
str_66: "💬 反饋",
str_67: "設定",
str_68: "當前網站 Full Picture Load 選項",
str_69: "左下圖示按鈕 ( 0:關、1:開 ) PS:優先級別低於內置規則",
str_70: "最大下載線程數 ( 1 ~ 32 ) PS:優先級別低於內置規則",
str_71: "壓縮打包 ( 1:壓縮、0:不壓縮 )",
str_72: "壓縮檔副檔名 ( zip 或 cbz )",
str_73: "自動下載 (1:開、0:關) ",
str_74: "快捷鍵 [ ctrl + . ] 開始或取消",
str_75: "自動下載倒數秒數 PS:優先級別低於內置規則",
str_76: "當前漫畫站規則 ( 0:維持關閉、1:啟用 )",
str_77: "移動裝置雙擊前往下一頁 ( 1:開、0:關 )",
str_78: "Fancybox燈箱功能 ( 1:開 、0:關 )",
str_79: "圖片縮放比例 ( 0 ~ 10 ) 10 = 100%、5 = 50%、0 = auto",
str_80: "圖片並排模式顯示數量 ( 2 ~ 6 ) comic類固定為 ( 2 )",
str_81: "PS:comic類並排後為右至左的漫讀模式 hcomic類也設定為2將套用",
str_82: "取消 (Esc)",
str_83: "重置設定",
str_84: "保存設定",
str_85: "腳本選項(*)",
str_86: "切換模式(5)",
str_87: "比例縮放(-)",
str_88: "取消縮放(+)",
str_89: "暫停自動翻頁",
str_90: "啟用自動翻頁",
str_91: "初始化設定",
str_92: "原始模式",
str_93: "並排模式",
str_94: "返回開頭了",
str_95: "前往下一集",
str_96: "已是最後下一集",
str_97: "共",
str_98: "頁獲取出錯,建議反饋",
str_99: "重試第",
str_100: "次",
str_101: "網址.txt已儲存"
};
break;
case "zh-CN":
displayLanguage = {
str_01: "获取图片元素中...",
str_02: "获取图片中 ",
str_03: "获取图片逾时",
str_04: "等待关键元素中...",
str_05: "获取数据中...",
str_06: "获取数据中 ",
str_07: "确认登录状态中...",
str_08: "获取预览图中...",
str_09: "获取最后一张图...",
str_10: "是否拷贝链接至剪贴板?",
str_11: "已拷贝链接至剪贴板",
str_12: "只有拷贝链接功能",
str_13: "请输入图片抓取最大次数",
str_14: "获取下一页中...",
str_15: "获取下一页结束",
str_16: "获取元素中...",
str_17: "获取元素中 ",
str_18: "已聚集所有图片",
str_19: "用来定位插入的元素不存在",
str_20: "没有能插入的图片",
str_21: "延迟",
str_22: "毫秒",
str_23: "第",
str_24: "张下载",
str_25: "完成",
str_26: "错误",
str_27: "下载失败了",
str_28: "张",
str_29: "\n是否只保存目前下载成功的图片?\n只要图片不是100%挂掉,可以F5重新加载后重新下载试试看。",
str_30: "图片extension错误",
str_31: "压缩进度: ",
str_32: "自动下载倒数",
str_33: "秒",
str_34: "nextJS前往下一页",
str_35: "已点击下一页",
str_36: "自动下载完毕",
str_37: "没有下一页元素",
str_38: "返回上一页",
str_39: "已点击上一页",
str_40: "没有上一页元素",
str_41: "已取消",
str_42: "字数小于3已取消",
str_43: "下载失败数据为空...",
str_44: "没有任何图片元素...",
str_45: "网址已拷贝",
str_46: "即将进行卷动...",
str_47: "左键:进行下载打包压缩\n中键:存储网址URLs.txt文档\n右键:拷贝图片网址和标题或聚集所有图片",
str_48: "下载&压缩中请稍后再操作!",
str_49: "获取图片中请稍后再操作!",
str_50: "请输入自定义CSS/Xpath选择器:\n范例:img#TheImg OR //img[@id='TheImg']\n也能使用JS代码自己生成的IMG元素数组\n范例:js;return [...document.images];",
str_51: "请输入自定义压缩档文件夹名称",
str_52: "聚图数量",
str_53: "图片绘制中...",
str_54: "403,未登录网站?",
str_55: "下载加载中...",
str_56: "确认图片状态中...",
str_57: "自动翻页加载中...",
str_58: "已到达最后一页",
str_59: "没有任何主体元素",
str_60: "图片缩放",
str_61: "取消缩放",
str_62: "前往第一张图",
str_63: "左键:前往最后一张图\n右键:存储网址URLs.txt文档",
str_64: "即将开始自动下载!!!",
str_65: "已停止自动下载!!!",
str_66: "💬 反馈",
str_67: "设置",
str_68: "当前网站 Full Picture Load 选项",
str_69: "左下图标按钮 ( 0:关、1:开 ) PS:优先级别低于内置规则",
str_70: "最大下载线程数 ( 1 ~ 32 ) PS:优先级别低于内置规则",
str_71: "压缩打包 ( 1:压缩、0:不压缩 )",
str_72: "压缩档文件扩展名 ( zip 或 cbz )",
str_73: "自动下载 (1:开、0:关) ",
str_74: "快捷键 [ ctrl + . ] 开始或取消",
str_75: "自动下载倒数秒数 PS:优先级别低于内置规则",
str_76: "当前漫画站规则 ( 0:维持关闭、1:启用 )",
str_77: "移动设备双击前往下一页 ( 1:开、0:关 )",
str_78: "Fancybox灯箱功能 ( 1:开 、0:关 )",
str_79: "图片缩放比例 ( 0 ~ 10 ) 10 = 100%、5 = 50%、0 = auto",
str_80: "图片并排模式显示数量 ( 2 ~ 6 ) comic类固定为 ( 2 )",
str_81: "PS:comic类并排后为右至左的漫读模式 hcomic类也设置为2将套用",
str_82: "取消 (Esc)",
str_83: "重置设置",
str_84: "保存设置",
str_85: "脚本选项(*)",
str_86: "切换模式(5)",
str_87: "比例缩放(-)",
str_88: "取消缩放(+)",
str_89: "暂停自动翻页",
str_90: "启用自动翻页",
str_91: "初始化设置",
str_92: "原始模式",
str_93: "并排模式",
str_94: "返回开头了",
str_95: "前往下一集",
str_96: "已是最后下一集",
str_97: "共",
str_98: "页获取出错,建议反馈",
str_99: "重试第",
str_100: "次",
str_101: "网址.txt已存储"
};
break;
default:
displayLanguage = {
str_01: "Get Element...",
str_02: "Get Element ",
str_03: "Get timed out",
str_04: "Wait Element...",
str_05: "Get Data...",
str_06: "Get Data ",
str_07: "Confirm login status",
str_08: "Get preview thumbnail",
str_09: "Get Element...",
str_10: "whether to copy link to clipboard?",
str_11: "Copied",
str_12: "Only link can be copied",
str_13: "Please enter the number of pictures",
str_14: "Get next page...",
str_15: "Get next page end",
str_16: "Get Element...",
str_17: "Get Element ",
str_18: "All pictures gathered",
str_19: "element does not exist",
str_20: "No pictures",
str_21: "Delay",
str_22: "ms",
str_23: "No. ",
str_24: "P download ",
str_25: "completed",
str_26: "error",
str_27: "download failed",
str_28: "P",
str_29: "\nDo you want to save only the pictures that have been successfully downloaded so far?\nAs long as the image is not 100% dead, you can reload it with F5 and try downloading it again.",
str_30: "Image extension error",
str_31: "Compression progress: ",
str_32: "Countdown ",
str_33: " sec",
str_34: "JS Go to next page",
str_35: "Next page clicked",
str_36: "Automatic download completed",
str_37: "No next page element",
str_38: "return to previous page",
str_39: "Previous page clicked",
str_40: "No previous page element",
str_41: "Cancelled",
str_42: "Cancelled",
str_43: "Download failed data is empty",
str_44: "No picture element",
str_45: "URLs copied ",
str_46: "About to scroll...",
str_47: "left click:Download and compress\nmiddle click:Save URLs.txt\nleft click:Copy image URL and title or aggregate images",
str_48: "Downloading & compressing, please try again later!",
str_49: "Get Pictureing Please try again later!",
str_50: "Please enter selector:\nexample:img#TheImg OR //img[@id='TheImg']",
str_51: "Please enter a custom zip file folder name",
str_52: "Number of pictures",
str_53: "Picture drawing...",
str_54: "403,Not logged in to website?",
str_55: "Download Loading...",
str_56: "Check picture statusing...",
str_57: "AutoPager Loading...",
str_58: "Reached the last page",
str_59: "no main element",
str_60: "Image zoom",
str_61: "Cancel zoom",
str_62: "Go to first image",
str_63: "left click:Go to last image\nleft click:Save URLs.txt",
str_64: "Start automatic download!!!",
str_65: "Stop automatic download!!!",
str_66: "💬 Feedback",
str_67: "settings",
str_68: "Current website Full Picture Load Options",
str_69: "Lower left icon button ( 0:hide、1:show )",
str_70: "Max download thread ( 1 ~ 32 )",
str_71: "Compressed packaging ( 1:yes、0:no)",
str_72: "Compressed file extension ( zip or cbz )",
str_73: "Automatic download (1:open、0:off) ",
str_74: "shortcut key [ ctrl + . ] Start or cancel",
str_75: "Automatic download countdown seconds",
str_76: "Current Comic Site Rules ( 0:remain closed、1:open )",
str_77: "Double click on mobile device to go to next page ( 1:open、0:off )",
str_78: "Fancybox plugin ( 1:open、0:off )",
str_79: "Image zoom ratio ( 0 ~ 10 ) 10 = 100%、0 = auto",
str_80: "Number of pictures side by side ( 2 ~ 6 )",
str_81: "PS:Comic Category fixed to 2",
str_82: "Cancel (Esc)",
str_83: "Reset",
str_84: "Save",
str_85: "Settings(*)",
str_86: "Toggle(5)",
str_87: "Zoom(-)",
str_88: "Cancel(+)",
str_89: "Pause automatic page turning",
str_90: "Enable automatic page turning",
str_91: "Initialization settings",
str_92: "original mode",
str_93: "side-by-side mode",
str_94: "Back to the beginning",
str_95: "Go to next episode",
str_96: "It’s the last episode",
str_97: "have",
str_98: "page fetch error please feedback",
str_99: "Retry No.",
str_100: "bout",
str_101: "URLs.txt saved"
};
break;
}
//console.log("\ndisplayLanguage\n", displayLanguage);
let _GM_xmlhttpRequest, _GM_openInTab;
if (typeof GM_xmlhttpRequest != "undefined") {
_GM_xmlhttpRequest = GM_xmlhttpRequest;
} else if (typeof GM != "undefined" && typeof GM.xmlHttpRequest != "undefined") {
_GM_xmlhttpRequest = GM.xmlHttpRequest;
}
if (typeof GM_openInTab != "undefined") {
_GM_openInTab = GM_openInTab;
} else if (typeof GM != "undefined" && typeof GM.openInTab != "undefined") {
_GM_openInTab = GM.openInTab;
} else {
_GM_openInTab = fun.openInTab;
}
const fun = {
getModeUrl: (mode, i) => {
if (mode === 1) {
//【.html ==> .html?page=2】第一頁 ==> 第二頁
//【 ==> ?page=2】第一頁 ==> 第二頁
return siteUrl.replace(/\?page=\d+$/, "") + "?page=" + i;
} else if (mode === 2) {
//【.html ==> /2.html】 第一頁 ==> 第二頁
return siteUrl.slice(0, -5) + "/" + i + ".html";
} else if (mode === 3) {
//【.html ==> _1.html】 第一頁 ==> 第二頁
//return siteUrl.replace(/(_\d+)?\.html$/, "") + "_" + (i - 1) + ".html";
return siteUrl.replace(/\.html$/, "") + "_" + (i - 1) + ".html";
} else if (mode === 4) {
//【/ ==> /2/】 第一頁 ==> 第二頁
return siteUrl.slice(0, -1) + "/" + i + "/";
} else if (mode === "4") {
//【 ==> /2】 第一頁 ==> 第二頁
return siteUrl + "/" + i;
} else if (mode === 5) {
//【.html ==> -2.html】 第一頁 ==> 第二頁
return siteUrl.replace(/\.html$/, "") + "-" + i + ".html";
} else if (mode === "5") {
//【-1.html ==> -2.html】 第一頁 ==> 第二頁
return siteUrl.replace(/(-\d+)?\.html$/, "") + "-" + i + ".html";
} else if (mode === 6) {
//【?p=1 ==> ?p=2】 第一頁 ==> 第二頁
return siteUrl.replace(/\?p=\d+$/, "") + "?p=" + i;
} else if (mode === 7) {
//【/1 ==> /2】 第一頁 ==> 第二頁
//【.html ==> .html/2】 第一頁 ==> 第二頁
return siteUrl.replace(/\/\d+$/, "") + "/" + i;
} else if (mode === 8) {
//【 ==> &page=1】 第一頁 ==> 第二頁
return siteUrl.replace(/&page=\d+$/, "") + "&page=" + (i - 1);
} else if (mode === "8") {
//【 ==> &page=2】 第一頁 ==> 第二頁
return siteUrl.replace(/&page=\d+$/, "") + "&page=" + i;
} else if (mode === 9) {
//【.html ==> _2.html】 第一頁 ==> 第二頁
return siteUrl.replace(/(_\d+)?\.html$/, "") + "_" + i + ".html";
} else if (mode === 10) {
//【.html ==> .html/2】 第一頁 ==> 第二頁
return siteUrl.replace(/\.html(\/\d+)?$/, "") + ".html/" + i;
} else if (mode === 11) {
//【/ ==> /2.html】 第一頁 ==> 第二頁
//【/1.html ==> /2.html】 第一頁 ==> 第二頁
return siteUrl.replace(/\/(\d+\.html)?$/, "") + "/" + i + ".html";
} else if (mode === 12) {
//【/ ==> /2.htm】 第一頁 ==> 第二頁
//【/1.htm ==> /2.htm】 第一頁 ==> 第二頁
return siteUrl.replace(/\/(\d+\.htm)?$/, "") + "/" + i + ".htm";
} else if (mode === 13) {
//【-1-* ==> -2-*】 第一頁 ==> 第二頁
return siteUrl.replace(/-\d+-[^-]+$/, "") + "-" + i;
} else if (mode === 14) {
//【/1/ ==> /2/】 第一頁 ==> 第二頁
return siteUrl.replace(/\/\d+\/$/, "") + "/" + i + "/";
} else if (mode === 15) {
//【/index.html ==> /index_2.html】 第一頁 ==> 第二頁
return siteUrl.replace(/\/(index(_\d+)?\.html)?$/, "") + "/index_" + i + ".html";
} else if (mode === 16) {
//【 ==> /2#list】 第一頁 ==> 第二頁
return siteUrl.replace(/\/(index(_\d+)?\.html)?$/, "") + "/" + i + "#list";
} else if (mode === 17) {
//【.htm ==> _2.htm】 第一頁 ==> 第二頁
return siteUrl.replace(/#$/, "").replace(/(_\d+)?\.htm$/, "") + "_" + i + ".htm";
} else if (mode === 18) {
//【/ ==> /page/2/】 第一頁 ==> 第二頁
return siteUrl.replace(/\/(page\/\d+\/)?$/, "") + "/page/" + i + "/";
} else if (mode === 19) {
//【-1 ==> -2】 第一頁 ==> 第二頁
return siteUrl.replace(/-\d+$/, "") + "-" + i;
} else if (mode === 20) {
//【 ==> -p-2】 第一頁 ==> 第二頁
return siteUrl.replace(/-p-\d+$/, "") + "-p-" + i;
}
},
retryUrl: async (url, res, fn) => {
debug(`\n${fn}連線錯誤碼:${res.status}\n`, url);
let retryNum = 1;
let obj = {
fn: fn,
url: url,
status: res.status
};
debug(`\n${fn}連線錯誤碼:${res.status}重試第${retryNum}次\n`, url);
let retry = await new Promise(async resolve => {
for (let check = 1; check <= 10; check++) {
let checkRes = await fetch(url);
if (checkRes.status == 304 || checkRes.status == 200) {
let buffer = await checkRes.arrayBuffer();
resolve({
ok: true,
buffer: buffer
});
break;
} else {
debug(`\n${fn}連線錯誤碼:${checkRes.status}重試第${retryNum += 1}次\n`, url);
await fun.delay(3000, 0);
}
if (check >= 10) {
resolve({
ok: false
});
}
}
});
if (retry.ok) {
return retry.buffer;
} else {
fetchErrorArray.push(obj);
return null;
}
},
fetchErrorMsg: () => {
if (fetchErrorArray.length > 0) {
debug(`\nfetchErrorArray\n`, fetchErrorArray);
setTimeout(() => {
fun.show(`${displayLanguage.str_97}${fetchErrorArray.length}${displayLanguage.str_98}`, 10000);
}, 1500);
}
},
getImg: async (img, maxPage = 1, mode = 1, rText = [null, null], time = 50) => {
if (fun.ge(".FullPictureLoadImage")) return [...fun.gae(".FullPictureLoadImage:not(.small)")];
fetching = true;
fun.show(displayLanguage.str_01, 0);
let imgsArray = [];
let fetchNum = 0;
const html = url => fetch(url).then(async res => {
debug(`\nfun.getImg() URL`, url);
if (res.status >= 400) {
let resData = await fun.retryUrl(url, res, "fun.getImg()");
if (resData !== null) return resData;
}
return res.arrayBuffer();
}).then(buffer => {
const decoder = new TextDecoder(document.characterSet || document.charset || document.inputEncoding);
const htmlText = decoder.decode(buffer);
fun.show(`${displayLanguage.str_02}${fetchNum+=1}/${maxPage}`, 0);
return htmlText;
}).catch(error => {
console.error(`\nfun.getImg() > fetch()出錯:\n${decodeURI(url)}`, error);
});
const resArr = [];
resArr.push(html(siteUrl));
if (parseInt(maxPage, 10) > 1) {
for (let i = 2; i <= parseInt(maxPage, 10); i++) {
resArr.push(html(fun.getModeUrl(mode, i)));
await fun.delay(time, 0);
}
}
await Promise.all(resArr).then(htmls => {
fetching = false;
fun.hide();
for (let i = 0; i < htmls.length; i++) {
let doc = fun.doc(htmls[i]);
let imgs = [...fun.gae(img, doc)];
debug(`\nfun.getImg() DOM${i}`, doc);
for (let p = 0; p < imgs.length; p++) {
let check = fun.checkImgSrc(imgs[p], rText);
check.ok ? imgsArray.push(decodeURI(check.src)) : debug(`\nfun.getImg() imgs[${p}]錯誤`, imgs[p]);
}
}
});
debug("\nfun.getImg() 聚集的所有圖片網址", imgsArray);
debug("\nfun.getImg() 去重複後的圖片網址", [...new Set(imgsArray)]);
fun.fetchErrorMsg();
return imgsArray;
},
getImgO: async (img, maxPage = 1, mode = 1, rText = [null, null], time = 200, replaceElement = null, msg = 1) => {
if (fun.ge(".FullPictureLoadImage")) return [...fun.gae(".FullPictureLoadImage:not(.small)")];
fetching = true;
if (msg == 1) fun.show(displayLanguage.str_01, 0);
let imgsArray = [];
let fetchNum = 0;
const html = async (url, id = 1) => {
await fun.delay(time, 0);
return fetch(url).then(async res => {
debug(`\nfun.getImgO() URL`, url);
if (res.status >= 400) {
let resData = await fun.retryUrl(url, res, "fun.getImgO()");
if (resData !== null) return resData;
}
return res.arrayBuffer();
}).then(buffer => {
const decoder = new TextDecoder(document.characterSet || document.charset || document.inputEncoding);
const htmlText = decoder.decode(buffer);
let doc = fun.doc(htmlText);
[...fun.gae(img, doc)].forEach(ele => {
let check = fun.checkImgSrc(ele);
if (ele.tagName == "IMG" && check.ok) {
ele.src = check.src;
}
if (id == 1) {
let targetEle = [...fun.gae(img)].pop();
targetEle.parentNode.insertBefore(ele.cloneNode(true), targetEle.nextSibling);
}
});
if (typeof replaceElement == "string") {
[...fun.gae(".invisible", doc)].forEach(ele => {
ele.classList.remove("invisible");
});
let currentPageEles = [...fun.gae(replaceElement)];
let nextPageEles = [...fun.gae(replaceElement, doc)];
if (currentPageEles.length === nextPageEles.length) {
for (let i in currentPageEles) {
currentPageEles[i].outerHTML = nextPageEles[i].outerHTML;
}
}
}
if (msg == 1) fun.show(`${displayLanguage.str_02}${fetchNum+=1}/${maxPage}`, 0);
return htmlText;
}).catch(error => {
console.error(`\nfun.getImgO() > fetch()出錯:\n${decodeURI(url)}`, error);
});
};
const resArr = [];
resArr.push(html(siteUrl, 0));
if (parseInt(maxPage, 10) > 1) {
for (let i = 2; i <= parseInt(maxPage, 10); i++) {
resArr.push(await html(fun.getModeUrl(mode, i)));
}
}
await Promise.all(resArr).then(htmls => {
fetching = false;
fun.hide();
for (let i = 0; i < htmls.length; i++) {
let doc = fun.doc(htmls[i]);
let imgs = [...fun.gae(img, doc)];
debug(`\nfun.getImgO() DOM${i}`, doc);
for (let p = 0; p < imgs.length; p++) {
let check = fun.checkImgSrc(imgs[p], rText);
check.ok ? imgsArray.push(decodeURI(check.src)) : debug(`\nfun.getImgO() imgs[${p}]錯誤`, imgs[p]);
}
}
});
debug("\nfun.getImgO() 聚集的所有IMG", imgsArray);
fun.fetchErrorMsg();
return imgsArray;
},
getImgIframe: async (img, maxPage = 1, mode = 1, rText = [null, null], rEle = null, time = 500, showMsg = 1) => {
if (fun.ge(".FullPictureLoadImage")) return [...fun.gae(".FullPictureLoadImage:not(.small)")];
fetching = true;
if (showMsg == 1) fun.show(displayLanguage.str_01, 0);
let imgsArray = [];
let fetchNum = 1;
await fun.waitEle(img);
[...fun.gae(img)].forEach(ele => {
imgsArray.push(ele);
});
const html = async (url, index = 0) => {
let targetEle = [...fun.gae(img)].pop();
let load = document.createElement("p");
load.className = "FullPictureLoadLoading";
load.innerText = "Loading...";
targetEle.parentNode.insertBefore(load, targetEle.nextSibling);
await fun.delay(time, 0);
let doc;
for (let i = 1; i < 20; i++) {
doc = await fun.iframeSrcDoc(url, img);
if (doc !== null) {
break;
} else {
fun.remove("#FullPictureLoadIframe");
}
}
if (doc) {
debug("iframeDoc" + index, doc);
[...fun.gae(img, doc)].forEach(ele => {
imgsArray.push(ele);
targetEle.parentNode.insertBefore(ele.cloneNode(true), targetEle.nextSibling);
});
if (rEle) {
let ces = [...fun.gae(rEle)];
let nes = [...fun.gae(rEle, doc)];
if (ces.length === nes.length) {
for (let i in ces) {
ces[i].outerHTML = nes[i].outerHTML;
}
}
}
load.remove();
if (showMsg == 1) fun.show(`${displayLanguage.str_02}${fetchNum+=1}/${maxPage}`, 0);
} else {
fetchNum += 1;
load.remove();
let obj = {
fn: "fun.getImgIframe()",
url: url
};
fetchErrorArray.push(obj);
fun.show(displayLanguage.str_03, 3000);
return;
}
}
if (parseInt(maxPage, 10) > 1) {
for (let i = 2; i <= parseInt(maxPage, 10); i++) {
await html(fun.getModeUrl(mode, i), i);
}
}
debug("\nfun.getImgiframe() 聚集的所有IMG", imgsArray);
fetching = false;
fun.hide();
fun.fetchErrorMsg();
return imgsArray;
},
getImgA: async (img, link, mode = 0, rText = [null, null], showMsg = 1) => { //從指定的所有鏈接抓圖片
if (fun.ge(".FullPictureLoadImage")) return [...fun.gae(".FullPictureLoadImage:not(.small)")];
fetching = true;
if (showMsg == 1) fun.show(displayLanguage.str_01, 0);
let links, linksNum;
if (typeof link == "function") {
links = await link();
linksNum = links.length;
} else if (typeof link == "object") {
links = link;
linksNum = links.length;
} else if (typeof link == "string") {
links = [...fun.gae(link)];
linksNum = parseInt(links.length, 10) + 1;
} else {
console.error("\nfun.getImgA() link參數錯誤");
return;
}
debug("\nfun.getImgA() links", links);
let imgsArray = [];
let fetchNum = 0;
const html = url => fetch(url).then(async res => {
debug(`\nfun.getImgA() URL`, url);
if (res.status >= 400) {
let resData = await fun.retryUrl(url, res, "fun.getImgA()");
if (resData !== null) return resData;
}
return res.arrayBuffer();
}).then(buffer => {
if (showMsg == 1) fun.show(`${displayLanguage.str_02}${fetchNum+=1}/${linksNum}`, 0);
const decoder = new TextDecoder(document.characterSet || document.charset || document.inputEncoding);
const htmlText = decoder.decode(buffer);
return htmlText;
}).catch(error => {
console.error(`\nfun.getImgA fetch()出錯:\n${decodeURI(url)}`, error);
});
const resArr = [];
if (typeof link != "object") resArr.push(html(siteUrl));
for (let i = 0; i < links.length; i++) {
if (mode == 0) {
if (links[i].tagName == "A") {
resArr.push(html(links[i].href));
} else if (/^http/.test(links[i])) {
resArr.push(html(links[i]));
}
} else if (mode >= 100) {
if (links[i].tagName == "A") {
await fun.delay(mode, 0);
resArr.push(html(links[i].href));
} else if (/^http/.test(links[i])) {
await fun.delay(mode, 0);
resArr.push(html(links[i]));
}
} else if (mode == 1) {
let res;
if (links[i].tagName == "A") {
res = await html(links[i].href);
} else if (/^http/.test(links[i])) {
res = await html(links[i]);
}
resArr.push(res);
let doc = fun.doc(res);
debug(`\nfun.getImgA()單線程模式 DOM\n${links[i].href}`, doc);
let imgs = [...fun.gae(img, doc)];
let imgHtml = "";
for (let p = 0; p < imgs.length; p++) {
let imgSrc;
let check = fun.checkImgSrc(imgs[p], rText);
if (check.ok) {
imgSrc = check.src;
/*
let blob = await GM_XHR_GetData(imgSrc);
let objectURL = await URL.createObjectURL(blob.blob);
imgSrc = objectURL;
*/
debug("\nfun.getImgA() 單線程模式imgSrc", imgSrc);
} else {
console.error("\nfun.getImgA() 單線程模式出錯", imgs[p]);
continue;
}
imgHtml += `<img class="FullPictureLoadImage" src="${imgSrc}">`;
}
links[i].outerHTML = imgHtml;
}
}
await Promise.all(resArr).then(htmls => {
fetching = false;
fun.hide();
for (let i = 0; i < htmls.length; i++) {
let doc = fun.doc(htmls[i]);
if (mode != 1) debug(`\nfun.getImgA() DOM${i}`, doc);
let imgs = [...fun.gae(img, doc)];
for (let p = 0; p < imgs.length; p++) {
let check = fun.checkImgSrc(imgs[p], rText);
check.ok ? imgsArray.push(check.src) : console.error("\nfun.getImgA() PromiseAll出錯", imgs[p]);
}
}
});
debug("\nfun.getImgA 聚集的所有IMG", imgsArray);
fun.fetchErrorMsg();
return imgsArray;
},
checkImgSrc: (ele, rText = [null, null]) => {
let imgSrc;
let check = fun.checkDataset(ele);
if (ele.tagName == "IMG" && check.ok || ele.tagName == "DIV" && check.ok || ele.tagName == "A" && check.ok) {
imgSrc = check.src;
if (/^\/\//.test(imgSrc)) imgSrc = location.protocol + imgSrc;
if (/^\/\w+/.test(imgSrc)) imgSrc = location.origin + imgSrc;
if (!/^(http|blob)/.test(imgSrc) && /^\w+/.test(imgSrc)) imgSrc = location.origin + "/" + imgSrc;
if (rText[0]) imgSrc = imgSrc.replace(rText[0], rText[1]);
return {
ok: true,
src: imgSrc
};
} else if (ele.tagName == "IMG" || ele.tagName == "AMP-IMG") {
if (ele.tagName == "IMG") imgSrc = ele.src;
if (ele.tagName == "AMP-IMG") imgSrc = ele.getAttribute('src');
if (/^\/\//.test(imgSrc)) imgSrc = location.protocol + imgSrc;
if (rText[0]) imgSrc = imgSrc.replace(rText[0], rText[1]);
return {
ok: true,
src: imgSrc
};
} else if (ele.tagName == "A") {
imgSrc = ele.href;
if (rText[0]) imgSrc = imgSrc.replace(rText[0], rText[1]);
return {
ok: true,
src: imgSrc
};
} else if (/^(http|blob|\/\/)/.test(ele)) {
imgSrc = ele;
if (/^\/\//.test(ele)) imgSrc = location.protocol + imgSrc;
if (rText[0]) imgSrc = imgSrc.replace(rText[0], rText[1]);
return {
ok: true,
src: imgSrc
};
}
return {
ok: false
};
},
checkDataset: ele => {
if (ele.tagName == "IMG" || ele.tagName == "DIV" || ele.tagName == "A") {
const setArr = ["data-src", "data-original", "data-url", "data-thumb", "data-echo", "data-ecp", "data-lazyload-src", "data-lazy-src", "data-lazy", "lazysrc", "data-lazyload", "file", "zoomfile", "data-lbwps-srcsmall", "original", "mydatasrc", "ess-data", "data-cfsrc", "data-pin-media", "data-mfp-src"];
for (let i = 0; i < setArr.length; i++) {
let imgSrc = ele.getAttribute(setArr[i]);
if (imgSrc) {
return {
ok: true,
src: imgSrc.trim()
};
}
}
}
return {
ok: false
};
},
getNP: async (pageEle, nextLinkEle, lastEle = null, replaceElement = null, time = 0, dataset = null, mag = 1) => {
//翻頁模式聚集所有圖片或是預覽縮圖然後fun.getImgA()
//用在規則init,fun.getNP(picsEle, nextLinkEle, lastEle, replaceElement, time);
if (fun.ge(".FullPictureLoadImage")) return;
fetching = true;
let nextlink = null;
if (mag == 1) fun.show(displayLanguage.str_14, 0);
const getNextLink = async (url = "", doc = document) => {
if (typeof nextLinkEle === "function") {
nextlink = await nextLinkEle();
} else if (typeof nextLinkEle === "string") {
let ele = fun.ge(nextLinkEle, doc);
if (ele) {
if (ele.dataset.url) {
if (!/^http/.test(ele.dataset.url)) return null;
nextlink = ele.dataset.url;
} else if (ele.tagName === "A") {
nextlink = ele.href;
let nh = ele.host;
let lh = location.host;
if (nh != lh) nextlink = nextlink.replace(nh, lh);
} else {
try {
ele.getAttribute("href") ? nextlink = ele.getAttribute("href") : nextlink = ele.getAttribute("_href");
} catch (e) {
nextlink = null;
}
}
} else {
nextlink = null;
}
} else {
nextlink = null;
}
if (typeof url === "string" && typeof nextlink === "string" && (url === nextlink)) {
if (mag == 1) fun.show(displayLanguage.str_15);
nextlink = null;
}
return nextlink;
};
const getNextPageEles = async url => {
await fetch(url).then(async res => {
if (res.status >= 400) {
let resData = await fun.retryUrl(url, res, "fun.getNP()");
if (resData !== null) return resData;
}
return res.arrayBuffer();
}).then(buffer => {
const decoder = new TextDecoder(document.characterSet || document.charset || document.inputEncoding);
const htmlText = decoder.decode(buffer);
return htmlText;
}).then(async htmlText => {
let doc = fun.doc(htmlText);
if (dataset) {
[...fun.gae(`img[${dataset}],a[${dataset}],div[${dataset}]`, doc)].forEach(e => {
if (e.tagName == "IMG") {
e.src = e.getAttribute(dataset);
} else if (e.tagName == "A" || e.tagName == "DIV") {
let url = e.getAttribute(dataset);
e.style.backgroundImage = `url(${url})`;
}
});
}
debug(`\nfun.getNP() > getNextPageEles() DOM\n${decodeURI(url)}`, doc);
let eles = [...fun.gae(pageEle, doc)];
let lastPage = null;
if (typeof lastEle === "string") {
lastPage = fun.ge(lastEle, doc);
} else if (typeof lastEle === "function") {
try {
lastPage = await lastEle(doc);
} catch (error) {
debug("fun.getNP() lastEle() 函式錯誤", error);
lastPage = null;
}
}
let fragment = new DocumentFragment();
eles.forEach(ele => {
fragment.appendChild(ele.cloneNode(true));
});
let targetEle = [...fun.gae(pageEle)].pop();
targetEle.parentNode.insertBefore(fragment, targetEle.nextSibling);
if (replaceElement) {
let currentPageEles = [...fun.gae(replaceElement)];
let nextPageEles = [...fun.gae(replaceElement, doc)];
if (currentPageEles.length === nextPageEles.length) {
for (let i in currentPageEles) {
//debug("paginationEle", ele);
try {
currentPageEles[i].outerHTML = nextPageEles[i].outerHTML;
} catch (error) {
console.error("\nfun.getNP() 替換元素錯誤\n", error);
}
}
}
}
if (lastPage) {
fetching = false;
if (mag == 1) fun.show(displayLanguage.str_15);
return;
}
nextlink = await getNextLink(url, doc);
if (nextlink) {
await fun.delay(time, 0);
await getNextPageEles(nextlink);
} else {
fetching = false;
if (mag == 1) fun.show(displayLanguage.str_15);
return;
}
});
};
nextlink = await getNextLink();
if (nextlink) {
await fun.delay(time, 0);
await getNextPageEles(nextlink);
} else {
fetching = false;
if (mag == 1) fun.show(displayLanguage.str_15);
return;
}
},
toggleAutoPager: () => {
if (autoPager === true) {
autoPager = false;
fun.show(displayLanguage.str_89);
[...fun.gae(".autoPagerTitle")].forEach(e => {
e.classList.add("off");
});
} else {
autoPager = true;
fun.show(displayLanguage.str_90);
[...fun.gae(".autoPagerTitle")].forEach(e => {
e.classList.remove("off");
});
}
},
autoPager: async () => {
let url = await fun.getNextLink();
if (!url) {
autoPager = false;
fun.show(displayLanguage.str_58, 3000);
return;
}
fun.addLoading();
if (siteData.autoPager.mode == 1) {
doc = await fun.iframeSrcDoc(url, (siteData.autoPager.waitEle || siteData.autoPager.ele));
} else {
try {
doc = await fun.fetchDoc(url);
} catch (e) {
doc = await fun.xhrDoc(url);
}
}
debug(`\nfun.autoPager()\n${url}\n`, doc);
if (siteData.autoPager.stop) {
let check;
try {
check = await siteData.autoPager.stop();
} catch (error) {
console.error("\nsiteData.autoPager.stop() 函式錯誤\n", error);
check = false;
}
if (check) {
autoPager = false;
fun.removeLoading();
fun.show(displayLanguage.str_58, 3000);
return;
}
}
if (siteData.autoPager.script) {
let scripts = [...fun.gae(siteData.autoPager.script, doc)];
for (let i = 0; i < scripts.length; i++) {
if (scripts[i].src) {
await fun.script(scripts[i].src, 1, 1);
} else {
let code = scripts[i].innerText;
await fun.script(code, 0, 1);
}
}
}
if (siteData.autoPager.lazySrc) {
let eles = [...fun.gae(siteData.autoPager.lazySrc, doc)];
for (let i = 0; i < eles.length; i++) {
let check = fun.checkDataset(eles[i]);
if (check.ok) {
if (eles[i].tagName === "IMG") {
eles[i].src = check.src;
} else if (eles[i].tagName === "DIV" || eles[i].tagName === "A") {
eles[i].style.backgroundImage = `url('${check.src}')`;
}
}
}
}
if (typeof siteData.autoPager.bF === "function") await siteData.autoPager.bF();
if (siteData.autoPager.re) {
let currentPageEles = [...fun.gae(siteData.autoPager.re)];
let nextPageEles = [...fun.gae(siteData.autoPager.re, doc)];
if (currentPageEles.length === nextPageEles.length) {
for (let i in currentPageEles) {
currentPageEles[i].outerHTML = nextPageEles[i].outerHTML;
}
}
}
let newEle, tE;
if (typeof siteData.autoPager.ele === "function" && siteData.autoPager.pos || typeof siteData.autoPager.ele === "string") {
if (typeof siteData.autoPager.ele === "function") newEle = await siteData.autoPager.ele();
if (typeof siteData.autoPager.ele === "string") {
let nextEle = fun.ge(siteData.autoPager.ele, doc);
if (!nextEle) {
fun.removeLoading();
fun.show(displayLanguage.str_59, 3000);
return;
}
tE = [...fun.gae(siteData.autoPager.ele)].pop();
newEle = [...fun.gae(siteData.autoPager.ele, doc)];
}
let fragment = new DocumentFragment();
if (siteData.autoPager.showTitle !== 0) {
let add = true;
let titleText = null;
if (typeof siteData.autoPager.title === "function") {
try {
titleText = await siteData.autoPager.title();
if (typeof titleText === "object") {
if (titleText.ok) {
titleText = titleText.text;
} else {
add = false;
}
}
} catch (error) {
console.error("\nsiteData.autoPager.title() 函式錯誤\n", error);
}
}
if (add) fragment.appendChild(await fun.titleUrlEle(url, (titleText || doc.title)));
}
newEle.forEach(e => {
fragment.appendChild(e.cloneNode(true));
});
newEle = null;
if (siteData.autoPager.pos) {
if (siteData.autoPager.pos[1] === 0) { //元素裡面
tE = fun.ga(siteData.autoPager.pos[0], doc);
tE.appendChild(fragment);
} else if (siteData.autoPager.pos[1] === 1) { //元素之前
tE = fun.ga(siteData.autoPager.pos[0], doc);
tE.parentNode.insertBefore(fragment, tE);
} else if (siteData.autoPager.pos[1] === 2) { //元素之後
tE.parentNode.insertBefore(fragment, tE.nextSibling);
}
} else {
tE.parentNode.insertBefore(fragment, tE.nextSibling);
}
} else if (typeof siteData.autoPager.ele === "function") {
await siteData.autoPager.ele();
}
if (typeof siteData.autoPager.aF === "function") await siteData.autoPager.aF();
fun.removeLoading();
if (siteData.autoPager.history == 1) fun.addHistory(doc.title, url);
if (siteData.autoPager.observer) {
await fun.delay(siteData.autoPager.sleep || 1000, 0);
let ele = [...fun.gae(siteData.autoPager.observer)].pop();
fun.nextObserver.observe(ele);
}
},
iframeDoc: (url, ele) => {
return new Promise(async resolve => {
let tid;
const iframe = document.createElement("iframe");
iframe.id = "FullPictureLoadIframe";
iframe.style.display = "none";
iframe.src = url;
document.body.appendChild(iframe);
tid = setTimeout(() => {
resolve(null);
}, 3000);
const call = async () => {
clearTimeout(tid);
let doc = iframe.contentDocument || iframe.contentWindow.document;
if (!doc) resolve(fun.doc("none"));
doc.body.scrollTop = 9999999;
doc.documentElement.scrollTop = 9999999;
try {
await fun.delay(siteData.autoPager.loadTime || 200, 0);
} catch (e) {
await fun.delay(200, 0);
}
if (typeof ele === "string") await fun.waitEle(ele, 600, doc);
resolve(doc);
iframe.remove();
};
if (iframe.attachEvent) {
iframe.attachEvent("onload", () => {
call();
});
} else {
iframe.onload = () => {
call();
};
}
});
},
iframeSrcDoc: (url, ele) => {
return new Promise(async resolve => {
let tid;
let resText = await fetch(url).then(async res => {
debug(`\nfun.iframeSrcDoc() URL`, url);
if (res.status >= 400) {
let resData = await fun.retryUrl(url, res, "fun.iframeSrcDoc()");
if (resData !== null) return resData;
}
return res.arrayBuffer()
}).then(buffer => {
const decoder = new TextDecoder(document.characterSet || document.charset || document.inputEncoding);
const htmlText = decoder.decode(buffer);
return htmlText;
});
const iframe = document.createElement("iframe");
iframe.id = "FullPictureLoadIframe";
iframe.style.display = "none";
iframe.srcdoc = resText;
document.body.appendChild(iframe);
tid = setTimeout(() => {
resolve(null);
}, 5000);
const call = async () => {
clearTimeout(tid);
let doc = iframe.contentDocument || iframe.contentWindow.document;
if (!doc) resolve(fun.doc("none"));
doc.body.scrollTop = 9999999;
doc.documentElement.scrollTop = 9999999;
try {
await fun.delay(siteData.autoPager.loadTime || 200, 0);
} catch (e) {
await fun.delay(200, 0);
}
if (typeof ele === "string") await fun.waitEle(ele, 600, doc);
resolve(doc);
iframe.remove();
};
if (iframe.attachEvent) {
iframe.attachEvent("onload", () => {
call();
});
} else {
iframe.onload = () => {
call();
};
}
});
},
nextObserver: new IntersectionObserver((entries, observer) => {
entries.forEach(entry => {
if (entry.isIntersecting && autoPager) {
observer.unobserve(entry.target);
fun.autoPager();
}
});
}),
getNextLink: async () => {
if (typeof siteData.autoPager.next === "function") {
let nextCode = await siteData.autoPager.next();
if (nextLink === nextCode) return null;
nextLink = nextCode;
} else if (typeof siteData.autoPager.next === "string") {
let nextEle = fun.ge(siteData.autoPager.next, doc);
try {
if (nextLink === nextEle.href) return null;
} catch (error) {
console.error("\nfun.getNextLink() ERROR\n", error);
return null;
}
nextLink = nextEle.href;
const nh = nextEle.host;
const lh = location.host;
if (nh !== lh) nextLink = nextLink.replace(nh, lh);
} else {
return null;
}
if (!nextLink) return null;
if (siteData.autoPager.http) siteData.autoPager.http == "https" ? nextLink = nextLink.replace("http:", "https:") : nextLink = nextLink.replace("https:", "http:");
return nextLink;
},
titleUrlEle: (url, title) => {
let div = document.createElement("div");
div.className = "autoPagerTitle";
let a = document.createElement("a");
a.href = url;
a.innerText = title;
div.appendChild(a);
div.addEventListener("click", event => {
fun.toggleAutoPager();
});
return div;
},
addLoading: () => {
if (siteData.autoPager.loading === "msg") {
fun.show(displayLanguage.str_57, 0);
} else {
try {
let img = new Image();
img.className = "autoPagerLoading";
img.src = autoPagerLoading;
let tE;
if (siteData.autoPager.pos) {
if (siteData.autoPager.pos[1] === 0) { //元素裡面
tE = fun.ga(siteData.autoPager.pos[0], doc);
tE.appendChild(img);
} else if (siteData.autoPager.pos[1] === 1) { //元素之前
tE = fun.ga(siteData.autoPager.pos[0], doc);
tE.parentNode.insertBefore(img, tE);
} else if (siteData.autoPager.pos[1] === 2) { //元素之後
tE.parentNode.insertBefore(img, tE.nextSibling);
}
} else {
tE = [...fun.gae(siteData.autoPager.ele)].pop();
tE.parentNode.insertBefore(img, tE.nextSibling);
}
} catch (e) {
fun.show(displayLanguage.str_57, 0);
}
}
},
removeLoading: () => {
if (siteData.autoPager.loading === "msg") {
fun.hide();
} else {
try {
fun.ge(".autoPagerLoading").remove();
} catch (e) {
fun.hide();
}
}
},
addHistory: (title, url) => {
history.pushState(null, title, url);
document.title = title;
},
getEle: async (links, elements, targetEle, removeEles = null, time = 100) => {
if (fun.ge(".FullPictureLoadImage")) return;
fetching = true;
let resArr = [];
let xhrNum = 0;
fun.show(displayLanguage.str_16, 0);
for (let i = 0; i < links.length; i++) {
let res = fun.xhrDoc(links[i]).then(doc => {
debug(`\nfun.getEle() URL`, links[i]);
fun.show(`${displayLanguage.str_17}${xhrNum+=1}/${links.length}`, 0);
debug(`fun.getEle()\n${decodeURI(links[i])}\n`, doc);
return [...fun.gae(elements, doc)];
});
resArr.push(res);
await fun.delay(time, 0);
}
await Promise.all(resArr).then(arr => arr.flat()).then(eles => {
fetching = false;
fun.hide();
let ele;
let fragment = new DocumentFragment();
eles.forEach(e => {
fragment.appendChild(e.cloneNode(true));
});
if (typeof targetEle == "object") {
ele = fun.ge(targetEle[0]);
if (targetEle[1] == 0) ele.appendChild(fragment);
else if (targetEle[1] == 1) ele.parentNode.insertBefore(fragment, ele);
else if (targetEle[1] == 2) ele.parentNode.insertBefore(fragment, ele.nextSibling);
} else if (typeof targetEle == "string") {
ele = fun.ge(targetEle);
ele.innerHTML = "";
ele.appendChild(fragment);
}
if (removeEles) fun.remove(removeEles);
fun.fetchErrorMsg();
});
},
insertImg: (imgsArray, ele, mode = 1) => {
let srcArr = [];
for (let i = 0; i < imgsArray.length; i++) {
let check = fun.checkImgSrc(imgsArray[i]);
check.ok ? srcArr.push(check.src) : console.error("\nfun.insertImg(imgsArray) 格式錯誤!", imgsArray[i]);
}
srcArr = [...new Set(srcArr)];
let fragment = new DocumentFragment();
if (siteData.button) {
if (typeof siteData.button[2] === "number") {
for (let i = 0; i < siteData.button[2]; i++) {
let br = document.createElement("br");
fragment.appendChild(br);
}
}
let width = "24%";
if (typeof siteData.button[1] === "string") {
width = siteData.button[1];
}
const buttonObj = [{
id: "FullPictureLoadOptionsBtn",
text: displayLanguage.str_85,
fn: event => {
event.preventDefault();
fun.ge("#FullPictureLoadOptions").removeAttribute("style");
}
}, {
id: "FullPictureLoadToggleImgModeBtn",
text: displayLanguage.str_86,
fn: event => {
event.preventDefault();
toggleImgMode();
}
}, {
id: "FullPictureLoadToggleZoomeBtn",
text: displayLanguage.str_87,
fn: event => {
event.preventDefault();
toggleZoom();
}
}, {
id: "FullPictureLoadCancelZoomBtn",
text: displayLanguage.str_88,
fn: event => {
event.preventDefault();
cancelZoom();
}
}];
const createButton = obj => {
let button = document.createElement("button");
button.id = obj.id;
button.style.width = width;
button.style.height = "24px";
button.innerText = obj.text;
button.addEventListener("click", obj.fn);
fragment.appendChild(button);
};
[...buttonObj].forEach(obj => {
createButton(obj);
});
}
let noVideoNum = [...srcArr].filter(src => !/youtube|\.mp4$|\.webm$/.test(src)).length;
let blackList = fancyboxBlackList();
if (options.fancybox == 1 && thumbnailsSrcArray.length > 0) {
if (!/www\.24cos\.org|www\.lovecos\.net|luohuaxiu\.com|kemono\.su|coomer\.su/.test(location.host) || !/^data/.test(thumbnailsSrcArray[0])) {
thumbnailsSrcArray = [...new Set(thumbnailsSrcArray)];
}
/*
if (!/^data/.test(thumbnailsSrcArray[0])) {
let thumbnailsFragment = new DocumentFragment();
for (let i in thumbnailsSrcArray) {
let img = new Image();
img.src = thumbnailsSrcArray[i];
thumbnailsFragment.appendChild(img);
}
debug("\n背景預讀所有預覽縮圖\n", thumbnailsFragment);
}
*/
}
debug("插入圖片最後確認 thumbnailsSrcArray", thumbnailsSrcArray);
debug("插入圖片最後確認 srcArr", srcArr);
let padStart = String(srcArr.length).length;
for (let i = 0; i < srcArr.length; i++) {
let a = document.createElement("a");
if (options.fancybox == 1 && !blackList) {
a.id = "imgLocationOriginal" + i;
a.dataset.fancybox = "FullPictureLoadImageOriginal";
thumbnailsSrcArray.length > 0 && thumbnailsSrcArray.length == noVideoNum ? a.dataset.thumb = thumbnailsSrcArray[i] : a.dataset.thumb = srcArr[i];
a.href = srcArr[i];
/*
a.dataset.downloadSrc = srcArr[i];
a.dataset.downloadFilename = (customTitle || document.title) + `-${String(parseInt(i, 10) + 1).padStart(padStart, "0")}P`;
*/
}
let img = new Image();
img.alt = `no.${parseInt(i, 10) + 1}`;
img.className = "FullPictureLoadImage";
if (siteData.referrerpolicy) img.setAttribute("referrerpolicy", siteData.referrerpolicy);
if (options.zoom <= 10 && options.zoom > 0) {
img.style.width = `${options.zoom * 10}%`;
img.style.height = "auto";
}
if (mode == 2 || mode == 3) {
img.src = loading_bak;
img.dataset.src = srcArr[i];
fun.imagesObserver.observe(img);
} else {
img.src = srcArr[i];
img.onload = () => {
img.classList.remove("error");
};
img.onerror = error => {
if (errorNum > 100) return;
errorNum += 1;
error.target.classList.add("error");
setTimeout(() => {
debug(`\nfun.insertImg()重新載入出錯的圖片:\n${error.target.src}`);
error.target.src = error.target.src;
}, 1000);
};
}
if (options.fancybox == 1 && !blackList) {
a.appendChild(img);
fragment.appendChild(a);
} else {
fragment.appendChild(img);
}
}
if (videosSrcArray.length > 0) {
debug("插入圖片最後確認 videosSrcArray", videosSrcArray);
for (let i = 0; i < videosSrcArray.length; i++) {
let video = document.createElement("video");
video.className = "FullPictureLoadVideo";
video.src = videosSrcArray[i];
video.controls = true;
video.loop = false;
video.autoplay = false;
video.style = "height: 500px;width: 100%;max-width:100%";
fragment.appendChild(video);
}
}
let end = document.createElement("p");
end.id = "FullPictureLoadEnd";
end.innerText = `${displayLanguage.str_52}:${noVideoNum}P`;
fragment.appendChild(end);
const MutationObserver_aff = () => { //观察者 MutationObserver事件
const openEvent = () => {
if (fun.ge("span[data-fancybox-current-index]") !== null) {
slideIndex = parseInt(fun.geT("span[data-fancybox-current-index]"), 10) - 1;
} else if (fun.ge("span[data-fancybox-index]") !== null) {
slideIndex = parseInt(fun.geT("span[data-fancybox-index]"), 10) - 1;
} else if (fun.ge("badge.b-black.counter") !== null) {
slideIndex = parseInt(fun.geT("badge.b-black.counter").match(/\d+/)[0], 10) - 1;
}
if (typeof slideIndex === "number") {
console.log("open - # " + slideIndex + " slide is open!");
}
};
const ContentContainer = document.body;
const configObserver = {
childList: true,
subtree: true,
attributeFilter: ["class"]
};
// 当观察到突变时执行的回调函数
const Callbacks = mutationsList => {
mutationsList.forEach((item, index) => {
// console.log("index: ", index, " - \n", item);
if (item.type === "attributes") {
// console.log(item);
if (item.target.className === "fancybox-slide fancybox-slide--image fancybox-slide--current fancybox-slide--complete" || item.target.className === "fancybox__slide has-image can-zoom_in is-selected" || item.target.className === "swiper-slide swiper-slide-active") {
console.log(" # ", item);
openEvent();
fun.scrollEvent(slideIndex);
}
} else if (item.type === "childList") {
// console.log(item);
if (item.removedNodes.length > 1 && /fancybox|swiper/.test(item.removedNodes[1].className)) {
console.log(" # ", item);
console.log("close - # " + slideIndex + " slide is closed!");
// setTimeout(closeEvent, 1000);
fun.scrollEvent(slideIndex);
}
}
});
};
// 创建一个链接到回调函数的观察者实例
const Observer = new MutationObserver(Callbacks);
ContentContainer && Observer.observe(ContentContainer, configObserver);
};
MutationObserver_aff();
const picPreload = async _srcArr => {
const loadImg = async (src, index) => {
await new Promise(resolve => {
let temp = new Image();
temp.src = src;
temp.onload = () => {
resolve();
temp = null;
};
temp.onerror = error => {
if (errorNum > 100) return;
errorNum += 1;
resolve();
setTimeout(() => {
if (/yskhd\.com|ysk567\.com/.test(location.host)) {
if (/-scaled/.test(src)) {
debug(`\n圖片全載Lazyloading預讀出錯 优丝库HD 重新載入另一種圖片網址:\n${src}\nto\n${src.replace("-scaled", "")}\n`, loadImg(src.replace("-scaled", ""), index));
} else {
debug(`\n圖片全載Lazyloading預讀出錯 优丝库HD 重新載入另一種圖片網址:\n${src}\nto\n${src.replace(/(\.[a-z]+)$/i, "-scaled$1")}\n`, loadImg(src.replace(/(\.[a-z]+)$/i, "-scaled$1"), index));
}
} else if (/www\.yinghuamh\.net/.test(location.host)) {
debug(`\n圖片全載Lazyloading預讀出錯 樱花漫画 重新載入另一個圖片伺服器的圖片網址:\n${src}\nto\n${src.replace(Gm.getMediaHost(media), media)}\n`, loadImg(src.replace(Gm.getMediaHost(media), media), index));
} else {
debug(`\n圖片全載Lazyloading預讀重新載入出錯的圖片:\n${src}\n`, loadImg(src, index));
}
}, 1000);
temp = null;
};
});
};
debug("\n圖片全載Lazyloading開始預讀");
for (let src = 0; src < _srcArr.length; src++) {
if (/youtube|\.mp4$|\.webm$/.test(_srcArr[src])) {
continue;
}
await loadImg(_srcArr[src], src);
if (src == _srcArr.length - 1) debug("\n圖片全載Lazyloading預讀結束");
}
};
if (srcArr.length > 0) {
if (siteData.insertImg[1] == 2 || siteData.insertImg[1] == 3) picPreload(srcArr);
let targetEle;
try {
if (typeof ele == "object") {
targetEle = fun.ge(ele[0]);
if (ele[1] == 0) {
targetEle.appendChild(fragment);
targetEle.style.textAlign = "center";
targetEle.style.display = "block";
} else if (ele[1] == 1) {
targetEle.parentNode.insertBefore(fragment, targetEle);
targetEle.parentNode.style.textAlign = "center";
targetEle.parentNode.style.display = "block";
} else if (ele[1] == 2) {
targetEle.parentNode.insertBefore(fragment, targetEle.nextSibling);
targetEle.parentNode.style.textAlign = "center";
targetEle.parentNode.style.display = "block";
}
if (typeof ele[2] != "undefined") {
fun.remove(ele[2]);
}
if (siteData.msg != 0 && siteData.category != "comic") fun.show(displayLanguage.str_18);
if (siteData.go == 1) goToNo1Img();
} else if (typeof ele == "string") {
targetEle = fun.ge(ele);
targetEle.innerHTML = "";
targetEle.appendChild(fragment);
targetEle.style.textAlign = "center";
targetEle.style.display = "block";
if (siteData.msg != 0 && siteData.category != "comic") fun.show(displayLanguage.str_18);
if (siteData.go == 1) goToNo1Img();
}
} catch (error) {
fun.show(displayLanguage.str_19, 3000);
console.error("\nfun.insertImg() ele參數錯誤,或用來定位插入的元素不存在。", error);
return;
}
let imgs = [...fun.gae(".FullPictureLoadImage:not(.small)")];
let imgsNum = 0;
document.addEventListener("keydown", event => {
if (fun.ge("#FullPictureLoadOptions:not([style])")) return;
if (event.key == "ArrowUp") {
if (fun.ge(".fancybox-container,.fancybox__container")) return;
if (imgsNum > 0 && viewMode == 0) {
imgsNum -= 1;
imgs[imgsNum].scrollIntoView();
}
} else if (event.key == "ArrowDown") {
if (fun.ge(".fancybox-container,.fancybox__container")) return;
event.preventDefault();
if (imgsNum < imgs.length && viewMode == 0) {
imgsNum += 1;
try {
imgs[imgsNum].scrollIntoView();
} catch (e) {
imgsNum = 0;
imgs[0].scrollIntoView();
fun.show(displayLanguage.str_94);
}
}
} else {
imgsNum = 0 - 1;
}
});
[...fun.gae("#FullPictureLoadGoToFirstImage,#FullPictureLoadGoToLastImage")].forEach(e => {
e.style.display = "block";
});
if (options.fancybox == 1 && !blackList && !siteData.fancybox) {
try {
Fancybox.bind("[data-fancybox='FullPictureLoadImageOriginal']", FancyboxOptions);
} catch (error) {
debug("沒有引入FancyboxV5", error);
}
}
} else {
fun.show(displayLanguage.str_20);
}
},
immediateInsertImg: async () => {
await fun.delay(siteData.insertImg[2] || 200);
let selector = siteData.imgs;
let imgsSrcArray = await getImgs(selector);
fun.insertImg(imgsSrcArray, siteData.insertImg[0], siteData.insertImg[1]);
},
ge: (e, d) => /^\//.test(e) ? (d || document).evaluate(e, (d || document), null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue : (d || document).querySelector(e),
gae: (e, d) => {
if (/^\//.test(e)) {
let nodes = [];
let results = (d || document).evaluate(e, (d || document), null, XPathResult.ANY_TYPE, null);
let node;
while (node = results.iterateNext()) {
nodes.push(node);
}
return nodes;
} else {
return (d || document).querySelectorAll(e);
}
},
geT: (ele, mode = 1) => {
try {
if (mode == 1) {
return fun.ge(ele).innerText;
} else if (mode == 2) {
return fun.ge(ele).previousElementSibling.innerText;
} else if (mode == 3) {
return fun.ge(ele).previousElementSibling.previousElementSibling.innerText;
}
} catch (error) {
debug("\nfun.geT() ERROR\n", error);
return null;
}
},
attr: (ele, attr) => fun.ge(ele).getAttribute(attr),
run: code => new Function("return " + code)(),
doc: str => new DOMParser().parseFromString(str, 'text/html'),
xml: str => new DOMParser().parseFromString(str, 'text/xml'),
title: (str, mode = 0) => {
let split = document.title.replace(/漫画|\s-\s(漫本|奇漫屋|漫画星球|6漫画)|\[\d+p(\d+v)?\]/gi, "").split(str);
if (mode == 0) {
try {
return document.title.replace(str, "").trim();
} catch (error) {
debug("\nfun.title() ERROR", error);
return document.title;
}
} else if (mode == 1) {
try {
return split[0].replace(/,$/g, "").replace(/,/g, " ").trim();
} catch (error) {
debug("\nfun.title() ERROR", error);
return document.title;
}
} else if (mode == 2) {
try {
return (split[0] + str + split[1]).replace(/,$/g, "").replace(/,/g, " ").trim();
} catch (error) {
debug("\nfun.title() ERROR", error);
return document.title;
}
} else if (mode == 3) {
try {
return (split[1] + str + split[0]).replace(/,$/g, "").replace(/,/g, " ").trim();
} catch (error) {
debug("\nfun.title ERROR", error);
return document.title;
}
}
},
show: (text, time = 1000) => {
let msg = fun.ge(".FullPictureLoadMsg");
if (fun.ge(".FullPictureLoadMsg[style]")) msg.removeAttribute("style");
msg.innerText = text;
if (time > 0) {
setTimeout(() => {
fun.hide();
}, time);
}
},
hide: () => {
if (!fun.ge(".FullPictureLoadMsg[style]")) {
let msg = fun.ge(".FullPictureLoadMsg");
msg.innerText = "none";
msg.style.display = "none";
}
},
imagesObserver: new IntersectionObserver((entries, observer) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
observer.unobserve(entry.target);
let realSrc = entry.target.dataset.src;
let nE = entry.target.nextElementSibling;
let fancyboxE = entry.target.parentNode;
let fancyboxNE = null;
if (fancyboxE && fancyboxE.tagName == "A") fancyboxNE = fancyboxE.nextElementSibling;
if (realSrc) {
entry.target.src = realSrc;
entry.target.onload = () => {
if (!/^data/.test(entry.target.src)) entry.target.classList.remove("error");
};
entry.target.onerror = (error) => {
if (errorNum > 100) return;
if (!/yskhd\.com|ysk567\.com/.test(location.host)) errorNum += 1;
if (/yskhd\.com|ysk567\.com/.test(location.host)) {
/-scaled/.test(error.target.dataset.src) ? error.target.dataset.src = error.target.dataset.src.replace("-scaled", "") : error.target.dataset.src = error.target.dataset.src.replace(/(\.[a-z]+)$/i, "-scaled$1");
} else if (/www\.yinghuamh\.net/.test(location.host)) {
error.target.dataset.src = error.target.dataset.src.replace(Gm.getMediaHost(media), media);
}
error.target.src = loading_bak;
error.target.classList.add("error");
setTimeout(() => {
if (/yskhd\.com|ysk567\.com/.test(location.host)) {
debug(`\nimagesObserver 优丝库HD圖片出錯 重新載入另一種圖片網址:\n${realSrc}\nto\n${error.target.dataset.src}`);
} else if (/www\.yinghuamh\.net/.test(location.host)) {
debug(`\nimagesObserver 樱花漫画圖片出錯 重新載入另一個圖片伺服器的圖片網址:\n${realSrc}\nto\n${error.target.dataset.src}`);
} else {
debug(`\nimagesObserver重新載入出錯圖片:\n${realSrc}`);
}
error.target.src = error.target.dataset.src;
}, 1000);
};
}
if (nE && nE.tagName == "IMG" && nE.dataset.src) nE.src = nE.dataset.src;
if (fancyboxNE && fancyboxNE.tagName == "A") {
let ele = fancyboxNE.firstElementChild;
if (ele && ele.tagName == "IMG" && ele.dataset.src) ele.src = ele.dataset.src;
}
}
});
}),
addFullPictureLoadMsg: () => {
let div = document.createElement("div");
div.className = "FullPictureLoadMsg";
div.style.display = "none";
div.innerText = "none";
document.body.appendChild(div);
},
css: css => {
let style = document.createElement("style");
style.type = "text/css";
style.className = "FullPictureLoadStyle";
style.innerHTML = css;
document.head.appendChild(style);
},
script: async (code, src = 0, pos = 0) => {
let script = document.createElement("script");
script.className = "FullPictureLoadScript";
if (src == 0) {
script.type = "text/javascript";
script.innerHTML = code;
}
if (src == 0 && pos == 0) {
return script;
} else if (pos == 1) {
if (src == 1) {
await new Promise(resolve => {
script.src = code;
document.body.appendChild(script);
script.onload = () => {
resolve();
}
});
} else {
document.body.appendChild(script);
}
}
},
delay: (time, msg = 1) => {
if (time > 200 && msg == 1) fun.show(`${displayLanguage.str_21}${time}${displayLanguage.str_22}...`, time);
return new Promise(resolve => {
setTimeout(resolve, time);
});
},
waitEle: (ele, max = 200, doc = document) => {
let loopNum = 0;
return new Promise(resolve => {
let loop = setInterval(() => {
loopNum += 1;
if (!!fun.ge(ele, doc) === true) {
clearInterval(loop);
resolve(true);
}
if (loopNum >= max) {
clearInterval(loop);
debug(`fun.waitEle()達循環上限,沒有出現"${ele}"元素。`);
resolve(false);
}
}, 100);
});
},
checkImgStatus: (src, msg = null) => {
fun.show(msg || displayLanguage.str_56, 0);
return new Promise(resolve => {
let temp = new Image();
temp.src = src;
temp.onload = () => {
fun.hide();
resolve({
ok: true,
src: src,
width: temp.width,
height: temp.height
});
}
temp.onerror = () => {
fun.hide();
resolve({
ok: false,
src: src
});
}
});
},
checkDownloadThread: () => {
return new Promise(resolve => {
let loop = setInterval(() => {
if (currentDownloadThread <= options.threading) {
clearInterval(loop);
resolve();
}
}, 50);
});
},
xhr: (url, type = "text", referer = location.href, ua = navigator.userAgent) => {
return new Promise((resolve, reject) => {
_GM_xmlhttpRequest({
method: "GET",
url: url,
responseType: type,
headers: {
"Referer": referer,
"User-Agent": ua
},
onload: data => {
if (data.status > 400) debug(`\nfun.xhr()連線錯誤碼:${data.status}\n`, url);
resolve(data.response);
},
onerror: error => {
reject(error);
}
});
});
},
xhrHEAD: url => {
return new Promise(resolve => {
_GM_xmlhttpRequest({
method: "HEAD",
url: url,
timeout: 20000,
onload: data => {
resolve(data);
},
onerror: error => {
console.log(`fun.xhrHEAD() ERROR\n${url}`, error);
resolve({
status: 403
});
},
ontimeout: error => {
console.log(`fun.xhrHEAD() Timeout\n${url}`, error);
resolve({
status: 524
});
}
});
});
},
xhrDoc: (url, referer = location.href, ua = navigator.userAgent) => {
return new Promise((resolve, reject) => {
_GM_xmlhttpRequest({
method: "GET",
url: url,
responseType: "arraybuffer",
headers: {
"Referer": referer,
"User-Agent": ua
},
onload: data => {
if (data.status >= 400) {
debug(`\nfun.xhrDoc()連線錯誤碼:${data.status}\n`, url);
let obj = {
fn: "fun.xhrDoc()",
url: url,
status: data.status
};
fetchErrorArray.push(obj);
}
let decoder = new TextDecoder(document.characterSet || document.charset || document.inputEncoding);
let htmlText = decoder.decode(data.response);
let doc = fun.doc(htmlText);
resolve(doc);
},
onerror: error => {
reject(error);
}
});
});
},
fetchDoc: url => {
return fetch(url).then(async res => {
if (res.status >= 400) {
let resData = await fun.retryUrl(url, res, "fun.fetchDoc()");
if (resData !== null) return resData;
}
return res.arrayBuffer();
}).then(buffer => {
const decoder = new TextDecoder(document.characterSet || document.charset || document.inputEncoding);
const htmlText = decoder.decode(buffer);
return fun.doc(htmlText);
});
},
getKukudmSrc: async () => {
let timeId = setTimeout(() => {
location.reload();
}, 10000);
fun.show(displayLanguage.str_05, 0);
let max;
try {
max = fun.geT("//td[input]").match(/共(\d+)/)[1];
} catch (e) {
max = fun.geT(".bottom .subNav").match(/\/(\d+)/)[1];
}
let links = [];
let url = location.href.replace(/1\.htm$/, "");
for (let i = 1; i <= max; i++) {
links.push(url + i + ".htm");
}
let resArr = [];
let fetchNum = 0;
for (let i = 0; i < links.length; i++) {
let res = fun.fetchDoc(links[i]).then(doc => {
fun.show(`${displayLanguage.str_06}${fetchNum+=1}/${links.length}`, 0);
let script = [...doc.scripts].find(s => s.innerText.search(/document\.write/) > -1).innerText;
let arr = script.split("'><");
let pathArr0, pathArr1, pathArr2;
if (arr.length == 1) {
let arr = script.split(`"+server+"`);
if (arr.length == 2) {
pathArr0 = arr[1].replace(/(\.[a-z]+).+/i, "$1").replace("\n", "");
} else {
return null;
}
} else if (arr.length == 4) {
pathArr1 = arr[0].split("/");
pathArr2 = arr[2].split("/");
} else if (arr.length == 5) {
pathArr1 = arr[1].split("/");
pathArr2 = arr[3].split("/");
} else {
return null;
}
if (arr.length == 1) {
let host0 = fun.run("server");
let src0 = host0 + pathArr0;
return src0;
} else {
let host1 = fun.run(pathArr1[0].split("+")[1]);
let host2 = fun.run(pathArr2[0].split("+")[1]);
pathArr1[0] = pathArr1[0].match(/\w+$/)[0];
pathArr2[0] = pathArr2[0].match(/\w+$/)[0];
let src1 = host1 + pathArr1.join("/");
let src2 = host2 + pathArr2.join("/");
return {
src1: src1,
src2: src2
};
}
});
resArr.push(res);
}
let allSrc = await Promise.all(resArr).then(arr => {
clearTimeout(timeId);
fun.hide();
return arr;
});
debug("\nfun.getKukudmSrc() > allSrc\n", allSrc);
try {
if (typeof allSrc[0] === "string") {
return allSrc;
} else {
let obj = await fun.checkImgStatus(allSrc[0].src1);
if (obj.ok) {
return allSrc.map(e => e.src1);
} else {
return allSrc.map(e => e.src2);
}
}
} catch (e) {
return [];
}
},
remove: (ele, time = 0) => {
setTimeout(() => {
[...fun.gae(ele)].forEach(e => {
e.remove()
});
}, time);
},
addUrlHtml: (url, ele, pos, text = "點選進入下一話") => {
let _pos;
switch (pos) {
case 0:
_pos = "beforebegin"; //在元素之前。
break;
case 1:
_pos = "afterend"; //在元素之後。
break;
case 2:
_pos = "beforeend"; //在元素裡面,最後一個子元素之後。
break;
case 3:
_pos = "afterbegin"; //在元素裡面,第一個子元素之前。
break;
}
let html = `<div style="padding: 20px 0; text-align: center;"><a href="${url}"style="font-size: 26px;line-height: 50px;height: 50px;text-align: center;">${text}</a></div>`;
fun.ge(ele).insertAdjacentHTML(_pos, html);
},
dataURLtoBlobURL: dataurl => {
let arr = dataurl.split(","),
mime = arr[0].match(/:(.*?);/)[1],
bstr = atob(arr[1]),
n = bstr.length,
u8arr = new Uint8Array(n);
while (n--) {
u8arr[n] = bstr.charCodeAt(n);
}
return URL.createObjectURL(new Blob([u8arr], {
type: mime
}));
},
imgSrcToDataURL: (src, type = "image/jpeg", cros = 0) => {
return new Promise((resolve, reject) => {
let img = document.createElement("img");
img.src = src;
if (cros == 1) {
img.setAttribute("crossOrigin", "anonymous");
}
img.onload = () => {
let canvas = document.createElement("canvas");
let ctx = canvas.getContext("2d");
canvas.height = img.height;
canvas.width = img.width;
ctx.drawImage(img, 0, 0);
let dataURL = canvas.toDataURL(type);
resolve(dataURL);
};
img.onerror = error => {
reject(error);
}
});
},
imgToBlobURL: (img, mode = 1, type = "image/jpeg") => {
let canvas = document.createElement("canvas");
if (mode == 1) {
canvas.width = img.naturalWidth;
canvas.height = img.naturalHeight;
} else if (mode == 2) {
canvas.width = img.width;
canvas.height = img.height;
} else {
return img;
}
canvas.getContext("2d").drawImage(img, 0, 0);
let dataUrl = canvas.toDataURL(type);
return fun.dataURLtoBlobURL(dataUrl);
},
imgBlobArr: async (ele, mode = 1, type = "image/jpeg") => {
let imgs;
fun.show(displayLanguage.str_53, 0);
await fun.delay(200, 0);
imgs = [...fun.gae(ele)].map(e => fun.imgToBlobURL(e, mode, type));
fun.hide();
return imgs;
},
blobToDataURL: blob => {
return new Promise(resolve => {
const reader = new FileReader();
reader.onload = () => {
resolve(reader.result);
}
reader.readAsDataURL(blob);
});
},
scrollEles: async (ele, ms = 100) => {
let eles = [...fun.gae(ele)];
for (let i in eles) {
eles[i].scrollIntoView({
behavior: "smooth",
block: "end"
});
await fun.delay(ms, 0);
}
/*
window.scrollTo({
top: 0
});
*/
},
openInTab: (url, target = "_blank") => {
let a = document.createElement("a");
a.href = url;
a.target = target;
a.style = "display: none;";
document.body.appendChild(a);
a.click();
a.remove();
},
CivitAiAutoShowNSFW: () => {
const unBlur = async () => {
if (/\/posts\/|\/models\//.test(siteUrl)) {
let ele = [...fun.gae(".mantine-1pj0akd,.mantine-1a9x8zw,.mantine-qwgpbp,.mantine-1m05dul,.mantine-1gtzxoj,.mantine-7cmpjr,.mantine-hdmzgx,.mantine-10dlb,.mantine-17xqhym,.mantine-1ll12xr,.mantine-1ge3iyn,.mantine-1jb75iu,.mantine-5ix9q9,.mantine-1p64zh1,.mantine-k1f4y4,.mantine-kg33jb")][0];
let elePath = fun.ge("span+svg>path", ele);
if (elePath) {
let d = elePath.getAttribute("d");
if (d == "M10 12a2 2 0 1 0 4 0a2 2 0 0 0 -4 0") {
ele.click();
//elementClick(ele);
}
await fun.delay(200);
}
}
[...fun.gae(".mantine-1pj0akd,.mantine-1a9x8zw,.mantine-qwgpbp,.mantine-1m05dul,.mantine-1gtzxoj,.mantine-7cmpjr,.mantine-hdmzgx,.mantine-10dlb,.mantine-17xqhym,.mantine-1ll12xr,.mantine-1ge3iyn,.mantine-1jb75iu,.mantine-5ix9q9,.mantine-1p64zh1,.mantine-k1f4y4,.mantine-kg33jb")].forEach(ele => {
let elePath = fun.ge("span+svg>path", ele);
if (elePath) {
let d = elePath.getAttribute("d");
if (d == "M10 12a2 2 0 1 0 4 0a2 2 0 0 0 -4 0") {
ele.click();
//elementClick(ele);
}
}
});
};
new MutationObserver(unBlur).observe(document.body, {
childList: true,
subtree: true,
attributes: true
});
unBlur();
},
scrollEvent: slideIndex => {
let modeName = "Samll";
switch (viewMode) {
case 0:
modeName = "Original";
break;
case 1:
modeName = "Samll";
break;
default:
console.error("模式错误");
break;
}
debug(`imgLocation${modeName}` + slideIndex);
let elementById = document.getElementById(`imgLocation${modeName}` + slideIndex);
if (elementById) {
elementById.scrollIntoView({
block: "center",
behavior: "smooth",
inline: "center",
});
} else {
console.error(" # ", "未定位id!");
}
},
clearAllTimer: (mode = 0) => {
let debuggerStr = `
if ((() => {}).constructor === Function) Function.prototype.constructor = () => {};
`;
if (mode == 0 || mode == 1) new Function(debuggerStr)();
let endTidStr = `
let endTid = setTimeout(() => {});
for (let i = 0; i <= endTid; i++) {
clearTimeout(i);
}
`;
if (mode == 0 || mode == 2) {
new Function(endTidStr)();
let endTid = setTimeout(() => {});
for (let i = 0; i <= endTid; i++) {
clearTimeout(i);
}
}
let endIidStr = `
let endIid = setInterval(() => {});
for (let i = 1; i <= endIid; i++) {
clearInterval(i);
}
`;
if (mode == 0 || mode == 3) {
new Function(endIidStr)();
let endIid = setInterval(() => {});
for (let i = 1; i <= endIid; i++) {
clearInterval(i);
}
}
}
};
const ge = css => document.querySelector(css);
const gae = css => document.querySelectorAll(css);
const gx = xpath => document.evaluate(xpath, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
const gax = xpath => {
let nodes = [];
let results = document.evaluate(xpath, document, null, XPathResult.ANY_TYPE, null);
let node;
while (node = results.iterateNext()) {
nodes.push(node);
}
return nodes;
};
const getNum = (i, padStart = 4) => {
let n = parseInt(i, 10) + 1;
let picNum = String(n).padStart(padStart, "0");
return picNum;
};
const showMsg = (text, time = 1000) => {
ge(".FullPictureLoadMsg").removeAttribute("style");
ge(".FullPictureLoadMsg").innerText = text;
setTimeout(() => {
ge(".FullPictureLoadMsg").innerText = "none";
ge(".FullPictureLoadMsg").style.display = "none";
}, time);
};
const getDataMsg = (text, picNum, imgsNum) => {
if (picNum != "none") fun.show(`${displayLanguage.str_23}${downloadNum += 1}/${imgsNum}${displayLanguage.str_24}${text}`, 0);
};
const getReferer = srcUrl => {
let referer;
if (siteData.referer == "src") {
referer = srcUrl;
} else if (typeof siteData.referer == "string" || siteData.referer == "") {
referer = siteData.referer;
} else {
referer = location.href;
}
return referer;
};
const Fetch_API_GetData = (srcUrl, picNum = "none", imgsNum = "none") => {
currentDownloadThread++;
return new Promise(resolve => {
fetch(srcUrl, {
referrer: getReferer(srcUrl)
}).then(res => res.blob()).then(blob => {
currentDownloadThread--;
getDataMsg(displayLanguage.str_25, picNum, imgsNum);
resolve({
load: "下載成功",
blob: blob,
picNum: picNum
});
}).catch(error => {
currentDownloadThread--;
resolve({
error: "下載錯誤",
picNum: picNum,
src: srcUrl,
errorLog: error
});
getDataMsg(displayLanguage.str_26, picNum, imgsNum);
console.error(`Fetch_API_GetData() Error: ${error}`);
});
})
};
const GM_XHR_GetData = (srcUrl, picNum = "none", imgsNum = "none") => {
currentDownloadThread++;
return new Promise(resolve => {
_GM_xmlhttpRequest({
method: "GET",
url: srcUrl,
responseType: "blob",
headers: {
origin: location.origin,
referer: getReferer(srcUrl),
accept: "*/*"
},
onload: data => {
currentDownloadThread--;
let blob = data.response;
//debug("GM blob", blob);
if (blob.type == "application/octet-stream" || blob.type == "binary/octet-stream") {
resolve({
load: "下載成功",
blob: blob,
picNum: picNum
});
getDataMsg(displayLanguage.str_25, picNum, imgsNum);
} else if (/^image|^video/.test(blob.type)) {
resolve({
load: "下載成功",
blob: blob,
picNum: picNum
});
getDataMsg(displayLanguage.str_25, picNum, imgsNum);
} else {
let htmlText = "none";
if (/text\/html/.test(blob.type)) {
htmlText = blob.text();
}
resolve({
htmlText: htmlText,
blob: blob,
error: "下載錯誤",
picNum: picNum,
src: srcUrl
});
getDataMsg(displayLanguage.str_26, picNum, imgsNum);
}
},
onerror: error => {
currentDownloadThread--;
resolve({
error: "下載錯誤",
picNum: picNum,
src: srcUrl,
errorLog: error
});
getDataMsg(displayLanguage.str_26, picNum, imgsNum);
console.error(`GM_XHR_GetData() Error: ${error}`);
}
});
});
};
const saveData = (blob, fileName) => {
let a = document.createElement("a");
a.href = URL.createObjectURL(blob);
a.download = fileName;
document.body.appendChild(a);
a.click();
a.remove();
setTimeout(() => {
URL.revokeObjectURL(blob);
}, 1000);
};
const checkGeting = () => {
if (downloading) {
alert(displayLanguage.str_48);
return true;
}
if (fetching) {
alert(displayLanguage.str_49);
return true;
}
return false;
};
const getImgs = async selector => {
fetching = true;
let imgs;
if (ge(".FullPictureLoadImage") && siteData.repeat != 1) {
imgs = [...gae(".FullPictureLoadImage:not(.small)")];
} else if (typeof selector == "function") {
imgs = await selector();
} else if (!selector || selector === "") {
showMsg(displayLanguage.str_41);
return;
} else if (selector.length < 3) {
showMsg(displayLanguage.str_42);
return;
} else if (/^js;/.test(selector)) {
imgs = await new Function("siteData", "fun", '"use strict";' + selector.slice(3))(siteData, fun);
debug("\ngetImgs(selector) JSimgs:", imgs);
} else if (/^\//.test(selector)) {
imgs = [...gax(selector)];
} else {
imgs = [...gae(selector)];
}
imgs = imgs.filter(item => item); //去除空、無用
let imgsSrcArr = imgs.map(img => {
let check = fun.checkImgSrc(img);
if (check.ok) {
return check.src;
} else {
console.error("\ngetImgs() imgs 格式錯誤!", img);
return null;
}
}).filter(item => item);
debug("\ngetImgs() 所有圖片網址:", imgsSrcArr);
debug("\ngetImgs() 去重複後的圖片網址:", [...new Set(imgsSrcArr)]);
imgsSrcArr = [...new Set(imgsSrcArr)];
globalImgArray = imgsSrcArr;
fetching = false;
return imgsSrcArr;
};
const startAutoDownload = async () => {
let autoDownload = siteData.autoDownload;
let next = siteData.next;
if (!next && !autoDownload) return;
let ele;
typeof next === "function" ? ele = await next() : ele = fun.ge(next);
if (ele && siteData.autoDownload[0] == 1 || ele && options.autoDownload == 1) {
let max = siteData.autoDownload[1] || options.autoDownloadCountdown;
let countdownNum = max;
fun.show(`${displayLanguage.str_32}${max}${displayLanguage.str_33}`, 0);
for (let i = 1; i < max; i++) {
setTimeout(() => {
fun.show(`${displayLanguage.str_32}${countdownNum-=1}${displayLanguage.str_33}`, 0);
}, i * 1000);
}
setTimeout(() => {
if (typeof next === "function") {
fun.show(displayLanguage.str_34);
location.href = ele;
} else {
fun.show(displayLanguage.str_35);
ele.click();
}
}, max * 1000);
} else if (!ele && siteData.autoDownload[0] == 1 || !ele && options.autoDownload == 1) {
fun.show(displayLanguage.str_36, 0);
options.autoDownload = 0;
let jsonStr = JSON.stringify(options);
localStorage.setItem("FullPictureLoadOptions", jsonStr);
}
};
const imgZipDownload = async () => {
if (checkGeting() || ge("#FullPictureLoadOptions:not([style])")) return;
let selector, titleText;
if (fastDownload) {
typeof siteData.imgs == "function" ? selector = siteData.imgs : selector = options.default;
titleText = (customTitle || document.title.replace(/\[\d+p(\d+v)?\]|【\d+P】/i, "").replace(/[\/\?<>\\:\*\|":]/g, " ").trim());
} else {
if (!siteData.autoDownload || siteData.autoDownload && siteData.autoDownload[0] != 1 && options.autoDownload != 1) {
//typeof siteData.imgs == "function" ? selector = siteData.imgs : await prompt(displayLanguage.str_50, options.default);
typeof siteData.imgs == "function" ? selector = siteData.imgs : selector = options.default;
titleText = await prompt(displayLanguage.str_51, (customTitle || document.title.replace(/\[\d+p(\d+v)?\]|【\d+P】/i, "").replace(/[\/\?<>\\:\*\|":]/g, " ").trim()));
} else if (siteData.autoDownload) {
if (siteData.autoDownload[0] == 1 || options.autoDownload == 1) {
selector = siteData.imgs;
titleText = (customTitle || document.title.replace(/\[\d+p(\d+v)?\]|【\d+P】/i, "").replace(/[\/\?<>\\:\*\|":]/g, " ").trim());
} else {
debug("未開啟自動下載");
return;
}
}
}
let imgsSrcArr = await getImgs(selector);
downloading = true;
if (imgsSrcArr.length > 0 && titleText != null && titleText != "") {
fun.show(displayLanguage.str_55, 0);
const imgsNum = parseInt(imgsSrcArr.length, 10);
let title = titleText;
const zip = new JSZip();
let zipFolder;
let videosNum;
if (videosSrcArray.length > 0 && siteData.downloadVideo && siteData.downloadVideo == true) {
videosNum = parseInt(videosSrcArray.length, 10);
zipFolder = zip.folder(`${title} [${imgsNum}P + ${videosNum}V]`);
} else {
zipFolder = zip.folder(`${title} [${imgsNum}P]`);
}
const padStart = String(imgsSrcArr.length).length;
for (let i = 0; i < imgsSrcArr.length; i++) {
let picNum = getNum(i, padStart);
let promiseBlob;
await fun.checkDownloadThread();
siteData.fetch == 1 ? promiseBlob = Fetch_API_GetData(imgsSrcArr[i], picNum, imgsNum) : promiseBlob = GM_XHR_GetData(imgsSrcArr[i], picNum, imgsNum);
promiseBlobArray.push(promiseBlob);
}
if (videosSrcArray.length > 0 && siteData.downloadVideo && siteData.downloadVideo == true) {
const padStart = String(videosNum).length;
for (let i = 0; i < videosSrcArray.length; i++) {
let videoNum = getNum(i, padStart);
let promiseBlob;
await fun.checkDownloadThread();
siteData.fetch == 1 ? promiseBlob = Fetch_API_GetData(videosSrcArray[i], videoNum, imgsNum + videosNum) : promiseBlob = GM_XHR_GetData(videosSrcArray[i], videoNum, imgsNum + videosNum);
promiseBlobArray.push(promiseBlob);
}
}
debug("\nPromiseBlobArray:", promiseBlobArray);
Promise.all(promiseBlobArray).then(async data => {
debug("\nPromiseAllData:", data);
let blobDataArray = data.filter(item => item.load); //成功下載
let errorDataArray = data.filter(item => item.error); //下載錯誤
debug("\nNewDataArray:", blobDataArray);
debug("\nErrorDataArray:", errorDataArray);
if (errorDataArray.length > 0) {
options.autoDownload = 0;
let jsonStr = JSON.stringify(options);
localStorage.setItem("FullPictureLoadOptions", jsonStr);
downloadNum = 0;
downloading = false;
/*
fun.show(`${displayLanguage.str_27}${errorDataArray.length}${displayLanguage.str_28}`, 3000);
setTimeout(() => {
fun.show(displayLanguage.str_29, 0);
}, 3100);
return;
*/
let yes = await confirm(`${displayLanguage.str_27}${errorDataArray.length}${displayLanguage.str_28}${displayLanguage.str_29}`);
if (!yes) {
promiseBlobArray = [];
blobDataArray = null;
errorDataArray = null;
return;
}
}
if (blobDataArray.length > 0) {
for (let i = 0; i < blobDataArray.length; i++) {
let ex;
let type = blobDataArray[i].blob.type;
try {
if (type == "application/octet-stream") {
ex = "webp";
} else if (type == "binary/octet-stream") {
ex = "jpg";
} else {
ex = type.split("/")[1].match(/\w+/)[0];
}
} catch (e) {
if (/^image/.test(type)) {
ex = "jpg";
} else {
console.error("\nimgZipDownload() PromiseAll blob資料格式錯誤", blobDataArray);
fun.show(displayLanguage.str_30, 0);
return;
}
}
let fileName;
if (ex == "mp4") {
fileName = `${blobDataArray[i].picNum}V.${(siteData.ex || ex)}`;
} else {
fileName = `${blobDataArray[i].picNum}P.${(siteData.ex || ex)}`;
}
if (options.zip == 1) {
//console.log(`第${n}/${blobDataArray.length}張,檔案名:${fileName},大小:${parseInt(blobDataArray[i].blob.size / 1024, 10)} Kb`);
zipFolder.file(fileName, blobDataArray[i].blob, {
binary: true
});
} else {
saveData(blobDataArray[i].blob, title + "_" + fileName);
await fun.delay(200, 0);
if (i === blobDataArray.length - 1) {
promiseBlobArray = [];
downloadNum = 0;
downloading = false;
fun.hide();
startAutoDownload();
}
}
}
if (options.zip == 1) {
zip.generateAsync({
type: "blob"
}, (metadata) => {
fun.show(displayLanguage.str_31 + metadata.percent.toFixed(2) + " %", 0);
}).then(async data => {
debug("\nZIP壓縮檔數據:", data);
let fileName;
if (videosSrcArray.length > 0 && siteData.downloadVideo && siteData.downloadVideo == true) {
fileName = `${title} [${imgsNum}P + ${videosNum}V].${options.file_extension}`;
} else {
fileName = `${title} [${imgsNum}P].${options.file_extension}`;
}
saveData(data, fileName);
promiseBlobArray = [];
downloadNum = 0;
downloading = false;
fun.hide();
startAutoDownload();
});
}
} else {
promiseBlobArray = [];
downloadNum = 0;
downloading = false;
showMsg(displayLanguage.str_43);
return;
}
});
} else {
downloading = false;
showMsg(displayLanguage.str_41);
return;
}
};
const saveImgSrcText = async () => {
if (checkGeting() || ge("#FullPictureLoadOptions:not([style])")) return;
let selector;
typeof siteData.imgs == "function" ? selector = siteData.imgs : selector = options.default;
let srcArr = await getImgs(selector);
if (srcArr.length == 0) {
showMsg(displayLanguage.str_44);
return;
}
let titleText = (customTitle || document.title);
let fileName = `${titleText}URLs.txt`;
if (videosSrcArray.length > 0) {
srcArr = srcArr.concat(videosSrcArray);
}
let str = srcArr.join("\n");
let blob = new Blob([str], {
type: "text/plain",
endings: "native"
});
saveData(blob, fileName);
showMsg(`${displayLanguage.str_101}`);
};
const copyImgSrcText = async () => {
if (checkGeting() || ge("#FullPictureLoadOptions:not([style])")) return;
let selector;
typeof siteData.imgs == "function" ? selector = siteData.imgs : selector = options.default;
let srcArr = await getImgs(selector);
siteData.insertImg ? debug("手動插入圖片") : debug("複製網址");
if (srcArr.length == 0) {
showMsg(displayLanguage.str_44);
return;
}
if ((!fun.ge(".FullPictureLoadImage") && siteData.insertImg) || siteData.repeat == 1) {
fun.insertImg(srcArr, siteData.insertImg[0], siteData.insertImg[1]);
return;
}
if (videosSrcArray.length > 0) {
srcArr = srcArr.concat(videosSrcArray);
}
let textArr = [customTitle || document.title].concat(srcArr);
let str = textArr.join("\n");
console.log(str);
copyToClipboard(str);
showMsg(`${displayLanguage.str_45}(${textArr.length - 1})`);
};
const copyToClipboard = text => {
if (navigator.clipboard && window.isSecureContext) {
return navigator.clipboard.writeText(text);
} else {
let textArea = document.createElement("textarea");
textArea.value = text;
textArea.style.position = "absolute";
textArea.style.opacity = 0;
textArea.style.left = "-999999px";
textArea.style.top = "-999999px";
document.body.appendChild(textArea);
textArea.focus();
textArea.select();
return new Promise((res, rej) => {
document.execCommand("copy") ? res() : rej();
textArea.remove();
});
}
};
const goToNo1Img = (time = 1000) => {
if (ge("#FullPictureLoadOptions:not([style])")) return;
let ele;
ge("#FullPictureLoadImgBox:not([style*=none])") ? ele = ge(".FullPictureLoadImage.small") : ele = ge(".FullPictureLoadImage");
if (ele) {
if (time != 0) showMsg(displayLanguage.str_46);
setTimeout(() => {
ele.scrollIntoView({
behavior: "smooth"
});
}, time);
}
};
const goToImg = img => {
let ele = null;
if (ge("#FullPictureLoadImgBox:not([style*=none])") && img == "first") {
ele = ge(".FullPictureLoadImage.small");
} else if (img == "first") {
ele = ge(".FullPictureLoadImage:not(.small)");
}
if (ge("#FullPictureLoadImgBox:not([style*=none])") && img == "last") {
ele = [...gae(".FullPictureLoadImage.small")].pop();
} else if (img == "last") {
ele = [...gae(".FullPictureLoadImage:not(.small)")].pop();
}
if (ele) {
ele.scrollIntoView();
}
};
const autoScrollEles = () => {
if (ge("#FullPictureLoadOptions:not([style])")) return;
let arr = siteData.scrollEle;
if (arr) fun.scrollEles(arr[0], arr[1]);
};
const toggleZoom = () => {
if (fetching || ge("#FullPictureLoadOptions:not([style])")) return;
if (options.zoom <= 10 && ge(".FullPictureLoadImage:not(.small)")) {
options.zoom == 0 ? options.zoom = 10 : options.zoom = options.zoom -= 1;
if (options.zoom == 0) cancelZoom();
ge("#FullPictureLoadOptionsZoom").value = options.zoom;
let jsonStr = JSON.stringify(options);
localStorage.setItem("FullPictureLoadOptions", jsonStr);
if (options.zoom > 0) {
[...gae(".FullPictureLoadImage:not(.small)")].forEach(img => {
img.style.width = `${options.zoom * 10}%`;
});
fun.show(`${displayLanguage.str_60} ${options.zoom * 10}%`);
}
}
};
let viewMode = 0;
const toggleImgMode = async () => {
if (fetching || ge("#FullPictureLoadOptions:not([style])")) return;
let column;
if ([...gae(".FullPictureLoadImage")].length < 1) {
fun.show("請先手動插入圖片");
return;
}
if (ge(".FullPictureLoadImage:not(.small):not([style*=none])")) {
if (ge("#FullPictureLoadImgBox")) {
ge("#FullPictureLoadImgBox").style.display = "block";
[...gae(".FullPictureLoadImage:not(.small),#FullPictureLoadEnd")].forEach(e => {
if (e.tagName == "IMG") {
e.setAttribute("style", "display:none!important;");
if (options.zoom > 0) {
e.style.width = `${options.zoom * 10}%`;
}
} else {
e.setAttribute("style", "display:none!important;");
}
});
viewMode = 1;
fun.show(displayLanguage.str_93);
return;
}
let width;
if (options.column == 2 || siteData.category == "comic") {
width = "48.8%";
column = 2;
} else if (options.column == 3) {
width = "32%";
column = 3;
} else if (options.column == 5) {
width = "19.2%";
column = 5;
} else if (options.column == 6) {
width = "16%";
column = 6;
} else {
column = 4;
hasTouchEvents() ? width = "24%" : width = "24.4%";
}
let imgBox = document.createElement("div");
imgBox.id = "FullPictureLoadImgBox";
imgBox.style.width = "100%";
imgBox.style.maxWidth = "1400px";
imgBox.style.backgroundColor = "#F6F6F6";
let srcArr1 = [...gae(".FullPictureLoadImage:not(.small)")].map(e => e.dataset.src ? e.dataset.src : e.src);
let srcArr2 = srcArr1.map((item, index, arr) => parseInt(index, 10) % 2 == 0 ? (parseInt(index, 10) + 1) == arr.length ? arr[index] : arr[parseInt(index, 10) + 1] : arr[parseInt(index, 10) - 1]);
let srcArr;
siteData.category == "comic" || (options.column == 2 && siteData.category == "hcomic") ? srcArr = srcArr2 : srcArr = srcArr1;
let padStart = String(srcArr.length).length;
let blackList = fancyboxBlackList();
srcArr.forEach((e, i) => {
let a = document.createElement("a");
if (options.fancybox == 1 && !blackList) {
a.id = "imgLocationSamll" + i;
a.dataset.fancybox = "FullPictureLoadImageSmall";
thumbnailsSrcArray.length > 0 && thumbnailsSrcArray.length == srcArr.length ? a.dataset.thumb = thumbnailsSrcArray[i] : a.dataset.thumb = e;
a.href = e;
/*
a.dataset.downloadSrc = e;
a.dataset.downloadFilename = (customTitle || document.title) + `-${String(parseInt(i, 10) + 1).padStart(padStart, "0")}P`;
*/
}
let img = new Image();
img.className = "FullPictureLoadImage small";
img.src = loading_bak;
img.dataset.src = e;
if (siteData.referrerpolicy) img.setAttribute("referrerpolicy", siteData.referrerpolicy);
fun.imagesObserver.observe(img);
let item = document.createElement("div");
item.style.width = width;
item.style.height = "auto";
//item.style.float = "left";
item.style.display = "inline-block";
siteData.category == "comic" || (options.column == 2 && siteData.category == "hcomic") ? item.style.verticalAlign = "middle" : item.style.verticalAlign = "top";
item.style.padding = "0.1%";
item.style.border = "1px solid #a0a0a0";
if (options.fancybox == 1 && !blackList) {
a.appendChild(img);
item.appendChild(a);
imgBox.appendChild(item);
} else {
item.appendChild(img);
imgBox.appendChild(item);
}
});
let tE = fun.ge("#FullPictureLoadEnd");
tE.parentNode.insertBefore(imgBox, tE);
if (fun.ge(".FullPictureLoadVideo")) {
[...fun.gae(".FullPictureLoadVideo")].forEach(e => {
tE.parentNode.insertBefore(e, tE);
});
}
if (options.fancybox == 1 && !blackList && !siteData.fancybox) {
try {
Fancybox.bind("[data-fancybox='FullPictureLoadImageSmall']", FancyboxOptions);
} catch (error) {
debug("沒有引入FancyboxV5", error);
}
}
tE.parentNode.style.textAlign = "center";
tE.parentNode.style.display = "block";
[...gae(".FullPictureLoadImage:not(.small),#FullPictureLoadEnd")].forEach(e => {
if (e.tagName == "IMG") {
e.setAttribute("style", "display:none!important;");
if (options.zoom > 0) e.style.width = `${options.zoom * 10}%`;
} else {
e.setAttribute("style", "display:none!important;");
}
});
viewMode = 1;
fun.show(displayLanguage.str_93);
let imgs = [...gae("#FullPictureLoadImgBox>div")];
let imgsNum = 0;
if (imgs[0].nextSibling && siteData.category == "comic") {
await fun.checkImgStatus(imgs[0].nextSibling.querySelector("img").dataset.src, "Wait Loading...");
if (imgs[0].offsetHeight < imgs[0].nextSibling.offsetHeight) {
imgs[0].style.height = (imgs[0].nextSibling.offsetHeight) + "px";
let img = imgs[0].querySelector("img");
await fun.checkImgStatus(img.dataset.src, "Wait Loading...");
let num = (imgs[0].offsetHeight - img.height) / 2;
img.style.marginTop = `${num}px`;
}
imgs[0].scrollIntoView();
}
document.addEventListener("keydown", async event => {
if (ge("#FullPictureLoadOptions:not([style])")) return;
if (event.key == "ArrowUp") {
if (ge(".fancybox-container,.fancybox__container")) return;
event.preventDefault();
if (imgsNum > 0 && viewMode == 1) {
imgsNum -= column;
imgs[imgsNum].scrollIntoView();
}
} else if (event.key == "ArrowDown") {
if (ge(".fancybox-container,.fancybox__container")) return;
event.preventDefault();
if (imgsNum < imgs.length && imgsNum != imgs.length && viewMode == 1) {
imgsNum += column;
try {
if (imgs[imgsNum].nextSibling && siteData.category == "comic") {
debug(`\n第${parseInt(imgsNum, 10) + 1}張(左)高:${imgs[imgsNum].offsetHeight}\n第${parseInt(imgsNum, 10) + 2}張(右)高:${imgs[imgsNum].nextSibling.offsetHeight}`);
await fun.checkImgStatus(imgs[imgsNum].nextSibling.querySelector("img").dataset.src, "Wait Loading...");
if (imgs[imgsNum].offsetHeight < imgs[imgsNum].nextSibling.offsetHeight) {
imgs[imgsNum].style.height = (imgs[imgsNum].nextSibling.offsetHeight) + "px";
let img = imgs[imgsNum].querySelector("img");
await fun.checkImgStatus(img.dataset.src, "Wait Loading...");
let num = (imgs[imgsNum].offsetHeight - img.height) / 2;
debug(`\n修改了之後\n第${parseInt(imgsNum, 10) + 1}張(左)高:${imgs[imgsNum].offsetHeight}\n第${parseInt(imgsNum, 10) + 2}張(右)高:${imgs[imgsNum].nextSibling.offsetHeight}`);
img.style.marginTop = `${num}px`;
}
} else if (siteData.category == "comic") {
imgs[imgsNum].src = imgs[imgsNum].dataset.src;
await fun.checkImgStatus(imgs[imgsNum].dataset.src, "Wait Loading...");
}
imgs[imgsNum].scrollIntoView();
} catch (e) {
if (siteData.category == "comic" && siteData.next && siteData.insertImg) {
if (typeof siteData.next === "string") {
let next = fun.ge(siteData.next);
if (next) {
fun.show(displayLanguage.str_95, 3000);
//next.click();
elementClick(next);
} else {
imgsNum = 0 - column;
fun.show(displayLanguage.str_96, 3000);
}
} else if (typeof siteData.next === "function") {
let next = await siteData.next();
if (next) {
fun.show(displayLanguage.str_95, 3000);
location.href = next;
} else {
imgsNum = 0;
fun.show(displayLanguage.str_96, 3000);
}
}
} else {
imgsNum = 0;
imgs[0].scrollIntoView();
fun.show(displayLanguage.str_94);
}
}
}
} else {
imgsNum = 0 - column;
}
});
} else if (ge(".FullPictureLoadImage.small")) {
ge("#FullPictureLoadImgBox").style.display = "none";
[...gae(".FullPictureLoadImage:not(.small),#FullPictureLoadEnd")].forEach(e => {
e.removeAttribute("style");
});
if (options.zoom > 0) {
[...gae(".FullPictureLoadImage:not(.small)")].forEach(img => {
img.style.width = `${options.zoom * 10}%`;
});
}
viewMode = 0;
fun.show(displayLanguage.str_92);
}
};
const cancelZoom = () => {
if (ge("#FullPictureLoadOptions:not([style])")) return;
if (ge(".FullPictureLoadImage:not(.small)")) {
options.zoom = 0;
ge("#FullPictureLoadOptionsZoom").value = options.zoom;
let jsonStr = JSON.stringify(options);
localStorage.setItem("FullPictureLoadOptions", jsonStr);
[...gae(".FullPictureLoadImage:not(.small)")].forEach(e => {
e.style.width = "";
});
fun.show(displayLanguage.str_61);
}
};
const addFullPictureLoadButton = () => {
let img = new Image();
img.id = "FullPictureLoad";
img.className = "FullPictureLoadFixedBtn";
img.src = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAACFlBMVEVEREAAAABEREBEREBUXnFTXXBTXG5VXXJUXHFUW28grV0grV0hrl4hrV0hq10iql0oomAhrV2BiZiAiJd/h5V+h5Uiq16OlaKNlKGMk5+Mkp+KkZ89p28nq2Hp9+/n9u3t8PHs7/Dg9Ojp7O3d8+bo7O3o6+zn6+3m6uzl6evX8OLV8OHi5ujh5efO7dze4uTe4ePb3+LY3eDX29/W2t7T19u35Mu25Mr01lqw4sbz1Vmv4sXA1NWs4cPw0lnv0lmp4MCk3r3ozVuh3buu0M6vz83kylugysefycadx8OexsOdxsOF0qZ6zp5pyJK1p2S0pmOsoGRWv4SLlKEmuZpBsnc5t3AmuJmQi2ont5kmtpcptJiOiWg0tWwytGorr5Yqr5YsrpUws2kqrJRNmpMusmcsqpIuqJMssWkqsWQqsGUnsGUzoI8lsGGAf2wkr2Ekr2BzfI0irl8hrl5ye4x9fGogrWAhrV03mIwgrF9xeoshq10gql8dp2ccp2cdpmkcnIUanIYcm4QRoIUTnoURn4QdmYM/h4QcmIMSnYMXmoMWmoIbloIclYJDgYIYl4EaloAek4IfkYFqbm0jjoBqbW0ni4ApiX9Hd35kanBjaXBhaG9MbnpOanhOaXhPaHdDbXZHanZGanRLZnZJZ3RSYnVMZXRPY3ROY3VSYXRQYnRTYHRVX3NUX3RSYHNUXnNTXXJTXXFME6frAAAAHnRSTlMAAAUGZ2dqeHh7lrzNzc7O3O/09PT19fn5+fn5/f4hZOrvAAAB1UlEQVR42oWTzYoTQRSFv6q6RqOoqBicTTCKK1cOURBGBV9AXCgu9Vl8FF/ApcshI4qKgrtBByZK0HSGmMxkMrF/qq6LTjptErGX5zu3uu65dY3TYCh9ag2UNPsfjnmpZW4MgBbaIy/6PCnxvL7gEQhJ7AruAqifcZ96EHDX67ngKgCJn/k3B6AC1O9Cj9ri/2mBsZIf9iLi0rMFDhhjbO6NsL9er+CQG3pYMT+XuGVmuH9SzPF7S/UONDfUHl44/6A24wfdpMgsSO6tP52ffxjF6cUT056MBdxf/cVRzP6PiQG8KhZMJedhewik0QT43RsBQUEwLufZx53Td85p7wCwEu+Fs6qAGBsA1aO3XUZbG/EAsAJJlM/MGgOoDltdYNTam3JIOlVmOaj2N/sAjHf9lGdBqwACmmi0FU/TOWxfEY483o/9tcuvJBXU+90PaZHf5NtVFzTL+N7bqD4GS9DRmzl3btJWk2WFIKradqX8LfudU3VKBuKd0vwc+HCjNDJhkJXfB6jq+wZJBSAT5MmKN1/la7sJ+jmsiyQrdkZo9N819FNnXcSZFTt1rGnXhl/G6a26IP/YOXczi5prQmFY3snbkzNSXGyBV+28p+nNF+vn2h97PvHD5SOHkgAAAABJRU5ErkJggg==";
img.setAttribute("title", displayLanguage.str_47);
img.oncontextmenu = () => false;
img.addEventListener("click", () => {
fastDownload = false;
imgZipDownload();
});
img.addEventListener("mousedown", (event) => {
if (event.button == 1) {
event.preventDefault();
//goToNo1Img(0);
saveImgSrcText();
}
if (event.button == 2) {
event.preventDefault();
copyImgSrcText();
}
});
document.body.appendChild(img);
let img2 = new Image();
img2.id = "FullPictureLoadGoToFirstImage";
img2.className = "FullPictureLoadFixedBtn";
img2.style.display = "none";
img2.src = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAA7BJREFUWEetl29olVUYwH/n3jvvGpp/WtNlIdoK1MJazBwO0/mlZqFgRCgGfZC7TTbwixqbMnPiHIIwmdd9MYiMhD4o6gqirenGsoF/MLfaahFz3a1Shlv7e9/3yHnnxXvv3vee96574P3wcp4/v/M8z3nOOQK3o67Oj2+0EMlWPKxEkg3Wp0YIQQiTLgQXCWc0UV4+4ca00Ao1HM3G8B0CuROYp5WfFhgGcQ5v+FMCFaFEOs4An1WlM+6vRIq9QIZLx/Fiowh5kvSJaj6uGrezYQ9QX7sEYV4A3pyl43i160jPNvbsG4ifmAlwquZVfDQieV7nfJE/3RJ5MGG7uFh1wT3CFFF24E70RCyAWrnH7NA5V0pH8gooW51r2Tp19wYHO1qROmIFYXryoiPxBEDlfCz9B13YlULd+s0EVq6JcdfQdZvytu/1EHCdp8Y3RmriCUDwWDVSVOgq1s55RMc1hJBHKfmkUulNA1hbzftbomp3Wnk8sEuIUbxGjtqi0wCnjwdBFjut3q3z5CIhzlC6v0Qw3eH+cWoyyTpPAmKYcMazgtM17wCNTk0iUc51Re8iHUWC+pozCAJ2DeL/OHcVCUmDIFjTgmRDPMDB3HzUl4qxq7mR87//MtOU4KpKQTfwUvTsgjl+QrtK8Qr9WeUGsG2gn02Xz9uJ9iiAYWBu9OwbmYtp36YOv9SM/8JTZH1ez5RpxhscsQWYP8fPnzsCZPh8MQph0+THv0MULFlqS9Y60M+6rGx8Hk/M/Nlf71B87Ts7HQtgRgqUZNkruZxYt/Fxp4JJ0+Cj5m/IeXoB1XkFtgCVHa10Dt2ndu0GcuYvtGR+fvAvO5uu0DV03yEFDkWopNVqtix70QrdFz2d9D4cYt+atQkBam//ZEFvXrqMCcPg2sA95zxaReiwDZ203AC4rhxrGyZoRHaGUgoARdpWHA+RQoDHrVh50BxG0RApBAhSeqDU9XEcgUgRwAhpRg67KwaTupAoiD2rX+dk/ibbOtvb3kz93Zv6GhTiECX7jyjBpK9k+Yufo+W9D22dvHXpK9oH/9IAiDYyxwr5oGoyFkD9ubyUfln4Lu+veDnG0de93exouqxz3kdaOE+FPiI4q2u5OqRKVr3G2y8st+x82/cHwc5bGDLRvVj0Ycgtia/lEayUP0xEG2nh7dErd45AZCY1T7MRhKjlmbHjkZzH50h/4M/ucfoQOEeacdhu1dEQeoCItPPzXCVenTj9SNmJ4BLeRS0EAlP6/QiPAMXOipDq4W0VAAAAAElFTkSuQmCC";
img2.setAttribute("title", displayLanguage.str_62);
img2.addEventListener("click", () => {
goToImg("first");
});
document.body.appendChild(img2);
let img3 = new Image();
img3.id = "FullPictureLoadGoToLastImage";
img3.className = "FullPictureLoadFixedBtn";
img3.style.display = "none";
img3.src = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAA6lJREFUWEfFl21IlWcYx3/3c46vayG1lq5i5FablrQFbon2oiOYzlgfgsY2gvrinCQEwzayklI69SVQPMdDH4KJMkZBoxf6kpkYVjK32FqgtiGbs8xczeF0O5477ucknZfnzaPUDc+n57ru/++67uu6XwROh9+fwNToRiRbECIbWAIsBQQwhGCIILcRfEcgtY3KykknUytn63GibjH/uw4CnwDz7cyf/B8D0YIrcIiyfUNWPuYA39Yk8iBlL1JWAfMcCkebjSPkcZIna9lZM2E0hzGAHrX7NMj8OIWj3a4jta1UVN2N/hEL0ODJwSXOg1xmJu4SgvLst3h/2XLd5OLvv+H75UempDTnFfxBgBJ2f/lTuFEkQCjybitx5dxaVMq2zJURYqd+7eXjtnPWCVMQQS03PBNPAdSaj6S02aU9b/ErXNnykaHQxrPf0HXvT7tVu07KxKbpmngK4Du6HykP2XlXrHqb43mFhmZ7ui7TeOsHuylAyDrKv6pWhiGAUKv1O6n2qjXvUJtbYChS3d3JsZs37AFgHNfU66pFQwBejxcod+I5RwAq9iY+31suqK9Pwj1+H3jx2QIwRiB1kcDrKQYuOBFXNnOXAV2xRNDoaUJQ9lwAJH6Bz3MFyQYzgPXpS0lyubg0OIDaZpxkIHN+Gp+uyCZB0zg/cIdrwybHgaBDLUEvsCIaICttIS1FH7B6wUv6r/5Hf1F1o4PstIWWXdD/90O+LiwmUXPpfgr6i2vtNPzcYxRjnwIYM2q/pvWb2fVGToRTIBjUoylIVydx7Oi8O8i6lzNwa1rEz/FAgFdb/Tz6L+aE/scQQKVueEcFL7gTnJaGrV3emRa+H7kXbacDGC7B5dLt5JtEaqsWZaAOqYxmLw9jM9BnWoTbX3uT5sKSmWoZ2h/u6UJ9MUMvQpM2VFtkff57lGWtmRWE//ZNKq9e0osxZuhtaLERzRbCUjxEU2K7FccL4UD8yVasOLxHfSA/M8v1TCEciIcdRkrVX5fBlH4cp84Wwpl49HGsVH1HapFin1XF2WXCobjBhUSpnqxJ5t/kduDdeCAci4PJlUypNh5LRwt2I/UXj+lQmTicW8DuVWt1m4ZbPezv7jRutfBZLC+l04bqWu7mgh2EMl+QlKx7jU4avjkiA3B0LZ92UZkQwTN2yzGDHWoGD5PpWVVNTCRVI8Ueq+6wgYjzaRY+q96i7gMg1ePU0b0RmIPHaXRooctrEZIP0chCkgH6p0bcz/PHF6yIkDG/FFMAAAAASUVORK5CYII=";
img3.setAttribute("title", displayLanguage.str_63);
img3.addEventListener("click", () => {
goToImg("last");
});
img3.addEventListener("mousedown", (event) => {
if (event.button == 2) {
event.preventDefault();
saveImgSrcText();
}
});
document.body.appendChild(img3);
};
const elementClick = ele => {
const dispatchTouchEvent = (_ele, type) => {
let touchEvent = document.createEvent("UIEvent");
touchEvent.initUIEvent(type, true, true);
touchEvent.touches = [{
clientX: 1,
clientY: 1
}];
_ele.dispatchEvent(touchEvent);
};
if (hasTouchEvents()) {
dispatchTouchEvent(ele, "touchstart");
dispatchTouchEvent(ele, "touchend");
}
ele.click();
/*
if (hasTouchEvents()) {
ele.dispatchEvent(new Event("touchstart"));
ele.dispatchEvent(new Event("touchend"));
//ele.click();
debug("\nelementClick touch事件式點擊\n", ele);
} else {
//ele.dispatchEvent(new Event("click"));
ele.click();
debug("\nelementClick click事件式點擊\n", ele);
}
*/
};
const addReturnTopButton = () => {
let a = document.createElement("a");
a.href = "javascript:void(0);";
a.setAttribute("onclick", "window.scrollTo({top:0,behavior:'smooth'});");
let img = new Image();
img.src = "data:image/png;base64,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";
img.className = "FullPictureLoadImageReturnTop";
a.appendChild(img);
document.body.appendChild(a);
};
const nsfw1Data = customData.filter(item => item.category == "nsfw1"); //列出寫真站
const nsfw2Data = customData.filter(item => item.category == "nsfw2"); //列出老司機站
const comicData = customData.filter(item => item.category == "comic"); //列出普漫站
const hcomicData = customData.filter(item => item.category == "hcomic"); //列出H漫站
const AIData = customData.filter(item => item.category == "AI"); //列出AI繪圖站
const autoPagerData = customData.filter(item => item.category == "autoPager"); //列出自動翻頁
const noneData = customData.filter(item => item.category == "none"); //列出未分類
const FullPictureLoadOptionsMain = document.createElement("div");
FullPictureLoadOptionsMain.id = "FullPictureLoadOptions";
FullPictureLoadOptionsMain.style.display = "none";
const FullPictureLoadOptionsMainHtmlSrt = `
<div style="width: 100%;">
<p><font color="black">${displayLanguage.str_68}</font></p>
</div>
<div style="width: 100%;">
<p><font color="black">${displayLanguage.str_69}</font></p>
<input id="FullPictureLoadOptionsIcon">
</div>
<div style="width: 100%;">
<p><font color="black">${displayLanguage.str_70}</font></p>
<input id="FullPictureLoadOptionsThreading">
</div>
<div style="width: 100%;">
<p><font color="black">${displayLanguage.str_71}</font></p>
<input id="FullPictureLoadOptionsZip">
</div>
<div style="width: 100%;">
<p><font color="black">${displayLanguage.str_72}</font></p>
<input id="FullPictureLoadOptionsExtension">
</div>
<div style="width: 100%;">
<p><font color="black">${displayLanguage.str_73}</font><font color="red">${displayLanguage.str_74}</font></p>
<input id="FullPictureLoadOptionsAutoDownload">
</div>
<div style="width: 100%;">
<p><font color="black">${displayLanguage.str_75}</font></p>
<input id="FullPictureLoadOptionsCountdown">
</div>
<div style="width: 100%; display: none;">
<p><font color="black">${displayLanguage.str_76}</font></p>
<input id="FullPictureLoadOptionsComic">
</div>
<div style="width: 100%;">
<p><font color="black">${displayLanguage.str_77}</font></p>
<input id="FullPictureLoadOptionsDouble">
</div>
<div style="width: 100%;">
<p><font color="black">${displayLanguage.str_78}</font></p>
<input id="FullPictureLoadOptionsFancybox">
</div>
<div style="width: 100%;">
<p><font color="black">${displayLanguage.str_79}</font></p>
<input id="FullPictureLoadOptionsZoom">
</div>
<div style="width: 100%;">
<p><font color="black">${displayLanguage.str_80}</font></p>
<input id="FullPictureLoadOptionsColumn">
<p><font color="black">${displayLanguage.str_81}</font></p>
</div>
<button id="FullPictureLoadOptionsCancelBtn"><font color="black">${displayLanguage.str_82}</font></button>
<button id="FullPictureLoadOptionsResetBtn"><font color="black">${displayLanguage.str_83}</font></button>
<button id="FullPictureLoadOptionsSaveBtn"><font color="black">${displayLanguage.str_84}</font></button>
`;
FullPictureLoadOptionsMain.innerHTML = FullPictureLoadOptionsMainHtmlSrt;
document.body.appendChild(FullPictureLoadOptionsMain);
const setValue = () => {
ge("#FullPictureLoadOptionsIcon").value = options.icon;
ge("#FullPictureLoadOptionsThreading").value = options.threading;
ge("#FullPictureLoadOptionsZip").value = options.zip;
ge("#FullPictureLoadOptionsExtension").value = options.file_extension;
ge("#FullPictureLoadOptionsAutoDownload").value = options.autoDownload;
ge("#FullPictureLoadOptionsCountdown").value = options.autoDownloadCountdown;
ge("#FullPictureLoadOptionsComic").value = options.comic;
ge("#FullPictureLoadOptionsDouble").value = options.doubleTouchNext;
fancyboxBlackList() ? ge("#FullPictureLoadOptionsFancybox").value = 0 : ge("#FullPictureLoadOptionsFancybox").value = options.fancybox;
ge("#FullPictureLoadOptionsZoom").value = options.zoom;
siteData.category == "comic" ? ge("#FullPictureLoadOptionsColumn").value = 2 : ge("#FullPictureLoadOptionsColumn").value = options.column;
};
ge("#FullPictureLoadOptionsCancelBtn").addEventListener("click", event => {
event.preventDefault();
ge("#FullPictureLoadOptions").style.display = "none";
});
ge("#FullPictureLoadOptionsResetBtn").addEventListener("click", event => {
event.preventDefault();
localStorage.removeItem("FullPictureLoadOptions");
location.reload();
});
ge("#FullPictureLoadOptionsSaveBtn").addEventListener("click", event => {
event.preventDefault();
options.icon = ge("#FullPictureLoadOptionsIcon").value;
options.threading = ge("#FullPictureLoadOptionsThreading").value;
options.zip = ge("#FullPictureLoadOptionsZip").value;
options.file_extension = ge("#FullPictureLoadOptionsExtension").value;
options.comic = ge("#FullPictureLoadOptionsComic").value;
options.autoDownload = ge("#FullPictureLoadOptionsAutoDownload").value;
options.autoDownloadCountdown = ge("#FullPictureLoadOptionsCountdown").value;
options.doubleTouchNext = ge("#FullPictureLoadOptionsDouble").value;
options.fancybox = ge("#FullPictureLoadOptionsFancybox").value;
options.zoom = ge("#FullPictureLoadOptionsZoom").value;
options.column = ge("#FullPictureLoadOptionsColumn").value;
let jsonStr = JSON.stringify(options);
localStorage.setItem("FullPictureLoadOptions", jsonStr);
location.reload();
});
const style = `
.fancybox-container,.fancybox__container {
z-index: 2147483647 !important;
}
.FullPictureLoadImageReturnTop {
position: fixed;
right: 10px;
bottom: 80px;
width: 53px !important;
height: 53px !important;
border: unset;
z-index: 99;
opacity: 0.6;
}
#FullPictureLoadOptions {
text-align: center;
width: auto !important;
max-width: 400px !important;
height: auto !important;
position: fixed !important;
top: 6%;
left: 50%;
margin-left: -190px;
border: 1px solid #a0a0a0 !important;
border-radius: 3px !important;
box-shadow: -2px 2px 5px rgb(0 0 0 / 30%) !important;
background-color: #FAFAFB;
z-index: 2147483647 !important;
}
#FullPictureLoadOptions * {
font: unset !important;
font-family: Arial, sans-serif !important;
font-size: 12px !important;
float: none !important;
line-height: 18px !important;
margin-bottom: 1px !important;
padding: 1px 4px !important;
width: auto;
}
#FullPictureLoadOptions button {
width: 114px;
margin-left: 2px;
margin-right: 2px;
margin-bottom: 4px !important;
display: inline-block;
border: 1px solid #a0a0a0 !important;
background-color: transparent !important;
}
#FullPictureLoadOptions input {
color: #000000 !important;
height: 20px !important;
width: 360px !important;
border: 1px solid #a0a0a0 !important;
background-color: transparent !important;
}
#FullPictureLoadOptions p {
text-align: center !important;
margin-block-start: 0px !important;
margin-block-end: 0px !important;
margin-inline-start: 0px !important;
margin-inline-end: 0px !important;
}
#FullPictureLoad {
bottom: 24px !important;
display: block !important;
}
#FullPictureLoadGoToLastImage {
bottom: 66px !important;
}
#FullPictureLoadGoToFirstImage {
bottom: 108px !important;
}
.FullPictureLoadFixedBtn {
position: fixed !important;
left: 24px !important;
width: 32px !important;
height: 32px !important;
border-radius: unset !important;
z-index: 2147483647 !important;
opacity: 1 !important;
}
.FullPictureLoadMsg {
font-family: Arial, sans-serif !important;
font-size: 24px;
font-weight: bold;
text-align: center;
line-height: 50px;
color: #ffffff;
width: 340px;
height: 50px;
top: 30%;
left: 50%;
margin-left: -170px;
padding: 0px !important;
background-color: #000;
border: 1px solid #303030;
border-radius: 10px;
position: fixed;
z-index: 2147483647;
opacity: 0.7;
}
.FullPictureLoadImage:not(.small) {
width: auto;
height: auto;
max-width: 100%;
display: block !important;
opacity: 1 !important;
border: none !important;
border-radius: unset !important;
padding: 0 !important;
margin: 0 auto !important;
}
.FullPictureLoadImage.small {
width: auto;
height: auto;
max-width: 100%;
max-height: 100% !important;
min-height: 50x !important;
display: block !important;
opacity: 1 !important;
border: none !important;
border-radius: unset !important;
padding: 0 !important;
margin: auto;
}
#FullPictureLoadImgBox {
display: block;
opacity: 1 !important;
border: none !important;
border-radius: unset !important;
padding: 0 !important;
margin: 0 auto !important;
}
a[data-fancybox=FullPictureLoadImageOriginal],a[data-fancybox=FullPictureLoadImageSmall] {
padding: 0 !important;
margin: 0 !important;
}
#FullPictureLoadEnd {
font-size: 20px;
height: 30px;
width: 100%;
line-height: 30px;
text-align: center;
margin: 5px auto !important;
}
#FullPictureLoadEnd~*:not(#FullPictureLoadOptions):not(.FullPictureLoadMsg):not(.FullPictureLoadFixedBtn):not(a[href='javascript:void(0);']):not(*[class^=fancybox]):not(div[tabindex]):not(.row):not(.text-center):not(.link-d):not(#myrating):not(.gallery-a):not(.pagination):not(div[class^=picnext]):not(a.zwf):not(p) {
display: none !important;
}
.FullPictureLoadLoading {
font-size: 20px;
text-align: center;
height: 30px;
line-height: 30px;
margin: 5px auto !important;
border: none !important;
}
#FullPictureLoad~*:not(.FullPictureLoadFixedBtn):not([id^='pv-']):not([class^='pv-']):not(.pagetual_tipsWords):not(#comicRead):not(#fab):not(.pagetual_tipsWords):not(*[class^=fancybox]):not(div[tabindex]):not(#spotlight):not(div[id^='swiper-imgbox']) {
display: none !important;
}
.autoPagerTitle {
width: auto;
height: 30px;
font-size: 18px;
color: black;
font-family: Arial, sans-serif !important;
line-height: 29px;
text-align: center;
overflow: hidden;
display: block;
margin: 10px 5px;
border: 1px solid #e0e0e0;
background-color: #f0f0f0;
background: -webkit-gradient(linear, 0 0, 0 100%, from(#f9f9f9), to(#f0f0f0));
background: -moz-linear-gradient(top, #f9f9f9, #f0f0f0);
box-shadow: 0 0 5px rgba(0, 0, 0, 0.6);
border-radius: 5px;
}
.autoPagerTitle.off {
color: white;
border: 1px solid #0e0e0e;
background-color: #0f0f0f;
background: -webkit-gradient(linear, 0 0, 0 100%, from(#9f9f9f), to(#0f0f0f));
background: -moz-linear-gradient(top, #9f9f9f, #0f0f0f);
box-shadow: 0 0 5px rgba(255, 255, 255, 0.6);
border-radius: 5px;
}
.autoPagerTitle a:-webkit-any-link {
font-family: Arial, sans-serif !important;
color: black;
}
.autoPagerTitle.off a:-webkit-any-link {
color: white;
}
.autoPagerLoading {
width: auto;
height: auto;
display: block !important;
opacity: 1 !important;
border: none !important;
border-radius: unset !important;
padding: 0 !important;
margin: 20px auto !important;
}
#FullPictureLoadOptionsBtn,
#FullPictureLoadToggleImgModeBtn,
#FullPictureLoadToggleZoomeBtn,
#FullPictureLoadCancelZoomBtn {
padding: 1px !important;
margin-top: 10px !important;
margin-bottom: 6px !important;
appearance: auto;
text-rendering: auto;
color: buttontext;
letter-spacing: normal;
word-spacing: normal;
line-height: normal;
font-size: 14px !important;
text-transform: none;
text-indent: 0px;
text-shadow: none;
display: inline-block;
text-align: center;
align-items: flex-start;
cursor: default;
box-sizing: border-box;
background-color: buttonface;
border: 1px solid #a0a0a0 !important;
}
.viewer-open:not(.fancybox-active) {
overflow: unset !important;
padding-right: 0px !important;
}
.fancybox-infobar *,.fancybox__infobar,a[data-fancybox-download],a[data-fancybox-download]:hover,a[data-fancybox-download]:link,a[data-fancybox-download]:visited,a[data-fancybox-download]:active {
color: white;
}
`;
const checkOptionsData = async () => {
const getOptionsData = localStorage.getItem("FullPictureLoadOptions");
if (getOptionsData === null && options.autoDownload !== 1) {
let jsonStr = JSON.stringify(options);
localStorage.setItem("FullPictureLoadOptions", jsonStr);
} else if (options.autoDownload !== 1) {
let optionsJson = JSON.parse(getOptionsData);
if (optionsJson.fancybox != 1 && optionsJson.fancybox != 0) {
localStorage.removeItem("FullPictureLoadOptions");
let jsonStr = JSON.stringify(options);
localStorage.setItem("FullPictureLoadOptions", jsonStr);
if (!fun.ge(".FullPictureLoadMsg")) fun.addFullPictureLoadMsg();
if (!fun.ge(".FullPictureLoadStyle")) fun.css(style);
debug("圖片全載更新已初始化設定");
} else {
options = optionsJson;
}
debug("\nFull Picture Load Options Json\n", options);
}
};
const Fancyboxl10nV5 = async () => {
await new Promise(resolve => {
let num = 0;
let loop = setInterval(() => {
num++;
try {
if (typeof Fancybox === "function") {
clearInterval(loop);
resolve();
}
} catch (e) {}
if (num >= 5) {
clearInterval(loop);
resolve();
console.error("FancyboxV5 注入逾時");
return;
}
}, 100);
});
try {
switch (language) {
case "zh-TW":
Fancybox.defaults.l10n = {
PANUP: "上移",
PANDOWN: "下移",
PANLEFT: "左移",
PANRIGHT: "右移",
ZOOMIN: "放大",
ZOOMOUT: "縮小",
TOGGLEZOOM: "切換縮放等級",
TOGGLE1TO1: "切換縮放等級",
ITERATEZOOM: "切換縮放等級",
ROTATECCW: "逆時針旋轉",
ROTATECW: "順時針旋轉",
FLIPX: "水平翻轉",
FLIPY: "垂直翻轉",
FITX: "水平適應",
FITY: "垂直適應",
RESET: "重設",
TOGGLEFS: "切換全螢幕",
CLOSE: "關閉",
NEXT: "上一個",
PREV: "下一個",
MODAL: "使用 ESC 鍵關閉",
ERROR: "發生了錯誤,請稍後再試",
IMAGE_ERROR: "找不到圖像",
ELEMENT_NOT_FOUND: "找不到 HTML 元素",
AJAX_NOT_FOUND: "載入 AJAX 時出錯: 未找到",
AJAX_FORBIDDEN: "載入 AJAX 時出錯: 被阻止",
IFRAME_ERROR: "載入頁面出錯",
TOGGLE_ZOOM: "切換縮放等級",
TOGGLE_THUMBS: "切換縮圖",
TOGGLE_SLIDESHOW: "切換幻燈片",
TOGGLE_FULLSCREEN: "切換全螢幕",
DOWNLOAD: "下載"
};
break;
case "zh-CN":
Fancybox.defaults.l10n = {
PANUP: "上移",
PANDOWN: "下移",
PANLEFT: "左移",
PANRIGHT: "右移",
ZOOMIN: "放大",
ZOOMOUT: "缩小",
TOGGLEZOOM: "切换缩放级别",
TOGGLE1TO1: "切换缩放级别",
ITERATEZOOM: "切换缩放级别",
ROTATECCW: "逆时针旋转",
ROTATECW: "顺时针旋转",
FLIPX: "水平翻转",
FLIPY: "垂直翻转",
FITX: "水平适应",
FITY: "垂直适应",
RESET: "重置",
TOGGLEFS: "切换全屏",
CLOSE: "关闭",
NEXT: "上一个",
PREV: "下一个",
MODAL: "使用 ESC 键关闭",
ERROR: "发生了错误,请稍后再试",
IMAGE_ERROR: "找不到图像",
ELEMENT_NOT_FOUND: "找不到 HTML 元素",
AJAX_NOT_FOUND: "载入 AJAX 时出错: 未找到",
AJAX_FORBIDDEN: "载入 AJAX 时出错: 被阻止",
IFRAME_ERROR: "加载页面出错",
TOGGLE_ZOOM: "切换缩放级别",
TOGGLE_THUMBS: "切换缩略图",
TOGGLE_SLIDESHOW: "切换幻灯片",
TOGGLE_FULLSCREEN: "切换全屏",
DOWNLOAD: "下载"
};
break;
};
Fancybox.defaults.animated = false;
debug("\nFancybox 5.0.xx 預設選項物件 Fancybox.defaults\n", Fancybox.defaults);
} catch (error) {
if (!siteData.fancybox) {
try {
const jcss = "https://cdn.jsdelivr.net/npm/@fancyapps/[email protected]/dist/jquery.fancybox.min.css";
const fancyBoxCss = await fetch(jcss).then(res => res.text());
fun.css(fancyBoxCss);
} catch (error) {
console.error("\ncdn.jsdelivr.net [email protected] jquery.fancybox.min.css 注入失敗", error);
const bcss = "https://cdn.bootcdn.net/ajax/libs/fancybox/3.5.7/jquery.fancybox.min.js";
const fancyBoxCss = await fetch(bcss).then(res => res.text());
fun.css(fancyBoxCss);
}
}
debug("沒有引入FancyboxV5", error);
}
};
const Fancyboxi18nV3 = async () => {
if (siteData.fancybox.js === false) return;
let str = `
switch (language) {
case "zh-TW":
$.fancybox.defaults.i18n.tw = {
"CLOSE": "關閉",
"NEXT": "下一個",
"PREV": "上一個",
"ERROR": "無法載入請求的內容。 <br/> 請稍後重試。",
"PLAY_START": "開始幻燈片",
"PLAY_STOP": "暫停幻燈片",
"FULL_SCREEN": "全螢幕",
"THUMBS": "縮圖",
"DOWNLOAD": "下載",
"SHARE": "分享",
"ZOOM": "縮放"
};
$.fancybox.defaults.lang = "tw";
break;
case "zh-CN":
$.fancybox.defaults.i18n.cn = {
"CLOSE": "关闭",
"NEXT": "下一个",
"PREV": "上一个",
"ERROR": "无法加载请求的内容。 <br/> 请稍后重试。",
"PLAY_START": "开始幻灯片",
"PLAY_STOP": "暂停幻灯片",
"FULL_SCREEN": "全面屏",
"THUMBS": "缩略图",
"DOWNLOAD": "下载",
"SHARE": "分享",
"ZOOM": "缩放"
};
$.fancybox.defaults.lang = "cn";
break;
}
`;
new Function("language", str)(language);
};
const FancyboxOptionsV3 = () => {
if (siteData.fancybox.js === false) return; //"download",
let str = `
$.fancybox.defaults.buttons = ["zoom", "slideShow", "fullScreen", "thumbs", "close"];
$.fancybox.defaults.loop = true;
$.fancybox.defaults.toolbar = true;
console.log("fancybox 3.5.7 選項物件",$.fancybox.defaults);
`;
new Function(str)();
};
let showOptions = false;
for (let i = 0; i < customData.length; i++) {
let check = null;
if (typeof customData[i].reg === "object") {
check = customData[i].reg.test(siteUrl);
} else if (typeof customData[i].reg === "function") {
check = await customData[i].reg();
}
if (check) {
let category = customData[i].category;
if (category === "comic" && customData[i].enable === 0) {
showOptions = true;
ge("#FullPictureLoadOptions>div:nth-child(8)").style.display = "";
}
let delay = customData[i].delay;
if (delay) await fun.delay(delay, 0);
options.enable = 1;
if (customData[i].enable == 0) {
await checkOptionsData();
if (options.comic == 1 && category === "comic") {
showOptions = true;
options.enable = 1;
debug("\n漫畫類預設關閉的此站規則已開啟");
} else {
//showOptions = true;
options.enable = 0;
debug("\n此規則禁用", customData[i]);
continue;
}
}
if (customData[i].enable != 0) await checkOptionsData();
let include = customData[i].include;
if (include) {
if (!fun.ge(include)) {
options.enable = 0;
debug("\n頁面沒有包含必須元素", customData[i]);
continue;
}
}
let exclude = customData[i].exclude;
if (exclude) {
if (fun.ge(exclude)) {
options.enable = 0;
debug("\n頁面包含排除元素", customData[i]);
continue;
}
}
siteData = customData[i];
if (siteData.category != "none") showOptions = true;
if (!ge(".FullPictureLoadMsg")) fun.addFullPictureLoadMsg();
if (!ge(".FullPictureLoadStyle")) fun.css(style);
let css = customData[i].css;
if (css) fun.css(css);
let initCode = customData[i].init;
if (initCode) {
if (typeof initCode == "string") {
await new Function("siteData", "fun", '"use strict";' + initCode)(siteData, fun);
} else if (typeof initCode == "function") {
await initCode();
}
}
if (options.fancybox == 1 && !siteData.fancybox && category !== "none" && !siteData.autoPager) {
//const fancyBoxCssHtml = `<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fancyapps/[email protected]/dist/fancybox/fancybox.css">`;
//document.head.insertAdjacentHTML("beforeend", fancyBoxCssHtml);
if (typeof Fancybox === "function") {
try {
const jcss = "https://cdn.jsdelivr.net/npm/@fancyapps/[email protected]/dist/fancybox/fancybox.css";
const fancyBoxCss = await fetch(jcss).then(res => res.text());
fun.css(fancyBoxCss);
} catch (error) {
console.error("\ncdn.jsdelivr.net CSS注入失敗", error);
const bcss = "https://cdn.bootcdn.net/ajax/libs/fancyapps-ui/5.0.22/fancybox/fancybox.css";
const fancyBoxCss = await fetch(bcss).then(res => res.text());
fun.css(fancyBoxCss);
}
}
await Fancyboxl10nV5();
} else if (options.fancybox == 1 && category !== "none" && !siteData.autoPager && siteData.fancybox.v == 5 && siteData.fancybox.insertLibrarys == 1) {
//加規則
/*
fancybox: {
v: 5,
insertLibrarys : 1
},
*/
await addLibrarysV5();
await Fancyboxl10nV5();
} else if (options.fancybox == 1 && category !== "none" && !siteData.autoPager && siteData.fancybox.v == 3 && siteData.fancybox.insertLibrarys == 1) {
//加規則
/*
fancybox: {
v: 3,
insertLibrarys : 1
},
*/
await addLibrarysV3();
Fancyboxi18nV3();
FancyboxOptionsV3();
}
if (customData[i].imgs) {
options.default = customData[i].imgs;
debug(`\nCSS/Xpath/JS選擇器:${options.default}`);
}
if (customData[i].threading) {
options.threading = customData[i].threading;
debug("\n下載線程數:" + options.threading);
}
let titleCode = customData[i].customTitle;
if (titleCode) {
const getTitle = async () => {
if (typeof titleCode == "string") {
customTitle = await new Function("siteData", "fun", '"use strict";' + titleCode)(siteData, fun);
} else if (typeof titleCode == "function") {
customTitle = await titleCode();
}
};
await getTitle();
debug(`\n自定義標題:${customTitle}`);
if (customData[i].observerTitle) {
new MutationObserver(async () => {
await getTitle();
debug(`\n自定義標題:${customTitle}`);
}).observe(document.body, {
childList: true,
subtree: true
});
}
}
let next = customData[i].next;
if (next) {
let link = null;
typeof next === "function" ? link = await next() : link = fun.ge(next);
debug("\n圖片全載NEXT\n", link);
const callback = () => {
if (typeof next === "function") {
fun.show(displayLanguage.str_34, 0);
/^http/.test(link) ? location.href = link : fun.show(displayLanguage.str_37);
} else if (typeof next === "string") {
if (link) {
//link.click();
elementClick(link);
fun.show(displayLanguage.str_35);
} else {
fun.show(displayLanguage.str_37);
}
}
};
if (hasTouchEvents() && options.doubleTouchNext == 1) {
document.addEventListener("dblclick", () => {
callback();
});
}
document.addEventListener("keydown", event => {
if (ge(".fancybox-container,.fancybox__container")) return;
let key = window.event ? event.keyCode : event.which;
if (key == 39) callback();
});
}
let prev = customData[i].prev;
if (typeof prev == "string" && prev != 1) {
document.addEventListener("keydown", event => {
if (ge(".fancybox-container,.fancybox__container")) return;
let key = window.event ? event.keyCode : event.which;
if (key == 37) {
event.preventDefault();
let ele = fun.ge(prev);
if (ele) {
//ele.click();
elementClick(ele);
fun.show(displayLanguage.str_39);
} else {
fun.show(displayLanguage.str_40);
}
}
});
} else if (prev == 1) {
document.addEventListener("keydown", (event) => {
if (ge(".fancybox-container,.fancybox__container")) return;
let key = window.event ? event.keyCode : event.which;
if (key == 37) {
event.preventDefault();
fun.show(displayLanguage.str_38);
history.back();
}
});
}
let autoClick = customData[i].autoClick;
if (autoClick) {
if (typeof autoClick == "object") {
setTimeout(() => {
let ele = fun.ge(autoClick[0]);
if (ele) {
elementClick(ele);
debug(`\n圖片全載autoClick("${autoClick}")`, ele);
}
}, autoClick[1] || 1000);
} else if (typeof autoClick == "string") {
let ele = fun.ge(autoClick);
if (ele) {
elementClick(ele);
debug(`\n圖片全載autoClick("${autoClick}")`, ele);
}
}
}
let observerClick = customData[i].observerClick;
if (observerClick) {
let ele = fun.ge(observerClick);
if (ele) {
const observer = new IntersectionObserver((entries, observer) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
observer.unobserve(entry.target);
elementClick(entry.target);
debug(`\n圖片全載observerClick("${observerClick}")`, entry.target);
setTimeout(async () => {
if (await fun.waitEle(observerClick, 30)) observer.observe(fun.ge(observerClick));
}, 1000);
}
});
});
setTimeout(() => {
observer.observe(ele);
}, 1000)
}
}
let loadMore = customData[i].loadMore;
if (loadMore) {
const callback = () => {
if (window.innerHeight + window.pageYOffset >= document.body.offsetHeight - 200) {
document.removeEventListener("scroll", callback);
let ele = fun.ge(loadMore);
if (ele) {
elementClick(ele);
debug(`圖片全載loadMore("${loadMore}")`);
}
setTimeout(async () => {
if (await fun.waitEle(loadMore, 30)) document.addEventListener("scroll", callback);
}, 1000);
}
};
document.addEventListener("scroll", callback);
}
if (siteData.autoPager) {
if (siteData.autoPager.observer) {
let ele = [...fun.gae(siteData.autoPager.observer)].pop();
if (ele) fun.nextObserver.observe(ele);
} else {
const callback = async () => {
if (window.innerHeight + window.pageYOffset >= document.body.offsetHeight - (siteData.autoPager.bottom || 1000)) {
if (!autoPager) return;
document.removeEventListener("scroll", callback);
await fun.autoPager();
await fun.delay(siteData.autoPager.sleep || 1000, 0);
document.addEventListener("scroll", callback);
}
};
document.addEventListener("scroll", callback);
}
document.addEventListener("dblclick", () => {
fun.toggleAutoPager();
});
}
let openInNewTab = customData[i].openInNewTab;
if (openInNewTab) {
const _openInNewTab = () => [...fun.gae(openInNewTab)].forEach(a => {
a.setAttribute("target", "_blank");
});
_openInNewTab();
new MutationObserver(() => {
_openInNewTab();
}).observe(document.body, {
childList: true,
subtree: true
});
}
let autoDownload = siteData.autoDownload;
if (autoDownload) {
if (autoDownload[0] == 1 || options.autoDownload == 1) imgZipDownload();
}
let insertImg = customData[i].insertImg;
if (insertImg) {
if (autoDownload) {
if (autoDownload[0] == 1 || options.autoDownload == 1) break;
}
if (insertImg[1] == 1 || insertImg[1] == 2) fun.immediateInsertImg();
}
let button = customData[i].topButton;
if (button) addReturnTopButton();
break;
}
}
setValue();
if (siteData.reg) {
debug("\n列出此站資料", siteData);
debug(`\n列出規則總數(${customData.length})`);
debug("\n列出NSFW規則", nsfw1Data);
debug("\n列出NSFW+規則", nsfw2Data);
debug("\n列出COMIC規則", comicData);
debug("\n列出HCOMIC規則", hcomicData);
debug("\n列出AI繪圖規則", AIData);
debug("\n列出自動翻頁規則", autoPagerData);
debug("\n列出未分類規則", noneData);
}
if (showOptions) {
//debug("\n圖片全載開啟了GM選單?\n", showOptions);
const registerMenu = () => {
try {
GM_registerMenuCommand(displayLanguage.str_67, () => {
ge("#FullPictureLoadOptions").removeAttribute("style");
});
} catch (e) {
try {
GM.registerMenuCommand(displayLanguage.str_67, () => {
ge("#FullPictureLoadOptions").removeAttribute("style");
});
} catch (e) {}
}
}
registerMenu();
}
if (!ge(".FullPictureLoadStyle")) fun.css(style);
let autoDownload = siteData.autoDownload;
if (hasTouchEvents() || !autoDownload) {
[...gae("#FullPictureLoadOptions>div:nth-child(n+6):nth-child(-n+7)")].forEach(e => {
e.style.display = "none";
});
}
if (!hasTouchEvents()) ge("#FullPictureLoadOptions>div:nth-child(9)").style.display = "none";
if (autoDownload) {
document.addEventListener("keydown", event => {
if (ge("#FullPictureLoadOptions:not([style])")) return;
if (event.ctrlKey && event.key == ".") {
if (options.autoDownload == 0) {
fun.show(displayLanguage.str_64, 0);
options.autoDownload = 1;
let jsonStr = JSON.stringify(options);
localStorage.setItem("FullPictureLoadOptions", jsonStr);
setTimeout(() => {
location.reload();
}, 2000);
} else {
options.autoDownload = 0;
let jsonStr = JSON.stringify(options);
localStorage.setItem("FullPictureLoadOptions", jsonStr);
let endTid = setTimeout(() => {});
for (let i = 0; i <= endTid; i++) {
clearTimeout(i);
}
fun.show(displayLanguage.str_65, 0);
location.reload();
}
}
});
}
if (hasTouchEvents() && siteData.insertImg && (siteData.insertImg[1] == 0 || siteData.insertImg[1] == 3)) {
let timeId;
document.addEventListener("touchstart", event => {
//debug("\nTouchEvent\n", event);
if (event.target.tagName == "IMG" && event.target.id != "FullPictureLoad") {
timeId = setTimeout(() => {
copyImgSrcText();
}, 500);
}
});
document.addEventListener("touchmove", event => {
clearTimeout(timeId);
});
document.addEventListener("touchend", event => {
//debug("\nTouchEvent\n", event);
clearTimeout(timeId);
});
}
debug("\n最終options物件\n", options);
try {
GM_registerMenuCommand(displayLanguage.str_66, () => {
_GM_openInTab("https://greasyfork.org/scripts/463305/feedback");
});
} catch (e) {
try {
GM.registerMenuCommand(displayLanguage.str_66, () => {
_GM_openInTab("https://greasyfork.org/scripts/463305/feedback");
});
} catch (e) {}
}
if (options.enable == 1 && siteData.category != "autoPager" && siteData.category != "none") {
if (!ge(".FullPictureLoadMsg")) fun.addFullPictureLoadMsg();
if (!ge(".FullPictureLoadStyle")) fun.css(style);
if (siteData.key != 0) {
document.addEventListener("keydown", event => {
if (event.keyCode != 27) {
if (ge("#FullPictureLoadOptions:not([style])")) return;
}
switch (event.keyCode) {
case 96: //數字鍵0
fastDownload = false;
imgZipDownload();
break;
case 97: //數字鍵1
copyImgSrcText();
break;
case 98: //數字鍵2
goToImg("first");
break;
case 99: //數字鍵3
fastDownload = true;
imgZipDownload();
break;
case 100: //數字鍵4
goToImg("last");
break;
case 101: //數字鍵5
toggleImgMode();
break;
case 102: //數字鍵6
autoScrollEles();
break;
case 103: //數字鍵7
saveImgSrcText();
break;
case 109: //數字鍵-
toggleZoom();
break;
case 107: //數字鍵+
cancelZoom();
break;
case 106: //數字鍵*
ge("#FullPictureLoadOptions").removeAttribute("style");
break;
case 27: //Esc
ge("#FullPictureLoadOptions").style.display = "none";
break;
case 111: //數字鍵/
fun.show(displayLanguage.str_91);
localStorage.removeItem("FullPictureLoadOptions"); //重置當前網站的用戶設定恢復為預設選項
setTimeout(() => {
location.reload();
}, 1000);
break;
}
});
}
if (siteData.icon == 0) {
return;
} else if (options.icon == 1 || siteData.icon == 1) {
addFullPictureLoadButton();
}
}
})();