Full_Picture_Load 規則B 需要依賴AllUtils、fn、 hr、 q、getTitle、jsonHooker
Acest script nu ar trebui instalat direct. Aceasta este o bibliotecă pentru alte scripturi care este inclusă prin directiva meta a // @require https://update.greasyfork.org/scripts/586083/1908029/Full_Picture_Load_RuleDataB.js
// ==UserScript==
// @name Full_Picture_Load_RuleDataB
// @namespace https://greasyfork.org/users/20361
// @version 2026.8.21
// @description Full_Picture_Load 規則B 需要依賴AllUtils、fn、 hr、 q、getTitle、jsonHooker
// @author 德克斯DEX
// ==/UserScript==
const ruleDataB = (AllUtils, fn, hr, q, getTitle, jsonHooker) => {
const debug = (str, obj = "", title = "debug") => console.log(`%c[Full Picture Load] ${title}:`, "color: #000;background-color: #C9FFC9;", str, obj);
const delay = (time) => new Promise(resolve => setTimeout(resolve, time));
const typeOf = (object) => Object.prototype.toString.call(object).replace("[object ", "").replace("]", "");
const isString = (str) => typeOf(str) === "String";
const isNumber = (num) => typeOf(num) === "Number" && !isArray(num) && String(Number(num)) !== "NaN" && num !== "" && num !== null && num !== undefined;
const isArray = (arr) => typeOf(arr) === "Array";
const isObject = (obj) => typeOf(obj) === "Object";
const isArrayBuffer = b => typeOf(b) === "ArrayBuffer";
const isFn = fn => typeOf(fn).endsWith("Function");
const isEle = (e) => typeOf(e).endsWith("Element") || typeOf(e) === "DocumentFragment";
const {
Code,
NextJS,
island
} = AllUtils;
return [{
name: "BEAUTYLEG 腿模",
link: "http://www.beautyleg.com/photo/show.php?no=1",
url: {
h: "beautyleg.com",
p: "/photo/show",
s: "no="
},
box: [".table_all", 2, 1054],
imgs: "a[href*='/album/']",
thumbs: "a[href*='/album/'] img",
button: [4],
insertImg: ["box", 2],
insertImgAF: () => fn.hideEle(".table_all"),
next: () => `?no=${Number(fn.getUSP("no")) + 1}`,
prev: () => `?no=${Number(fn.getUSP("no")) - 1}`,
customTitle: () => {
let [no, date] = q("tr span").texts;
no = no.padStart(3, "0");
date = date.replace(/\d+$/, "").trim();
return `BEAUTYLEG 腿模(免費下載) No.${no} ${date}`;
},
category: "photo"
}, {
name: "KAI-YOU(カイユウ)",
url: {
h: "kai-you.net",
p: "/article/",
e: ".m-article-eyecatch-content-link,.m-article-images-main"
},
imgs: () => fn.clp("/images/") ? q(".m-article-images-main-swiper-slide-img") : hr.getImgA(".m-article-images-main-swiper-slide-img", [q(".m-article-eyecatch-content-link").url]),
capture: true,
videos: () => q("div.youtube[data-video]").map(e => e.dataset.video),
customTitle: ".m-article-header-title,.m-article-image-title",
category: "photo"
}, {
name: "cureco beta",
url: {
h: ["cureco.jp"],
p: "/view/"
},
imgs: () => hr.getNP(".article_tweet:has(.triangle-border)", "#pager_box .next a", null, "#pager_box").then(() => q(".attach_image")),
capture: true,
customTitle: ".article_title",
category: "photo"
}, {
name: "百度 NewsPage",
reg: [
/^https?:\/\/baijiahao\.baidu\.com\/s\?id=\d+$/,
/^https?:\/\/mbd\.baidu\.com\/newspage\/data\/landingsuper\?context=/
],
init: () => fn.waitEle(["div[data-testid=article] img", "#header div"]),
imgs: "div[data-testid=article] img",
customTitle: "#header div",
category: "photo"
}, {
name: "雅拉伊", //免VIP僅支援PC版和圖片命名是簡單數字遞增的。
url: {
h: ["www.yalayi.com"],
p: "/gallery/"
},
imgs: async () => {
await fn.waitEle(".bigimg>img");
let [max] = q(".tishiwenzi-box").text.match(/\d+/);
let img = q(".bigimg>img").one;
let dir = fn.dir(img.dataset.original);
let testArr = [dir + "1.jpg", dir + "01.jpg", dir + "001.jpg", dir + "0001.jpg"];
let ok = false;
let pad = 1;
for (let [i, test] of testArr.entries()) {
let obj = await fn.checkImgStatus(test);
console.log(`確認圖片[${i}]`, obj);
if (obj.ok) {
ok = true;
pad = i + 1;
break;
}
}
return ok ? [img.src, ...fn.arr(max, (v, i) => dir + String(i + 1).padStart(pad, "0") + ".jpg")] : [];
},
button: [4, 4],
insertImg: [".bigimg", 2],
customTitle: () => fn.title(" - ", 3),
category: "nsfw1"
}, {
name: "24FA",
host: ["www.24fa.com"],
link: "https://www.24fa.com/c49.aspx",
url: {
t: "24FA",
p: ".aspx",
e: ["#content img", ".pager"]
},
init: "document.onkeydown=null",
imgs: () => hr.getImgA("#content img", ".pager a:not([title])"),
button: [4],
insertImg: ["#content", 2],
autoDownload: [0],
next: ".prevNews>a",
prev: ".nextNews>a",
customTitle: "h1",
hide: "body>ins,body>div:has(div[style]):has(div>a[target]):not([class])",
category: "nsfw2"
}, {
name: "凸凹吧",
host: ["www.tuao.cc", "www.tuaow.top", "www.24ao.cc", "www.nnao.cc"],
url: {
e: {
s: ".top-nav>a",
t: "凸凹吧"
},
p: "/Articles/Content/",
e: "#imgData"
},
imgs: () => q("#imgData").one.value.split("|").map(atob),
button: [4],
insertImg: ["#pageContainer", 2],
insertImgAF: () => fn.remove("#pagination"),
customTitle: ".content-title",
hide: "body>div:has(>div[style]>a>img),ins",
headers: () => ({
accept: "image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8"
}),
referer: "url",
category: "nsfw2"
}, {
name: "美之图",
host: ["kkmzt.com"],
url: {
t: "美之图",
p: ["/photo/", "/beauty/"]
},
box: [".uk-article", 2],
imgs: () => jsonHooker((text, parse, resolve) => {
if ([".jpg", ".png", ".webp", ".avif", ".gif"].some(t => text.includes(t))) {
resolve(parse(text));
}
}).then(arr => {
let src = fn.src(".uk-inline>img");
let dir = fn.dir(src);
return arr.map(e => dir + e);
}),
button: [4],
insertImg: ["box", 2],
next: ".uk-text-bottom>a[rel=next]",
prev: ".uk-text-bottom>a[rel=prev]",
customTitle: "article>h1",
category: "nsfw"
}, {
name: "Depvailon格式",
url: {
h: ["www.depvailon.com", "nungvl.net", "www.kaizty.com", "lootiu.com", "redseats.org", /dongojyousan\.com$/, "thismore.fun", "m.phimvuspot.com", "www.hunghang.com"],
p: ["/gallery", "/articles/", "/photos/", "/view/", ".html", ".cfg"]
},
clearEvent: true,
init: async () => {
await fn.waitVar("jQuery");
fn.run("jQuery(document).off() && jQuery('body').off()");
fn.remove(".mobiletop,.ooo-icon-container");
},
box: [".contentme,.contentme2,.video-description", 2],
imgs: async (s = ".contentme img,.contentme2 img,.video-description img") => {
let srcs = fn.srcs(s);
let pages = document.title.includes("| Page");
if (pages) {
let max = document.title.match(/\d+/g).at(-1);
let links = fn.arr(max, (v, i) => i == 0 ? fn.lp : `${fn.lp}?page=${i + 1}`);
srcs = await hr.getImgA(s, links);
}
return fn.lh == "thismore.fun" ? srcs : fn.removeImageCDN(srcs);
},
button: [4],
insertImg: [
["box", 0, ".video-description,.contentme,.contentme2"], 2
],
customTitle: () => fn.dt({
d: [
/^[a-z-\s\.]+:/i,
/\s\|\sPage[\s\/\d]+/,
"NứngVL.net:",
/Nude Chinese Model Uncensored Gallery[\s\d–]+/,
" – Chinese Beauties",
" – DVL",
"| E-CUP"
]
}),
fetch: 0,
category: "nsfw2"
}, {
name: "Kutekorean.Com",
url: {
h: "nv.kutekorean.com",
p: ".html",
e: ["article.type-post", ".entry-content img", ".entry-title"]
},
imgs: async (s = ".entry-content img") => {
let srcs = fn.srcs(s);
let pages = document.title.includes("| Page");
if (pages) {
let max = document.title.match(/\d+/g).at(-1);
let links = fn.arr(max, (v, i) => i == 0 ? fn.lp : `${fn.lp}?page=${i + 1}`);
return hr.getImgA(s, links).then(srcs => fn.removeImageCDN(srcs));
}
return srcs;
},
button: [4],
insertImg: [".entry-content ", 2],
customTitle: () => fn.dt({
s: ".entry-title",
d: [
/[\s\|]+Page[\s\d\/]+/,
"E-CUP"
]
}),
fetch: 0,
category: "nsfw2"
}, {
name: "Hit-x-Hot",
url: {
h: "www.hitxhot.org",
p: "/gallerys/"
},
clearEvent: true,
imgs: () => {
let links = [fn.lp, ...q("div[id^=post] a").urls];
let pages = document.title.includes("| Page");
if (pages) {
let max = document.title.match(/\d+/g).at(-1);
links = fn.arr(max, (v, i) => i == 0 ? fn.lp : `${fn.lp}?page=${i + 1}`);
}
if (!links.length) return [];
return hr.getImgA(".VKSUBTSWA img", links).then(srcs => fn.removeImageCDN(srcs));
},
button: [4],
insertImg: [".VKSUBTSWA", 2],
insertImgAF: () => fn.remove(".pagination,h3+.HCRIN"),
customTitle: () => fn.dt({
t: fn.title(/^[a-z-\s\.I]+:/i).split("|")[0].trim(),
d: " - 1.jpg"
}),
fetch: 0,
category: "nsfw2"
}, {
name: "我为人人",
host: ["2048.info", "2048.cc"],
url: {
t: "人人",
p: "/read.php",
s: "tid=",
e: "#read_tpc img"
},
imgs: () => q("#read_tpc img"),
capture: true,
box: ["div:not([id]):has(>form[name=delatc]),form[name=delatc]", 1],
button: [4],
insertImg: ["box", 2],
next: ".pages .fn",
prev: ".pages a:not(.fn)",
customTitle: "#subject_tpc",
hide: ".recs-wrapper,.nav-container",
category: "nsfw2"
}, {
name: "4096社区/色花堂",
host: ["www.4096bbs.com", "4096bbs.com", "sehuatang.org"],
url: (e = "img[zoomfile],img[id^='aimg'],.message img") => fn.checkUrl({
t: ["4096", "98堂", "色花堂"],
p: "/thread",
e
}) || fn.checkUrl({
t: ["4096", "98堂", "色花堂"],
s: "viewthread",
e
}),
imgs: () => q("img[zoomfile],img[id^='aimg'],.message img"),
capture: true,
box: ["#postlist,.viewthread,div[id^=post],.n5_bbsnrbt+.plc", 1],
button: [4],
insertImg: ["box", 2],
customTitle: "#thread_subject,.view_tit,.n5_bbsnrbt",
category: "nsfw2"
}, {
name: "秀人网",
url: {
e: [{
s: [".index_bottom_text", ".piclist_bottom_container"],
t: ["xiuren.info", "xrw.info"]
}, "img[alt=图片][title=图片]+span", "img[src*='cover.jpg']", "#content img", "#NoLogin"],
p: "piclist",
s: "id="
},
imgs: () => {
let max = Number(q("img[alt=图片][title=图片]+span").text);
let src = fn.src("#content img:not(#cover)");
let dir = fn.dir(src);
let id = dir.split("/").at(-2);
let srcs = [dir + "cover.jpg"];
if (max > 99) {
max = 99;
}
for (let i = 1; i <= max; i++) {
src = dir + id + String(i).padStart(2, "0") + ".jpg";
srcs.push(src);
}
return srcs;
},
capture: true,
customTitle: ".Ptitle,.piclist_box",
category: "nsfw1"
}, {
name: "美图乐",
host: ["www.meitule.com", "www.meitule.net", "www.meitulu.cc", "www.meitu123.org"],
url: {
t: "美图乐",
p: "/photo/",
e: ".content img"
},
imgs: () => hr.getImgO(".content img", ".page-link", 9),
button: [4],
insertImg: [".content", 2],
customTitle: "h1.h5",
hide: "#dtag>center,#divpsg,.tujia,.list-album>li:nth-child(n+1):nth-child(-n+2)",
category: "nsfw1"
}, {
name: "尤美图库/M5MM",
host: ["www.umeitu.com", "www.m5mm.com"],
url: {
h: /umeitu\.com$|m5mm\.com$/,
p: ["/img/", "/photo/"]
},
imgs: () => hr.getImg(".vipimglist img", ".stitle>h1>span", 9),
button: [4],
insertImg: [".vipimglist", 2],
customTitle: () => fn.dt({
d: [
" - 尤美图库",
" - M5MM"
]
}),
css: ".vipimglist img{min-height:unset!important;}",
hide: "union[id],.sb.list2>li:nth-child(n+2):nth-child(-n+3)",
category: "nsfw1"
}, {
name: "秀窝/RMM吧/赞MM格式",
url: {
e: ["#showimg img", "//p[contains(text(),'图片数量') or contains(text(),'圖片數量')]"],
p: ".html"
},
init: () => fn.clearAllTimer(),
imgs: () => hr.getImgO("#showimg img", q("//p[contains(text(),'图片数量') or contains(text(),'圖片數量')]").text.match(/\d+/)[0], 9),
button: [4],
insertImg: ["#showimg", 2],
customTitle: ".weizhi h1",
referer: "",
mcss: ".content img{max-width:100%!important}",
category: "nsfw1"
}, {
name: "魅影图库",
host: ["www.xxtu.org", "xxtu.org"],
url: {
t: "魅影图库",
s: "p="
},
imgs: ".entry-content img",
button: [4],
insertImg: [".entry-content", 2],
autoDownload: [0],
next: ".article-nav-prev a",
prev: ".article-nav-next a",
customTitle: ".entry-title",
hide: ".ripro_gg_wrap",
category: "nsfw2"
}, {
name: "MOMO图库",
host: ["mo8.org"],
url: {
t: "MOMO图库"
},
srcset: ".entry-content img[srcset],.entry-content .wp-block-image img",
button: [4],
insertImg: [".entry-content", 2],
autoDownload: [0],
next: ".nav-previous a",
prev: ".nav-next a",
customTitle: ".entry-title",
hide: "a.show,a.show~*:not([id^=Full],[class^=fancybox],.viewer-container)",
category: "nsfw1"
}, {
name: "写真门",
host: ["xzm3096.com"],
url: {
t: "写真门",
e: [".logo a[title$=写真门]", ".article-content img[src*='/cover.'],.article-content img[src*='/0001.']"]
},
imgs: async () => {
let title = q("h1.article-title").text;
let t_num = title.match(/\[(\d+)P\]/)?.at(1);
let g_num
if (!t_num) {
g_num = prompt("请输入图片总数", 100);
}
let src = fn.src(".article-content img");
let dir = fn.dir(src);
let ex = src.split(".").at(-1);
let srcs = src.includes("/cover.") ? [src] : [];
for (let i = 1, n = Number(t_num || g_num); i <= n; i++) {
src = dir + String(i).padStart(4, "0") + "." + ex;
srcs.push(src);
}
fn.showMsg("hr.xhrHEAD(test)");
let status = await hr.xhrHEAD(srcs.at(-1)).then(res => res.status);
if (status != 200) {
srcs = srcs.slice(0, -1);
}
return srcs;
},
repeat: 1,
customTitle: "h1.article-title",
category: "nsfw1"
}, {
name: "秀人集",
host: ["3w.8012359.xyz"],
url: {
e: "//div[@class='item_info']//a[text()='秀人集']",
p: /\/\w+\/\d+\.html$/
},
init: () => q(".page").remove(0),
imgs: () => hr.getImg(".content>p img", ".page a", 3, 100),
button: [4],
insertImg: ["//div[p[img]]", 2],
autoDownload: [0],
next: "//span[contains(text(),'下一篇')]/a[contains(@href,'html')]",
prev: "//span[contains(text(),'上一篇')]/a[contains(@href,'html')]",
customTitle: ".item_title>h1",
fetch: 0,
hide: ".content br",
category: "nsfw1"
}, {
name: "秀人美女網",
host: ["www.xiu01.top"],
url: {
e: "//div[@class='single-cat']/a[text()='秀人美女网']",
p: /\/\w+\/\d+\/\d+\.html$/
},
imgs: () => hr.getImg(".content p img[alt]", ".page a", 3, 100),
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: ".item_title>h1",
fetch: 0,
hide: ".item_info>a,p[align='center']:has(>img),.item_title>div[id],.item_title>a,.content br,.bottom_fixed,.update_area_lists>div[id]",
category: "nsfw1"
}, {
name: "爱美女网",
host: ["a1.imn1.vip"],
url: {
e: "//section[@class='container']//a[text()='爱美女网']",
p: /\/\w+\/\w+\.html$/
},
imgs: () => hr.getImg(".imgwebp p img[alt]", ".page a", 3, 100),
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: ".focusbox h1+div",
fetch: 0,
hide: ".imgwebp br,img[src*='zz2.gif'],p:has(>a[title][alt]>img)",
category: "nsfw1"
}, {
name: "爱看美女网",
host: ["www.ik001.top"],
url: {
e: ["//i[@class='iconfont icon-shouye']/following-sibling::a[text()='爱看美女网']", ".info-pagebar>a"],
p: /^\/\w+\/\d+\.html$/
},
init: () => q(".pagebar").remove(0),
imgs: () => hr.getImg(".info-imtg-box img[alt]", ".pagebar>*", 3, 100),
button: [4],
insertImg: ["//p[img[@alt]]", 2],
autoDownload: [0],
next: ".info-next li:last-child a",
prev: ".info-next li:first-child a",
customTitle: "h1",
fetch: 0,
category: "nsfw1"
}, {
name: "美人图",
url: {
h: "meirentu",
p: /\/pic\/\d+\.html$/
},
imgs: () => hr.getImg(".content_left img[alt]", ".page a", 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: ".item_title>h1",
hide: "img[alt]~br",
category: "nsfw1"
}, {
name: "高清图片吧/高清写真",
host: ["pic8.cc", "www.pic882.cc", "ka123.cc", "www.ka1235.cc"],
url: {
h: /^www\.(pic|ka)\d+\.cc$/,
p: /^\/\w+\/\d+\/\d+\.html$/
},
imgs: () => hr.getImg(".content img", "#page>a,.page>*", 9),
button: [4],
insertImg: [".content", 2],
customTitle: "//div[@class='Title111']/h3[not(a)] | //div[@class='Title111']/h9[not(a)]",
hide: ".center:has(>.dibu1),.center:has(>.dibu2),[class^=pgg],#gotop~*",
category: "nsfw1"
}, {
name: "美女写真网/美女图片网",
host: ["ku137.com", "www.ku1373.cc", "ku66.cc", "www.ku6663.cc"],
url: {
h: /^www\.ku\d+\.cc$/,
p: /^\/\w+\/\d+\/\d+\.html$/
},
imgs: () => hr.getImg(".content img", ".page>a,.NewPages a", 9),
button: [4],
insertImg: [".content,.image-content", 2],
autoDownload: [0],
next: "//p[@class='BlueF'][text()='上一篇:']/a",
prev: "//p[@class='BlueF'][text()='下一篇:']/a",
customTitle: () => q(".position").text.replaceAll("\n", "").replace(/\s+/g, " ").replace("浏览", " ").split(">").at(-1),
hide: ".center:has(>.dibu1),.center:has(>.dibu2),.link2,.dibu1,.dibu2",
category: "nsfw1"
}, {
name: "美女写真网",
host: ["abc963.cc", "www.abc9632.cc"],
url: {
h: /^www\.abc\d+\.cc$/,
p: /^\/\w+\/\d+\/\d+\.html$/
},
imgs: () => hr.getImg(".image-content img", ".pagination a", 9),
button: [4],
insertImg: [".image-content", 2],
customTitle: () => q(".position").text.replaceAll("\n", "").replace(/\s+/g, " ").replace("浏览", " ").split(">").at(-1),
hide: ".dibu1,.dibu2",
category: "nsfw1"
}, {
name: "美女图库",
host: ["www.kan664.cc"],
url: {
t: "kan6.cc",
p: "/pp/"
},
imgs: () => hr.getImg(".content img", ".pages a", 9),
button: [4],
insertImg: [".content", 2],
customTitle: "div:has(>.pic-info)>h1",
hide: ".link2,.dibu1,.dibu2",
category: "nsfw1"
}, {
name: "美女图库",
host: ["wa123.cc", "app123.cc", "www.wa1237.cc"],
url: {
t: "美女图库",
p: "/wa/"
},
imgs: () => hr.getImg(".content img", "#pageNum a", 9),
button: [4],
insertImg: [".content", 2],
customTitle: "#nav~div h1:not(:has(a))",
hide: ".link2,.dibu1,.dibu2",
category: "nsfw1"
}, {
name: "多图网/七图吧",
host: ["www.duotu1231.cc", "7tuba.com", "www.773tuba.cc"],
url: {
t: ["duotu123.com", "七图吧"],
p: ["/mm/", "/html/"]
},
imgs: () => hr.getImg(".content img", "#pages a", 9),
button: [4],
insertImg: [".content", 2],
customTitle: ".header~div h1:not(:has(a)),.top~div h1",
hide: ".link2,.dibu1,.dibu2",
category: "nsfw1"
}, {
name: "美女图片网",
host: ["www.tu96334.cc"],
url: {
t: "tu963.com",
p: "/y/"
},
imgs: () => hr.getImg(".content img", ".articleV4Page a", 9),
button: [4],
insertImg: [".content", 2],
customTitle: ".articleV4Tit",
hide: ".dibu1,.dibu2",
category: "nsfw1"
}, {
name: "大图吧",
host: ["da123.cc", "www.da1232.cc"],
url: {
t: "大图吧",
p: "/to/",
e: ".breadcrumb"
},
imgs: () => hr.getImg(".content img", ".pages a", 9),
button: [4],
insertImg: [".content", 2],
customTitle: ".Title111>h9",
hide: ".link2,.dibu1,.dibu2",
category: "nsfw1"
}, {
name: "高清图片吧M/美女写真网M/美女图片网M/高清写真M/美女图库M/多图网M/大图吧M/七图吧M",
host: ["m.pic882.cc", "m.ku1373.cc", "m.ku6663.cc", "m.tu96334.cc", "m.ka1235.cc", "m.kan664.cc", "m.wa1237.cc", "m.duotu1231.cc", "m.da1232.cc", "m.abc9632.cc", "m.773tuba.cc"],
url: {
h: /^m\.(pic|ku|ka|kan|tu|wa|duotu|da|abc)\d+\.cc$|^m\.\d+tuba\.cc$/,
p: /^\/\w+\/\d+\/\d+\.html$/
},
box: [".PsBox,.tuji", 2],
imgs: ".ArticleImageBox>img",
button: [4],
insertImg: [
["box", 0, ".ArticleImageBox,.m_adv,.m_kanp,.m_ku66,.m_ka123,.m_kan6,.m_ku137,.m_tu963,.m_pic8,.m_wa123,.m_duotu123,.m_da123,.m_abc963,.m_tutuba"], 2
],
customTitle: ".PsBox,.tuji>.weizhi",
hide: ".m_adv,.m_kanp,.m_ku66,.m_ka123,.m_ku137,.m_kan6,.m_tu963,.m_pic8,.m_wa123,.m_duotu123,.m_da123,.m_abc963,.m_tutuba",
category: "nsfw1"
}, {
name: "美女目录网",
url: {
h: ["www.girldir.com"],
p: "/book/",
e: ".view-photo"
},
imgs: () => {
let [total] = q(".base-info li").text.match(/\d+/);
let pages = Math.ceil(total / 10);
if (pages > 1) {
let links = fn.arr(pages, (v, i) => i == 0 ? fn.lp : `${fn.lp}?page=${i + 1}`);
return hr.getImgA(".view-photo img", links, 600);
}
return q(".view-photo img").all;
},
button: [4],
insertImg: ["#vueRender", 2],
customTitle: ".book-title a",
category: "nsfw1"
}, {
name: "ROSI写真",
url: {
h: "rosipic.com",
p: /^\/rosi\/\d+\.html$/,
e: "a.spotlight"
},
imgs: () => q("a.spotlight").urls.map(u => u.replace("https://wsrv.nl/?url=", "").replace(/&blur=\d+/, "")),
button: [4],
insertImg: [
["#waterfall-container", 2], 2
],
category: "nsfw1"
}, {
name: "ROSI美女写真",
host: ["www.365mm.cc", "www.rosi318.cc", "www.rosipro.cc"],
url: {
e: "//header[@class='header']//h1[@class='logo']//span[starts-with(text(),'ROSI')]",
p: /^\/\w+\/\w+\.html$/,
ee: "//span/a[text()='ROSI视频']"
},
init: () => {
q(".pagination2").remove(0);
fn.remove(".content>b,.content>br,.asst");
},
imgs: () => hr.getImg(".article-content img", "[class^=pagination] a", 9),
button: [4],
insertImg: [".article-content", 2],
autoDownload: [0],
next: ".article-nav-prev>a",
prev: ".article-nav-next>.a",
customTitle: ".article-title",
category: "nsfw1"
}, {
name: "ROSI小莉最新写真",
host: ["www.rosimm.top"],
url: {
t: "ROSI小莉写真官网",
p: /^\/html\/\d+$/
},
imgs: () => hr.getImgA("article img", ".page-links a"),
button: [4],
insertImg: ["article.post", 2],
autoDownload: [0],
next: ".nav-previous>a",
prev: ".nav-next>a",
customTitle: "h1.entry-title",
category: "nsfw1"
}, {
name: "闺秀网",
url: {
h: ["www.guixiu.org", "guixiu.org"],
p: "/post/"
},
imgs: () => hr.getImgA("#lightgallery img", "#ipage a[href*=ipage]"),
button: [4],
insertImg: ["#lightgallery", 2],
customTitle: ".focusbox-title",
category: "nsfw1"
}, {
name: "爱图门",
url: {
h: ["aitu.men"],
p: ".html",
e: ".context img"
},
imgs: () => hr.getNP(".context img", ".pagelist span+a", null, ".pagelist"),
button: [4],
insertImg: [".context", 1],
autoDownload: [0],
next: ".post-previous a",
prev: ".post-next a",
customTitle: "#content h1",
category: "nsfw1"
}, {
name: "K55",
link: "https://k55.net/arttype/2.html",
url: {
h: ["k55.net"],
p: "/artdetail-",
e: ".photo_box",
},
imgs: () => q(".photo_box img").currentSrcs,
sort: true,
button: [4],
insertImg: [".photo_box", 2],
autoDownload: [0],
next: ".item_prev_next>.item_right>a",
prev: ".item_prev_next>.item_left>a",
customTitle: () => fn.dt({
s: ".title-box>.h3-md.mb-1",
d: /\[\d+P\].+$/i
}),
category: "nsfw1"
}, {
name: "秀人网图集",
host: ["www.aisxiuren.com"],
url: {
e: ".site .logo-wrapper img.logo.tap-logo[alt='XiuRen秀人网']",
p: /^\/\d+\.html/
},
exclude: "//button[contains(text(),'登录购买')]",
imgs: () => hr.getImgA("a[data-fancybox],.entry-content img", ".fenye a"),
button: [4],
insertImg: [".entry-content", 2],
autoDownload: [0],
next: ".article-nav-prev a",
prev: ".article-nav-next a",
customTitle: ".entry-title",
fancybox: {
v: 3,
css: false
},
observerClick: [".swal2-close", ".ht-n-close-toggle"],
css: ".navbar .nav-list>.menu-item>a{line-height:20px;margin:0 6px}",
category: "nsfw1"
}, {
name: "秀人网图集",
url: {
e: ".site .logo-wrapper img.logo.tap-logo[alt='XiuRen秀人网']",
},
observerClick: [".swal2-close", ".ht-n-close-toggle"],
css: ".navbar .nav-list>.menu-item>a{line-height:20px;margin:0 6px}",
category: "ad"
}, {
name: "牛C網",
url: {
//h: ["rulel.com"],
t: "NIUC.NET",
p: /^\/\d+\.html$/,
e: "i.czs-folder-l+a:text:写真|寫真|photo|뷰티포토|Photo|Foto|Cosplay|角色扮演|코스프레|コスプレ|PHOTO|相片|사진|FOTO"
},
imgs: () => q(".content-warp img").filter(e => !e.closest("a[href*=android],a[href*=mypikpak],a[href$='app.html'],a[href*='/t.me/']") && !e.src.includes("/svg")),
button: [4],
insertImgBF: () => fn.sm4().then(() => fn.waitEle("a.core-next-img").then(() => fn.hm())),
insertImg: [".content-warp", 2],
autoDownload: [0],
next: ".card-item-img a:text:上一|prev|Prev|이전|前の|précédent|vorherigen|precedente",
prev: ".card-item-img a:text:下一|next|Next|다음|次の|suivant|Nächster|Prossimo",
customTitle: ".post-title",
mcss: ".post-warp .content-warp{padding:0px}",
category: "nsfw2"
}, {
name: "8E资源站",
host: ["8ezy.com"],
url: {
e: [".logo>a[title='8EZY']", "h1.article-title"]
},
imgs: ".article-content p>img",
videos: "video>source",
button: [4],
insertImg: [".article-content", 2],
customTitle: () => fn.dt({
s: "h1.article-title",
d: [
"【在线观看】-",
/\d+p(\d+v)?$|\(\d+[\w\s\.\+-]+\)|\[\d+[\w\s\.\+-]+\]|“\d+ photos.*/i
]
}),
downloadVideo: true,
category: "nsfw2"
}, {
name: "MissKon",
host: ["misskon.us"],
url: {
t: "MissKon",
p: "/albums/"
},
box: ["div[x-data^=photoViewer]>.space-y-3", 1],
imgs: () => {
let getImageUrls = (code) => {
let a = code.indexOf("JSON.parse");
let b = code.indexOf(")", a) + 1;
code = code.slice(a, b);
return fn.run(code).map(e => e.image_url);
};
let max = fn.um("nav:has(a[rel=next]) a");
let links = fn.arr(max, (v, i) => i == 0 ? fn.lp : `${fn.lp}?page=${i + 1}`);
return hr.getEle(links, "#main-content div[x-data^=photoViewer]").then(eles => q(eles).attrs("x-data").map(getImageUrls));
},
button: [4],
insertImg: ["box", 2],
insertImgAF: {
remove: "div[x-data^=photoViewer]>.space-y-3,div[x-data^=photoViewer]>nav[aria-label]"
},
customTitle: ["nav>ol>li>a,nav>ol>li[class]", -2, -1],
category: "nsfw2"
}, {
name: "秀图网",
url: {
h: "www.xiutu.me",
p: "/photo/"
},
box: ["article>p:last-of-type", 2],
imgs: () => hr.getImg(".post-content img", ".current~a", "4"),
button: [4],
insertImg: [
["box", 0, "article>p"], 2
],
customTitle: ".post-title",
category: "nsfw1"
}, {
name: "优美图录",
url: {
h: ["www.umei.net", "umei.net"],
p: ".html",
e: ".image_div img"
},
imgs: () => hr.getImgO(".image_div img", ".item_info span", 9, 200, ".nav-links"),
button: [4],
insertImg: [".image_div", 2],
customTitle: ".item_title>h1",
css: ".content_left img,.image_div a img{cursor:unset}",
hide: ".affs,.xg_content>li:nth-child(n+1):nth-child(-n+2)",
category: "nsfw1"
}, {
name: "Xiutaku/Kiutaku",
url: {
h: ["xiutaku.com", "kiutaku.com"],
p: /^\/\d+$/
},
init: () => fn.remove(".search-form~*,.blog~*:not([class]),.pagination~*:not([class]):not(hr),.article.content~*:not([class]):not(hr),.bottom-articles~*"),
imgs: () => hr.getImg(".article-fulltext img", ".pagination-list a"),
button: [4],
insertImg: [".article-fulltext", 2],
customTitle: () => fn.dt({
s: ".article-header>h1",
d: /([\s-]+)?.Mitaku.*/i
}),
category: "nsfw1"
}, {
name: "美图社",
host: ["www.928r.com", "www.060k.com", "ssleg.top"],
url: {
t: ["美图社", "花瓣美女", "美图鉴"],
p: /^\/\w+\/\d+\.html$/
},
imgs: () => {
let url = q("//a[text()='显示全文']").url;
if (!url) {
return q("#lightgallery img").all;
}
fn.sm5();
return hr.fetchDoc(url).then(dom => q("#lightgallery img", dom).all);
},
button: [4],
insertImg: ["#lightgallery", 2],
autoDownload: [0],
next: ".prev>a",
prev: ".next>a",
customTitle: ".focusbox-title",
category: "nsfw1"
}, {
name: "桃花社",
host: ["www.iiblog.live", "taohua.iiblog.live"],
url: {
t: "桃花社",
p: "/thread/"
},
box: ["div:has(>p>img)", 1],
imgs: ".entry-title~div img",
button: [4],
insertImg: [
["box", 0, "div:has(>p>img)"], 2
],
customTitle: () => fn.dt({
s: ".entry-title",
r: [
["|", " - "]
]
}),
category: "nsfw1"
}, {
name: "91性感美女",
url: {
h: ["www.913wen.com", "913wen.com"],
p: ["/mm/", "/p/"]
},
imgs: () => hr.getImg(".sg_img img", ".current~a", 9),
button: [4],
insertImg: [".sg_img", 2],
customTitle: "h1",
css: ".sg_img img{min-height:unset!important}",
hide: "#divpsg,.tujia",
category: "nsfw1"
}, {
name: "柠檬皮",
url: {
h: "www.emonl.com",
p: ".html"
},
imgs: () => hr.getNP(".single-content>*", ".page-links span.current+a:has(.next-page)", null, ".page-links").then(() => fn.hideEle(".page-links")).then(() => q(".single-content img")),
capture: true,
customTitle: () => fn.dt({
d: " | 檸檬皮"
}),
category: "nsfw1"
}, {
name: "美女私房菜",
host: ["ozv.me"],
url: {
t: "美女私房菜",
p: ".html"
},
init: () => fn.clearAllTimer(3),
imgs: "img.swiper-lazy",
customTitle: () => fn.title(" - 美女私房菜"),
category: "nsfw1"
}, {
name: "美桌",
link: "http://www.win4000.com/meitu.html",
url: {
h: "www.win4000.com",
p: /^\/meinv\d+\.html$/
},
imgs: () => hr.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: ".ptitle>h1",
category: "nsfw1"
}, {
name: "MM1311",
url: {
h: ["www.mm1311.net", "m.mm1311.net"],
p: /^\/\w+\/\d+\.html$/
},
imgs: () => hr.getImg(".content-pic img,.post-content img", ".page-ch:first-child,.fenye>.rw", 9),
button: [4],
insertImg: [".content-pic,.post-content", 2],
autoDownload: [0],
next: ".updown_r",
prev: ".updown_l",
customTitle: ".content>h5,.mm-title",
hide: "union",
category: "nsfw1"
}, {
name: "656G精品套图/秀人妹子图",
url: {
h: ["www.656g.com", "m.656g.com", "www.mmww.cc", "mmww.cc"],
p: "/tid/"
},
imgs: () => hr.getImgO(".imgg img", ".i1", 9),
button: [4],
insertImg: [".imgg", 2],
customTitle: ".c-tt>h1",
category: "nsfw1"
}, {
name: "MM1314美女",
url: {
h: "mm1314.cc",
p: "/p/"
},
imgs: () => hr.getImg(".content img", ".page-link", 9),
button: [4],
insertImg: [".content", 2],
autoDownload: [0],
next: "//span[@class='htag'][text()='上一篇:']/a[not(@href='/p/')]",
prev: 1,
customTitle: ".item_title>h1",
category: "nsfw1"
}, {
name: "青年美圖",
host: ["jrants.com"],
reg: [
/^https?:\/\/(\w+\.)?jrants\.com\/\d+\.html$/,
/^https:\/\/\w+\.jrants\.com\/[^\/]+\/$/
],
imgs: () => hr.getImg(".entry-content img", ".page-links>a", 7),
button: [4],
insertImg: [".entry-content", 1],
autoDownload: [0],
next: "span.prev>a",
prev: "span.next>a",
customTitle: ".entry-title",
hide: ".code-block",
category: "nsfw2"
}, {
name: "CosBlay/風流雜誌/虹圖/FullMei",
url: {
h: [/cosblay\.com$/, /trendszine\.com$/, /\.hongimg\.com/, "www.fullmei.com"],
p: /\.html$|^\/[^/]+\/$/,
e: ".entry-content img"
},
imgs: () => hr.getImg(".entry-content img", ".current~a", 7),
button: [4],
insertImg: [".entry-content", 2],
autoDownload: [0],
next: "span.prev>a",
prev: "span.next>a",
customTitle: ".entry-title,#main h1.gb-headline",
mcss: ".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}",
hide: ".code-block",
category: "nsfw2"
}, {
name: "三千图片网",
link: "https://www.win3000.com/tags/xingganmeinv/",
url: {
h: "www.win3000.com",
p: ".html",
e: ".pic-cont img"
},
imgs: () => {
let [max] = q(".title>span").text.match(/\d+$/);
let links = fn.arr(max, (v, i) => fn.lp.replace(".html", "") + "_" + (i + 1) + ".html");
return hr.getImgA(".pic-cont img", links, 2);
},
button: [4],
insertImg: [".pic-cont", 2],
autoDownload: [0],
next: "a.other-group.fr",
prev: "a.other-group.fl",
customTitle: ".title>h1",
category: "nsfw1"
}, {
name: "三千图片网M",
link: "https://m.win3000.com/tags/xingganmeinv/",
url: {
h: "m.win3000.com",
p: ".html",
e: [".show-page>i", ".pic-showbox .imgbox img"]
},
imgs: () => {
let max = q(".show-page>i").text;
let links = fn.arr(max, (v, i) => fn.lp.replace(".html", "") + "_" + (i + 1) + ".html");
return hr.getImgA(".pic-showbox .imgbox img", links, 2);
},
button: [4],
insertImg: [".pic-showbox", 2],
autoDownload: [0],
next: "a.page-next",
prev: "a.page-prev",
customTitle: ".pic-infobox h1",
css: "#app{font-size:14px!important}",
category: "nsfw1"
}, {
name: "3G 壁纸",
host: ["www.3gbizhi.com", "m.3gbizhi.com"],
link: "https://www.3gbizhi.com/meinv",
reg: /^https?:\/\/(www|m|desk)\.3gbizhi\.com\/meinv\/(\w+\/)?\w+\.html$/,
imgs: () => {
let links = q(".showImglistw a").map(a => a.pathname);
return hr.getImgA("#contpic,#mobile_c_img>img", links);
},
thums: ".showImglistw img",
button: [4],
insertImg: ["#showimg", 1],
endColor: "white",
autoDownload: [0],
next: "a.next-page[href$=html]",
prev: "a.prev-page[href$=html]",
customTitle: "h2.title,.titlew>h2",
hide: "[class^=ad_id]",
category: "nsfw1"
}, {
name: "亿图全景图库",
host: ["www.yeitu.com", "m.yeitu.com"],
link: "https://www.yeitu.com/meinv/",
reg: /^https?:\/\/(www|m)\.yeitu\.com\/\w+\/\w+\/\w+\.html$/,
init: () => {
let a = q(".article-body>a,.gallery-item>a").one;
if (a) a.outerHTML = a.innerHTML;
},
imgs: () => {
let max = q(".imageset-sum,span.num").maxNum || 1;
let links = fn.arr(max, (v, i) => i == 0 ? fn.lp : fn.lp.replace(".html", "") + "_" + (i + 1) + ".html");
return hr.getImgA(".img_box img[alt],.gallery-item img[alt],.article-show img", links, 2);
},
button: [4],
insertImg: [".img_box,.gallery-item,.article-show", 2],
customTitle: "#title>h1,h1.article-title,.article-info>h1",
hide: ".appbox,.uk-page~section,.yt-pages+.mssp",
category: "nsfw1"
}, {
name: "MEITU131",
host: ["www.meitu131.com", "m.meitu131.com"],
link: "https://www.meitu131.com/nvshen/,https://www.meitu131.com/jigou/",
reg: /^https?:\/\/(www|m)\.meitu131\.(com|net)\/(\w+\/)?meinv\/\d+\//,
imgs: () => hr.getImgO(".work-content img,.uk-article-bd img", "a[title=Page],.uk-page>span", 15),
button: [4],
insertImg: [".work-content>p,.uk-article-bd", 1],
customTitle: ".contitle-box>h1,h1.uk-article-title",
css: ".work-content img{max-width:100%!important}",
hide: ".appbox,.uk-page~section",
category: "nsfw1"
}, {
name: "爱套图",
url: {
h: ["www.aitaotu.cc", "aitaotu.cc", "www.2taotu.cc", "2taotu.cc"],
p: "/photo/"
},
box: [".uk-inline", 2],
imgs: () => hr.getImg(".uk-article img", ".current~a", 9),
button: [4],
insertImg: [
["box", 0, "figure.uk-inline"], 2
],
next: ".m-prevnext a",
customTitle: ".uk-article-title",
hide: "union[id]",
category: "nsfw1"
}, {
name: "和邪社",
url: {
h: "www.hexieshe.com",
p: /^\/\d+\/$/
},
init: () => hr.getNP("#content-innerText>p", "span.current+a", null, ".post-links"),
imgs: "#content-innerText img",
customTitle: () => fn.dt({
s: ".entry-title",
d: "为您朗读"
}),
setFancybox: true,
category: "nsfw1"
}, {
name: "爱美女",
url: {
h: "www.92meinv.com",
p: "/article-",
e: ".pp.hh img[alt],#image_div img"
},
imgs: () => {
let max = q(".des>h1,.post_title_topimg").maxNum || 1;
let links = fn.arr(max, (v, i) => fn.lp.replace(/\.html$/, "") + "-" + (i + 1) + ".html");
return hr.getImgA(".pp.hh img[alt],#image_div img", links, 200);
},
button: [4],
insertImg: [".pp.hh,.content", 2],
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: () => fn.title("_", 1),
category: "nsfw1"
}, {
name: "爱美女M",
url: {
h: "m.92meinv.com",
p: "/article-",
e: ".arcmain img,#image_div img"
},
imgs: () => {
let max = q(".article-page>*").maxNum || 1;
let links = fn.arr(max, (v, i) => fn.lp.replace(/\.html$/, "") + "-" + (i + 1) + ".html");
return hr.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",
hide: "body>a",
customTitle: () => fn.title("_", 1),
category: "nsfw1"
}, {
name: "XiuRenBox",
url: {
h: "www.xiurenbox.com",
p: /\/\d+\/$/
},
box: [".entry-content .wp-block-image", 1],
imgs: () => hr.getImgA(".entry-content .wp-block-image img", [fn.lp + "?showall=1"]),
button: [4],
insertImg: ["box", 2],
insertImgAF: () => fn.hideEle(".wp-block-image,.simple-page-nav"),
autoDownload: [0],
next: "a[href][rel=prev]",
prev: "a[href][rel=next]",
customTitle: "#post-title",
category: "nsfw1"
}, {
name: "4Kgirl",
url: {
h: "www.4kgirl.com",
e: "#post-title"
},
box: [".entry-content .wp-block-image", 1],
imgs: () => hr.getImg(".wp-block-image img", ".current~a", 4),
button: [4],
insertImg: ["box", 2],
insertImgAF: () => fn.hideEle(".wp-block-image,.child-page-nav"),
autoDownload: [0],
next: "//a[div[span[text()='Previous']]][@href]",
prev: "//a[div[span[text()='Next']]][@href]",
customTitle: () => fn.dt({
s: "#post-title",
d: "– 4kgirl"
}),
category: "nsfw1"
}, {
name: "4KGal",
host: ["gal4k.com"],
url: {
t: "4KGal",
p: "/post/"
},
box: [".gallery", 1],
imgs: () => hr.getImg(".gallery-item img", ".gallery~nav>.img-page-info").then(srcs => {
return srcs.map(src => {
if (src.includes("?url") && src.includes("4khd.com")) {
src = fn.getUSP("url", src);
return fn.rt(src, [
[/i\d\.wp\.com\//, ""],
["pic.4khd.com", "img.4khd.com"],
[/\?.+$/, ""],
[/\/w\d+-rw\//, "/w2500-h2500-rw/"]
]);
}
return src;
});
}),
button: [4],
insertImg: ["box", 2],
insertImgAF: () => fn.hideEle(".gallery,.img-pagination"),
autoDownload: [0],
next: ".post-nav-prev",
prev: ".post-nav-next",
customTitle: ".post-title",
category: "nsfw2"
}, {
name: "imissx/mavicX/xaicos/xaimiss",
url: {
h: ["www.imissx.com", "www.mavicx.com", "www.xaicos.com", "www.xaimiss.com"],
p: /^\/\d+\.html$/
},
imgs: () => hr.getImgA(".article-content img", ".article-paging a"),
button: [4],
insertImg: [".article-content", 2],
autoDownload: [0],
next: ".article-nav-prev>a",
prev: ".article-nav-next>a",
customTitle: ".article-title",
hide: ".rmp-container",
category: "nsfw1"
}, {
name: "男人之家",
host: ["nanrenhome.cc", "nanrenhome.com"],
url: {
h: /nanrenhome\./,
p: ".html",
e: "//a[@rel='category tag'][text()='福利美图']"
},
imgs: () => {
let pages = q(".article-paging a[href]").one;
return pages ? hr.getImgA(".article-content img", ".article-paging a[href]") : q(".article-content img");
},
button: [4],
insertImg: [
["//article/p[img]", 2, "//article/p[img] | //div[@class='article-paging']"], 2
],
customTitle: ".article-title",
category: "nsfw1"
}, {
name: "推次元",
host: ["www.a2cy.com", "a2cy.com"],
url: {
h: "a2cy.com",
p: ".html"
},
imgs: () => q(".imgBox img,.w:not(.box-shadow) img").filter(e => !e.closest(".cy_tyoum,.cy_ranking,.yalayi_box,.mb10")).srcs,
capture: true,
customTitle: "h1",
category: "nsfw1"
}, {
name: "HaneAme",
url: {
h: "haneame.net",
p: ["/album-", "/deepfake"]
},
imgs: () => hr.getImgA(".entry-content img", ".pagelinks a"),
button: [4],
insertImg: [".entry-content", 2],
autoDownload: [0],
next: "a.g1-teaser-prev",
prev: "a.g1-teaser-next",
customTitle: () => fn.dt({
s: "h1.entry-title",
d: "Album –"
}),
category: "nsfw1"
}, {
name: "蠢沫沫",
url: {
h: "chunmomo.net",
p: ["/album-", "/deepfake"]
},
imgs: async () => {
let srcs = fn.srcs(".s-post-content img");
let pages = q(".all-page").text;
if (pages) {
let [max] = pages.match(/\d+/);
srcs = await hr.getImg(".s-post-content img", max, 4);
}
return srcs.filter(e => !e.includes("rehanman") && !e.includes("thumbnail"));
},
button: [4],
insertImg: [".s-post-content", 2],
autoDownload: [0],
next: ".next-page a.pg-arrow",
prev: ".prev-page a.pg-arrow",
customTitle: () => fn.dt({
s: "h1.entry-title",
d: "Album –"
}),
hide: "[id^='quads-ad'],[id^=block]",
category: "nsfw1"
}, {
name: "秀人写真网",
host: ["tu925.com"],
url: {
t: "秀人写真网",
p: /^\/\d+\/\d+\/\d+\//
},
box: ["#gallery-container", 1],
imgs: () => {
let pages = q("//a[contains(text(),'下一页')]").one;
if (pages) {
let max = q("a", pages.parentNode).maxNum;
let links = fn.arr(max, (v, i) => i == 0 ? fn.lp : `${fn.lp}?page_num=${i + 1}`);
return hr.getImgA("#gallery-container img", links);
}
return q("#gallery-container img");
},
button: [4],
insertImg: [
["box", 0, "#gallery-container"], 2
],
autoDownload: [0],
next: "//a[span[text()='上一个图集']]",
prev: "//a[span[text()='下一个图集']]",
customTitle: "section h1",
category: "nsfw2"
}, {
name: "猫猫网盘",
url: {
h: ["catcat.cloud"]
},
page: () => fn.lpsl() > 2,
SPA: "g",
observeURL: "nav",
imgs: () => hr.getAList(),
customTitle: () => fn.dt({
d: [" | 猫猫网盘"]
}),
downloadVideo: true,
category: "nsfw1"
}, {
name: "美图录",
url: {
h: ["meitulu.me"],
p: "/item/",
e: ".mb-4>img[alt]"
},
imgs: () => hr.getImg(".mb-4>img[alt]", ".page-link", 9),
button: [4],
insertImg: [".mb-4", 1],
customTitle: ".top-title",
category: "nsfw1"
}, {
name: "美女视界",
host: ["www.beapic.com"],
url: {
t: "美女视界",
p: /^\/\d+\.html$/,
e: "#image_div",
ee: "//a[@rel='category tag'][text()='演出视频']"
},
imgs: () => hr.getImg("#image_div img", ".current~a", 9).then(srcs => srcs.map(e => e.replace(/\?x-oss-process.+$/, ""))),
button: [4],
insertImg: ["#content", 2],
insertImgAF: () => fn.run("$(document).off()"),
customTitle: () => fn.title(" – 美女视界"),
category: "nsfw1"
}, {
name: "FoamGirl",
url: {
h: "foamgirl.net",
p: ".html",
e: "a.imageclick-imgbox"
},
box: ["#image_div,a.imageclick-imgbox", 1],
imgs: () => hr.getImg("a.imageclick-imgbox", ".current~a", 9),
button: [4],
insertImg: [
["box", 0, "#image_div,a.imageclick-imgbox,#content br,#image_div_all"], 2
],
customTitle: () => fn.dt({
s: ".item_title>h1",
d: /\n/g
}),
hide: ".affs",
category: "nsfw2"
}, {
name: "COSPLAY Girl 18+",
host: ["cosplay.girl18.net", "xiuren.girl18.net", "bobosocks.girl18.net", "imiss.girl18.net", "cosplay.girl18.net"],
url: {
h: ".girl18.net"
},
imgs: () => fn.srcs("#image_div img").map(src => src.replace(/\?.+$/, "")),
button: [4],
insertImg: ["#image_div", 2],
customTitle: ".item_title",
hide: ".item_images_info",
category: "nsfw2"
}, {
name: "Girl 18+",
host: ["girl18.net"],
url: {
h: "girl18"
},
imgs: () => fn.srcs("#content img").map(src => src.replace(/\?.+$/, "")),
button: [4],
insertImg: ["#content", 2],
customTitle: ".item_title",
hide: ".item_images_info",
category: "nsfw1"
}, {
name: "18成人貼圖",
host: ["www.sexphotos.cc"],
reg: /^https?:\/\/www\.sexphotos\.cc\/\w+\/\d+\.html$/,
init: () => fn.waitEle(".article-body>img").then(e => fn.createImgBox(e, 1)),
imgs: ".article-body>img",
button: [4],
insertImg: [
["box", 0, ".article-body>img"], 2
],
autoDownload: [0],
next: "a.entry-page-prev[href$=html]",
prev: "a.entry-page-next[href$=html]",
customTitle: ".detail-title",
category: "nsfw2"
}, {
name: "Coser Lab",
url: {
h: ["coserlab.io"],
p: "/archives/",
ee: ".card-body .error-empty,.post-hide-content"
},
imgs: () => {
fn.showMsg("hr.xhrHEAD(check)...", 0);
let xhrNum = 0;
return q("a.glightbox").urls.map(u => u.replace("-scaled", "")).map(async (src, i, arr) => {
await fn.delay(100 * i, 0);
let res = await hr.xhrHEAD(src);
fn.showMsg(`hr.xhrHEAD(${xhrNum+=1}/${arr.length})`, 0);
let status = res.status;
return status == 404 ? src.replace(/(\.[a-z]+)$/i, "-scaled$1") : src;
});
},
thums: "a.glightbox img",
button: [4],
insertImg: [
[".masonry-list", 2, ".masonry-list"], 2
],
customTitle: "span.current,.card-body h1",
category: "nsfw2"
}, {
name: "Erohere",
url: {
h: "my.erohere.eu",
p: "/album/"
},
box: ["#gallery", 1],
imgs: () => hr.getImg("#gallery img", ".current-page", 14),
button: [4],
insertImg: [
["box", 0, "#gallery,.pagination"], 2
],
customTitle: ".album-name",
category: "nsfw1"
}, {
name: "懒人看图",
host: ["www.lazymanpic.net"],
url: {
t: "懒人在线看图",
e: ".m-list-content img"
},
imgs: () => hr.getNP(".m-list-content img", "//a[text()='下一页'][@class='next']", null, ".link_pages"),
button: [4],
insertImg: [".m-list-content", 2],
autoDownload: [0],
next: ".sxpage_r>a",
prev: ".sxpage_l>a",
customTitle: () => fn.dt({
s: ".m-list-tools>h2",
d: [
/\(\d\)/,
/\[\d+[\s\.\+\w-\/]+\].*/,
/全网首发|免费下载|无损图包下载|未删减版|无删减图包/g
]
}),
category: "nsfw1"
}, {
name: "尤物秀",
host: ["www.youwushow.net"],
reg: /^https?:\/\/(www\.)?youwushow\.net\/pic\/\w+\.html(\?btwaf=\d+)?$/,
imgs: () => hr.getNP(".entry-content>*:not(.page-links)", "span.current+a", null, ".page-links").then(() => q(".entry-content img")),
button: [4],
insertImg: [".entry-content", 2],
autoDownload: [0],
next: "a.prev-link",
prev: "a.next-link",
customTitle: () => fn.dt({
s: ".entry-title",
d: [
/\(\d\)/,
/\[\d+[\s\.\+\w-\/]+\].*/,
/全网首发|免费下载|无损图包下载|未删减版|无删减图包/g
]
}),
category: "nsfw1"
}, {
name: "比思在線圖庫",
host: ["bisipic.xyz", "bisipic.online"],
url: {
h: /bisipic\./,
p: "/thread-",
e: "img[zoomfile]"
},
imgs: () => q("img[zoomfile]").map(e => fn.lo + "/" + fn.attr(e, "zoomfile")),
capture: true,
customTitle: () => fn.dt({
t: q("meta[name=keywords]").attr("content"),
d: /【\d+P】.*$/
}),
category: "nsfw1"
}, {
name: "米兔妹妹",
host: ["www.loxiu.com"],
url: {
t: "米兔妹妹",
p: "/post/"
},
imgs: () => hr.getImg(".info-imtg-box>img[alt]", ".pagebar>*"),
button: [4],
insertImg: ["div:has(>.info-imtg-box)", 2],
autoDownload: [0],
next: "//a[p[text()='上一篇']]",
prev: "//a[p[text()='下一篇']]",
customTitle: ".info-title>h1",
category: "nsfw1"
}, {
name: "遛无写真格式",
url: {
h: [
"www.0xzn.com",
"www.096d.com",
"www.0niz.com",
"www.1nlm.com",
"www.1plq.com",
"www.1tu5.com",
"www.1vtr.com",
"www.3pxa.com",
"www.3tck.com",
"www.4tck.com",
"www.54k5.com",
"www.5njs.com",
"www.5pwc.com",
"www.6evu.com",
"www.6kpo.com",
"www.6tck.com",
"www.6vtr.com",
"www.7k1a.com",
"www.7mqk.com",
"www.7tck.com",
"www.7u8t.com",
"www.09kt.com",
"www.c0h.net",
"www.df10.net",
"www.eshh.net",
"www.game1313.net",
"www.te2zn.com",
"www.tmm123.vip",
"www.wangblog.net",
"www.wjstbs.net",
"www.wsqap.com",
"www.wxytw.com",
"www.zhaixiaonan.com",
"www.vansankan.net",
"d2nx.com"
],
p: /^\/\d+\.html$/,
e: "#post_content img,.article-content img,.entry-content img",
ee: "//a[@rel='category tag'][contains(text(),'人物简历') or contains(text(),'宅男科技') or contains(text(),'时尚玩酷') or contains(text(),'身边事') or contains(text(),'追星一族') or contains(text(),'网红头条') or contains(text(),'大众娱乐') or contains(text(),'生活热点') or contains(text(),'影评剧透') or contains(text(),'娱乐时尚') or contains(text(),'吃喝玩乐') or contains(text(),'体育') or contains(text(),'亲子宠物') or contains(text(),'番号大全') or contains(text(),'番号推荐') or contains(text(),'最新番号') or contains(text(),'素人番号')]"
},
imgs: () => hr.getImgA("#post_content img,.article-content img,.entry-content img", ".pagelist a,.pagination a,.article-paging a"),
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: () => fn.dt({
s: "h1",
d: [
/无圣光.+$/,
/无水印.+$/,
/无删减.+$/,
/高品质.+$/,
/超高清.+$/,
]
}),
css: ".article_container{padding:10px 0px!important}#post_content{padding:0px!important}",
mcss: ".container{max-width:100% !important}",
category: "nsfw1"
}, {
name: "原创妹子图/尤物私房图/极品美女图/免费私房图/私房网红图/尤物妹妹图",
//所有域名在環境變數urltz
host: ["www.ywsft.com", "www.jpmnt.com", "www.mfsft.com", "www.sfwht.com", "www.ywmmt.com"],
url: {
e: [".b", "#picg", ".pagelist"],
p: /^\/[a-z]+\/[a-z]+\/\d+\/\d+\.html$/
},
init: () => {
q(".b a").for(a => a.removeAttribute("target"));
q("#picg a").for(a => (a.outerHTML = a.innerHTML));
fn.remove("iframe", 2000);
},
imgs: () => hr.getImg("#picg img[alt]", ".pagelist a", 9),
button: [4],
insertImg: ["#picg", 2],
autoDownload: [0],
next: "//div[@class='b' and contains(text(),'下一')]/a",
prev: "//div[@class='b' and contains(text(),'上一')]/a",
customTitle: () => fn.dt({
s: "h1",
d: [
/第\d+页|^- /g,
/[\s-]+P\.\d/g,
/:/g
]
}),
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}",
hide: "body>br,body>*[id]:has(*[class*=adsby]),#apic,#bzs7,.interestline+center,center+#pic,#qpai,#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,#divftst,.interestline+.nav~span,.interestline+.nav~br",
category: "nsfw2"
}, {
name: "美女私房照/看妹图",
host: ["www.sfjpg.com", "www.sfmm.cc", "www.kmeitu.cc", "kanmeitu.net"],
url: {
t: ["美女私房照", "看妹图", "看妹圖"],
p: /^\/\w+\/\d+\.html$/,
e: "#picg img"
},
init: () => {
q(".b a").for(a => a.removeAttribute("target"));
q("#picg a").for(a => (a.outerHTML = a.innerHTML));
},
imgs: () => hr.getImgO("#picg img", ".pagelist span,.pagelist a[title=Page]", 9, 0, ".page .pagelist"),
button: [4],
insertImg: ["#picg", 2],
autoDownload: [0],
next: "//div[@class='b' and contains(text(),'上一')]/a",
prev: "//div[@class='b' and contains(text(),'下一')]/a",
customTitle: "h1",
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}",
hide: "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]",
category: "nsfw2"
}, {
name: "爱妹子",
url: {
h: ["xx.knit.bid", "www.lovecutes.com"],
p: /^\/([\w-]+\/)?article\/\d+\//i,
e: ".item-image img"
},
box: [".image-container"],
imgs: () => {
if (q("li.next-page").one) {
let max = q(".pagination a").maxNum;
let links = fn.arr(max, (v, i) => i == 0 ? fn.lp : fn.lp + `page/${i + 1}/`);
return hr.getImgA(".item-image img", links, 1200);
}
return q(".item-image img");
},
button: [4],
insertImg: [
["box", 0, ".item-image,.loading-indicator,.pagination-nav"], 2
],
insertImgAF: () => setTimeout(() => fn.clearAllTimer(2), 1500),
customTitle: ".focusbox-title",
css: "a{white-space:unset!important}",
hide: ".clickadu-container",
category: "nsfw2"
}, {
name: "美女写真",
url: {
h: "portrait.knit.bid",
p: /^\/\w+\/\d+$/,
e: ".container>.container>img"
},
imgs: () => {
let max = q(".page-link").maxNum;
let links = fn.arr(max, (v, i) => siteUrl + "?page=" + (i + 1));
return hr.getImgA(".container>.container>img", links, 300);
},
button: [4],
insertImg: [
[".container>.container>nav", 2, "nav[aria-label=pagination],.img-fluid"], 2
],
customTitle: ".container h1",
category: "nsfw1"
}, {
name: "美图网",
url: {
h: "meitu.knit.bid",
p: /^\/(beauty|handsome)\/[^\/]+$/,
e: ".details_item>img"
},
imgs: () => {
let [max] = q("a[href*=gotoPage]").urls.at(-2).match(/\d+/);
let links = fn.arr(max, (v, i) => siteUrl + "?page=" + (i + 1));
return hr.getImgA(".details_item>img", links, 300);
},
button: [4],
insertImg: [".details_item", 2],
customTitle: () => fn.dt({
s: ".text-center>h1",
r: [
["|", "-"]
]
}),
category: "nsfw1"
}, {
name: "美图网",
url: {
h: "meitu.knit.bid",
p: /^\/(news|street)\/\d+$/
},
imgs: ".news-body img",
customTitle: () => fn.dt({
s: ".text-center>h1",
r: [
["|", "-"]
]
}),
category: "nsfw1"
}, {
name: "萌图社",
url: {
h: ["www.446m.com", "446m.com"],
p: /^\/index\.php\/\w+\/\d+\.html$/
},
imgs: "span.post-item",
button: [4],
insertImg: [".post-content", 2],
customTitle: () => fn.title(" - 萌图社"),
hide: ".footer~*",
category: "nsfw1"
}, {
name: "日式JK旧版",
host: ["v2.jk.rs"],
reg: /^https?:\/\/v2\.jk\.rs\/\d+\/\d+\/\d+\/\d+\.html$/,
imgs: "div[data-fancybox]",
button: [4],
insertImg: ["#masonry", 2],
customTitle: () => fn.title(" - 日式JK"),
fancybox: {
v: 3,
css: false
},
css: "#masonry{position:unset!important;height:unset!important}",
category: "nsfw1"
}, {
name: "日式JK",
url: {
h: "www.jk.rs",
p: ".html",
ee: ".post-hide-content"
},
imgs: "a.glightbox",
button: [4],
insertImg: [
[".masonry-list", 2, ".masonry-list"], 2
],
insertImgAF: () => fn.css("#masonry{position:unset!important;height:unset!important}"),
customTitle: () => fn.title(" – 日式JK"),
referer: "",
category: "nsfw1"
}, {
name: "微博美女",
url: {
h: "weibomn.com",
p: "/girl"
},
box: [".photos", 1],
imgs: ".photos img",
button: [4],
insertImg: [
["box", 0, ".photos"], 2
],
customTitle: () => "微博美女 - " + q(".post-content p").text,
category: "nsfw1"
}, {
name: "唐朝资源",
url: {
h: "oorpg.com",
e: ["#card-box", ".article-h1"],
st: "var uul"
},
box: ["#card-box", 1],
imgs: () => {
let str = Code.str("var uul");
return str.split("https://").filter(Boolean).map(s => "https://" + s);
},
button: [4],
insertImg: ["box", 2],
insertImgAF: () => fn.hideEle("#card-box"),
customTitle: () => fn.dt({
s: ".article-h1",
d: "- [秀人套图]"
}),
category: "nsfw1"
}, {
name: "HotAsiaGirl",
url: {
h: ["hotgirl.asia"]
},
box: [".galeria_img", 1],
imgs: () => hr.getImgA(".galeria_img>img", ".pagination a[href]"),
button: [4],
insertImg: [
["box", 0, ".galeria_img,#pagination"], 2
],
customTitle: ".mvic-desc h3",
category: "nsfw2"
}, {
name: "HotGirl World",
url: {
h: ["www.hotgirl2024.com", "hotgirl.world"],
P: "/g/"
},
init: () => q(".blur-image").for(e => e.classList.remove("blur-image")),
imgs: () => hr.getImg(".article__image-list img", ".pagination__total"),
button: [4],
insertImg: [".article__image-list", 2],
customTitle: ".article-header__title",
category: "nsfw1"
}, {
name: "MaoJiuJiu/SkyBird/TightImg/SexCity",
url: {
h: ["www.maojiujiu.com", "www.skybirdx.com", "www.tightimg.com", "www.sexscity.com"],
p: "/album/",
e: "#item_list img"
},
imgs: () => hr.getImgA("#item_list img", ".pager>a:not(.current)"),
capture: true,
customTitle: "h1.title",
setFancybox: "#item_list a:has(>img)",
category: "nsfw1"
}, {
name: "Pibys",
url: {
h: "pibys.win",
e: ".page-links"
},
box: [".entry-content img", 1],
imgs: () => hr.getImgA(".entry-content img", ".page-links a"),
button: [4],
insertImg: [
["box", 0, "#FullPictureLoadMainImgBox~*"], 2
],
customTitle: ".entry-title",
category: "nsfw1"
}, {
name: "TGG",
url: {
h: ["thegg.net"],
e: "#header img,#body img"
},
imgs: () => q("#header img:not([alt*='author']),#body img:not([alt*='author'])").srcsets.filter(src => !src.includes("banner")),
capture: true,
autoDownload: [0],
next: "//a[text()='Next post']",
prev: "//a[text()='Previous post']",
customTitle: ".info h2",
category: "nsfw1"
}, {
name: "1Y Beauties",
url: {
h: "www.1y.is",
p: /^\/[\w-]+\/[^\.]+\.html$/i
},
imgs: () => hr.getImgA(".entry-content img", ".page-links a"),
capture: true,
customTitle: ".entry-title",
category: "nsfw1"
}, {
name: "True Pic",
url: {
h: ["truepic.net"],
p: /^\/[\w-]+\/$/,
e: "//div[@class='entry-content']//p[img]"
},
box: ["//p[img]", 1],
imgs: () => hr.getImgA("//p/img", ".pagination_split_post a"),
button: [4],
insertImg: [
["box", 0, "//p[img]"], 2
],
customTitle: ".entry-content h2",
category: "nsfw1"
}, {
name: "#TheFappening",
url: {
h: "fap.thefappening.one",
p: /^\/[^\/]+\/$/,
e: ".entry-title"
},
imgs: () => {
let a = q(".gallery-item a[target]").all;
if (a.length) return a;
return q(".gallery-item img");
},
capture: true,
customTitle: () => q(".entry-title").text.replaceAll("/", "-"),
category: "nsfw2"
}, {
name: "Hot Girl Pix/美图集",
url: {
h: ["www.hotgirlpix.com", "www.meituj.com"],
p: "/p/"
},
imgs: () => hr.getImgA("article img", "#singlePostPagination a", 300),
button: [4],
insertImg: ["article", 2],
customTitle: "#singlePostTitle",
css: ".nav-menu{z-index:10}",
hide: "#modalAdblock,.alignCenter,.gcseSearchPlaceHolder,body~*:not(#DownloadAppUIRoot,[id^=Full],.viewer-container),footer~*",
category: "nsfw1"
}, {
name: "Hot Girl Pix AD",
host: ["www.hotgirlpix.com"],
reg: /^https?:\/\/www\.hotgirlpix\.com\//,
hide: "#modalAdblock,body~*:not(#DownloadAppUIRoot,[id^=Full],.viewer-container),footer~*",
category: "ad"
}, {
name: "美推网",
host: ["www.meinvtui.com"],
url: {
//h: [/meinvtui\.com$/, "bbs.2tu.me"],
e: [".logo>a[title=美女图片]>img[alt=美女图片],nav.bg-w a[title=美女图片]", ".pp.hh,.contimglist"],
p: ".html"
},
imgs: () => hr.getImg(".pp.hh img[alt],.contimglist img[alt]", ".pages>a:first-child,.page a:not([href])", 9),
button: [4],
insertImg: [".pp.hh,.contimglist", 2],
autoDownload: [0],
next: "//b[text()='上一篇:']/following-sibling::a | //a[@class='f-l l2'][@href]",
prev: "//b[text()='下一篇:']/following-sibling::a | //a[@class='f-l l3'][@href]",
customTitle: ".des>h1,.contmbx-title",
category: "nsfw1"
}, {
name: "SexyAsianGirl",
url: {
h: ["www.sexyasiangirl.top", "sexyasiangirl.top"],
p: "/album/"
},
box: ["article>header~img", 1],
imgs: () => hr.getImg("article>header~img", "//span[contains(text(),'of')]"),
button: [4],
insertImg: [
["box", 0, "article>header~img"], 2
],
customTitle: "header>h2",
category: "nsfw2"
}, {
name: "媚人图库",
host: ["meirrrrrrr.xyz"],
url: {
t: "媚人图库",
u: "album/"
},
box: ["article>header~img", 1],
imgs: () => {
let max = fn.gt("//span[contains(text(),'of')]").match(/\d+/g).at(-1);
let links = fn.arr(max, (v, i) => i == 0 ? fn.url : `${fn.url}?page=${i + 1}`);
return hr.getImgA("article>header~img", links);
},
button: [4],
insertImg: [
["box", 0, "article>header~img"], 2
],
customTitle: "header>h2",
category: "nsfw2"
}, {
name: "尤物丧志/亚色图库/福利姬美图/秀人图/極品妹子圖/涩图社/三上悠亚写真图片/AHottie/Coser/HotGirl/SexyGirl/私房图库",
url: {
t: ["尤", "图", "圖", "写真", "寫真", "AHottie", "Coser", "Girl"],
e: ["img.block", "//div[img[@title]]", "#main>h1,header>h1"]
},
imgs: () => hr.getImg("img.block", "span~a").then(srcs => srcs.map(e => e.replace("teleimgs.pages.dev", "imgfiles.pages.dev"))),
button: [4],
insertImg: ["//div[img[@title]]", 2],
next: "//span[contains(text(),'上一篇')]/following-sibling::a[1]",
customTitle: () => fn.dt({
s: "#main>h1,header>h1",
d: [
/\(\d+[\w\s\\\/\.+-/]+\)?|\[\d+[\w\s\\\/\.+-/]+\]?|(\d+[\w\s\\\/\.+-/]+)?|【\d+[\w\s\\\/\.+-/]+】?|\d+P/gi,
/\s?\d+P\+?\d+V/,
/未分类性感写真|^.+人体|AI图区/,
/(\d+月\d+打赏群(自购)?资源)/gi,
/🐾/g
]
}),
hide: "div.flex.m-1:has(>a[style]),.my-2:has(>a[target][referrerpolicy][style]),iframe[id][class][width][height][style],div:has(>script):has(>iframe),div:has([id*='adsby']),body>div[id][style]:has(>a[id])",
category: "nsfw2"
}, {
name: "美图鉴赏/美图鉴赏ACG",
links: [
"https://www.lspimg.com/page/1/",
"https://acg.lspimg.com/page/1/"
],
url: {
h: ["www.lspimg.com", "acg.lspimg.com"],
p: "/archives/"
},
home: "/page/1/",
imgs: "div[data-src]",
button: [4],
insertImg: ["#masonry", 2],
customTitle: () => fn.lh === "www.lspimg.com" ? fn.title(" - 美图鉴赏") : null,
css: "#masonry{position:unset!important;height:unset!important}",
hide: "#popup",
category: "nsfw2"
}, {
name: "tumbex",
url: {
h: "www.tumbex.com"
},
page: "/post/",
SPA: true,
observeURL: "head",
imgs: () => fn.waitEle(".hg-item").then(() => q(".hg-item", ".post-content")),
capture: true,
customTitle: () => fn.title(" - Tumbex"),
referer: "",
category: "nsfw2"
}, {
name: "Fapdungeon",
url: {
h: ["fapdungeon.com"]
},
init: () => fn.addMutationObserver(() => fn.remove("div[class][style*='z-index']")),
srcset: ".entry-content img.size-full",
videos: ".entry-content video>source",
customTitle: "h1.entry-title",
referer: "https://fapdungeon.com/",
setFancybox: ".entry-content img",
downloadVideo: true,
category: "nsfw2"
}, {
name: "Jizz to Nude Girls",
url: {
h: "jizzy.org",
p: /^\/[^\/]+\/$/,
e: ".entry-content img"
},
imgs: () => q(".entry-content img").srcs.filter(src => !src.includes("18xmob")),
button: [4],
insertImg: [".entry-content", 2],
customTitle: ".entry-title",
category: "nsfw2"
}, {
name: "WhoresHub",
url: {
h: "whoreshub.com",
p: "/albums/",
e: [".gallery-top", ".info-buttons"]
},
box: [".info-buttons", 1],
imgs: () => q(".gallery-top .swiper-wrapper img").map(e => e.dataset.srcset),
thums: ".gallery-thumbs img",
button: [4],
insertImg: ["box", 2],
customTitle: "h1.title",
category: "nsfw2"
}, {
name: "SaradaHentai",
url: {
h: ["saradahentai.com"],
p: /^\/[\w-]+\/$/
},
imgs: () => {
let b = q(".sd-gallery-thumbs>.sd-gallery-thumb");
return b.length ? b : q(".sd-entry-content img");
},
capture: true,
customTitle: ".sd-single-title",
category: "hcomic"
}, {
name: "CosersLove",
url: {
h: ["coserslove.com"],
p: "/album/"
},
box: ["div[data-photo-list]", 2],
imgs: async () => {
let imgs = q("article[data-photo-index] img").all;
let [, a, b] = q("#photo-grid p").text.match(/\d+/g);
let pages = Math.ceil(b / a);
if (pages > 1) {
let links = fn.arr(pages, (v, i) => i == 0 ? fn.lp : `${fn.lp}/${i+1}`);
imgs = await hr.getEle(links, "article[data-photo-index] img");
}
return q(imgs).srcsets;
},
button: [4],
insertImg: [
["box", 0, "div[data-photo-list]"], 2
],
customTitle: "#main-content h1",
category: "nsfw2"
}, {
name: "暖暖社",
url: {
h: "nncos.com",
p: /^\/\d+\.html$/,
ee: ".vip-hide-content"
},
loop: () => {
let cs = ".age-gate-restricted,.age-gate__restricted,.age-restriction,.age-gate__restricted--js";
q(cs).for(e => e.classList.remove(...cs.replaceAll(".", "").split(",")));
document.body.removeAttribute("style");
},
loopTime: 3000,
init: () => (document.cookie = "age_gate=18;"),
imgs: () => hr.getImgA(".post-content img", ".single-page-link>a"),
button: [4],
insertImg: [".post-content", 2],
customTitle: ".post-title",
hide: "#gh-container,.fixnav,.age-gate__wrapper",
category: "nsfw2"
}, {
name: "G-MH/18GAL",
url: {
h: ["g-mh.com", "18gallery.com"],
p: "/gallery/"
},
imgs: () => {
let max = q("[aria-label=Pagination] a").maxNum || 1;
if (max > 1) {
let links = fn.arr(max, (v, i) => `${fn.url}page/${i + 1}/`);
return hr.getImgA("#article img", links);
}
return q("#article img");
},
button: [4],
insertImg: ["#article", 2],
customTitle: "main h1",
hide: ".bg-muted:has(script)",
category: "nsfw2"
}, {
name: "LUOBUS",
url: {
h: ["luobus.com"],
e: ".post-meta"
},
box: ["div[class$='meta-info']", 2],
imgs: () => hr.getImg(".entry-content img", ".ajax-pager a", "4"),
button: [4],
insertImg: [
["box", 0, "div[class$='meta-info']~p,.ajax-pager"], 2
],
customTitle: ".entry-header>h1",
category: "nsfw2"
}, {
name: "JimmysOnline.com",
url: {
h: "www.jimmysonline.com",
p: /^\/[^\/]+\/$/,
e: "a.aigpl-img-link[data-mfp-src]"
},
imgs: () => q("a.aigpl-img-link[data-mfp-src]").map(a => a.dataset.mfpSrc),
button: [4],
insertImg: [".aigpl-gallery", 2],
customTitle: ".entry-title",
category: "nsfw2"
}, {
name: "Mitaku",
url: {
h: "mitaku.net",
e: "a.msacwl-img-link[data-mfp-src]"
},
MutationObserver: () => q("body>div").for(e => {
if (e.textContent.includes("Ads Blocker Detected")) {
e.remove();
}
}),
imgs: () => q("a.msacwl-img-link[data-mfp-src]").map(a => a.dataset.mfpSrc),
button: [4],
insertImg: [
[".entry-content", 2], 2
],
autoDownload: [0],
next: ".previous>a",
prev: ".next>a",
customTitle: () => fn.dt({
s: "h1.entry-title",
d: /.[\smitaku]{6,7}\.net./
}),
hide: "div:has(.adblock_title)",
category: "nsfw2"
}, {
name: "Mitaku AAD",
url: {
h: ["mitaku.net"]
},
MutationObserver: () => q("body>div").for(e => {
if (e.textContent.includes("Ads Blocker Detected")) {
e.remove();
}
}),
hide: "div:has(.adblock_title)",
category: "ad"
}, {
name: "야동갤러리",
host: ["yagall2.com"],
url: {
t: "야동갤러리",
p: "/studio/"
},
box: ["#sv-img-grid", 1],
imgs: () => q("#studio-content img").map(e => e.dataset.s ? atob(e.dataset.s) : e.src),
button: [4],
insertImg: ["box", 2],
insertImgAF: () => fn.hideEle("#sv-img-grid"),
customTitle: "#bo_v_title",
category: "nsfw2"
}, {
name: "Mikatu",
url: {
h: "mikatu.net",
p: "/galleries/"
},
box: ["div:has(>div.gallery-card)", 1],
imgs: () => hr.getImg("div.gallery-card>img", "nav.flex"),
button: [4],
insertImg: [
["box", 2, "div:has(>div.gallery-card)"], 2
],
customTitle: "main h1",
category: "nsfw2"
}, {
name: "Maulon",
host: "1sex.maulon.vip",
url: {
t: "Maulon",
p: ".html",
e: ".entry-content .separator"
},
imgs: () => hr.getImgA(".entry-content .separator>a", ".page-links a"),
button: [4],
insertImg: [".entry-content", 2],
customTitle: "h1.entry-title",
category: "nsfw1"
}, {
name: "MissKON.com",
host: ["misskon.com"],
reg: /^https?:\/\/misskon\.com\/[^\/]+\/$/,
imgs: () => hr.getImg(".entry img[decoding]", ".page-link>*", 4),
button: [4],
insertImg: ["//p[img[@decoding]]", 2],
customTitle: "h1",
category: "nsfw2"
}, {
name: "4KHD",
host: ["www.4khd.com", "aynzl.uuss.uk", "zrxiu.ssuu.uk"],
url: {
e: "//a[@rel='home'][text()='4KHD'] | //a[@rel='home'][text()='秀图网']",
p: /^\/content\/\d+\/[^\.\/]+\.html$/
},
init: () => {
if ("serviceWorker" in navigator) {
let loop = setInterval(() => {
navigator.serviceWorker.getRegistrations().then(registrations => {
if (registrations.length) {
for (let registration of registrations) {
registration.unregister();
}
clearInterval(loop);
}
});
}, 1000);
}
},
imgs: () => hr.getImgA("figure.wp-block-image>a>img,#basicExample>a>img,.entry-content>p>a>img", ".page-link-box a").then(srcs => srcs.map(src => fn.rt(src, [
[/i\d\.wp\.com\//, ""],
["pic.4khd.com", "img.4khd.com"],
[/\?.+$/, ""],
[/\/w\d+-rw\//, "/w2500-h2500-rw/"]
]))),
button: [4],
insertImg: [
[".page-link-box,.wp-block-post-content>*:last-child,#khd", 1, "#basicExample,.wp-block-image,.entry-content>p:not(#FullPictureLoadEnd),.page-link-box"], 2
],
customTitle: "h3.wp-block-post-title",
css: ".FullPictureLoadImage{max-width:100%!important}",
hide: ".centbtd,.popup,.wp-container-13,.popup-iframe",
category: "nsfw2"
}, {
name: "4KHD AAD",
url: {
e: "//a[@rel='home'][text()='4KHD']"
},
init: () => {
if (fn.lh === "www.4khd.com") {
const replaceSrc = () => q("img[src*='pic.4khd.com']").for(e => {
let src = e.src;
src = src.replace("pic.4khd.com", "img.4khd.com");
e.src = src;
});
fn.addMutationObserver(replaceSrc);
}
},
hide: ".centbtd,.popup,.wp-container-13,.popup-iframe",
category: "ad"
}, {
name: "AsianPink",
url: {
h: ["asianpink.net"],
p: /^\/[^\/]+\/$/
},
imgs: () => {
let max = Number(fn.gt(".pagination .next", 2)) || 1;
if (max > 1) {
let links = fn.arr(max, (v, i) => i == 0 ? fn.lp : `${fn.lp}?gallery_page=${i + 1}`);
return hr.getImgA(".gallery-wrapper img", links).then(srcs => srcs.map(e => decodeURIComponent(e)));
}
return fn.srcs(".gallery-wrapper img").map(e => decodeURIComponent(e));
},
button: [4],
insertImg: [".gallery-wrapper", 2],
customTitle: "h1.entry-title",
category: "nsfw1"
}, {
name: "Buon Dua",
url: {
h: ["buondua.com", "buondua.us"],
e: ".article-fulltext img[alt]"
},
init: () => {
fn.remove("//div[text()='Sponsored ads']");
fn.remove(".search-form~*");
q(".pagination a[previous],.pagination a[next]").for(e => e.classList.add('disabled'));
},
imgs: () => hr.getImg(".article-fulltext img[alt]", ".pagination a"),
button: [4],
insertImg: [".article-fulltext", 2],
customTitle: ".article-header>h1",
referrerpolicy: "strict-origin",
hide: "div:not([class]):has(>small),a[href^=java]",
category: "nsfw2"
}, {
name: "HOTGIRLchina格式",
h: ["hotgirlchina.com"],
url: {
e: ["html[lang='en-US'],html[lang='vi']", "body.wp-theme-cube-blog", "#masthead .site-branding-logo", "#site-navigation", ".wp-block-gallery img"]
},
init: () => fn.remove("div:has(>iframe),center:has(iframe)"),
imgs: () => fn.srcs(".wp-block-gallery img").filter(src => !src.endsWith(".gif")),
button: [4],
insertImg: [".entry-content", 2],
autoDownload: [0],
next: ".nav-previous a",
prev: ".nav-next a",
customTitle: () => fn.dt({
s: ".entry-title",
d: /\(\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.*\)|\/mitaku\.net\//i
}),
hide: ".gaigu-banner,.vietpub_nativeads-banner,div:has(>iframe),center:has(iframe),#tpbr_topbar,.ad-container,.nwm-hidden-mobile,section[id^='custom_html'],#adsxyz-overlay-bg,#adsxyz-banner-float,#adsxyz-bottom-banner,.fappedia-banner,#vietpub-overlay,body>div[id]:has(>a[id])",
category: "nsfw2"
}, {
name: "HOTGIRLchina 格式 AD",
url: {
e: ["html[lang='en-US'],html[lang='vi']", "body.wp-theme-cube-blog", "#masthead .site-branding-logo", "#site-navigation"]
},
init: () => fn.remove("div:has(>iframe),center:has(iframe)"),
hide: ".gaigu-banner,.vietpub_nativeads-banner,div:has(>iframe),center:has(iframe),#tpbr_topbar,.ad-container,.nwm-hidden-mobile,section[id^='custom_html'],.boxzilla-container,.boxzilla-overlay,.sharrre-container,#vietpub-overlay,#adsxyz-overlay-bg,#adsxyz-banner-float,#adsxyz-bottom-banner,.fappedia-banner,#vietpub-overlay,body>div[id]:has(>a[id])",
category: "ad"
}, {
name: "3600000 Beauty",
host: ["3600000.xyz"],
reg: /^https?:\/\/3600000\.xyz\/[^\/]+\/$/,
imgs: () => {
let [a, img] = ["//a[img[@file]]", ".entry-content img.ls_lazyimg[file]"];
if (q(a).length) {
return q(a);
} else if (q(img).length) {
return q(img).attrs("file");
}
return [];
},
button: [4],
insertImg: [".entry-content", 2],
autoDownload: [0],
next: ".nav-previous>a",
prev: ".nav-next>a",
customTitle: ".entry-title",
hide: "ins",
category: "nsfw1"
}, {
name: "Big Boobs Asia",
host: ["www.tokyobombers.com"],
reg: /^https?:\/\/www\.tokyobombers\.com\/\d+\/\d+\/\d+\/[^\/]+\/$/,
imgs: () => {
if (q(".gallery img[srcset]").length) {
return q(".gallery img[srcset]").srcsets;
}
return q("a[itemprop='contentURL']");
},
button: [4],
insertImg: [".gallery", 2],
customTitle: ".entry-title",
category: "nsfw1"
}, {
name: "Pixnet 相簿",
link: "https://nagoat.pixnet.net/albums",
url: {
h: "pixnet.net",
p: "/albums/"
},
box: [".gallery", 2],
imgs: () => hr.getNP(".gallery>a", "a[data-slot='pagination-link']:has(path[d$='6-6-6-6'])", null, "nav[data-slot=pagination]"),
button: [4],
insertImg: [
["box", 0, ".gallery,nav[data-slot=pagination]"], 2
],
customTitle: () => fn.dt({
s: "#panel h2",
d: "相簿檔案"
}),
category: "nsfw1"
}, {
name: "Tabakus Gallery",
reg: /^https?:\/\/tabakus\.blogspot\.com\/\d+\/\d+\/[^\.]+\.html/,
init: () => fn.waitEle(".separator img"),
box: [".separator:has(>a>img[height])", 1],
imgs: ".separator>a:has(>img[height])",
button: [4],
insertImg: [
["box", 0, ".separator:has(>a>img),.separator~br"], 2
],
customTitle: ".post_item>h1",
category: "nsfw2"
}, {
name: "Chinese Nude Art Photos",
url: {
h: ["chinesenudeart.blogspot.com"],
p: /^\/\d+\/\d+\/[\w-]+\.html/i
},
imgs: ".entry-content a[href]",
thums: ".entry-content a[href]>img",
button: [4],
insertImg: [".entry-content", 2],
autoDownload: [0],
next: "a.blog-pager-older-link",
prev: "a.blog-pager-newer-link",
customTitle: () => fn.dt({
s: ".entry-title",
d: [
"Chinese beautiful model Amanda -",
"Beautiful Chinese girl -",
"Beautiful Chinese girl ",
"Chinese Beautiful girl -",
" |18+ Nude model Amateur"
]
}),
mcss: "#outer-wrapper{margin:0px!important;width:100%!important}",
category: "nsfw1"
}, {
name: "Daily Cosplay",
url: {
h: ["dailycosplay.com"]
},
imgs: () => q("tbody td[width='754'] center img[title]").filter(e => !e.closest("img[alt=Previous],img[alt=Next],.t2")),
capture: true,
autoDownload: [0],
next: "td[align=LEFT] a:has(img[alt=Previous])",
prev: "td[align=RIGHT] a:has(img[alt=Next])",
customTitle: () => fn.title(" - Daily Cosplay .com"),
category: "nsfw1"
}, {
name: "Animexx",
url: {
h: ["www.animexx.de"],
e: [".header_mitte>a", "#cosplay_tab_holder"],
st: "PHPSESSID"
},
imgs: () => {
fn.sm5();
let data_url = new URL(document.querySelector(".header_mitte>a").href).searchParams.get("back").replace(/\?.+$/, "");
let code = [...document.scripts].find(s => s.textContent.includes("PHPSESSID")).textContent;
let [, id] = code.match(/PHPSESSID=(\w+)/);
return hr.json(data_url + "photoswipe/?PHPSESSID=" + id, {
"headers": {
"x-requested-with": "XMLHttpRequest"
}
}).then(data => data.map(e => e.url));
},
capture: true,
customTitle: () => fn.title("auf Animexx.de"),
category: "nsfw1"
}, {
name: "Everia.club/Vearitale.com",
url: {
h: ["everia.club", "vearitale.com", "vilolala.com"],
p: [/^\/\d+\/\d+\/\d+\//, /^\/[^\/]+\/$/]
},
imgs: () => hr.getImgA(".wp-block-image img,.separator img", ".page-links a"),
button: [4],
insertImg: [".entry-content", 2],
customTitle: ".single-post-title",
category: "nsfw2"
}, {
name: "Gravia",
url: {
h: ["www.gravia.site", "gravia.site"],
p: "show.php",
s: "id="
},
box: [".slideshow.for_box", 2],
imgs: ".slideshow .item>img",
thums: ".thums img",
button: [4],
insertImg: [
["box", 0, ".slideshow.for_box"], 2
],
customTitle: () => fn.dt({
s: ".container>h1",
d: /\s?【\d+枚】/
}),
css: "img.small{max-width:100% !important;max-height:auto !important}",
hide: ".cmd_bar.wide",
category: "nsfw1"
}, {
name: "抜けるっ!二次元エロ画像&イラストまとめ",
url: {
h: "ero-gazou.jp",
e: ".grid-container img"
},
init: () => fn.addMutationObserver(() => document.documentElement.classList.remove("pum-open", "pum-open-overlay", "pum-open-scrollable")),
imgs: () => hr.getImgA(".grid-container img", ".pager-numbers a"),
capture: true,
autoDownload: [0],
next: "a.prev-post",
prev: "a.next-post",
customTitle: "h1.entry-title",
css: "html.pum-open{overflow: auto}",
hide: "#content-top,#content-bottom,.pum-overlay",
category: "nsfw2"
}, {
name: "水着グラビア",
url: {
h: ["www.mizugigurabia.com"],
s: "p="
},
init: () => {
fn.clearAllTimer();
fn.remove("#content-top");
},
imgs: () => {
let srcs_a = q(".article img[srcset]").srcsets;
let srcs_b = q(".entry-content a:has(>img)").filter(a => !a.closest(".code-block-16")).map(a => {
if (a?.firstElementChild?.src) {
let src = a.firstElementChild.src;
src = src.replace(/s(\.\w+)/i, "$1");
if (src == a.href) {
return src;
}
}
return a?.firstElementChild?.src;
});
return [...srcs_a, ...srcs_b];
},
capture: true,
customTitle: ".entry-title",
category: "nsfw2"
}, {
name: "エロ画像まとめ",
host: ["geinou-nude.com"],
reg: /^https?:\/\/geinou-nude\.com\/[^\/]+\/(#.*)?$/,
init: () => fn.addMutationObserver(() => fn.remove(".widgetarea_sp,.widget_execphp,.adContainer")),
imgs: ".post_thum>img,.post_content a[href*='/uploads/']",
videos: "iframe[src*=youtube]",
autoDownload: [0],
next: "a.nav_link_l",
prev: "a.f_row_r",
customTitle: "h1.post_title",
hide: ".widgetarea_sp,.widget_execphp,.adContainer",
setFancybox: true,
category: "nsfw2"
}, {
name: "お宝エログ幕府",
url: {
h: "bakufu.jp",
p: "/archives/"
},
imgs: () => {
let srcs = fn.srcs(".entry-content a[href*=bakufu]:has(img[src*=bakufu]),.entry-content a[href*=twimg]:has(img[src*=twimg])");
return srcs.map(e => e.replace("-scaled.", "."));
},
capture: true,
autoDownload: [0],
next: ".nav-previous>a",
prev: ".nav-next>a",
customTitle: "h1.entry-title",
category: "nsfw2"
}, {
name: "惚れた.net",
url: {
h: ["horeta.net"],
p: /^\/[\w-]+\/$/
},
imgs: () => {
let srcs = fn.srcs(".entry-content p>img.alignnone,.gallery-item img");
return srcs.map(e => e.replace("-scaled.", "."));
},
capture: true,
autoDownload: [0],
next: ".st-next-link",
prev: ".st-prev-link",
customTitle: ".entry-title",
category: "nsfw1"
}, {
name: "エロ画像女神ちゃんねる",
url: {
h: ["megamich.com"],
p: /^\/[^\/]+\/\d+\.html$/
},
imgs: () => hr.getImg("img[id^='entry_image']", ".current~a", 9),
capture: true,
customTitle: "#Single_h1",
hide: ".sidesticky_l:has(#im_wrap_left),.sidesticky_r:has(#im_wrap_right)",
category: "nsfw2"
}, {
name: "裏ピク",
url: {
h: "www.urapic.com",
p: "/blog-entry-"
},
imgs: "//div[@class='entry-body']//a[img[@title]] | //div[@class='entry_body']//a[img[@title]]",
autoDownload: [0],
next: "link[rel=prev],.next_entry>a",
prev: "link[rel=next],.prev_entry>a",
customTitle: () => fn.gt(".entry-title,.entry_title>h1").replace(/[w]+$/, ""),
setFancybox: true,
category: "nsfw2"
}, {
name: "Rikitake.com",
url: {
h: ["rikitake.com"],
p: "/g/"
},
imgs: "a[data-lightbox],a[data-fancybox]",
videos: "video>source",
button: [4],
insertImg: [".entry-content", 2],
customTitle: () => fn.dt({
d: "|Rikitake.com"
}),
downloadVideo: true,
observerClick: ".age-link.enter",
category: "nsfw2"
}, {
name: "アイドル画像魂",
host: ["blog.livedoor.jp"],
reg: /^https?:\/\/blog\.livedoor\.jp\/idol_gravure_sexy\/archives\/\d+\.html$/,
imgs: () => fn.srcs(".pict").map(e => e.replace("-s.", ".")),
capture: true,
autoDownload: [0],
next: ".article-pager>.prev a",
prev: ".article-pager>.next a",
customTitle: "h1.article-title",
category: "nsfw1"
}, {
name: "水着画像まとめ",
url: {
h: ["mizugazo.com"],
p: "/archives/"
},
imgs: () => {
let srcs = fn.srcs(".single_thumbnail>img,.wp-block-gallery img");
return srcs.map(e => e.replace(/-\d+x\d+\./, "."));
},
capture: true,
customTitle: ".entry-title",
category: "nsfw1"
}, {
name: "JKワールド",
link: "https://jkeroina.net/3zigazou/",
url: {
h: "jkeroina.net"
},
imgs: () => q(".single_thumbnail img,.single-post-main .content img").filter(e => !e.closest("#wp_rp_first")),
capture: true,
autoDownload: [0],
next: ".navigation a[rel=prev]",
prev: ".navigation a[rel=next]",
customTitle: "h1.entry-title",
category: "nsfw1"
}, {
name: "美巨乳美女図鑑@素人画像サイト",
url: {
h: "bikyonyu-bijo-zukan.com",
p: "/post"
},
imgs: () => fn.srcs(".entry-content img:not(.w_b_ava_img,[src$='ps-loader.svg'])").map(e => e.replace("-scaled.", ".")),
capture: true,
customTitle: "h1.entry-title",
hide: "div:has(.adblock_title),.widget_custom_html",
category: "nsfw2"
}, {
name: "日刊エログ",
url: {
h: "nikkanerog.com",
p: "/blog-entry-"
},
imgs: () => {
let srcs = q(".mainEntryBody img,.mainEntryMore img,#entry .entry-body img").filter(e => !e.closest("a[href*='html'],a[href*='?']")).srcs;
return srcs.map(e => e.replace(/s(\.\w+)$/, "$1"));
},
capture: true,
autoDownload: [0],
next: "a:has(>img[src$='next.png']),#nav-top .next a",
prev: "a:has(>img[src$='previous.png']),#nav-top .prev a",
customTitle: ".entry_title_h2_ver2,header.entry-title h1",
category: "nsfw2"
}, {
name: "夜のおかずchエロ画像集会所",
host: ["yorunookazucherogazousyuukaizyo.com"],
url: {
t: "夜のおかずchエロ画像集会所",
p: /^\/[^\/]+\/$/
},
imgs: () => hr.getNP(".entry-content>*", "//a[span[text()='次へ']]", null, ".pager-links").then(() => fn.srcsets(".entry-content img")),
button: [4],
insertImg: [".entry-content", 2],
autoDownload: [0],
next: "a:has(.prev-post-title)",
prev: "a:has(.next-post-title)",
customTitle: "h1.entry-title",
category: "nsfw2"
}, {
name: "Love Asian Babes",
url: {
h: ["amazon-love.com"],
p: /^\/[^.]+\.html$/
},
imgs: () => hr.getImg(".entry-content img", ".current~a", 7),
button: [4],
insertImg: [".entry-content", 2],
autoDownload: [0],
next: "span.prev>a",
prev: "span.next>a",
customTitle: ".entry-title",
category: "nsfw1"
}, {
name: "我要色色",
url: {
h: ["51sese.org"],
p: "/p/"
},
imgs: () => q("img[img-path]").attrs("img-path", (a) => `https://imgfiles.pages.dev${a}`),
button: [4],
insertImg: [".article-content", 2],
customTitle: ".article-title",
category: "nsfw1"
}, {
name: "夜社资源 寫真",
host: ["yeshezy.com", "yeshezy.sbs", "yeshezy.xyz", "yeshezy.top", "yeshezy.cfd", "yeshezy.cc"],
url: {
t: "夜社资源",
p: "/voddetail/",
e: ".infohead>span:text:写真列表"
},
box: [".videolist", 1],
imgs: () => q(".videolist>.list>a[onclick]").attrs("onclick", (a) => a.split("'").at(1)),
button: [4],
insertImg: ["box", 2],
insertImgAF: () => fn.remove(".videolist"),
customTitle: ".detailinfo>h1",
hide: "a.res",
category: "nsfw2"
}, {
name: "夜社资源 漫畫",
url: {
t: "夜社资源",
p: "/vodplay/"
},
box: [".picslist>.list", 1],
imgs: ".picslist img",
button: [4],
insertImg: ["box", 2],
insertImgAF: () => fn.remove(".picslist>.list"),
autoDownload: [0],
next: ".nextbtn>a",
prev: () => {
let cs = q("a.album-title").urls;
let ci = cs.findIndex(a => a.endsWith(fn.lp));
let a = cs[ci - 1];
return isString(a) ? a : null;
},
chapters: {
target: "a.album-title"
},
customTitle: ".picslist>.name",
hide: "a.res",
category: "hcomic"
}, {
name: "夜社/深夜色 寫真",
host: ["yeshex.com", "xyeshe.com", "shenyex.com"],
url: {
t: ["夜社", "深夜色"],
p: "/play/"
},
box: [".module-player-pics-list", 1],
imgs: ".module-player-pics-list img",
button: [4],
insertImg: ["box", 2],
insertImgAF: () => fn.remove(".module-player-pics-list"),
customTitle: ".module-player-info h1",
hide: ".btm_list_box,.module-player-info-items>.res,.vaj_list_box,a.module-item:not([href]),.storeBox",
category: "nsfw2"
}, {
name: "夜社/深夜色 漫畫",
url: {
t: ["夜社", "深夜色"],
p: "/play/"
},
box: [".module-player-cartoon-list>.title", 2],
imgs: ".title~.list img",
button: [4],
insertImg: ["box", 2],
insertImgAF: () => fn.remove(".title~.list"),
autoDownload: [0],
next: ".nextbtn>a",
prev: 1,
chapters: {
api: () => {
let id = fn.lpsa(2);
return `/detail/${id}.html`;
},
mode: "f",
target: ".chpterlist a.link"
},
customTitle: ".title",
hide: ".btm_list_box,.module-player-info-items>.res,.vaj_list_box,a.module-item:not([href]),.storeBox",
category: "hcomic"
}, {
name: "夜社/深夜色 AD",
url: {
t: ["夜社", "深夜色"]
},
hide: ".btm_list_box,.module-player-info-items>.res,.vaj_list_box,a.module-item:not([href]),.storeBox",
category: "ad"
}, {
name: "七仙子图片",
host: ["www.qixianzi.com"],
reg: /^https?:\/\/www\.qixianzi\.com\/\w+\/\d+\.html$/,
imgs: () => {
let url = fn.src("#diggnum script");
let classid = fn.getUSP("classid", url);
let id = fn.getUSP("id", url);
let links = [`/e/wap/show.php?classid=${classid}&id=${id}`];
return hr.getImgA(".arcmain img", links);
},
button: [4],
insertImg: [".picture_content", 2],
endColor: "white",
next: "//li[contains(text(),'上一篇')]/a",
prev: "//li[contains(text(),'下一篇')]/a",
customTitle: "h1.diy-h1",
hide: "nav:has(.pagination)",
category: "nsfw1"
}, {
name: "Asian To Lick",
url: {
h: ["asiantolick.com"],
p: "/post"
},
box: [".spotlight-group", 2],
imgs: () => fn.removeImageCDN(q("div[data-src]").srcs),
button: [4],
insertImg: [
["box", 0, ".spotlight-group"], 2
],
customTitle: "h1",
hide: "#touch_to_see",
category: "nsfw2"
}, {
name: "Asian To Lick 移除圖片CDN",
url: {
h: ["asiantolick.com"]
},
MutationObserver: () => q("#container img[data-src*='wsrv.nl']").for(e => {
e.src = fn.getUSP("url", e.dataset.src);
e.removeAttribute("data-src");
e.removeAttribute("src-original");
}),
category: "none"
}, {
name: "Goddess247/BestGirlSexy/美眉图/美女图库",
url: () => fn.checkUrl({
h: ["goddess247.com", "bestgirlsexy.com", "www.mmeijpg.com", "0505o.com"]
}) && !/^\/tag\/|^\/category\//.test(fn.lp) && !q(".needUp").one,
box: ["//p[img] | //img[@class='aligncenter size-full']", 1],
imgs: ".elementor-widget-container p img[alt],.elementor-widget-container img.aligncenter.size-full,.elementor-widget-theme-post-content img",
button: [4],
insertImg: [
["box", 0, "//p[img] | //img[@class='aligncenter size-full']"], 2
],
customTitle: () => fn.title(/ - Goddess247| - BestPrettyGirl| - Girl Sweetie| - Girl Dreamy| - BestGirlSexy| - 美眉图/),
category: "nsfw1"
}, {
name: "Danryoku",
url: {
h: ["danryoku.com"]
},
imgs: () => hr.getImgA(".dynamic-entry-content img", ".ipp-image-nav .nav-center a"),
button: [4],
insertImg: [".dynamic-entry-content", 2],
customTitle: "h1.gb-headline",
category: "nsfw1"
}, {
name: "HayVn.Net",
url: {
h: "www.hayvn.net"
},
imgs: () => {
let srcs = fn.srcs(".entry-content img");
return srcs.map(src => src.includes("/s1600/") ? fn.wurl("s16000", src, -2) : src);
},
capture: true,
customTitle: ".entry-title",
category: "nsfw1"
}, {
name: "GenZ Relax/Hình ảnh gái xinh",
url: {
h: ["genzrelax.com", "gaixinh.photo"],
e: ".entry-image img,.entry-content img:not(#img_video)"
},
imgs: () => q(".entry-image img,.entry-content img:not(#img_video)").filter(e => !e.closest("a[href*='?']")),
capture: true,
customTitle: "h1.entry-title,h1.page-title",
category: "nsfw1"
}, {
name: "呦糖社",
host: ["www.nicesss.com"],
reg: /^https?:\/\/www\.nicesss\.com\/archives\/[\w-]+\/([\w-]+\/)?\d+\.html$/i,
box: [".entry-content>img[data-srcset],.entry-content>p>img[data-srcset],.entry-content>center>img", 1],
imgs: () => q(".entry-content>img[data-srcset],.entry-content>p>img[data-srcset],.entry-content>center>img").map(e => e.dataset.srcset || e.src),
button: [4],
insertImg: [
["box", 0, ".entry-content>img[data-srcset],.entry-content>p:has(>img[data-srcset]),.entry-content>center>imgs"], 2
],
customTitle: ".entry-title>a",
category: "nsfw1"
}, {
name: "Fliporn/性性图",
host: ["fliporn.biz", "www.xingtupicx.buzz"],
reg: [
/^https?:\/\/fliporn\.biz\/videos\//,
/^https?:\/\/www\.xingtupicx\.buzz\/\?videos\//
],
include: "//span[@class='entry-category']/a[text()='亚洲贴图' or text()='写真' or text()='动漫贴图' or text()='性感贴图' or text()='欧美贴图' or text()='网友自拍']",
box: ["//center[img] | //center[p[img]] | //div[@id='conttpc' and img] | //div[@id='conttpc' and p[img]] | //div[@class='entry-content']//p[img] | //div[figure[div[img]]]", 1],
imgs: async () => {
let srcs = await hr.getImg("article img", ".current~a", 7);
return srcs.map(e => e.replace("%3C/center%3E%3C/p%3E%3Cdiv%20class=", "").replace(/\?w=858(&ssl=1)?/, ""));
},
button: [4],
insertImg: [
["box", 0, "//br | //div[@class='custom-pagination'] | //center[img] | //center[p[img]] | //div[@id='conttpc' and img] | //div[@id='conttpc' and p[img]] | //div[@class='entry-content']//p[img] | //div[figure[div[img]]]"], 2
],
customTitle: () => fn.dt({
s: ".entry-title",
d: /\n|[\s\d]+$/g
}),
category: "nsfw2"
}, {
name: "淫淫小说写真馆",
host: ["books.xxgirls.vip"],
url: {
h: "xxgirls",
p: "artdetail"
},
imgs: "#read_tpc img,.hl-article-content img",
button: [4],
insertImg: ["#read_tpc,.hl-article-content", 2],
autoDownload: [0],
next: ".hl-next",
prev: ".hl-prev",
customTitle: () => fn.dt({
s: ".hl-article-title",
d: /-[\d\s]+P?$|\(\d+P\)?.*$|【\d+P】$/i
}),
category: "nsfw2"
}, {
name: "Elite Babes格式",
url: {
h: ["www.elitebabes.com", "www.ftvhunter.com", "www.joymiihub.com", "pmatehunter.com", "www.jperotica.com", "www.metarthunter.com", "www.xarthunter.com", "www.femjoyhunter.com", "nakedporn.pics", "plum.gent", "uludagspot.com", "funphotoguys.com", "suikachallenge.com"],
e: ".list-gallery",
ee: "#content video"
},
init: () => fn.waitEle(".list-gallery a[data-fancybox]"),
imgs: () => q(".list-gallery a[data-fancybox]"),
thums: ".list-gallery a[data-fancybox]>img",
button: [4],
insertImg: [
[".list-gallery", 2], 2
],
customTitle: "#content>p",
fancybox: {
v: 3,
css: false
},
category: "nsfw2"
}, {
name: "Pics-X",
url: {
h: "pics-x.com",
p: "/gallery/"
},
imgs: () => fn.waitEle(["#images-container .images-container-image"]),
button: [4],
insertImg: ["#images-container", 2],
customTitle: () => fn.title(" | Pics-X"),
category: "nsfw2"
}, {
name: "Boombo!",
host: ["hot.boombo.biz", "boombo.biz"],
url: {
h: "boombo.biz"
},
imgs: () => fn.srcs(".text div[style] img,.text div.fimg img").map(e => e.replace("thumbs/", "")),
thums: ".text div[style] img,.text div.fimg img",
button: [4],
insertImg: [".text div[style],.news .text", 2],
customTitle: "#dle-content h1",
category: "nsfw2"
}, {
name: "Картинки и фото",
url: {
h: "cojo.ru",
e: ".entry-title"
},
imgs: ".wp-block-image img",
customTitle: () => fn.dt({
s: ".entry-title",
d: /\([\d\s]+фото\)|\(\d+[\sфотfots]+\)|\d+[\sфотfots]+/
}),
setFancybox: true,
category: "nsfw1"
}, {
name: "geekfan.site",
url: {
h: "geekfan.site",
e: [".sgb-data,.entry-content img", ".entry-title"]
},
imgs: () => {
let data = q(".sgb-data");
let links = q("a[href*='/images/']")
if (data.length) {
return data.all.flatMap(data => {
let text = data.textContent;
let json = JSON.parse(text);
return json.images.map(e => e.url.replace("-scaled", ""));
});
} else if (links.length) {
return links;
}
return q(".entry-content img");
},
capture: true,
autoDownload: [0],
next: ".nav-previous a[rel=prev]",
prev: ".nav-next a[rel=next]",
customTitle: () => fn.dt({
s: ".entry-title",
d: [
/\(\d+[\sфотfots]+\)|[\d\sфотfots]+/,
/\(?[\d\s]+фото\)?/,
/[\d\s]+горячих/,
"слив"
]
}),
category: "nsfw1"
}, {
name: "CLANNAD",
url: {
h: "clannadhouse.com",
p: /^\/[^\/]+\/$/
},
imgs: () => {
let g = "a.fox-lightbox-gallery-item";
let g2 = "div[class*='lightbox'] img";
if (q(g).length) {
return q(g);
} else if (q(g2).length) {
return q(g2).srcsets;
}
return q(".hero56__background>img,.entry-content img").srcsets;
},
capture: true,
customTitle: ".post-title",
category: "nsfw1"
}, {
name: "Terekspos",
url: {
h: "terekspos.com"
},
imgs: () => hr.getImg(".post-content>center>a>img,.post-content>p>a>img", ".post-pagination a", 4),
capture: true,
autoDownload: [0],
next: "div.next a",
prev: "div.previous a",
customTitle: "h1.post-title",
category: "nsfw2"
}, {
name: "Nevsepic",
host: ["nevsepic.com.ua"],
url: {
h: "nevsepic",
e: ["//div[@class='full-comms']/a[text()='18+']", ".full-text img,a.highslide", ".share_widget"]
},
box: [".share_widget", 1],
imgs: async () => {
let srcs = fn.srcs("a.highslide,.full-text img");
let pages = q(".bottom-nav").one;
if (pages) {
let last = q(".navigation>a:last-child").one;
let max = last.innerText;
let url = last.pathname;
let links = fn.arr(max, (v, i) => i == 0 ? fn.url : url.replace(/(\/page\,)(\d+\,)/, `$1${(i + 1) + ","}`));
srcs = await hr.getImgA("a.highslide,.full-text img", links);
}
return srcs.filter(src => !src.includes("/thumbs/") && !src.includes("attach.png"));
},
button: [4],
insertImg: [
["box", 0, ".full-text img:not(.FullPictureLoadImage,[src$='attach.png']),.full-text img:not(.FullPictureLoadImage,[src$='attach.png'])~br,a.highslide,a.highslide~br,.bottom-nav"], 2
],
customTitle: ".f-page-title",
category: "nsfw2"
}, {
name: "Nevsepic",
host: ["nevsepic.com.ua"],
url: {
h: "nevsepic",
e: [".full-text img,a.highslide", ".share_widget"]
},
imgs: async () => {
let srcs = fn.srcs("a.highslide,.full-text img");
let pages = q(".bottom-nav").one;
if (pages) {
let last = q(".navigation>a:last-child").one;
let max = last.innerText;
let url = last.pathname;
let links = fn.arr(max, (v, i) => i == 0 ? fn.url : url.replace(/(\/page\,)(\d+\,)/, `$1${(i + 1) + ","}`));
srcs = await hr.getImgA("a.highslide,.full-text img", links);
}
return srcs.filter(src => !src.includes("/thumbs/") && !src.includes("attach.png"));
},
capture: true,
button: [4],
customTitle: ".f-page-title",
category: "nsfw2"
}, {
name: "Развлекательно-эротический блог",
url: {
h: "tettie.net",
s: "p="
},
imgs: () => fn.srcs(".postContent img").filter(e => !e.includes("-ads")),
customTitle: ".postTitle",
setFancybox: true,
category: "nsfw2"
}, {
name: "FitNakedGirls",
url: {
h: ["fitnakedgirls.com"],
p: "/gallery/"
},
imgs: () => {
let srcs;
let [a, b] = [".wp-block-image img[data-src]", ".entry-content img"];
if (q(a).length) {
srcs = q(a).map(e => e.dataset.src.replace(/-\d+x\d+(\.\w+)$/, "$1"));
} else {
srcs = q(b).map(e => e.dataset.src ?? e.src);
}
return srcs.filter(src => !src.includes("18xmob.png") && !src.includes("/18plus"));
},
button: [4],
insertImg: [".entry-content", 2],
customTitle: ".entry-title",
css: ".g1-column-2of3{width:100%!important}",
hide: "#secondary",
category: "nsfw2"
}, {
name: "FreeXcafe",
host: ["www.freexcafe.com"],
reg: /^https?:\/\/www\.freexcafe\.com\/erotica\/[\w-]+\/[\w-]+\/index\.php/,
box: ["#content>*:last-child", 2],
imgs: () => hr.getImgA("#imagelink>img,#bigphoto>img", ".thumbs>a", 500),
thums: ".thumbs>a>img",
button: [4],
insertImg: [
["box", 2, ".thumbs"], 2
],
category: "nsfw2"
}, {
name: "Xasiat",
hots: [
"www.xasiat.com",
"avjb.com",
"www.x1hub.com",
"teenager365.to",
"theavporn.com",
"thothub.vip",
"thothd.com",
"epawg.com",
"www.javbangers.com",
"kissjav.com",
"xnhau.la",
"www.eachporn.com",
"www.eporner.video",
"www.porntrex.video",
"www.eachpics.com",
"www.xepn.com"
],
url: {
e: {
s: [".copyright a", ".footer .copy", ".footer .txt", ".footer .copi"],
t: [
"Xasiat",
"AVJB",
"爱微社区",
"愛微社區",
"X1HUB",
"EachPorn",
"Teenager365",
"The AV Porn",
"theavporn",
"javbangers",
"Thothub",
"ThotHD",
"EPawg",
"TXXX",
"KissJAV",
"xNhau",
"ePorner",
"EachPics"
]
},
p: [/\/(albums?|anh-sex)\/\d+/, "/gallery/"]
},
box: [".album-info,.video-controls", 1],
imgs: () => fn.srcs(".images img").map(e => e.replace(/main\/\d+x\d+/, "sources")),
thums: ".images img",
button: [4],
insertImg: [
["box", 0, ".images"], 2
],
customTitle: ".headline>h1,.title",
css: ".block-album{display:block !important}",
hide: ".block-album>.table,.top,.sponsor,.link-sponsor,.chatra--webkit,.report-violate,.footer~*:not([id^='Full'],[class^='Full'],[id^='pv-'],[class^='pv-'],#comicRead,#fab,*[class^=fancybox])",
category: "nsfw2"
}, {
name: "Erotic Pics",
url: {
h: ["erotic.pics"],
p: /^\/[^\/]+\/$/
},
imgs: ".entry-content img",
button: [4],
insertImg: [".entry-content", 2],
customTitle: () => fn.dt({
s: ".entry-title",
d: /\s–\s\d+\spics/
}),
category: "nsfw2"
}, {
name: "Jvflix",
url: {
h: ["jvflix.cc"]
},
box: [".vip-gallery", 1],
imgs: ".vip-gallery img",
button: [4],
insertImg: [
["box", 0, ".vip-gallery"], 2
],
customTitle: () => fn.title(/ - Jvflix.+$/),
category: "nsfw2"
}, {
name: "Erotic Pics 分類自動翻頁",
reg: /^https?:\/\/erotic\.pics\//,
autoPager: {
ele: "#masonry",
observer: "#masonry>article",
next: "span.current+a",
re: ".wp-pagenavi",
pageNum: "span.current"
},
openInNewTab: "a.entry-thumbnail:not([target=_blank])",
category: "autoPager"
}, {
name: "jimpicotphotography.com",
url: {
h: "jimpicotphotography.com"
},
imgs: ".con>img,#post-navigation img",
customTitle: () => fn.dt({
d: " - jimpicotphotography.com"
}),
category: "nsfw2"
}, {
name: "Pornotaran.com photo",
url: {
h: "pornotaran.com",
p: ".html",
e: ".inner-page__desc div:has(img[data-src])"
},
imgs: () => fn.srcs(".inner-page__desc img[data-src]").map(e => e.replace("/thumbs", "")),
button: [4],
insertImg: [".inner-page__desc div:has(img[data-src])", 2],
customTitle: ".inner-page__title",
category: "nsfw2"
}, {
name: "Hot Celebs Home",
url: {
h: "www.hotcelebshome.com",
e: ".tiled-gallery__gallery img"
},
imgs: () => fn.srcs(".tiled-gallery__gallery img").map(e => e.replace(/(-\d+x\d+)(.\w+)/i, "$2")),
capture: true,
customTitle: "h1.entry-title",
category: "nsfw2"
}, {
name: "Pictoa",
url: {
h: "www.pictoa.com",
p: ["/thumbs/", "/albums/"],
e: "#player img"
},
imgs: () => hr.getImgA("#player img", q(".thumb-nav-img a").urls),
thums: ".thumb-nav-img img",
button: [4],
insertImg: ["#player", 2],
customTitle: ".title>h1",
css: "#gallery #player{cursor:unset!important}",
hide: ".ad-placement",
category: "nsfw2"
}, {
name: "PimpAndHost",
host: ["pimpandhost.com"],
link: "https://pimpandhost.com/site/trending",
reg: /^https?:\/\/pimpandhost\.com\/(image|album)\/\d+/,
init: () => {
if (/image/.test(location.href)) location.href = q("a[title=Album]").url;
fn.remove(".flex-block-1,.flex-block-2,#comments,.ano_po");
},
imgs: () => hr.getNP("#album-images>.image-block", "li.active+li:not(.next)>a", null, ".pagination").then(() => q("#album-images .image-block a[data-src]")),
button: [4],
insertImg: [
[".summary", 2], 2
],
customTitle: ".author-header__album-name",
category: "nsfw2"
}, {
name: "PimpAndHost 隱藏廣告",
reg: /^https?:\/\/pimpandhost\.com\//,
init: () => fn.remove(".flex-block-1,.flex-block-2,#comments,.ano_po"),
hide: ".list-view:not(#main-list-view) .item:not(.image-block)",
category: "ad"
}, {
name: "Fapator",
host: ["www.fapator.com"],
reg: /^https?:\/\/www\.fapator\.com\/\?content_id=/i,
init: () => fn.remove("//div[@class='img' and a[@target and img]]"),
imgs: "a[data-lightbox]",
thums: "a[data-lightbox]>img",
button: [4],
insertImg: [".fcon+.fapad", 1],
autoDownload: [0],
next: "//a[contains(text(),'next photos')]",
prev: 1,
css: ".fapad{width:auto !important;height:auto !important}",
category: "nsfw2"
}, {
name: "DirtyShip.com",
url: {
h: ["dirtyship.com"],
p: "/gallery/"
},
srcset: ".gallery_grid img,.gallery_grid~img",
thums: ".gallery_grid img,.gallery_grid~img",
button: [4],
insertImg: [
[".gallery_grid", 0, ".gallery_grid img:not(.FullPictureLoadImage),.gallery_grid~img"], 2
],
customTitle: () => fn.title(" - DirtyShip.com"),
category: "nsfw2"
}, {
name: "imx.to gallery",
host: ["imx.to"],
reg: /^https?:\/\/imx\.to\/g\/\w+$/i,
imgs: () => q("img.imgtooltip").map(e => e.src.replace("/t/", "/i/").replace("/upload/small/", "/u/i/")),
button: [4],
insertImg: [
["#content", 2], 2
],
category: "nsfw2"
}, {
name: "imx.to",
host: ["imx.to"],
reg: /^https?:\/\/imx\.to\/i\/\w+$/i,
autoClick: ".button.blue.large,#continuebutton,a[title='Show gallery']",
category: "none"
}, {
name: "imgbox gallery",
url: {
h: ["imgbox.com"],
p: "/g/"
},
imgs: () => fn.srcs("#gallery-view-content img").map(src => fn.rt(src, [
["thumbs", "images"],
["_t.", "_o."],
["_b.", "_o."]
])),
button: [4],
insertImg: [
["#gallery-view-content", 2], 2
],
category: "nsfw2"
}, {
name: "1000艺术摄影/169图片大全",
url: {
h: ["www.1000ysys.com", "www.169tp.com", "wap.169tp.com"],
p: /^\/\w+\/\d+\/\d+\/\d+\.html/
},
imgs: () => hr.getImg(".big-pic img,.inside_box img", ".pagelist>li:first-child>a", 9),
button: [4],
insertImg: [".big-pic,.inside_box", 2],
autoDownload: [0],
next: ".fenxianga a,.pre_arct a",
prev: ".fenxianga a:last-child,.next_arct a",
hide: ".ad,union",
category: "nsfw1"
}, {
name: "热图站",
host: ["www.retu8.com", "www.simei8.com"],
link: "https://www.retu8.com/ji/leisitubaobao.html",
url: {
t: "热图站",
p: /\.htm$/,
e: ".pp.hh"
},
imgs: () => {
let max = fn.um(".page-show>*");
if (max > 1) {
let url = fn.lp.replace(".htm", "");
let links = fn.arr(max, (v, i) => i == 0 ? fn.lp : `${url}${i + 1}.htm`);
return hr.getImgA(".pp.hh img", links);
}
return q(".pp.hh img");
},
button: [4],
insertImg: [".pp.hh", 2],
customTitle: ".des>h1",
category: "nsfw1"
}, {
name: "热图站M",
host: ["m.retu8.com", "m.simei8.com"],
url: {
e: ["//a[text()='热图站']", "#ImageBox"],
p: /\.htm$/
},
imgs: () => {
let max = q(".article_page a").maxNum;
if (max > 1) {
let url = fn.lp.replace(".htm", "");
let links = fn.arr(max, (v, i) => i == 0 ? fn.lp : `${url}${i + 1}.htm`);
return hr.getImgA("#ImageBox img", links);
}
return q("#ImageBox img");
},
button: [4],
insertImg: ["#ImageBox", 2],
customTitle: ".ArticleHead>h1",
category: "nsfw1"
}, {
name: "人体艺术",
link: "https://dsqs8.com/",
url: {
e: ".umBody",
p: /^\/post\/\d+/
},
init: () => fn.clearAllTimer(),
box: [".viewall_plugin", 2],
imgs: ".LightGallery_Item",
button: [4],
insertImg: [
["box", 0, ".viewall_plugin"], 2
],
autoDownload: [0],
next: ".prev>a",
prev: ".next>a",
customTitle: "h1.tit",
category: "nsfw2"
}, {
name: "XO福利圖",
links: [
"https://kb1.a7xofulitu.com/%E5%84%BF%E6%AD%8C%E4%B8%89%E7%99%BE%E9%A6%96/",
"https://www.xofulitu521.xyz/xoxo",
"https://www.xofulitu9ok999.xyz/xoxo",
"https://diedk1123-ake33i.xofulitu2za222.sbs/xoxo",
"https://ponds-attract-ducks.xofulitu1qqq111.xyz/xoxo"
],
url: {
t: "XO福利圖",
h: "xofulitu",
e: ".picture-wrap img",
p: /\/art\/pic\/id\/\d+\/$/i
},
imgs: () => fn.srcs(".picture-wrap img").filter(src => !src.includes("loading")),
button: [4],
insertImg: [".container.clearfix", 2],
customTitle: () => fn.dt({
d: [
/ - XO福利圖.+$/,
/[\/\s]?[\(\[(【“]\d+[\w\s\\\/\.+-/]+[\)\])】”]|\s?\d+p[\+\s]+\d+v|\s?\d+p\d+v|\s?\d+P|\(\d\)/gi,
/[\s-]+$/
]
}),
hide: ".custom_link-wrapper,div:has(>#floating-ad),body>*[style*='display: block; z-index: 2147483646; width: 10%;']",
category: "nsfw2"
}, {
name: "XO福利圖 分類自動翻頁",
url: {
h: "xofulitu",
t: "XO福利圖",
p: /^\/arttype\//i
},
autoPager: {
ele: ".container.clearfix",
observer: ".container.clearfix .album",
next: ".paging-item--current+a",
re: ".pagging-div",
lazySrc: "img[data-src]",
pageNum: ".paging-item--current"
},
openInNewTab: ".picture-list a:not([target=_blank])",
hide: ".custom_link-wrapper,div:has(>#floating-ad),body>*[style*='display: block; z-index: 2147483646; width: 10%;']",
category: "autoPager"
}, {
name: "XO福利圖AD",
url: {
h: "xofulitu",
t: "XO福利圖"
},
hide: ".custom_link-wrapper,div:has(>#floating-ad),body>*[style*='display: block; z-index: 2147483646; width: 10%;']",
category: "ad"
}, {
name: "多多影视/多多影音/全网影视/哥哥在线/微微资讯/酷酷影音/男人社区 模式A",
link: "https://xxselove.com/artmv/",
url: {
e: [
".v_nav .sel_wrap",
"#content_news img"
],
p: /^\/art\w+\//
},
imgs: () => {
let pages = q("//div[@id='page']/a[@class='next'][starts-with(text(),'尾')]").one;
if (pages) {
let [max] = fn.gt(pages).match(/\d+/);
let dir = fn.dir(fn.lp);
let links = fn.arr(max, (v, i) => i == 0 ? dir : dir + `index${i + 1}.html`);
return hr.getImgA("#content_news img", links);
}
return q("#content_news img");
},
button: [4],
insertImg: ["#content_news", 2],
customTitle: ".title h1 a",
category: "nsfw2"
}, {
name: "多多影视/多多影音/全网影视/哥哥在线/微微资讯/酷酷影音/男人社区 模式B",
link: "https://m.rusese.org/artmv/",
url: {
e: [
"a.fed-nav-title[href='/artmv/']",
".fed-arti-content img"
],
p: /^\/art\w+\//
},
imgs: () => {
let pages = q(".fed-page-info a[href*='/index']").one;
if (pages) {
let [max] = fn.gt(".fed-page-info a:last-child").match(/\d+/);
let dir = fn.dir(fn.lp);
let links = fn.arr(max, (v, i) => i == 0 ? dir : dir + `index${i + 1}.html`);
return hr.getImgA(".fed-arti-content img", links);
}
return q(".fed-arti-content img");
},
button: [4],
insertImg: [".fed-arti-content", 2],
customTitle: ".fed-arti-info h2",
category: "nsfw2"
}, {
name: "多多影视/多多影音/全网影视/哥哥在线/微微资讯/酷酷影音/男人社区 模式C",
link: "https://xxk555.com/arttype/meituqu.html",
url: {
e: [
"a.fed-nav-title[href='/arttype/meituqu.html']",
".fed-arti-content img"
],
p: "/artdetail/"
},
imgs: () => {
let pages = q("//a[text()='尾页']").one;
if (pages) {
let max = q("//a[text()='尾页']").url.match(/\d+/g).at(-1);
let url = fn.lp.replace(/(-\d+)?\.html$/, "");
let links = fn.arr(max, (v, i) => i == 0 ? url + ".html" : url + `-${i + 1}.html`);
return hr.getImgA(".fed-arti-content img", links);
}
return q(".fed-arti-content img");
},
button: [4],
insertImg: [".fed-arti-content", 2],
customTitle: ".fed-arti-info h2",
category: "nsfw2"
}, {
name: "多多影视/多多影音/全网影视/哥哥在线/微微资讯/酷酷影音/男人社区 模式D",
link: "https://xoxvi.com/arttype/jipinmeinv.html",
url: {
e: [
"#sidebarTogglePcDown",
".single-video-info-content img"
],
p: "/artdetail/"
},
imgs: () => hr.getNP(".single-video-info-content>*", ".page-item.active+li>a:not([title='下一页'])", null, ".pagination").then(() => q(".single-video-info-content img")),
button: [4],
insertImg: [".single-video-info-content", 1],
customTitle: ".single-video-title h2",
category: "nsfw2"
}, {
name: "SexBee.TV",
link: "https://sexbee.tv/arttype/jipinmeinv/",
host: ["sexbee.tv", "m.beebee.top", "m.beeku.top", "蜜.2025tv.top", "m.aistv.top", "xiaobee.vip", "meimeibee.com"],
url: {
e: [
"#site-header .app-nav-toggle>.lines",
"#site-header a.logo>img[src='/assets/images/logo.png']",
"#list_art_common_art_show img"
],
st: ["pageContext", "toastMessage"],
p: "/artdetail/"
},
imgs: () => {
let pages = q(".pagination").one;
if (pages) {
let max = q("//a[text()='最後 »']").url.match(/\d+/g).at(-1);
let links = fn.arr(max, (v, i) => `?mode=async&function=get_block&block_id=list_art_common_art_show&sort_by=&from=${i + 1}`);
return hr.getImgA("#list_art_common_art_show img", links);
}
return q("#list_art_common_art_show img");
},
button: [4],
insertImg: ["#list_art_common_art_show", 2],
customTitle: ".content-header h2",
category: "nsfw2"
}, {
name: "adultspic色情成人圖片",
url: {
h: ["adultspic.com"],
p: ".html"
},
imgs: () => hr.getNP(".wp-block-image", "//a[text()='下一頁']").then(() => q(".wp-block-image img").currentSrcs),
button: [4],
insertImg: [".article-content", 2],
autoDownload: [0],
next: ".article-nav-prev>a",
prev: ".article-nav-next>a",
customTitle: ".article-title",
hide: ".ssr-content",
category: "nsfw2"
}, {
name: "名腿网",
host: ["www.mingtuiw.com"],
reg: /^https?:\/\/www\.mingtuiw\.com\/archives\/\d+\/.+$/,
exclude: "#div_img_vip",
imgs: () => hr.getImgA(".entry-content img.attachment-large", q("#thumb_imglist>a").urls).then(srcs => srcs.map(e => e.replace(/-\d+x\d+(\.\w+)$/, "$1"))),
button: [4],
insertImg: [".entry-content", 2],
customTitle: () => fn.dt({
d: /(\d+\/\d+).+/
}),
category: "nsfw1"
}, {
name: "AhentaiZ.net",
url: {
h: "ahentaiz.net",
e: "#imageContainer"
},
imgs: () => {
fn.sm5();
let json_url = fn.attr("#imageContainer", "data-json-url");
let s = new URL(json_url).origin;
return hr.json(json_url).then(arr => arr.map(e => s + e));
},
button: [4],
insertImgBF: () => fn.waitEle("#imageContainer img[alt]"),
insertImg: ["#imageContainer", 2],
customTitle: () => fn.dt({
d: [
"Read online Hentai Manga 2025 year",
" - Ahentaiz",
/"/g
]
}),
category: "hcomic"
}, {
name: "Doujin Hentai",
url: {
h: "doujin-hentai.net",
P: /^\/[\w-]+\/$/
},
box: [".post-content", 2],
srcset: ".post-content~p>img,.post-content~img",
button: [4, 4],
insertImg: ["box", 2],
insertImgAF: () => fn.remove(".post-content~p,.post-content~img,.post-content~center"),
customTitle: () => fn.getText([".post-titles h4", ".post-titles h2"]),
category: "hcomic"
}, {
name: "Prismblush",
url: {
h: "prismblush.com",
p: "/comic/"
},
imgs: () => {
let links = q(".level-0", ".comic-nav-jumptocomic").map(e => e.value);
return hr.getImgA("#comic img", links);
},
button: [4],
insertImg: ["#comic", 2],
endColor: "white",
customTitle: "h1.elementor-heading-title",
category: "hcomic"
}, {
name: "Xpicvid",
host: ["www.niacg.com", "www.susmeat.com"],
url: {
e: {
s: ".footer",
t: ["逆次元", "Xpicvid"]
},
p: /^\/(moeupup-\d-\d+\.html|showinfo-\d+-\d+-\d\.html)$/,
ee: ".dplayer-container,.episode"
},
imgs: () => hr.getNP(".row.thumb-overlay-albums img,.artwork-container .artwork img", ".pagination li.active+li>a:not(.prevnext)"),
button: [4],
insertImg: [".row.thumb-overlay-albums,.artwork-container .artwork", 2],
autoDownload: [0],
next: ".ph-active a[href$=html]:text:下一页|下一頁",
prev: ".ph-active a[href$=html]:text:上一页|上一頁",
customTitle: () => {
let url = q("//a[span[text()='漫畫簡介']] | //a[span[text()='漫画简介']]").url;
if (url) {
return hr.fetchDoc(url).then(dom => {
let comicName = q(".panel-heading h1", dom).text;
let episode = q(".episode", dom).one;
return episode ? comicName + " - " + q(".panel-heading>.pull-left").text : comicName;
}).then(text => fn.dt({
t: text,
d: [
/\(\d+[\w\s\.\+-]+\)/i,
/[\d+[\w\s\.\+-]+]/i
]
}));
}
return document.title;
},
category: "hcomic"
}, {
name: "DocTruyen3Q",
host: ["doctruyen3qhub.org"],
url: {
e: "meta[property='og:site_name'][content^=DocTruyen3Q]",
p: "/chapter-"
},
imgs: () => q(".list-image-detail>div[id].page-chapter>img").map(e => e.src),
button: [4],
insertImg: [".list-image-detail", 2],
autoDownload: [0],
next: "a.previous-chapter",
prev: "a.next-chapter",
chapters: {
target: "#select_chapter>option",
sort: "r"
},
customTitle: [".breadcrumb>li", 1, 2],
category: "hcomic"
}, {
name: "Manga Lotus/Yaoi Manga Online/Yaoi DJ/Yaoi Manga",
url: {
h: ["mangalotus.com", "yaoimangaonline.com", "yaoidj.com", "harlock.co.uk"]
},
box: [".meta-tags", 1],
imgs: ".entry-content img",
button: [4],
insertImg: [
["box", 0, ".entry-content .code-block,.entry-content p:has(img)"], 2
],
next: ".nav-links a[rel=next]",
prev: ".nav-links a[rel=previous]",
chapters: () => q(".mpp-toc a,.mpp-toc span").map(e => e.textContent == "Intro" ? null : ({
text: e.textContent,
url: e.classList.contains("current") ? fn.url : e.href
})).filter(Boolean),
customTitle: ".entry-title",
category: "hcomic"
}, {
name: "Naruto hentai Doujins/Ai Generated Hentai MILFS",
host: ["narutodoujins.com", "syntheticgirls.com"],
reg: [
/^https?:\/\/(www\.)?narutodoujins\.com\/\d+\//,
/^https?:\/\/(www\.)?syntheticgirls\.com\/\d+\//
],
imgs: async () => {
let srcs = [];
let links;
if (q(".post-items-list").one) {
let pages = q(".page-item-next").one;
if (pages) {
let max = fn.gt(".page-item-next", 2);
links = fn.arr(max, (v, i) => i == 0 ? fn.lp : fn.lp + `?page=${i + 1}`);
srcs = await hr.getEle(links, ".post-items-list a").then(eles => {
links = eles.map(a => a.href);
return hr.getImgA(".lightbox", links);
});
} else {
links = q(".post-items-list a").urls;
srcs = await hr.getImgA(".lightbox", links);
}
} else if (q(".post-images-carousel-wrap").one) {
links = q(".post-images-carousel-wrap a").urls;
srcs = await hr.getImgA(".lightbox", links);
} else {
srcs = fn.srcs(".lightbox");
}
let hd = srcs.filter(src => src.includes("/original/"));
if (hd.length) {
return hd;
}
return srcs;
},
capture: true,
customTitle: "h1.text-center",
category: "hcomic"
}, {
name: "TMOHentai",
url: {
h: ["www.tmohentai.app", "tmohentai.app"],
p: "/library/",
e: ".md-preview-read-btn"
},
box: [".md-info-card+.row", 2],
imgs: () => hr.getImgA(".reader-img-wrap>img", [q(".md-preview-read-btn").url]),
button: [4],
insertImg: [".md-info-card+.row", 2],
customTitle: "#md-title",
category: "hcomic"
}, {
name: "GotoFap",
url: {
h: ["gotofap.org"]
},
box: ["#gallery-border", 1],
imgs: () => hr.getNP(".gallery>*", "a.next.page-numbers-post", null, ".page-links").then(() => hr.getImgA(".entry-content img", q(".gallery-item a").urls)),
button: [4],
insertImg: ["box", 2],
insertImgAF: () => fn.hideEle("#gallery-border"),
customTitle: "article h1",
hide: "div[align]:has(script)",
category: "hcomic"
}, {
name: "ILikeComiX",
url: {
h: ["ilikecomix.com"],
e: ".entry-content img[data-jg-srcset],.pswp-gallery__item a"
},
imgs: () => q(".entry-content img[data-jg-srcset],.pswp-gallery__item a").srcsets.map(src => src.replace("-scaled", "")),
button: [4],
insertImg: [".entry-content", 2],
customTitle: ".entry-title",
category: "hcomic"
}, {
name: "MyAdultComics",
url: {
h: ["myadultcomics.com"],
p: "/read"
},
box: [".idbook", 1],
imgs: () => {
let str = Code.arr("template").join("");
let node = fn.html(str);
return q("img", node);
},
button: [4],
insertImg: [
["box", 0, ".idbook"], 2
],
customTitle: "#TOP",
category: "hcomic"
}, {
name: "ComicsXD",
url: {
h: ["comicsxd.com"],
e: ".pps-slide-count"
},
imgs: () => {
let max = fn.gt(".pps-slide-count").match(/\d+/g).at(-1);
let links = fn.arr(max, (v, i) => i == 0 ? fn.lp : `${fn.lp}${i + 1}/`)
return hr.getImgA(".pps-content img", links);
},
button: [4],
insertImg: [".pps-content", 2],
insertImgAF: () => fn.hideEle(".pps-slider-nav"),
customTitle: ".entry-title",
category: "hcomic"
}, {
name: "MANGA HENTAI",
url: {
h: ["adulthentai.net", "www.manga-hentai.net", "hentaiweb.net", "hentai-freak.com"],
},
box: [".thumbs", 2],
imgs: () => {
let links = q(".thumbs:not(:last-child) a").urls;
return hr.getImgA(".big-picture img", links);
},
thums: ".thumbs:not(:last-child) img",
button: [4],
insertImg: [
["box", 0, ".thumbs"], 2
],
customTitle: ".wrapper h2",
category: "hcomic"
}, {
name: "Neko Hentai",
host: ["neko-hentai.net"],
reg: /^https?:\/\/neko-hentai\.net\//i,
include: "#manga-content img",
imgs: "#manga-content img",
button: [4],
insertImg: ["#manga-content", 2],
endColor: "white",
customTitle: () => fn.title(/ - Neko Hentai.*$/),
category: "hcomic"
}, {
name: "EroKomics",
url: {
h: ["erokomics.com"],
e: ".ha_details_container"
},
box: [".custom-gallery", 1],
imgs: () => hr.getImgA("#shorts_container img", [fn.lp + "?mode=play"]),
button: [4],
insertImg: [
["box", 0, ".custom-gallery"], 2
],
customTitle: ".ha_heading",
category: "hcomic"
}, {
name: "Manhwaraw18",
url: {
h: ["manhwaraw18.com"],
p: "/chapter"
},
imgs: "#readerPages img",
button: [4],
insertImg: ["#readerPages", 2],
next: "a[title='Next Chapter']",
prev: "a[title='Previous Chapter']",
chapters: () => q("#chapterSelect>option").map(o => ({
text: o.text,
url: fn.wurl(o.value)
})).reverse(),
customTitle: [".reader-sidebar-title", "#chapterSelect>option[selected]"],
category: "hcomic"
}, {
name: "HDpornComics",
url: {
h: "hdporncomics.com",
e: [".my-gallery.scrollmenu", "#infoBox>h1"]
},
imgs: ".my-gallery a[data-size]",
thums: ".my-gallery a[data-size] img",
button: [4],
insertImg: [
[".postContent>.items-center,#likeDislikeVue", 2], 2
],
customTitle: () => fn.dt({
s: "#infoBox>h1",
d: [
" – Gay Manga",
" Comic Porn"
]
}),
category: "hcomic"
}, {
name: "HDpornComics",
url: {
h: "hdporncomics.com",
p: "/chapter"
},
imgs: "#imageContainer img",
button: [4],
insertImg: ["#imageContainer", 2],
autoDownload: [0],
next: "#nextChapter a",
prev: "#previousChapter a",
chapters: {
node: "#selectChapter",
target: "option",
sort: "r",
cb: (text, url) => {
if (!url.endsWith("/")) {
url = url + "/";
}
return {
text,
url
}
}
},
customTitle: [".list-reset a,option[selected]", 2, 3],
category: "hcomic"
}, {
name: "Hanime1.me",
url: {
h: ["hanimeone.me"],
p: /^\/comic\/\d+$/
},
box: [".comics-thumbnail-wrapper", 2, 1280],
imgs: () => {
fn.sm5();
let url = q(".comics-thumbnail-wrapper a").one;
return hr.fetchDoc(url).then(dom => {
let dir = q("#current-page-image", dom).one.dataset.prefix;
let extensions = Code.arr("extensions", dom);
return extensions.map((e, i) => {
if (dir.includes("nhentai")) {
return `${dir}${(i + 1)}.${fn.ex(e)}`;
}
return dir + e + ".jpg";
});
});
},
button: [4],
insertImg: ["box", 2],
insertImgAF: () => fn.hideEle(".comics-thumbnail-wrapper"),
endColor: "white",
customTitle: () => fn.getText(["h4.title", "h3.title"]),
referer: "src",
category: "hcomic"
}, {
name: "DoujinHentai",
url: {
h: ["doujinhentai.net"],
p: "/manga-hentai/",
e: ".manga-image"
},
imgs: () => Object.values(Code.obj("pageUrls")),
capture: true,
customTitle: [".desktop-manga-title>h1", ".desktop-manga-title>p"],
category: "hcomic"
}, {
name: "IMHentai格式",
url: {
h: ["imhentai.xxx", "hentairox.com", "hentaiera.com", "comicporn.xxx", "hentaiclap.com", "www.hentaienvy.com", "hentaienvy.com", "hentaifox.com"],
p: "/gallery/"
},
box: ["#comments_div,.gallery_second:has(#append_thumbs),.gallery_thumbs,.gallery_bottom"],
imgs: async () => {
let code = fn.fs("var g_th =");
if (!code) {
let url = fn.gu(".left_cover a,.gp_read a,.gt_left a,.gallery_left a,.hz-gallery-read");
code = await hr.getCode(url, {
mode: "dom",
key: "var g_th ="
});
}
let g_th = fn.textToObject(code, "g_th");
return hr.hentai_t(`/${fn.lh == "hentaifox.com" ? "includes" : "inc"}/thumbs_loader.php`).then(srcs => fn.dir(srcs.at(0))).then(dir => Object.entries(g_th).map(([i, v]) => `${dir}${i}.${fn.ex(v.split(",").at(0))}`));
},
button: [4],
insertImg: ["box", 2],
customTitle: () => fn.getText([".info>h1", ".gp_top_right h1", ".gt_right h1", ".subtitle", "h1"]),
category: "hcomic"
}, {
name: "HentaiZap",
url: {
h: ["hentaizap.com"],
p: "/gallery/"
},
box: [".hz-gallery-pages-section"],
imgs: async () => {
fn.sm5();
let url = fn.gu(".hz-gallery-read");
let dom = await hr.fetchDoc(url);
let code = fn.gt("#readerPagesJson", 1, dom);
let arr = JSON.parse(code);
let src = fn.src(".hz-gallery-thumb img");
let dir = fn.dir(src);
return arr.map(({
page,
ext
}) => `${dir}${page}.${fn.ex(ext)}`);
},
button: [4],
insertImg: ["box", 2],
customTitle: "#gallery-title",
category: "hcomic"
}, {
name: "エロモモ",
url: {
h: "momoniji.com",
e: "#cif"
},
imgs: () => hr.getImgA("#cif img", ".singlepager a"),
capture: true,
customTitle: "main h1",
category: "hcomic"
}, {
name: "エロ画像まとめ えっちなお姉さん。",
url: {
h: "hnalady.com",
p: "/blog-entry-"
},
imgs: () => q(".entry_body img,#more img,.entry_more img").filter(e => !e.closest(".relation_entry,.wakupr")),
capture: true,
autoDownload: [0],
next: ".page_next a,.next_entry a",
prev: ".page_prev a,.prev_entry a",
customTitle: "#main h2,.big_title h2",
category: "hcomic"
}, {
name: "キモ男陵辱同人道",
url: {
h: "kimootoko.net",
p: "/archives/"
},
imgs: () => q(".post_content .midashigazou img,.post_content a[data-wpel-link]:not(.syousaimoji):has(img)").filter(e => !e.closest(".fanzakiji-hako,.pickup")),
capture: true,
customTitle: ".c-postTitle__ttl",
category: "hcomic"
}, {
name: "H研-成年コミック研究会",
url: {
h: "www.b-hentai.com",
p: ".html"
},
imgs: () => hr.getImgA(".content img", ".article-pagination a"),
autoDownload: [0],
next: "//a[div[div[div[text()='Previous']]]]",
prev: "//a[div[div[div[text()='Next']]]]",
customTitle: "h1.post-title",
category: "hcomic"
}, {
name: "XlecX",
url: {
h: ["xlecx.one"],
p: /^\/[^\.\/]+\.html$/
},
imgs: () => fn.srcs(".ug-thumb-image,img[data-src]").map(e => e.replace("thumbs/", "")),
button: [4],
insertImg: [
[".page__col-left", 0], 2
],
customTitle: ".page__col-left>h1",
category: "hcomic"
}, {
name: "8muses",
host: ["comics.8muses.com"],
reg: /^https?:\/\/comics\.8muses\.com\/comics\/album\/[\w-]+\/[\w-]+\//i,
include: ".gallery",
exclude: ".image-title>.title-text",
imgs: () => {
let srcs = q("img[data-src]").map(e => e.dataset.src.replace("/image/th/", "https://comics.8muses.com/image/fl/"));
let xhrNum = 0;
fn.showMsg("hr.xhrHEAD...", 0);
return srcs.map(async src => {
let res = await hr.xhrHEAD(src);
fn.showMsg(`hr.xhrHEAD(${xhrNum+=1}/${srcs.length})`, 0);
let status = res.status;
return status == 404 ? src.replace("/fl/", "/fm/") : src;
});
},
button: [4],
insertImg: [
[".gallery", 2], 1
],
endColor: "white",
category: "hcomic"
}, {
name: "ReadManga18/ManhwaHub/Manga18fx/MangaDNA/MangaDass/Manhwa18",
url: {
h: ["www.readmanga18.com", "readmanga18.com", "manhwahub.me", "manga18fx.com", "mangadna.com", "mangadass.com", "manga18.me", "manhwa18.cc", "metruyen18.net"],
p: "/chapter-"
},
imgs: ".read-content img",
button: [4],
insertImg: [".read-content", 2],
autoDownload: [0],
next: "a.navi-change-chapter-btn-next",
prev: "a.navi-change-chapter-btn-prev",
chapters: {
node: "select.navi-change-chapter",
target: "option",
sort: "r",
cb: (text, _, o) => {
let url;
if (fn.lp.endsWith("/")) {
url = fn.wurl(o.dataset.c, fn.url, -2);
} else {
url = fn.wurl(o.dataset.c, fn.url);
}
return {
text,
url
}
}
},
customTitle: ".read-manga h1,.entry-title",
hide: "#detect_modal,.modal-backdrop",
category: "hcomic"
}, {
name: "爱漫画网",
host: ["www.iimhw.com", "iimhw.com", "www.iimhw.top", "eemh.top", "mhgou.com", "mhmao.com", "mhjia.com", "mhxia.com", "8cmh.com", "mhzan.com", "ppmhw.com", "mhzhu.com", "rhmhw.com", "www.ssmhw.com"],
url: {
e: "a#trang-chu.logo-h1",
p: "/chapter"
},
imgs: () => q(".chapter-content img:not([data-original*='?'])"),
button: [4],
insertImg: [".chapter-content", 2],
next: "a#next_chap[href$=html]",
prev: "a#prev_chap[href$=html]",
chapters: () => {
let a = q("a:has(.glyphicon-list-alt)").one;
return hr.fetchDoc(a).then(dom => {
const get = (_dom) => q(".title-list:not([id])+.row .list-chapter a", _dom).map(a => ({
text: a.title,
url: a.href
}));
let pages = q("//a[text()='Last']", dom).one;
if (pages) {
let doms = [dom];
let max = Number(fn.getUSP("p", pages.href)) - 1;
let links = fn.arr(max, (v, i) => `${a.href}?p=${i + 2}`);
let resArr = links.map(fn.fetchDoc);
return Promise.all(resArr).then(res => {
doms = [...doms, ...res];
return doms.map(get).flat();
});
}
return get(dom);
});
},
customTitle: [".truyen-title", ".chapter-title"],
hide: "#goTop~div[class][style]",
category: "hcomic"
}, {
name: "丽图·污漫画",
url: {
h: "litu100.xyz",
p: "comic/id-"
},
imgs: ".comic-images img",
button: [4],
insertImg: [".comic-images", 2],
autoDownload: [0],
next: "a.next",
prev: "a.prev",
chapters: {
target: "//h3[text()='漫画章节']/following-sibling::a"
},
customTitle: () => fn.dt({
s: ".breadcrumb span:nth-child(2)",
d: "首页"
}),
css: "body{overflow:unset!important}",
hide: ".banner_ad,.swal2-container,.article:has(.media),.jquery-modal.blocker.current,.push-top-container",
category: "hcomic"
}, {
name: "紳士漫畫",
link: "https://wnacg.date/,https://wnacg01.org/",
//第3方API直接取得"寫真 & Cosplay"分類一整頁的畫廊資料
//https://meoden.net/gallery?page=1&site=WN&siteTag=
//https://meoden.net/api/gallery/wnacg?page=1
url: {
t: ["紳士漫畫", "绅士漫画"],
p: "/photos-index-aid-"
},
init: () => {
fn.remove(".sh,.dlh,div:not([id],[class],[style]):has(>a>img[alt]),iframe,.dv-section:has(.dv-notice)");
fn.remove("//body/div[a[img]] | //div[@class='Introduct']/a[div[img]] | //div[a[img[@alt='Game Tip']]]");
fn.addMutationObserver(() => fn.remove(".sh,.dlh,div:not([id],[class],[style]):has(>a>img[alt]),iframe"));
},
box: [".gallary_wrap,.dv-section:has(.dv-desc-text)", 2],
imgs: () => {
fn.sm5();
let [galleryId] = fn.lp.match(/\d+/);
let dataUrl = `/photos-item-aid-${galleryId}.html`;
return hr.text(dataUrl).then(text => {
let array = fn.textToArray(text, "page_url");
return array.map(url => fn.rt(url, [
[/^http:\/\//, "https://"],
[/^\/\//, "https://"]
]));
});
},
button: [4],
insertImg: [
["box", 0, ".gallary_wrap"], 2
],
customTitle: () => fn.dt({
d: / - 紳士漫畫.*$| - 绅士漫画.*$|-紳士漫畫.*$|-绅士漫画.*$/
}),
category: "hcomic"
}, {
name: "宅男漫画",
host: ["www.znmh.net"],
url: {
t: "宅男漫画",
p: "/view/",
st: "encodedImages"
},
init: () => fn.clearAllTimer(3),
box: ["#imageContainer", 1],
imgs: () => {
let encodedImages = Code.str("encodedImages");
encodedImages = atob(encodedImages);
let images = "";
for (let i = 0, n = encodedImages.length; i < n; i++) {
images += String.fromCharCode(encodedImages.charCodeAt(i) ^ "comicreader2024".charCodeAt(i % 15));
}
return JSON.parse(images);
},
button: [4],
insertImg: [
["box", 0, "#imageContainer"], 2
],
customTitle: () => fn.title(" - 宅男漫画"),
hide: "#inviteModal,.float-ad",
category: "hcomic"
}, {
name: "宅男漫画",
host: ["www.znmh.net"],
url: {
t: "宅男漫画",
p: /^\/\w+$/
},
MutationObserver: () => q(".gallery-item[onclick]").for(item => {
item.innerHTML = `<a href="${item.getAttribute("onclick").split("'").at(1)}" target="_blank">${item.innerHTML}</a>`;
item.removeAttribute("onclick");
}),
hide: ".float-ad",
category: "none"
}, {
name: "PacHub",
url: {
h: ["pachub.net"],
p: "/read/"
},
imgs: "#comic-pages img",
button: [4],
insertImg: ["#comic-pages", 2],
autoDownload: [0],
next: {
s: "#comic-read-nav a",
t: "下一话"
},
prev: {
s: "#comic-read-nav a",
t: "上一话"
},
chapters: {
target: "[role=dialog] a",
textNode: "span",
cb: (t, url) => ({
text: `第${t}话`,
url
})
},
customTitle: () => {
let [m, c] = q("#comic-read-header>a,#comic-read-header h1+span").texts;
[c] = c.match(/\d+/);
return `${m} - 第${c}话`;
},
category: "hcomic"
}, {
name: "Roku Hentai",
host: ["rokuhentai.com"],
reg: /^https?:\/\/rokuhentai\.com\/\w+\/\d+$/,
imgs: ".site-reader__image",
button: [4],
insertImg: [".site-reader", 2],
customTitle: () => fn.title(" - Roku Hentai"),
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}",
hide: ".site-bottom-ad-slot",
category: "hcomic"
}, {
name: "177 漫画/XXIAV寫真館",
url: {
h: [/177pic/, "www.xxiav.com"],
p: /^\/html\/\d+\/\d+\/\d+\.html$/
},
imgs: () => hr.getImg(".single-content img[data-lazy-src]", ".page-links a", 10),
button: [4],
insertImg: [".single-content", 2],
autoDownload: [0],
next: "a[rel=prev]",
prev: "a[rel=next]",
customTitle: ".entry-title",
category: "hcomic"
}, {
name: "18H 宅宅愛動漫",
host: ["18h.animezilla.com"],
reg: /^https?:\/\/18h\.animezilla\.com\/manga\/\d+/,
imgs: () => hr.getImgO("#comic", ".last", "4", 0, ".entry-title,.wp-pagenavi", siteUrl, 0),
button: [4],
insertImg: ["#page-current", 1],
customTitle: () => fn.dt({
s: "h1.entry-title",
d: /\s?\[\d+P\](\s?-\s?\d+\/\d+\s?)?/i
}),
category: "hcomic"
}, {
name: "色漫網",
host: ["www.cartoon18.com", "www.cartoon18.org"],
url: {
e: ["//span[text()='色漫網']|//span[text()='色漫网']", ".title+div>a.btn-info"],
p: "/v/"
},
box: [".row.mb-4", 2],
imgs: () => {
fn.sm5();
let urls = q(".title+div>a.btn-info").urls;
return hr.getImgA("img[data-src],#lightgallery a,.gallary a", urls, 2000);
},
button: [4],
insertImg: ["box", 3],
hide: "#chromeModal,.modal-backdrop,#_iconsTop,#_iconsBottom,#_imageBottom",
category: "hcomic"
}, {
name: "色漫網",
url: {
e: ["//span[text()='色漫網']|//span[text()='色漫网']", ".title+div>a>i.fa-play"],
p: "/v/"
},
box: [".title~.row"],
imgs: () => {
fn.sm5();
let url = q(".title+div>a").url;
return hr.fetchDoc(url).then(dom => q("img[data-src]", dom).length ? q("img[data-src]", dom) : q("#lightgallery a,.gallary a", dom));
},
button: [4],
insertImg: ["box", 2],
insertImgAF: (parent) => {
parent.className = "";
let modalOpen = q(".modal-open").one;
if (modalOpen) modalOpen.classList.remove("modal-open");
},
hide: "#chromeModal,.modal-backdrop,#_iconsTop,#_iconsBottom,#_imageBottom",
category: "hcomic"
}, {
name: "色漫网",
host: ["www.cartoon18.com"],
reg: /^https?:\/\/www\.cartoon18\.com\/([\w-]+\/)?story\/\d+\/full/,
imgs: () => q("img[data-src]").length ? q("img[data-src]") : q("#lightgallery a,.gallary a"),
button: [4],
insertImg: ["#lightgallery,.gallary", 2],
autoDownload: [0],
next: "//a[text()='下一話']",
prev: "//a[text()='上一話']",
hide: "#_iconsTop,#_iconsBottom,#_imageBottom",
category: "hcomic"
}, {
name: "开心看漫画",
host: ["kxmanhua.com"],
url: {
t: "开心看漫画",
p: "/detail/"
},
imgs: ".blog__details__content img",
button: [4],
insertImg: [".blog__details__content", 2],
endColor: "white",
autoDownload: [0],
next: "//a[text()='下一话'][@href]",
prev: "//a[text()='上一话'][@href]",
chapters: {
url: ".view-fix-top-bar a",
target: ".chapter_list a",
sort: "r"
},
customTitle: () => q("meta[name='manga-name']").attr("content") + " - " + q("meta[name='chap-title']").attr("content"),
hide: ".fixed-ads,.ad-banner,.blog__details__content~*",
category: "hcomic"
}, {
name: "18H漫画",
host: ["18hmanga.com", "18hmanga.cyou"],
reg: /^https?:\/\/(18hmanga\.(com|cyou))\/[^\/]+\/$/,
init: () => fn.remove(".code-block,#secondary,body>div[id][class][style]"),
imgs: ".entry-content>img,.entry-content>p>img,.entry-content>div>img",
button: [4],
insertImg: [".entry-content", 2],
autoDownload: [0],
next: "#content .g1-teaser-prev",
prev: "#content .g1-teaser-next",
customTitle: ".entry-title",
css: ".g1-column-2of3{width:100%!important}",
category: "hcomic"
}, {
name: "COMIC18",
host: ["www.comic18.cc"],
reg: /^https?:\/\/www\.comic18\.cc\/\w+\/\d+\.html$/,
init: () => fn.waitEle(".article-body>img").then(e => fn.createImgBox(e, 1)),
imgs: ".article-body>img",
button: [4],
insertImg: [
["box", 0, ".article-body>img"], 2
],
autoDownload: [0],
next: "a.entry-page-prev[href$=html]",
prev: "a.entry-page-next[href$=html]",
customTitle: ".detail-title",
category: "hcomic"
}, {
name: "18漫畫",
host: ["18mh.org", "m.18mhx.com"],
url: {
e: ["meta[property='og:site_name'][content='18漫畫']", "#chapterContent"],
p: "/manga/"
},
imgs: () => fn.waitEle([".touch-manipulation img"]),
button: [4],
insertImg: [".touch-manipulation", 2],
autoDownload: [0],
next: "#nextChapterLink",
prev: "#preChapterLink",
chapters: {
api: () => {
let id = q("#chapterContent").attr("data-ms");
return `/manga/get?mid=${id}&mode=all`;
},
target: "#allchapterlist a",
cb: (t, url, e) => ({
text: e.dataset.ct,
url
})
},
customTitle: ["ol.inline-flex>li:nth-child(2) a", "ol.inline-flex>li:nth-child(3) a"],
category: "hcomic"
}, {
name: "HentaiVn",
host: ["www.hentaivnx.com", "www.hentaivnx.net", "hentaivnx.vip", "www.hentaivnx.live", "www.hentaivn.college", "raw18.vip"],
url: {
t: ["HentaiVn", "raw"],
p: "/chapter",
e: ".reading-detail",
ee: ".lucide-list"
},
init: () => fn.waitEle(".select-chapter>option"),
imgs: ".page-chapter img",
button: [4],
insertImg: [".reading-detail", 2],
autoDownload: [0],
next: "a.next:not([href='#'])",
prev: "a.prev:not([href='#'])",
chapters: () => hr.json("/Comic/Services/ComicService.asmx/ProcessChapterList?comicId=" + fn.attr(".chapter-id,.follow-link", "data-cid")).then(json => json.chapters.map(({
name,
url
}) => ({
text: name,
url
})).reverse()),
customTitle: [".breadcrumb span[itemprop=name]", 2, 3],
hide: ".banners-all",
category: "hcomic"
}, {
name: "Pizzaria Scan",
url: {
h: ["pizzariacomics.com"],
p: "-capitulo-"
},
init: () => fn.wait(() => fn.fs("ch_image")),
imgs: () => {
let code = Code.slice("ch_image", ["$.reader(", ");"]);
return Object.values(fn.run(code).array).map(e => e.image);
},
capture: true,
autoDownload: [0],
next: ".nvs>a:has(.fa-chevron-right)",
prev: ".nvs>a:has(.fa-chevron-left)",
chapters: async () => {
let fullHtml = "";
let id = q("a[data-post-id]").attr("data-post-id");
let page = 1;
let hasNextPage = false;
do {
let formData = new FormData();
formData.append("action", "load_chapters");
formData.append("post_id", id);
formData.append("count", 1000);
formData.append("paged", page);
formData.append("order", "ASC");
let htmlText = await hr.text("/wp-admin/admin-ajax.php", {
body: formData,
method: "POST"
});
fullHtml += htmlText;
if (htmlText.includes("Próximo")) {
hasNextPage = true;
page++;
} else {
hasNextPage = false;
}
} while (hasNextPage);
let node = fn.html(fullHtml);
return q("a:has(span.text-xs)", node).map(a => ({
text: q(".text-xs", a).text,
url: a.href
}));
},
customTitle: ".entry-title",
category: "hcomic"
}, {
name: "SXKOMIX.com/SEXKOMIX2.com",
url: {
h: ["sxkomix.com", "sexkomix2.com"],
p: "/comics"
},
home: "/home/",
box: ["#comix_pages_ul", 1],
imgs: "#comix_pages_ul img",
button: [4],
insertImg: [
["box", 0, "#comix_pages_ul"], 2
],
customTitle: () => fn.dt({
s: "#comix_description h1",
d: "by sexkomix2.com."
}),
category: "comic"
}, {
name: "Hennojin",
url: {
h: ["hennojin.com"],
p: "/manga/"
},
box: ["#respond", 1],
imgs: () => hr.getImgA(".slideshow-container img", [fn.gu("//a[text()='Read Online']")]),
button: [4],
insertImg: ["box", 2],
customTitle: () => [...q(".manga-title").one.childNodes].filter(e => e.nodeType == 3).at(0).textContent,
category: "hcomic"
}, {
name: "MangaXL",
url: {
h: "mangaxl.com",
s: "read_manga"
},
init: () => fn.waitEle(".all-pages-dialog__content-list>.active"),
imgs: () => hr.getImgA(".pages-slider__wrapper>img", ".all-pages-dialog__content-list>a:not(.active)"),
button: [4],
insertImg: [".pages-slider__wrapper", 2],
customTitle: ".read-page__header-title",
category: "hcomic"
}, {
name: "TruyenHentaiVN",
host: ["truyenhentaivn.store"],
url: {
e: [".site-logo img[alt=TruyenHentaiVN]", ".chapter-content", "h1.name"]
},
imgs: ".chapter-content img",
button: [4],
insertImg: [".chapter-content", 2],
autoDownload: [0],
next: "//a[text()='Chap sau ']",
prev: "//a[text()=' Chap trước']",
chapters: {
url: ".rank-math-breadcrumb a",
urlIndex: 1,
target: ".chap-list a",
textNode: ".name",
sort: "r"
},
customTitle: () => fn.dt({
s: "h1.name",
d: " - Oneshot"
}),
hide: "body>div[style]:has(a[href$=go])",
category: "hcomic"
}, {
name: "TruyenHentaiVN AD",
url: {
e: ".site-logo img[alt=TruyenHentaiVN]"
},
hide: "body>div[style]:has(a[href$=go])",
category: "ad"
}, {
name: "Thư Viện Hentai",
url: {
h: "hentai.yoga",
p: ["/gallery/open/", "/comics/open/"]
},
box: [".main-gallery-section", 2],
imgs: () => Code.arr("mainEntity").filter(e => e["@type"] == "ImageObject").map(e => e.url),
button: [4],
insertImg: ["box", 2],
customTitle: ".gallery-page-title",
category: "hcomic"
}, {
name: "哇嘎哒/一之涩/哈塔兹/布罗塔/物二/奥特",
host: ["www.wgada.com", "1zse.com", "hatazi.com", "www.bulota.com", "aotem.org", "522160.xyz"],
url: {
t: ["一之涩", "哈塔兹", "布罗塔", "物二", "奥特", "哇嘎哒", "网站标题"],
p: /^\/index\.php\/\d+\.html/
},
init: () => {
fn.addMutationObserver(() => fn.remove("#eruda,.__chobitsu-hide__,#lightboxOverlay,#lightbox"));
fn.clearAllTimer();
},
imgs: () => hr.getImg(".context img", "span.pages,.pagelist a", 7),
button: [4],
insertImg: [".context", 2],
autoDownload: [0],
next: ".post-previous a",
prev: ".post-next a",
customTitle: () => fn.dt({
s: "#content h1",
d: /\[\d+P\]|〈|〉/gi
}),
hide: "body>*:not(#head,.container,#footer,#tbox,[id^='Full'],[class^='Full'],[id^='pv-'],[class^='pv-'],#comicRead,#fab,*[class^=fancybox])",
category: "hcomic"
}, {
name: "杜牙/那露/勇吉拉/汉库克",
host: ["www.duteya.com", "naluhd.com", "www.yojila.com", "www.hakuk.com"],
url: {
t: ["杜牙", "那露", "勇吉拉", "汉库克"],
p: /^\/index\.php\/\d+\.html/
},
imgs: () => hr.getImgA(".article-content img", "a.post-page-numbers", 300),
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: ".article-title>a",
category: "hcomic"
}, {
name: "鸟鸟韩漫",
host: ["nnhanman6.com"],
url: {
h: "nnhanman",
p: "chapter",
e: ".BarTit>h1"
},
imgs: "img[data-original]",
button: [4],
insertImg: ["//td[img] | //div[@class='view-imgBox']", 2],
autoDownload: [0],
next: "#k_Pic_nextArr",
prev: "#k_Pic_upArr",
chapters: {
url: "#k_Pic_backArr",
target: "#list a",
sort: "r"
},
customTitle: () => fn.gt(".BarTit>h1").replace(" - 第1章", ""),
category: "hcomic"
}, {
name: "楠楠漫画",
host: ["nnmh.cc", "ttmh99.com", "nnmh.info", "nnboook.com"],
url: {
t: "楠楠漫画",
p: /\/inforedit\/\d+\/\d+$/
},
imgs: ".item img",
button: [4],
insertImg: [".item", 2],
autoDownload: [0],
next: () => {
let url = fn.gu(".next a");
return /\/\d+\/\d+$/.test(url) ? url : null;
},
prev: ".prev a",
chapters: async () => {
let p = 1;
let loop = true;
let html = "";
let id = fn.lpsa(-2);
while (loop) {
await hr.json("/index.php?m=&c=book&a=getjino", {
headers: {
"content-type": "application/x-www-form-urlencoded; charset=UTF-8",
"x-requested-with": "XMLHttpRequest"
},
body: new URLSearchParams({
type: "mh",
id,
p,
sort: 0
}),
method: "POST"
}).then(json => {
html += json.info;
if (json.status == 0) {
loop = false;
}
p++;
});
}
html = fn.html(html);
return q(".item a", html).map(a => {
let text = a.outerText;
if (text.includes("第")) {
let i = text.indexOf("第");
text = text.slice(i);
}
return {
text,
url: a.href
};
});
},
customTitle: () => {
let text = q("meta[property='og\\:title']").attr("content").split("/").at(-1);
let m, c;
if (text.includes("-")) {
[m, c] = text.split("-");
} else {
[m, c] = text.split(" ");
}
m = m.split("/").at(0);
return m + " - " + c;
},
hide: ".read-article>img",
category: "hcomic"
}, {
name: "18H汉化漫画 詳情頁",
host: ["manhua.sexbook.top", "18manga.top", "mt91.top", "kk4.top", "9xh.top", "v-m.top", "cr8.top"],
url: {
e: "//ul[@class='nav-main']//a[text()='18H汉化漫画'] | //a[text()='很色情的漫画'] | //a[text()='涩涩汉化漫画']",
p: "/cont.php",
s: "?id="
},
init: () => fn.waitEle(".article-content>h3,.article-title"),
imgs: () => {
let [max] = fn.gt("#td-Act+#td-Series,.meta+.meta .rounded-button99").match(/\d+/);
let [, dir, , ex] = fn.gu("#content-id a,.article-tabs-content a:has(img)").match(/^(.+\/)(\d+)(\.\w+)$/);
return fn.arr(max, (v, i) => dir + (i + 1) + ex);
},
button: [4],
insertImg: [
[".content", 0, ".article-content>a,.article-tabs-content a:has(img)"], 2
],
endColor: "white",
customTitle: () => {
let text = fn.gt(".article-content>h3,.article-title");
if (text.includes("|")) {
text = text.split("|")[1];
}
return fn.dt({
t: text,
d: "很色情的漫画-"
});
},
css: ".single .content{margin-right:0px!important;}",
hide: ".sidebar,.modown-ad",
category: "hcomic"
}, {
host: ["kkcomic.vip", "51man.vip", "www.51comic.org", "book.51comic.org", "18comic.top", "www.18comic.bar", "www.yumanse.com", "91manwu.com", "maozhuamcn.com", "fumanwu.org"],
url: () => {
let check = fn.checkUrl({
e: [".hl-logo-black", ".hl-logo-white"],
p: "/artdetail"
});
return check ? fn.waitEle(".hl-article-title,.hl-show").then(() => !q(".hl-comic-box.hl-show").one) : false;
},
init: () => fn.remove(".container:has(>#homeBannerWrap)"),
imgs: ".hl-article-box img",
button: [4],
insertImg: [".hl-article-box", 2],
autoDownload: [0],
next: "//a[@class='hl-next'] | //a[span[text()='下一話']]",
prev: "//a[@class='hl-prev'] | //a[span[text()='上一話']]",
customTitle: () => q(".hl-mob-title").one ? fn.gt(".conch-head-1>.hl-mob-title") + " - " + fn.gt(".conch-head-2>.hl-mob-title") : fn.gt(".hl-article-title"),
hide: ".hl-banner-list,.hl-app-list,.hl-hidden-md",
category: "hcomic"
}, {
name: "污污漫书",
host: "www.55comics.com",
url: {
t: "污污漫书",
p: /\/\d+\.html$/,
e: ".scramble-page img"
},
imgs: () => {
if (q(".pagination li.active").one) {
let max = fn.gt("//li[a[text()='下一页»' or text()='下一頁»' or text()='Next»']]", 2);
let links = fn.arr(max, (v, i) => i == 0 ? fn.url : fn.url + "?p=" + (i + 1));
return hr.getImgA(".scramble-page img", links);
}
return hr.getNP(".scramble-page", "//li/a[text()='下一页»' or text()='下一頁»' or text()='Next»']", null, ".pagination").then(() => q(".scramble-page img"));
},
button: [4],
insertImg: [
[".scramble-page", 2, ".scramble-page"], 2
],
insertImgAF: () => {
let arr = ["//div[div[@class='ads']]", "//div[ul[ul[@class='pagination']]]"];
fn.remove(arr);
},
autoDownload: [0],
next: "//a[text()='下一话»' or text()='下一話»']",
prev: "//a[text()='上一话»' or text()='上一話»']",
chapters: {
url: ".chapter-left a",
urlIndex: 2,
target: ".episode a"
},
customTitle: () => {
let str = fn.gt(".chapter-left h1");
let strArr = str.split(">");
strArr = strArr.map(str => str.trim());
if (strArr[3] == "全集阅读") {
return strArr[2]
}
return strArr[2] + " - " + strArr[3];
},
observerClick: "#chk_cover",
hide: ".row:has(>.ads),.row:has(>.stui_md)",
category: "hcomic"
}, {
name: "污污漫书",
url: {
t: "污污漫书",
h: /www\.55comics\./
},
observerClick: "#chk_cover",
hide: ".row:has(>.ads)",
category: "ad"
}, {
name: "VisorCapitulo",
url: {
h: ["www.visorcapitulo.com"],
p: "/manga/",
e: "i#data"
},
imgs: () => jsonHooker((text, parse, resolve) => {
if (text.includes('"images_link"')) {
resolve(parse(text).images_link);
}
}),
button: [4],
insertImg: ["#reader", 2],
autoDownload: [0],
next: "a:has(.bi-chevron-right)",
prev: "a:has(.bi-chevron-left)",
chapters: {
target: "#chapters-list>option",
sort: "r"
},
customTitle: [".breadcrumb>li", -2, -1],
category: "comic"
}, {
name: "Monte Tai",
url: {
h: ["montetaiscanlator.xyz"],
p: "/capitulo-"
},
box: [".reading-content", 2],
imgs: ".reading-content img",
button: [4],
insertImg: ["box", 2],
insertImgAF: () => fn.hideEle(".reading-content"),
endColor: () => q(".text-ui-light").one ? "white" : "black",
autoDownload: [0],
next: "a[title='Proximo capitulo']",
prev: "a[title='Capitulo anterior']",
chapters: {
target: "[data-mt-reading-panel=chapters] a",
sort: "r"
},
customTitle: [".mt-reading-desktop-title", ".mt-reading-desktop-chapter"],
category: "comic"
}, {
name: "Safire Scan",
url: {
h: "www.safirescan.site",
p: "/cap"
},
init: () => fn.waitEle("#nextPrevJSbottom a[rel=home]"),
imgs: ".chapter img",
autoDownload: [0],
next: "#nextPrevJSbottom a[rel=next]",
prev: "#nextPrevJSbottom a[rel=prev]",
chapters: {
target: "[name=npx-list] a",
sort: "r"
},
customTitle: () => `${q("header>h1>a").text} - ${q("[aria-label=Bookmark]").attr("data-title")}`,
category: "comic"
}, {
name: "HerenScan/Lector KNS",
url: {
h: ["herenscan.com", "lectorknight.com"],
p: "/capitulo-"
},
box: [".reading-content", 2],
imgs: ".chapter-images img",
button: [4],
insertImg: ["box", 2],
insertImgAF: () => fn.hideEle(".reading-content"),
endColor: () => q(".text-ui-light").one ? "white" : "black",
autoDownload: [0],
next: ".nav-next>a",
prev: ".nav-previous>a",
chapters: {
target: ".listing-chapters_wrap .chapter-name>a:not([href='#'])",
sort: "r"
},
customTitle: [".chap-item>h3>a", "#chapter-heading"],
hide: "body>div:has(button[aria-label=Close]):not(.wrap)",
category: "comic"
}, {
name: "Manga Livre",
url: {
h: ["mangalivre.blog"],
p: "/capitulo/"
},
imgs: ".chapter-images img",
button: [4],
insertImg: [".chapter-images", 2],
autoDownload: [0],
next: ".next-chapter",
prev: ".prev-chapter",
chapters: {
target: ".reader-sidebar__popup-list>a"
},
customTitle: () => fn.dt({
s: ".manga-title",
r: [
["/", "-"]
]
}),
category: "comic"
}, {
name: "Plot Twist No Fansub",
url: {
h: ["plotnofansub.com"],
p: "-"
},
box: [".reading-content", 2],
imgs: ".rd-panel .rd-pic",
button: [4],
insertImg: ["box", 2],
insertImgAF: () => fn.hideEle(".reading-content"),
endColor: () => q(".text-ui-light").one ? "white" : "black",
autoDownload: [0],
next: ".chapter-next>a",
prev: ".chapter-prev>a",
chapters: {
target: ".plot-reader-select>option",
sort: "r"
},
customTitle: () => fn.title(" - Plot Twist No Fansub"),
category: "comic"
}, {
name: "Kaguya ID",
host: ["01.kaguya.pro"],
url: {
t: "Kaguya ID"
},
box: [".reading-content", 2],
imgs: () => q(".chapter-images img[data-aesir]").attrs("data-aesir", atob),
button: [4],
insertImg: ["box", 2],
insertImgAF: () => fn.hideEle(".reading-content"),
endColor: () => q(".text-ui-light").one ? "white" : "black",
autoDownload: [0],
next: ".nav-next>a",
prev: ".nav-previous>a",
chapters: {
target: ".listing-chapters_wrap .chapter-name>a:not([href='#'])",
sort: "r"
},
customTitle: [".chap-item>h3>a", "#chapter-heading"],
category: "comic"
}, {
name: "TaurusManga",
url: {
h: ["lectortaurus.com"],
p: "/capitulo-"
},
imgs: ".reading-content img",
button: [4],
insertImg: [".reading-content", 2],
endColor: () => q(".text-ui-light").one ? "white" : "black",
autoDownload: [0],
next: ".nav-next>a",
prev: ".nav-previous>a",
chapters: {
target: ".wp-manga-chapter a",
sort: "r"
},
customTitle: ".chap-item h3",
hide: "#banner-cerrable,.ad",
category: "comic"
}, {
name: "Fairy Scans",
url: {
h: ["fairyscans.com"],
p: "-chapter-"
},
imgs: () => fn.waitEle(["#readerarea img"]),
button: [4],
insertImg: ["#readerarea", 2],
autoDownload: [0],
next: "a[aria-label='Next chapter']",
prev: "a[aria-label='Previous chapter']",
chapters: {
target: ".greed-reader-chapters>a",
sort: "r"
},
customTitle: [".greed-reader-series", ".greed-reader-titlebox .greed-reader-chapter"],
category: "comic"
}, {
name: "TRManga",
url: {
h: ["trmanga.com"],
p: "-"
},
imgs: "#images>img",
button: [4],
insertImg: ["#images", 2],
autoDownload: [0],
next: ".next>a",
prev: ".previous>a",
chapters: {
target: "#Chapter-list+.dropdown-menu>a",
sort: "r"
},
customTitle: () => q("#mangaNameInput").attr("value") + " - " + fn.gt("#Chapter-list"),
category: "comic"
}, {
name: "Mgread.io",
url: {
h: ["mgread.io", "siyahmelek.site", "ragnarscans.com"],
p: ["/chapter-", "/bolum-"]
},
imgs: "#chapter-content img",
button: [4],
insertImg: ["#chapter-content", 2],
autoDownload: [0],
next: "#next-link",
prev: "#prev-link",
chapters: () => {
let get = (items) => items.map(({
slug,
number
}) => ({
text: `${fn.lp.includes("/bolum") ? "Bölüm" : "Chapter"} ${number}`,
url: fn.wurl(slug, fn.lp, -2)
}));
let chapters = [];
let id = fn.attr("#chapter-toggle", "data-id");
return hr.json(`/wp-json/initmanga/v1/chapters?manga_id=${id}&paged=1&per_page=50`).then(json => {
chapters = get(json.items);
if (json.total_pages > 1) {
let links = fn.arr(json.total_pages - 1, (v, i) => `/wp-json/initmanga/v1/chapters?manga_id=${id}&paged=${i + 2}&per_page=50`);
let resArr = links.map(hr.json);
return Promise.all(resArr).then(arr => {
chapters = [...chapters, ...arr.map(j => get(j.items))].flat();
return chapters.reverse();
});
}
return chapters.reverse();
});
},
customTitle: [".uk-breadcrumb .uk-text-capitalize", -2, -1],
hide: ".init-ad",
category: "comic"
}, {
name: "Rinko Comics",
url: {
h: ["rinkocomics.com"],
p: "-chapter-"
},
imgs: ".images-flow>img",
button: [4],
insertImg: [".images-flow", 2],
autoDownload: [0],
next: ".chapter-navigation .next",
prev: ".chapter-navigation .prev",
chapters: () => {
let a = q(".comic-home").one;
return hr.fetchDoc(a).then(async dom => {
let comicworld_ajax = Code.obj("var comicworld_ajax", dom);
let {
ajax_url,
nonce
} = comicworld_ajax;
let id = q("#bookmarkComicBtn", dom).attr("data-comic-id");
let html = "";
let offset = 0;
let loop = true;
while (loop) {
await hr.json(ajax_url, {
headers: {
"content-type": "application/x-www-form-urlencoded; charset=UTF-8",
"x-requested-with": "XMLHttpRequest"
},
body: new URLSearchParams({
action: "load_more_chapters",
nonce,
comic_id: id,
offset
}),
method: "POST"
}).then(json => {
if (json?.data?.html) {
html += json?.data?.html;
offset += 10;
} else {
loop = false;
}
});
}
let node = fn.html(html);
return q(".chapter:not(.locked-chapter) a", node).map(a => ({
text: fn.dt({
s: ".chapter-number"
}, a),
url: a.href
})).reverse();
});
},
customTitle: [".breadcrumb-link,.breadcrumb-current", -2, -1],
category: "comic"
}, {
name: "Little Tyrant",
url: {
h: ["tiraninha.world"],
p: "/cap",
st: "_proxyUrls"
},
init: () => fn.waitEle(".manga-page-canvas[width][height]"),
imgs: async () => {
let p_arr = [];
await fn.aotoScrollEles({
scale: ".reading-content",
ele: ".manga-page-canvas",
cb: (canvas) => {
if (["width", "height"].every(k => canvas.hasAttribute(k))) {
p_arr.push(new Promise(resolve => canvas.toBlob((blob) => resolve(URL.createObjectURL(blob)), "image/jpeg", 0.9)));
return true;
}
return false;
},
top: 1
});
return Promise.all(p_arr);
},
autoDownload: [0],
next: ".nav-next>a",
prev: ".nav-previous>a",
chapters: {
wait: ".single-chapter-select option[data-redirect]",
node: ".single-chapter-select",
target: "option",
cb: (t, v, e) => ({
text: e.text,
url: e.dataset.redirect
}),
sort: "r"
},
customTitle: () => fn.title(" - Little Tyrant"),
category: "comic"
}, {
name: "Bully MANGA",
url: {
h: ["bully-manga.com"]
},
box: ["#imageContainer", 1],
imgs: () => Code.arr("const IMAGE_MAP"),
button: [4],
insertImg: [
["box", 0, "#imageContainer"], 2
],
autoDownload: [0],
next: ".rd-nav-btn.active:has(path[d^='M9'])",
prev: ".rd-nav-btn.active:has(path[d^='M15'])",
chapters: {
node: ".selected+.dropdown",
target: "li",
cb: (text, u, e) => {
let url = new URL(e.dataset.value, fn.url).href
return {
text,
url
};
},
sort: "r"
},
customTitle: "main h1",
category: "comic"
}, {
name: "Starlight Scan",
url: {
h: "starligthscan.com",
s: "episodio"
},
box: [".scanImagesContainer .base__horizontalList", 1],
imgs: ".scanImagesContainer>img",
button: [4],
insertImg: [
["box", 0, ".scanImagesContainer>img"], 2
],
endColor: "white",
autoDownload: [0],
next: "//a[text()='Próximo Episódio'][not(contains(@class,'disabled'))]",
prev: "//a[text()='Episódio Anterior'][not(contains(@class,'disabled'))]",
chapters: {
url: "//a[span[text()='Voltar']]",
target: "a.mangaDetails__episodeTitle",
sort: "r"
},
customTitle: () => hr.fetchDoc(q("//a[span[text()='Voltar']]").one).then(dom => {
let title = fn.gt(".mangaDetails__title", 1, dom);
return `${title} - Capítulo ${fn.getUSP("episodio")}`;
}),
category: "comic"
}, {
name: "Paradox Scans",
url: {
h: ["paradoxscans.com"],
p: "/bolum-"
},
imgs: () => fn.waitEle(["#chapter-content img"]),
button: [4],
insertImg: ["#chapter-content", 2],
autoDownload: [0],
next: "#next-link",
prev: "#prev-link",
chapters: () => {
let items = [];
let get = () => items.map(({
number,
slug
}) => ({
text: `Bölüm ${number}`,
url: fn.wurl(slug, fn.lp, -2)
})).reverse();
let id = fn.attr("#chapter-toggle", "data-id");
let api = (paged) => {
let params = fn.USP({
manga_id: id,
paged,
per_page: 50
});
return hr.json(`/wp-json/initmanga/v1/chapters?${params}`);
};
return api(1).then(json => {
items = json.items;
let {
total_pages
} = json;
if (total_pages > 1) {
let resArr = fn.arr(total_pages - 1, (v, i) => api(i + 2));
return Promise.all(resArr).then(arr => {
items = [...items, ...arr.map(e => e.items)].flat();
return get();
});
}
return get();
});
},
customTitle: [".uk-breadcrumb>li", -2, -1],
hide: "div:has(.adblock_title),div:has(img[alt$=Adblock]),div:has(img[alt*=Tool]),.adblock_title,.adblock_subtitle",
category: "comic"
}, {
name: "Ragnar Scans/MangaRuhu",
url: {
h: ["ragnarscans.net", "mangaruhu.com"],
p: "/bolum-"
},
imgs: "#chapter-content img",
button: [4],
insertImg: ["#chapter-content", 2],
autoDownload: [0],
next: "#next-link",
prev: "#prev-link",
chapters: () => {
let mid = q("#chapter-toggle").attr("data-id");
const get_json = (p) => hr.json(`/wp-json/initmanga/v1/chapters?manga_id=${mid}&paged=${p}&per_page=50`);
const get_c = (json) => json.items.map(({
slug,
number
}) => ({
text: `Bölüm ${number}`,
url: fn.lp.endsWith("/") ? fn.wurl(slug, fn.lp, -2) : fn.wurl(slug)
}));
return get_json(1).then(json => {
if (json.total_pages > 1) {
let jsons = [json];
let resArr = fn.arr(json.total_pages - 1, (v, i) => get_json(i + 2));
return Promise.all(resArr).then(res => {
jsons = [...jsons, ...res];
return jsons.map(j => get_c(j)).flat().reverse();
});
}
return get_c(json).reverse();
});
},
customTitle: ".uk-article>h1",
category: "comic"
}, {
name: "Araznovel",
url: {
h: ["manga.araznovel.com"],
p: "/bolum-"
},
imgs: () => q(".ao-reader-images__img").attrs("data-src", atob),
capture: true,
autoDownload: [0],
next: "a.ao-reader-nav__next",
prev: "a.ao-reader-nav__prev",
chapters: {
target: "#aoChapterSelect>option"
},
customTitle: [".ao-breadcrumbs__item span[itemprop=name]", -2, -1],
hide: "#aoAdblockOverlay",
category: "comic"
}, {
name: "Mangafu",
url: {
h: "mangafu.com",
p: "/bolum-"
},
box: [".reader-page", 1],
imgs: ".reader-page img",
insertImg: [
["box", 0, ".reader-page"], 2
],
autoDownload: [0],
next: "//a[text()='Sonraki Bölüm >']",
prev: "//a[text()='< Önceki Bölüm']",
chapters: {
node: "select[name=bolum]",
target: "option",
sort: "r"
},
chapters: () => q("option", "select[name=bolum]").map(o => ({
text: `Bölüm ${o.value}`,
url: fn.lp.replace(/\/bolum-[\d\.]+\//, `/bolum-${o.value}/`)
})),
customTitle: ".reader-header h2",
category: "comic"
}, {
name: "AstreaScans",
url: {
h: ["astreascans.com"],
p: "/bolum-"
},
imgs: () => {
fn.sm5();
let astrea_ajax_vars = Code.obj("var astrea_ajax_vars");
let {
nonce
} = astrea_ajax_vars;
let astreaChapterData = Code.obj("astreaChapterData");
let {
chapter_id,
load_time,
page_token
} = astreaChapterData;
let formData = new FormData();
formData.append("action", "astrea_get_chapter_images");
formData.append("nonce", nonce);
formData.append("chapter_id", chapter_id);
formData.append("load_time", load_time);
formData.append("page_token", page_token);
return hr.json("/wp-admin/admin-ajax.php", {
body: formData,
method: "POST"
}).then(json => json.data.urls);
},
button: [4],
insertImg: [".chapter-content-area", 2],
endColor: "white",
autoDownload: [0],
next: ".top-buttons>a:not(.disabled):has(.fa-chevron-right)",
prev: ".top-buttons>a:not(.disabled):has(.fa-chevron-left)",
chapters: {
node: ".chapter-select",
target: "option"
},
customTitle: ".ch-main-title",
category: "comic"
}, {
name: "Mangack",
url: {
h: ["mangack.com"],
p: "/chapter/"
},
imgs: ".entry-content>.separator>img",
button: [4],
insertImg: [".entry-content", 2],
endColor: "white",
autoDownload: [0],
next: ".next-post>a",
prev: ".prev-post>a",
chapters: {
url: ".latest-title>a",
target: ".chapterslist a",
cb: (t, url) => ({
text: t.toLowerCase().charAt(0).toUpperCase() + t.toLowerCase().slice(1),
url
}),
sort: "r"
},
customTitle: () => q(".entry-title").text.replace("chapter", "- Chapter"),
category: "comic"
}, {
name: "Nux Scans",
url: {
h: ["nuxscans.blogspot.com"],
p: "-chapter-"
},
box: [".separator", 1],
imgs: "#post-width img",
button: [4, 4],
insertImg: [
["box", 0, ".separator"], 2
],
autoDownload: [0],
next: "//a[text()='Next']",
prev: "//a[text()='Back']",
customTitle: () => q(".post-title").text.replaceAll("\n", "").trim().replace("CHAPTER", "Chapter"),
hide: "#preloader,#myModal",
category: "comic"
}, {
name: "Iniotaku/Kokkokutei Scan KT",
url: {
h: ["www.iniotaku2.com", "kokkokuteisukyankt.blogspot.com"],
p: ["/chapter", "/episodio"]
},
init: () => fn.waitEle("ul[name='npx-list']"),
imgs: "#reader img",
autoDownload: [0],
next: "//a[span[text()='Next']] | //a[span[text()='Siguiente']]",
prev: "//a[span[text()='Prev']] | //a[span[text()='Anterior']]",
chapters: {
target: "ul[name='npx-list'] a[href*=chapter],ul[name='npx-list'] a[href*=episodio]",
sort: "r"
},
customTitle: () => getTitle(["header h1>a", "ul[name='npx-list'] a[selected]"]),
category: "comic"
}, {
name: "DatgarScanlation/Sapphire Scan",
url: {
h: ["datgarscanlation.blogspot.com", "www.sapphirescan.com"],
p: "/cap"
},
init: () => fn.waitEle("#nPL .inner_nPL"),
imgs: ".check-box img",
button: [4],
insertImg: [".check-box", 2],
endColor: "white",
autoDownload: [0],
next: "//a[span[text()='Next']]",
prev: "//a[span[text()='Prev']]",
chapters: {
target: "#nPL_select>option[value*='/cap']",
sort: "r"
},
customTitle: "main h1",
category: "comic"
}, {
name: "Like Manga",
url: {
h: ["likemanga.ink"],
p: ["/chapter-"]
},
init: () => (document.onkeydown = null),
imgs: () => fn.waitEle([".reading-detail>.page-chapter>img"]),
button: [4],
insertImg: [".reading-detail", 2],
autoDownload: [0],
next: "a.a_next:not(.disabled)",
prev: "a.a_prev:not(.disabled)",
chapters: () => {
let pages = q("#nav_list_chapter_id_modal a").one;
if (pages) {
let mid = fn.attr("#title-detail-manga", "data-manga");
let max = fn.um("#nav_list_chapter_id_modal a,#nav_list_chapter_id_modal .current:not(:has(*))");
let links = fn.arr(max, (v, i) => `/?act=ajax&code=load_list_chapter_modal&manga_id=${mid}&page_num=${i + 1}`);
let resArr = links.map(hr.json);
return Promise.all(resArr).then(jsons => {
let html = jsons.map(j => j.list_chap).join("");
let node = fn.html(html);
return q("a", node).map(a => ({
text: a.text.trim(),
url: a.href
})).reverse();
});
}
return fn.getChapters({
target: "#list_chapter_id_modal a",
sort: "r"
}).reverse();
},
customTitle: "#title-detail-manga",
category: "comic"
}, {
name: "NetTruyen/NhatTruyen",
url: {
h: [/nettruyen/, /nhattruyen/],
p: "/truyen-tranh/",
e: [".chapter-id", ".reading-detail"]
},
imgs: () => fn.waitEle([".reading-detail>.page-chapter>img:not([style])"]),
button: [4],
insertImg: [".reading-detail", 2],
autoDownload: [0],
next: "a.a_next:not(.disabled)",
prev: "a.a_prev:not(.disabled)",
chapters: () => {
let params = fn.USP({
slug: fn.lpsa(-2),
comicId: fn.attr(".chapter-id", "data-cid")
});
return hr.json(`/Comic/Services/ComicService.asmx/ChapterList?${params}`).then(json => json.data.map(({
chapter_name,
chapter_slug
}) => ({
text: chapter_name,
url: fn.wurl(chapter_slug.replace("chapter", "chuong"))
})).reverse());
},
checkCurrentChapter: (url) => {
let a = url.split("/").filter(Boolean).at(-1).match(/\d+/g);
let b = fn.lp.split("/").filter(Boolean).at(-1).match(/\d+/g);
if (a.length == b.length) {
return a.every((n, i) => n == b[i]);
}
return false;
},
customTitle: ".top>.breadcrumb+h1",
hide: ".banner,.banner-container",
category: "comic"
}, {
name: "MangaBTT",
url: {
h: ["manhwabtt.cc", /nettruyen/],
e: ".reading-detail"
},
imgs: () => fn.waitEle([".reading-detail>.page-chapter>img:not([style])"]),
button: [4],
insertImg: [".reading-detail", 2],
autoDownload: [0],
next: "a.a_next:not(.disabled)",
prev: "a.a_prev:not(.disabled)",
chapters: {
target: ".select-chapter option",
sort: "r"
},
customTitle: ".top>.breadcrumb+h1",
hide: ".banner,.banner-container",
category: "comic"
}, {
name: "巴卡漫画",
host: ["bakamh.app", "bakamh.com", "bakamh.ru"],
url: {
t: "bakamh巴卡漫画",
p: "/c-"
},
imgs: ".read-container img",
button: [4],
insertImg: [".read-container", 2],
endColor: () => q(".text-ui-light").one ? "white" : "black",
autoDownload: [0],
next: "a.next_page",
prev: "a.prev_page",
chapters: {
wait: ".single-chapter-select option[data-redirect]",
node: ".single-chapter-select",
target: "option[data-redirect]",
cb: (t, v, e) => ({
text: e.text,
url: e.dataset.redirect
}),
sort: "r"
},
customTitle: [".breadcrumb li", -2, -1],
category: "comic"
}, {
name: "DigitalTeam",
url: {
h: ["dgtread.com"],
p: "/read/"
},
box: ["#page_select", 2],
imgs: () => {
let max = q("#page_select>option").length;
let links = fn.arr(max, (v, i) => fn.wurl(i + 1));
return hr.getImgA("#page_block>img", links);
},
button: [4],
insertImg: ["box", 2],
insertImgAF: (parent, buttonBar) => fn.hideEle("#page_select"),
customTitle: ["#t_manga_name a", "#chapter_select>option[selected]"],
category: "comic"
}, {
name: "MangaWorld/MangaWorldAdult",
url: {
h: ["www.mangaworld.mx", "www.mangaworldadult.net"],
p: "/read/"
},
box: ["#page", 2],
imgs: () => {
let list = fn.url.includes("style=list");
if (list) {
return q("#page>img");
}
let url = fn.url + "?style=list";
return hr.getImgA("#page>img", [url]);
},
button: [4],
insertImg: ["box", 2],
insertImgAF: (parent, buttonBar) => fn.hideEle("#page"),
category: "comic"
}, {
name: "MangaBuddy",
url: {
h: ["mangabuddy1.co.uk"],
p: "/chapter-"
},
imgs: ".image-container img[data-number]",
button: [4],
insertImg: [".image-container", 2],
autoDownload: [0],
next: "a[aria-label=Next]",
prev: "a[aria-label=Previous]",
chapters: () => q("button[data-chapter]", "div[data-chapter-menu]").map(b => ({
text: `Chapter ${b.dataset.chapter}`,
url: fn.wurl(`chapter-${b.dataset.chapter}`)
})),
customTitle: () => fn.dt({
s: ".title-comic",
r: [
[" Chapter ", " - Chapter "]
]
}),
category: "comic"
}, {
name: "MangaBuddy",
url: {
h: ["mangabuddy.me", "mangaspin.com", "manhuanow.com"],
p: "/chapter",
st: "chapImages"
},
imgs: () => {
let code = fn.fs("chapImages");
return code.split("'").at(1).split(",").map(src => fn.rt(src, [
[new URL(src).host, "sb.mbbcdn.com"],
["/res/", "/"]
]));
},
button: [4],
insertImg: ["#chapter-images", 2],
autoDownload: [0],
next: "#btn-next",
prev: "#btn-prev",
chapters: {
url: ".breadcrumbs-item:nth-child(2) a",
target: "#chapter-list a",
textNode: ".chapter-title",
sort: "r"
},
customTitle: ".chapter-info h1",
category: "comic"
}, {
name: "MangaPub",
host: ["mangapub.com"],
url: {
t: ["MangaPub"],
p: "/chapter",
st: "var bookId"
},
imgs: () => {
let code = fn.fs("var bookId = ");
return fn.textVar(code, "indicators", '"').split(",");
},
button: [4],
insertImg: [".chapter-image", 3],
autoDownload: [0],
next: "#btn-next",
prev: "#btn-prev",
chapters: {
url: ".breadcrumbs-item:nth-child(2) a",
target: "#chapter-list a",
textNode: ".chapter-title",
sort: "r"
},
customTitle: [".chapter-info h1", ".chapter-info h2"],
category: "comic"
}, {
name: "VyManga",
host: ["vymanga.com", "vymanga.net", "mangavyvy.com"],
url: {
h: ["summonersky.com", "burgerpixel.net", "aov-news.com", "5v5world.co"]
},
home: "https://vymanga.com/",
update: "https://vymanga.com/search?sort=updated_at",
imgs: ".carousel-item img",
autoDownload: [0],
next: "a#navbar-chapter-control-next",
prev: "a#navbar-chapter-control-prev",
chapters: {
node: ".select-chapter",
target: "option",
sort: "r"
},
checkCurrentChapter: (url, text) => {
let c_t = fn.gt(".select-chapter [selected]");
return c_t == text;
},
customTitle: "#chapter-info",
category: "comic"
}, {
name: "MHScans",
host: ["mhscans.com"],
url: {
h: ["mh.curiosidadtop.com"]
},
home: "https://mhscans.com/",
init: () => fn.waitEle(".rk-chapter-select"),
imgs: () => fn.waitEle([".rk-img"]),
capture: true,
autoDownload: [0],
next: "div:has(>#rk-chapter-select-bottom-container)>a:has(.fa-arrow-right)",
prev: "div:has(>#rk-chapter-select-bottom-container)>a:has(.fa-arrow-left)",
chapters: {
node: ".rk-chapter-select",
target: "option",
sort: "r"
},
checkCurrentChapter: (url, text) => {
let ct = fn.gt(".rk-chapter-select [selected]");
return ct == text;
},
customTitle: () => getTitle("strong>a"),
category: "comic"
}, {
name: "Mangahub",
url: {
h: "mangahub.ru",
p: "/read/"
},
update: "/feed",
imgs: ".reader-viewer-img",
autoDownload: [0],
next: "a[data-target='reader-area.chapterNext']",
prev: "a[data-target='reader-area.chapterPrev']",
chapters: {
api: () => {
let m_id = fn.attr("history-progress", "object-id");
let c_id = fn.attr("history-progress", "item-id");
return `/read/${m_id}/chapters?translationId=${c_id}`;
},
target: "a",
sort: "r"
},
customTitle: () => fn.gt(".reader-info a.text-truncate").split("/")[0] + " - " + fn.gt(".reader-header .text-truncate"),
category: "comic"
}, {
name: "Mèo Sữa",
host: ["meosua.org"],
url: {
t: "Mèo Sữa",
p: "ch"
},
imgs: ".chapter-content>p>img",
button: [4],
insertImg: [".chapter-content", 2],
autoDownload: [0],
next: "#next-link:not(.uk-disabled)",
prev: "#prev-link:not(.uk-disabled)",
chapters: () => {
let id = q("[data-catid]").attr("data-catid");
return hr.json("/wp-admin/admin-ajax.php", {
headers: {
"content-type": "application/x-www-form-urlencoded; charset=UTF-8",
"x-requested-with": "XMLHttpRequest"
},
body: `action=getchapter&catid=${id}`,
method: "POST"
}).then(json => json.data.map(({
chap,
link
}) => ({
text: `Chap ${chap}`,
url: link
})).reverse());
},
customTitle: ".uk-article>h3",
category: "comic"
}, {
name: "RoliaScan/MangaTaro",
url: {
h: ["roliascan.com", "mangataro.org"],
p: "/read/"
},
box: ["#chapter-images-container", 1, 1280],
imgs: () => {
let id = fn.attr("body", "data-chapter-id");
return hr.json(`/auth/chapter-content?chapter_id=${id}`, {
credentials: "include",
headers: {
"Content-Type": "application/json"
}
}).then(json => json.images);
},
button: [4],
insertImg: ["box", 2],
insertImgAF: () => fn.hideEle("#chapter-images-container"),
endColor: "white",
autoDownload: [0],
next: "a[title='Next Chapter']",
prev: "a[title='Previous Chapter']",
chapters: {
target: "#chapter-select>option",
cb: (text, url) => ({
text,
url: url + "/"
})
},
checkCurrentChapter: (url) => fn.usl(url) == fn.usl(),
customTitle: () => fn.attr("#reader-media", "data-chapter-title"),
category: "comic"
}, {
name: "MyNimeku",
url: {
h: "www.mynimeku.com",
p: "/chapter/"
},
imgs: ".komik-reader-content img",
button: [4],
insertImg: [".komik-reader-content", 2],
autoDownload: [0],
next: "//a[text()='Next']",
prev: "//a[text()='Prev']",
chapters: {
node: ".komik-chapter-list__panel",
target: ".komik-chapter-card-row[data-chapter-value]",
urlNode: ".komik-chapter-card",
textNode: ".komik-chapter-card__text",
cb: (t, url, e) => ({
text: `Chapter ${e.dataset.chapterValue}`,
url
}),
sort: "r"
},
customTitle: () => fn.dt({
s: ".post-title",
d: "Bahasa Indonesia",
r: [
[" Chapter ", " - Chapter "]
]
}),
category: "comic"
}, {
name: "Mangapill",
url: {
h: ["www.mangapill.com", "mangapill.com"],
p: "/chapters/"
},
update: "/chapters",
imgs: "chapter-page img",
button: [4],
insertImg: ["div:has(>chapter-page)", 2],
autoDownload: [0],
next: "a[data-hotkey=ArrowRight]",
prev: "a[data-hotkey=ArrowLeft]",
chapters: {
api: () => {
let [id] = fn.lp.match(/\d+/);
return `/manga/${id}/chapters`;
},
target: "a",
sort: "r"
},
customTitle: "h1#top",
hide: ".flex.items-center.justify-between:has(svg[data-remove-flyer])",
category: "comic"
}, {
name: "TodayManga",
url: {
h: ["todaymanga.com"],
p: ["/ch-", "-ch-"]
},
update: "/category/recent",
imgs: ".chapter-content>img[data-src]",
button: [4],
insertImg: [".chapter-content", 2],
autoDownload: [0],
next: "a:has(>.icon-ic_arw_right)",
prev: "a:has(>.icon-ic_arw_left)",
chapters: {
api: () => fn.attr("button[data-url]", "data-url"),
target: "a",
sort: "r"
},
customTitle: [".chapter-name>a", ".chapter-name>span"],
category: "comic"
}, {
name: "Project Suki",
url: {
h: ["www.projectsuki.com", "projectsuki.com"],
p: "/read/"
},
box: [".strip-reader", 1, 1280],
imgs: () => {
let [, , mid, cid] = fn.lp.split("/");
return hr.json("/callpage", {
body: JSON.stringify({
bookid: mid,
chapterid: cid,
first: true
}),
method: "POST"
}).then(json => {
let html = q(".strip-reader").one.innerHTML;
html += json.src;
let dom = fn.doc(html);
return [...dom.images];
});
},
button: [4],
insertImg: [
["box", 0, ".strip-reader"], 2
],
autoDownload: [0],
next: "a[title='Next chapter']",
prev: "a[title='Previous chapter']",
chapters: {
target: "#chapter-select>option",
cb: (t, u) => ({
text: "Chapter " + t.match(/[\d\.]+/).at(0),
url: fn.wurl(u, fn.lp, 3)
}),
sort: "r"
},
customTitle: () => fn.title(" | Project Suki"),
category: "comic"
}, {
name: "MangaDemon",
url: {
h: ["www.demonicscans.org", "demonicscans.org"],
p: "/chapter/"
},
update: "/lastupdates.php",
box: [".main-width .chapter-info", 1],
imgs: ".imgholder:not([src*='free_ads'])",
button: [4],
insertImg: [
["box", 0, ".main-width>*:not(#FullPictureLoadMainImgBox,.chapter-info,center)"], 2
],
autoDownload: [0],
next: "a.nextchap",
prev: "a.prevchap",
chapters: {
node: ".chapters-nav select",
target: "option"
},
checkCurrentChapter: (url) => {
let cid = fn.lpsa(-2);
let uid = fn.getUSP("chapter", location.origin + url);
return cid == uid;
},
hide: "#teaser3",
category: "comic"
}, {
name: "Oppai Stream",
url: {
h: ["read.oppai.stream"],
p: "/page"
},
init: () => fn.waitEle("#load-images img[data-original-url]"),
imgs: () => fn.aotoScrollEles({
scale: "#load-images",
ele: "#load-images img",
time: 60000,
cb: (img) => !!img.currentSrc,
top: 1
}).then(() => q("#load-images img").currentSrcs),
next: "a:has(img[alt^=next])",
prev: "a:has(img[alt^=prev])",
chapters: {
url: ".end-page>a:nth-of-type(2)",
mode: "f",
target: ".sort-chapters>a",
textNode: "h4",
sort: "r"
},
customTitle: () => getTitle([".extra-title>a", ".chapter-select font"]),
category: "comic"
}, {
name: "Niceoppai",
url: {
h: "niceoppai.net"
},
imgs: "#image-container img[alt]",
button: [4],
insertImg: ["#image-container", 2],
autoDownload: [0],
next: ".nav_pag .nxt",
prev: ".nav_pag .pvs",
chapters: () => q(".cbo_wpm_chp>option", ".nav_chp").map(o => ({
text: o.text,
url: fn.wurl(o.value, fn.url, -2)
})).reverse(),
customTitle: ["h1>a", "option[selected]"],
hide: "#sct_top_banner,#image-container~center",
category: "comic"
}, {
name: "Wurmz",
url: {
h: ["wurmz.net"],
p: "/chapter/"
},
imgs: ".reader-canvas img",
button: [4],
insertImg: [".reader-canvas", 2],
autoDownload: [0],
next: "a[aria-label='Chapter berikutnya']",
prev: "a[aria-label='Chapter sebelumnya']",
chapters: {
target: ".reader-nav-select>option",
cb: (t, u, o) => ({
text: o.text,
url: fn.wurl(o.value)
})
},
customTitle: [".sep+a", "option[selected]"],
category: "comic"
}, {
name: "TruyenQQ",
host: ["truyenqqno.com"],
url: {
e: "meta[property='og:site_name'][content^=TruyenQQ]",
p: "-chap-"
},
init: () => {
fn.wait((_, w) => isFn(w?.jQuery?.fn?.isInViewport)).then(() => fn.rjk());
},
box: [".chapter_control", 1],
imgs: ".chapter_content .page-chapter>img[data-original]",
button: [4],
insertImg: ["box", 2],
insertImgAF: () => fn.remove(".chapter_content>*:not([id^=Full],.chapter_control)"),
autoDownload: [0],
next: "a[href]:has(>.fa-arrow-right)",
prev: "a[href]:has(>.fa-arrow-left)",
chapters: {
target: ".chapter_list>option",
sort: "r"
},
customTitle: ".detail-title",
category: "comic"
}, {
name: "FoxTruyen",
host: ["foxtruyen2.com"],
url: {
e: "meta[property='og:site_name'][content=FoxTruyen]",
p: "-chap-"
},
init: () => {
fn.wait((_, w) => isFn(w?.jQuery?.lazy)).then(() => fn.rjk());
},
imgs: ".content_detail_manga>img",
button: [4],
insertImg: [".content_detail_manga", 2],
autoDownload: [0],
next: ".button-next-prev>a[href]:has(>.bi-arrow-right-short)",
prev: ".button-next-prev>a[href]:has(>.bi-arrow-left-short)",
chapters: () => hr.fetchDoc("/frontend/manga/list", {
headers: {
"content-type": "application/x-www-form-urlencoded; charset=UTF-8",
"x-requested-with": "XMLHttpRequest"
},
body: new URLSearchParams({
slug: fn.attr("#slug", "value"),
id: fn.attr("#book_id", "value"),
order: fn.attr("#episode_name", "value"),
token: fn.attr("#csrf-token", "value")
}),
method: "POST"
}).then(dom => q(".chapter-list a", dom).map(a => ({
text: a.text,
url: a.href
})).reverse()),
customTitle: ".title-detail>h1",
category: "comic"
}, {
name: "TopTruyen",
host: ["www.toptruyenzone.com"],
url: {
e: "meta[property='og:site_name'][content=TopTruyenVN]",
p: "/chapter-"
},
init: () => {
fn.wait((_, w) => isFn(w?.reloadImg)).then(() => fn.rjk());
},
imgs: () => q(".list-image-detail>[id^=page]>img").map(e => e.src),
button: [4],
insertImg: [".list-image-detail", 2],
autoDownload: [0],
next: "a.next-chapter",
prev: "a.previous-chapter",
chapters: {
target: "#select_chapter>option",
sort: "r"
},
customTitle: [".breadcrumb>li", 1, 2],
category: "comic"
}, {
name: "NewTruyenTranh",
host: ["newtruyentranh10.com"],
url: {
t: "NewTruyenTranh",
p: "/chapter-"
},
init: () => {
fn.wait((_, w) => isFn(w?.getlistCmt)).then(() => fn.rjk());
},
imgs: ".reading-detail>.page-chapter>img",
button: [4],
insertImg: [".reading-detail", 2],
autoDownload: [0],
next: "#nextChapter:not(.disabled)",
prev: "#prevChapter:not(.disabled)",
chapters: {
target: ".select-chapter>option",
sort: "r"
},
customTitle: ".breadcrumb+h1",
category: "comic"
}, {
name: "MangaToons",
url: {
h: "mangatoon.mobi",
p: "/watch/",
e: ".episode",
ee: ".new-episode-lock"
},
init: () => fn.waitEle(".pictures img:not(.cover)"),
imgs: ".pictures img:not(.cover)",
button: [4],
insertImg: [".pictures", 2],
autoDownload: [0],
next: ".page-icons-next",
prev: ".page-icons-prev",
chapters: {
url: ".top-left a",
target: ".episode-content-asc .episodes-wrap-new a.episode-item-new",
textNode: ".episode-title-new:not(.episode-number)"
},
customTitle: [".title", ".episode"],
category: "comic"
}, {
name: "Read Manga",
url: {
h: "readmanga.cc",
p: "/chapter-"
},
imgs: "div.justify-center>img[alt][loading=eager]",
button: [4],
insertImg: ["div.justify-center:has(>img[alt][loading=eager])", 2],
autoDownload: [0],
next: "//a[contains(text(),'Next')]",
prev: "//a[contains(text(),'Previous')]",
chapters: {
target: "#chapter-select option",
cb: (text, u) => ({
text,
url: fn.url.replace(/[\d\.]+$/, u)
}),
sort: "r"
},
customTitle: ["nav>ol>li", 1, 2],
category: "comic"
}, {
name: "MangaPanda/MangaReader",
url: {
h: ["www.mangapanda.in", "mangareader.in"],
p: "-chapter-",
e: "#arraydata"
},
imgs: () => q("#arraydata").text.split(","),
button: [4],
insertImg: [".chapter-content-inner", 2],
autoDownload: [0],
next: "a.RightArrow",
prev: "a.LeftArrow.prev",
chapters: {
api: () => {
let args = Code.obj(["args", "load_chapters_selectbox"]);
return `/ajax-load-chapters-selectbox?mangaID=${args.mangaID}`;
},
target: "option",
sort: "r"
},
customTitle: ["h2.chapter-title", 1, 0],
category: "comic"
}, {
name: "Comivex",
url: {
h: ["comivex.com"],
p: "/read/"
},
update: "/latest/",
imgs: "#chapter-images img",
button: [4],
insertImg: ["#chapter-images", 2],
autoDownload: [0],
next: ".nav-controls>a[aria-label='Next chapter']",
prev: ".nav-controls>a[aria-label='Previous chapter']",
chapters: () => q(".nav-select[aria-label='Select chapter']>option").map(o => ({
text: o.text,
url: fn.wurl(o.value, fn.url, -2)
})).reverse(),
customTitle: () => fn.title(" | Comivex"),
category: "comic"
}, {
name: "Mangayi",
url: {
h: ["mangayi.com"],
p: "/read/"
},
box: [".images", 1],
imgs: ".images img",
button: [4],
insertImg: ["box", 2],
insertImgAF: () => fn.hideEle(".images"),
autoDownload: [0],
next: ".n-btns>a[aria-label='Next chapter']",
prev: ".n-btns>a[aria-label='Previous chapter']",
chapters: {
wait: ".ch-sel>option",
node: ".ch-sel",
target: "option",
cb: (text, u, o) => ({
text,
url: fn.wurl(o.value, fn.url, -2)
}),
sort: "r"
},
customTitle: [".manga-title", ".chapter-title"],
category: "comic"
}, {
name: "BBATOTO",
h: ["bbato.com", "xbato.co.uk"],
url: {
t: "BATOTO",
p: "/read/"
},
box: [".pages", 1],
imgs: ".pages img:not([alt=dramatv])",
button: [4],
insertImg: [
["box", 0, ".pages"], 2
],
autoDownload: [0],
next: "//a[contains(text(),'Next Chap')]",
prev: "//a[contains(text(),'Prev Chap')]",
chapters: {
target: "#number-panel a",
sort: "r"
},
customTitle: () => fn.dt({
d: ["Read", "Online - BATOTO"]
}),
category: "comic"
}, {
name: "MangaGeko",
url: {
h: "www.mgeko.cc",
p: "/reader/"
},
update: "/jumbo/manga/",
init: () => fn.addMutationObserver(() => fn.remove("#radio_content")),
imgs: "#chapter-reader img",
button: [4],
insertImg: ["#chapter-reader", 2],
autoDownload: [0],
next: ".chnav.next[href^='/reader/']",
prev: ".chnav.prev[href^='/reader/']",
chapters: {
node: ".chapternav select",
target: "option",
cb: (t, v, e) => ({
text: t.replace("-eng-li", ""),
url: e.value ? v : fn.lp
}),
sort: "r"
},
customTitle: () => fn.title("Manga: "),
hide: "center:has(>#chapter-reader)>*:not(#chapter-reader),.chapternav+div[style]",
category: "comic"
}, {
name: "ReYume",
url: {
h: ["www.re-yume.my.id"],
p: /^\/\d+\/\d+\/[\w-]+\.html$/i
},
imgs: () => fn.waitEle(["#zeist-manga-reader img"]),
capture: true,
autoDownload: [0],
next: "#next-btn",
prev: "#prev-btn",
chapters: {
url: "#series-link",
mode: "f",
target: "#chapters a:has(h4)",
textNode: "h4",
sort: "r"
},
customTitle: ["header h4", "header h4+p"],
category: "comic"
}, {
name: "HotComics",
host: ["w1.hotcomics.me"],
url: {
t: "HotComics",
p: "/episode"
},
box: ["#viewer-img", 1, 800],
imgs: "#viewer-img img",
button: [4],
insertImg: [
["box", 0, "#viewer-img"], 2
],
autoDownload: [0],
next: "a.vnext:not(.disabled)",
prev: "a.vprev:not(.disabled)",
chapters: {
url: "a.vlist",
target: "#tab-chapter a",
textNode: ".num",
cb: (t, url, a) => {
url = a.getAttribute("onclick").split("'").at(1);
return {
text: "Episode " + url.split("-").at(-2),
url
}
}
},
customTitle: () => q(".viewer-title a").one.firstChild.textContent + " - " + fn.gt(".viewer-title a>em"),
category: "comic"
}, {
name: "Ikigai Mangas",
host: ["zonaikigai.gamesview.shop"],
url: {
t: "Ikigai Mangas",
p: "/capitulo/"
},
box: [".flex:has(img[alt^=Página])", 1],
imgs: "img[alt^=Página]",
button: [4],
insertImg: [
["box", 0, ".flex:has(img[alt^=Página])"], 2
],
autoDownload: [0],
next: "//a[span[text()='Siguiente']]",
prev: "//a[span[text()='Anterior']]",
chapters: async () => {
let dom = await hr.fetchDoc(fn.gu("a:has(.ph--arrow-u-up-left-duotone)"));
let chapters = q("div:has(>h2)+ul a", dom).all;
let next = q("a[aria-current=page]+a:not(:has([class]))", dom).one;
while (!!next) {
dom = await hr.fetchDoc(next);
chapters = [...chapters, ...q("div:has(>h2)+ul a", dom).all];
next = q("a[aria-current=page]+a:not(:has([class]))", dom).one;
}
return chapters.map(a => ({
text: q(".card-title", a).text,
url: a.pathname
})).reverse();
},
checkCurrentChapter: (url) => url.split("/").at(2) == fn.lpsa(2),
customTitle: ["a:has(.ph--arrow-u-up-left-duotone) span>span", 0, 1],
hide: "[id^=teaser]",
category: "comic"
}, {
name: "Yaoi Toon",
url: {
h: ["yaoitoon.net"],
p: "/chapter"
},
box: ["#chapter-container", 1],
imgs: () => {
fn.sm5();
let id = fn.lpsa();
return hr.json(`/ajax/image/list/chap/${id}`).then(({
html
}) => {
let node = fn.html(html);
return q(".readImg", node);
});
},
button: [4, 2],
insertImg: ["box", 2],
insertImgAF: () => fn.hideEle("#chapter-container"),
autoDownload: [0],
next: ".nextBtn:not([disabled])",
prev: ".prevBtn:not([disabled])",
chapters: {
node: ".chapters-select",
target: "option",
sort: "r"
},
customTitle: ".card h4",
category: "comic"
}, {
name: "OceComic",
url: {
h: ["ocecomic.com"],
p: "/comic/"
},
box: [".page.issue", 1],
imgs: ".page.issue img",
button: [4],
insertImg: ["box", 2],
insertImgAF: () => fn.hideEle(".page.issue"),
autoDownload: [0],
next: "li:has(>.issue-link.active)+li>a",
prev: 1,
chapters: {
target: ".issue-link",
sort: "r"
},
customTitle: () => fn.title(" | OceComic"),
category: "comic"
}, {
name: "Kiryuu/Natsu/Ikiru",
url: {
t: ["Kiryuu", "Natsu", "Ikiru"],
p: "/chapter-"
},
imgs: "section[data-image-data]>img",
button: [4],
insertImg: ["section[data-image-data]", 2],
autoDownload: [0],
next: "//a[div[p[text()='Next']]][not(starts-with(@href,'#'))]",
prev: "//a[div[p[text()='Prev']]][not(starts-with(@href,'#'))]",
chapters: {
api: () => {
let url = fn.attr("div[hx-get]", "hx-get");
let mid = fn.getUSP("manga_id", url);
let cid = fn.getUSP("chapter_id", url);
return `/wp-admin/admin-ajax.php?manga_id=${mid}&chapter_id=${cid}&type=manga&action=chapter_selects`;
},
target: "div[id^='chapter-lists'] a",
sort: "r"
},
customTitle: "main h1",
category: "comic"
}, {
name: "コミックシーモア",
url: {
h: ["hachiraw.win"],
p: "/chapter/"
},
imgs: ".entry-content img",
button: [4],
insertImg: [".entry-content", 2],
endColor: "white",
next: ".nextchapter",
prev: ".prevchapter",
chapters: {
node: ".chaplist",
target: "option",
sort: "r"
},
customTitle: () => fn.dt({
s: ".entry-title",
d: "(MANGA) "
}),
hide: ".simpleToast",
category: "comic"
}, {
name: "NicoManga",
url: {
h: ["nicomanga.com"],
p: "/chapter"
},
update: "/manga-list.html",
box: ["#imgChapter", 1],
imgs: () => Code.arr(["const images", "_loadImgs"]) || [],
button: [4],
insertImg: ["box", 2],
insertImgAF: () => fn.hideEle("#imgChapter"),
autoDownload: [0],
next: "//a[span[text()='Next chapter']]",
prev: "//a[span[text()='Previous chapter']]",
chapters: {
target: ".chapters-list-sidebar a",
textAttr: "title",
sort: "r"
},
checkCurrentChapter: (url) => url == fn.gu(".chapter-read"),
customTitle: [".breadcrumb-item", -2, -1],
hide: ".ph-inpage-widget,center:has(#unlock-overlay),div:has(>h2),.premium-promo-banner",
category: "comic"
}, {
name: "RNCALATION",
url: {
h: ["rncalation.online"],
p: "/cap/"
},
box: [".reader-bar~.flex", 1, 800],
imgs: ".page-img",
button: [4],
insertImg: [
["box", 0, ".reader-bar~.flex:has(.page-img)"], 2
],
autoDownload: [0],
next: "a.nav-btn:has(svg [points^='9'])",
prev: "a.nav-btn:has(svg [points^='15'])",
chapters: {
target: "#chapter-select>option",
cb: (text, u, o) => ({
text,
url: fn.wurl(o.value)
}),
sort: "r"
},
category: "comic"
}, {
name: "Insanos Manhua",
url: {
h: ["insanoslibrary.com"],
p: "-capitulo-"
},
box: [".reader-end-nav", 1],
imgs: "#reader-container img",
button: [4],
insertImg: ["box", 2],
insertImgAF: () => fn.hideEle("#reader-pages,#reader-pages+div[style]"),
autoDownload: [0],
next: ".reader-next",
prev: ".reader-prev",
chapters: async () => {
let dom = await hr.fetchDoc(q(".reader-back").one);
let script = q("#adar-main-js-extra", dom).one;
let code = await hr.text(script.src);
let AdarConfig = fn.textToObject(code, "AdarConfig", 1, 1);
let {
ajaxUrl,
nonce
} = AdarConfig;
let html = "";
let page = 1;
let loop = true;
while (loop) {
await hr.json(ajaxUrl, {
headers: {
"content-type": "application/x-www-form-urlencoded"
},
body: new URLSearchParams({
action: "adar_load_chapters",
nonce,
series_id: document.body.dataset.series,
page,
order: "asc"
}),
method: "POST"
}).then(json => {
loop = json.data.has_more;
html += json.data.html;
page++;
});
}
let node = fn.html(html);
return q(".chapter-row", node).map(a => ({
text: q(".chapter-row__num", a).text,
url: a.href
}));
},
customTitle: [".reader-series-name", ".reader-chapter-title"],
hide: "[id*=adblock]",
category: "comic"
}, {
name: "Ikigai Mangas",
url: {
h: ["ikigaicomics.lat"],
p: "/capitulo/"
},
imgs: ".reader-pages img",
button: [4],
insertImg: [".reader-pages", 2],
autoDownload: [0],
next: "//a[span[text()='Siguiente']]",
prev: "//a[span[text()='Anterior']]",
chapters: async () => {
let curl = q("a:has(.inline-block>span)").url;
let dom = await hr.fetchDoc(curl);
let eles = q("[data-caps-list] a", dom).all;
let pages = q("a[aria-current]", dom);
if (pages.length) {
pages = Number(fn.getUSP("pagina", pages.at(-1).search));
let links = fn.arr(pages - 1, (v, i) => `${curl}?pagina=${i + 2}`);
let resArr = links.map(hr.fetchDoc);
await Promise.all(resArr).then(doms => {
for (dom of doms) {
eles = [...eles, ...q("[data-caps-list] a", dom).all];
}
});
}
return eles.map(a => ({
text: q(".card-title", a).text,
url: a.href
})).reverse();
},
customTitle: [".inline-block>span", 0, 1],
category: "comic"
}, {
name: "RawKuro",
url: {
h: ["rawkuro.net", "mangakoma.net", "www.manhuaplus.org", "manhuaplus.org", "mangakoma01.top", "mangakoma01.net", "raw1001.net", "mangaraw1001.cc", "manhuaplus.top", "mangaraw18.net"],
st: "CHAPTER_ID"
},
box: ["#chapterContent,#image_container", 2],
imgs: () => {
fn.sm5();
let cid = Code.num("CHAPTER_ID");
return hr.text(`/ajax/image/list/chap/${cid}`, {
headers: {
"x-requested-with": "XMLHttpRequest"
},
method: "POST"
}).then(text => {
text = text.replace("The requested URL returned error: 403", "");
let json = JSON.parse(text);
let dom = fn.doc(json.html);
if (q(".separator", dom).one) {
let divs = q(".separator", dom).sort((a, b) => a.dataset.index - b.dataset.index);
return divs.map(e => e.firstElementChild.href).filter(e => !e.includes("rawwkuro.jpg"));
}
return q(".page-chapter img:not([data-original$='rawwkuro.jpg'])", dom);
});
},
button: [4],
insertImg: ["box", 2],
insertImgAF: () => fn.hideEle("#chapterContent,#image_container"),
endColor: "white",
autoDownload: [0],
next: "a.nextBtn[href*='/'],a.a_next[href*='/']",
prev: "a.prevBtn[href*='/'],a.a_prev[href*='/']",
chapters: {
node: ".nPL_select,.select-chapter",
target: "option",
sort: "r"
},
customTitle: "main h1",
category: "comic"
}, {
name: "RawOtaku/JManga/MangaReader/MangaNow/MangaXo",
host: ["rawotaku.com", "jmanga.casa"],
url: {
t: ["Otaku", "jmanga", "Read"],
h: [/^rawotaku/, /^jmanga/, "mangareader.to", "manganow.to", "mangaxo.com"]
},
page: () => fn.clp("/read/") || fn.clp("/chapter-"),
SPA: true,
observeURL: "nav",
init: () => fn.waitEle(["#images-content .page-read", ".chapter-item.active"]),
imgs: () => {
let id = q(".chapter-item.active").attr("data-id");
fn.sm5();
let api = `/json/chapter?mode=vertical&id=${id}`;
if (fn.lh.includes("mangareader")) {
api = `/ajax/image/list/chap/${id}?mode=vertical&quality=high&hozPageSize=1`;
}
if (fn.lh.includes("manganow") || fn.lh.includes("mangaxo")) {
api = `/ajax/image/list/${id}?mode=vertical&hozPageSize=1`;
}
return fetch(api).then(res => res?.json()).then(json => {
fn.hm();
if (fn.lh.includes("mangareader") || fn.lh.includes("manganow") || fn.lh.includes("mangaxo")) {
let node = fn.html(json.html);
return q(".iv-card[data-url]", node);
}
return [...fn.doc(json.html).images];
});
},
capture: true,
autoDownload: [0],
next: "//li[contains(@class,'chapter-item active')]/preceding-sibling::li[1]/a",
prev: ".chapter-item.active+li>a",
chapters: {
target: "#ja-chapters a,.reading-list a",
textNode: ".name",
sort: "r"
},
customTitle: () => fn.dt({
t: fn.gt(".manga-name") + " - " + fn.gt("#dropdown-chapters button")
}),
category: "comic"
}, {
name: "DFlowScans",
url: {
h: "dflow.alwaysdata.net",
p: "/ReadChapter/"
},
box: ["#readerContainer", 1],
imgs: () => Code.arr("const pages").map(e => e.url),
button: [4],
insertImg: ["box", 2],
insertImgAF: () => fn.hideEle("#readerContainer"),
autoDownload: [0],
next: "a:has(>.fa-arrow-right).btn-primary",
prev: "a:has(>.fa-arrow-left ).btn-primary",
chapters: {
url: "a:has(>.fa-list)",
target: "#chapters-section>div>div[style]>div",
urlNode: "a",
textNode: "h5",
sort: "r"
},
customTitle: () => fn.title(" - ", 3),
category: "comic"
}, {
name: "MangaFreak",
url: {
t: "MangaFreak",
p: "/Read"
},
box: [".slideshow-container", 1],
imgs: ".slideshow-container img",
button: [4],
insertImg: [
["box", 0, ".slideshow-container"], 2
],
autoDownload: [0],
next: "//div[text()='Next Chapter:']/following-sibling::span[1]/a",
prev: "//div[text()='Previous Chapter:']/following-sibling::span[1]/a",
chapters: {
target: ".chapter_list option"
},
customTitle: () => fn.dt({
d: [
"Read ",
" - MangaFreak"
]
}),
category: "comic"
}, {
name: "LeerCapitulo",
host: ["www.leercapitulo.co"],
url: {
e: ".chapter-title>a[title=Leercapitulo]",
p: "/leer/"
},
init: () => fn.waitEle("#page_select"),
imgs: () => q("#page_select option").map(e => e.value),
button: [4],
insertImg: [".each-page", 2],
autoDownload: [0],
next: "a.next",
prev: "a.pre",
chapters: {
node: "select[rel='chap-select']",
target: "option",
sort: "r"
},
customTitle: ".bodycontainer h1",
category: "comic"
}, {
name: "ego",
url: {
h: ["egotoons.com"],
},
page: "/capitulo/",
SPA: true,
observeURL: "nav",
NextJs: true,
init: () => fn.waitEle("img[alt^='Página']"),
imgs: () => q("img[alt^='Página']"),
capture: true,
autoDownload: [0],
next: "//a[text()='Próximo']",
prev: "//a[text()='Anterior']",
customTitle: "main h1",
category: "comic"
}, {
name: "ZonaTMO",
url: {
h: ["zonatmo.org"],
p: "/view"
},
imgs: ".reader-img-wrap>img",
autoDownload: [0],
next: "a[title='Cap. anterior']",
prev: "a[title='Cap. siguiente']",
chapters: {
target: "#sb-chapters-list a",
sort: "r"
},
customTitle: () => fn.title(" — ZonaTMO"),
category: "comic"
}, {
name: "N站模板無變數圖名隨機",
url: {
h: ["hentaivsmanga.com", "savehentai.info", "www.hentaihardcore.net", "hentai4all.com"],
e: "#thumbnail-container"
},
imgs: () => hr.getImgA("#image-container img", q("#thumbnail-container a").urls),
thums: "#thumbnail-container img",
button: [4],
insertImg: ["#thumbnail-container", 2],
customTitle: () => fn.getText(["#info h2", "#info h1"]),
category: "hcomic"
}, {
name: "N站模板無變數無縮略圖",
host: ["multi-manga.today", "hmanga.today", "w1.multi-manga.com"],
url: {
h: /multi|manga/,
e: ".logo img[src*='hitomila']"
},
imgs: "#thumbnail-container img",
button: [4],
insertImg: ["#thumbnail-container", 2],
customTitle: () => fn.getText(["#info h2", "#info h1"]),
category: "hcomic"
}, {
name: "N站模板無變數無縮略圖",
host: ["hentaidatia.com", "nhentai.online", "hentaiyaoi.net", "nhentaiyaoi.net", "hentaibl.com", "nhentai.net.br"],
url: {
h: "hentai",
e: ".post-titulo,.tituloOriginal"
},
srcset: ".post-fotos img",
button: [4],
insertImg: [".post-fotos", 2],
customTitle: () => fn.getText([".tituloOriginal", ".post-titulo"]),
hide: ".anuncios,#onesignal-slidedown-container,.floating-button",
category: "hcomic"
}, {
name: "KuManga",
url: {
//h: "www.kumanga.com",
t: "| KuManga",
p: "/manga/leer/"
},
imgs: () => fn.waitEle(["div[x-data^=imageGallery] img"]),
button: [4],
insertImg: ["div[x-data^=imageGallery]", 2],
autoDownload: [0],
next: ".chapter_next:not(.disabled)",
prev: ".chapter_prev:not(.disabled)",
customTitle: [".t_manga", ".t_cap"],
category: "comic"
}, {
name: "やわらかスピリッツ",
url: {
h: ["yawaspi.com"],
p: "/comic/"
},
imgs: () => fn.waitEle([".vertical__inner ul li img"]),
capture: true,
autoDownload: [0],
next: "a.-next",
prev: "a.-prev",
customTitle: ["header h2", "header h3"],
category: "comic"
}, {
name: "酷看漫画",
host: ["www.kukanmanhua.org"],
url: {
t: "酷看漫画",
p: "/chapter/",
e: "img[data-encrypted]",
d: "pc"
},
imgs: () => q("img[data-encrypted]").attrs("data-encrypted", atob),
button: [4],
insertImg: [".comiclist", 2],
autoDownload: [0],
next: "//a[text()='下一章']",
prev: "//a[text()='上一章']",
chapters: {
url: ".chapter-btn",
target: "#detail-list-select a"
},
customTitle: [".comic-name", ".title"],
category: "comic"
}, {
name: "酷看漫画",
host: ["www.kukanmanhua.org"],
url: {
t: "酷看漫画",
p: "/chapter/",
e: "img[data-encrypted]",
d: "m"
},
imgs: () => q("img[data-encrypted]").attrs("data-encrypted", atob),
button: [4],
insertImg: ["#cp_img", 2],
autoDownload: [0],
next: "//a[p[text()='下一章']]",
prev: "//a[p[text()='上一章']]",
chapters: {
url: "//a[p[text()='目录']]",
target: "#detail-list-select a"
},
customTitle: () => {
let {
book_name,
chapter_name
} = Code.obj("bookInfo");
return book_name + " - " + chapter_name;
},
category: "comic"
}, {
name: "readData&setComic 格式",
host: ["say-on.com", "ahgwyd.com", "www.jianyu120.com", "www.jiasenongye.com", "www.one-uplus.com", "www.qize-airline.com"],
url: {
st: [/(R|r)eadData/, "setComic"],
p: "/read/"
},
imgs: ".read-content img,#comicContainer img,.pic-ist img",
autoDownload: [0],
next: "//a[div[text()='下一话']][contains(@href,'/read/')] | //a[@class='page-next'][contains(@href,'/read/')] | //a[@id='nextButton'][contains(@href,'/read/')]",
prev: "//a[div[text()='上一话']][contains(@href,'/read/')] | //a[@class='page-prev'][contains(@href,'/read/')] | //a[@id='prevButton'][contains(@href,'/read/')]",
chapters: {
target: ".chapter-sidebar a,.list-main a"
},
customTitle: () => {
let {
comicName,
readName
} = Code.obj("[Rr]eadData");
return comicName + " - " + readName;
},
category: "comic"
}, {
name: "KuroNavi",
host: ["kuronavi.one"],
url: {
e: "meta[property='og:site_name'][content=kuronavi]",
p: "/chapter"
},
imgs: "#chapter-content .page-chapter>img",
button: [4],
insertImg: ["#chapter-content", 2],
autoDownload: [0],
next: "//a[button[contains(text(),'次の章')]][contains(@href,'chapter')]",
prev: "//a[button[contains(text(),'前の章')]][contains(@href,'chapter')]",
chapters: () => {
let id = Code.num("comicId");
return hr.json(`/Comic/Services/ComicService.asmx/ProcessChapterList?comicId=${id}`).then(json => {
return json.chapters.map(({
name,
url
}) => ({
text: name,
url
})).reverse();
});
},
customTitle: ".sticky-inner-wrapper h1",
category: "comic"
}, {
name: "Japscan",
url: {
h: ["japscan.st"]
},
box: ["nav~.grid:has(>a>div>img)", 2],
imgs: "nav~.grid:has(>a>div>img) img",
button: [4],
insertImg: ["box", 2],
insertImgAF: {
hide: "nav~.grid:has(>a>div>img)"
},
next: "//a[text()='Chapitre suivant ›']",
prev: "//a[text()='‹ Chapitre précédent']",
chapters: {
url: "//a[text()='Tous les chapitres']",
target: "[data-chapter-list] a",
textNode: "[data-ch-num]",
cb: (text, u) => ({
text,
url: u.replace(/\/\d+$/, "")
}),
sort: "r"
},
customTitle: ["section a>h1", "section a:has(>h1)+p"],
category: "comic"
}, {
name: "Japscan",
url: {
h: ["japscan.st"],
e: ".reader-stage"
},
box: [".reader-stage", 2, 1280],
imgs: () => hr.getImgA("nav~.grid:has(>a>div>img) img", [fn.lp.replace(/\/\d+$/, "")]),
button: [4],
insertImg: ["box", 2],
insertImgAF: () => fn.hideEle(".reader-stage"),
next: ".reader-stage~div .flex:has(>a>svg):not(:has(select))>a:text:›",
prev: ".reader-stage~div .flex:has(>a>svg):not(:has(select))>a:text:‹",
chapters: {
url: "header[data-topbar] a",
target: "[data-chapter-list] a",
textNode: "[data-ch-num]",
sort: "r"
},
customTitle: ["header[data-topbar] a", 0, 1],
category: "comic"
}];
};