您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
专注于写真、H漫、漫画的网站,目前规则数600+,进行图片全量加载,也能进行下载压缩打包,如有下一页元素能做到自动化下载。
当前为
// ==UserScript== // @name 圖片全載-FancyboxV5 // @name:en Full Picture Load - FancyboxV5 // @name:zh-CN 图片全载-FancyboxV5 // @name:zh-TW 圖片全載-FancyboxV5 // @version 1.7.28 // @description 專注於寫真、H漫、漫畫的網站,目前規則數600+,進行圖片全量加載,讓你免去需要翻頁的動作,也能進行下載壓縮打包,如有下一頁元素能做到自動化下載。 // @description:en Load all pictures for picture websites, and can also compress and package them for download. // @description:zh-CN 专注于写真、H漫、漫画的网站,目前规则数600+,进行图片全量加载,也能进行下载压缩打包,如有下一页元素能做到自动化下载。 // @description:zh-TW 專注於寫真、H漫、漫畫的網站,目前規則數600+,進行圖片全量加載,让你免去需要翻页的动作,也能進行下載壓縮打包,如有下一頁元素能做到自動化下載。 // @author tony0809 // @match *://*/* // @connect * // @exclude *.youtube.com* // @exclude *docs.google.com* // @exclude *google*/maps/* // @exclude *mail.google.com* // @exclude *accounts.google.com* // @icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAtFBMVEVEREAAAABEREBEREAuuaIzqpkvr58yiHgzhnY6kYM7mYI4kog4s6A2tpo0r544ooo2nY40sJw0sp00rZg1sJw0sZ0zsp01sZw0sZw0rZk1sJw1sZw1rZk0sp00rpk1sp01sZs1rpk1rpk0sp01spw1sJ00rZo1rZk1rpo0r5k0sJw0sZ01r5o0sZw0rpk0sp01sZ01sJw1spw1r5k1sp01sZw0sZ01sZw1rpk1sp01sZw1r5pUzpTcAAAAOXRSTlMAAAUGCw8QERIUFxgbHB0hIieqq6yvtLa3vb/AwMHCxMXFxsfIyc3Oz+zt7vDx8fL4+Pn5+vr7/v7AEFI4AAABR0lEQVR42qWT11bDMAxApbhsmm5KKVD2KiUQwpD1///FkZcSmh4e8FOsex3LsgymPy6ISkRyA4FlWMRXomIyQOg/SbyKAmSOE2Ip02UOYxf/DILNjOOEWLnAEAqio0MMAzJjTAZh1p0SrYCIuu0cMZc9JbENXLa1NWGdI1nWeQuXGPzBTdzC8ws52UI5MwchrA/VTOuTEP9fFyTG7E+R9q8JLsbW1UHzU8HHrCuU1fyToDlB43xRqMUgfc+/KA77fZrWSH/47zPlzOcpJxG8u32r/OEg5SRCqO/WTeT3+5oTuP4LxrXnd5F7waZ+wM5c+NVeujMRrDYMYueE+VK5E5r3uzOb7TbvHH7f/1pP/L8nU9u38Nwyy8OZdjfwY+ZnmPinp28y3mglNeERDJYy/9A3GYVS+GMPMB+uyL67/qO68Mb8MurBD7foVTtvIbtnAAAAAElFTkSuQmCC // @license MIT // @namespace https://greasyfork.org/users/20361 // @grant GM_xmlhttpRequest // @grant GM.xmlHttpRequest // @grant GM_registerMenuCommand // @grant GM.registerMenuCommand // @grant GM_openInTab // @grant GM.openInTab // @grant unsafeWindow // @noframes // @require https://cdn.jsdelivr.net/npm/[email protected]/dist/jszip.min.js // @require https://cdn.jsdelivr.net/npm/[email protected]/dist/jquery.min.js // @require https://cdn.jsdelivr.net/npm/@fancyapps/[email protected]/dist/fancybox/fancybox.umd.js // ==/UserScript== (async () => { "use strict"; if (document.querySelector("body.no-js")) return; //Cloudflare檢測連線安全性時,不運行腳本 let options = { //預設選項基本上不要改動,如果改動了最好透過UI選項設定或按/,重置儲存在localStorage的設定 enable: 0, //!!!維持0不要改!!! icon: 1, //是否顯示左下圖示,1:開啟、0:關閉 threading: 32, //最大下載線程數 default: "img[src]", //預設CSS/Xpath選擇器/javascript代碼 //default: "js;return [...document.images];", zip: 1, //1:圖片下載後壓縮打包,0:批量下載圖片,無法全自動下載 file_extension: "zip", //zip or cbz autoDownload: 0, //!!!維持0不要改!!!建議透過UI選項設定來開啟,需要customData也有autoDownload autoDownloadCountdown: 5, //有NEXT時自動下載的倒數秒數 comic: 0, //1,忽視漫畫站點開關選項,啟用漫畫規則 doubleTouchNext: 1, //觸控裝置雙擊前往下一頁,1:開啟、0:關閉 zoom: 0, //1 ~ 10 腳本插入的圖片縮放比例,10 = 100%,9 = 90%,0 = auto column: 4, //圖片並排顯示的數量 2 ~ 6 fancybox: 1 //Fancybox圖片燈箱展示功能,1:開啟、0:關閉 }; const siteUrl = window.location.href.replace(/#FullPictureLoad.+$/i, ""); let siteData = {}; let siteJson = null; const language = window.navigator.language; let displayLanguage = {}; let globalImgArray = []; let thumbnailsSrcArray = []; let videosSrcArray = []; let promiseBlobArray = []; let customTitle = null; let downloading = false; let fetching = false; let fetchErrorArray = []; let fastDownload = false; let currentDownloadThread = 0; let downloadNum = 0; let errorNum = 0; let getImgFn = ""; let doc = document; let autoPager = true; let currentPageNum = 0; let nextLink = null; const PcUa = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0"; const MobileUa = "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36"; const loading_bak = "data:image/gif;base64,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83uGje9+g7TK7znAs/1N/3BQTmbMt6lvwRde10/Xu89+ZrjEJ07xilv84hjPuMY3zvGOe/zjIA+5yEdO8pKb/OQoT7nKV87ylrv85TCPucxnTvOa2/zmOM+5znfO8577/OdAD7rQh070ohv96EhPutKXzvSmO/3pUI+61KdO9apb/epYz7rWt871rnv962APu9jHTvaym/3saE+72tfO9ra7/e1wj7vc5073utv97njPu973zve++/3vgA+84AdP+MIb/vCIT7ziF8/4xjv+8ZCPvOQnT/nKW/7ymM+85jfP+c57/vOgD73oR0/60pv+9KhPvepXz/rWu/71sI+97GdP+9rb/va4z73ud8/73pH7/vfAD77wh0/84hv/+MhPvvKXz/zmO//50I++9KdP/epb//rYz772t8/97nv/++APv/jHT/7ym//86E+/+tfP/va7//3wj7/850//+tv//vjPv/73z//++///ABiAAjiABFiABniACJiACriADNiADviAEBiBEjiBFFiBFniBGJiBGriBHNiBHviBIBiCFxEIACH5BAUKAGgALCwBjAACATABAAf/gGiCg4SFhoeIiYqLjI2JAQYGHhgaEC8FHBQfOhaOnp+goaKjpKWmp6iKAausra0GNDEUJ52ptre4ubq7vGiuv8CrGCksG2e9yMnKy8yOwc/ABjgsHc3W19jZo9DcwCsiJ9ri4+TW3ee/IyI65e3u76Xo8q4YLtXw+Pn6gvP9rS8Dju0bSBCbv4PCKCwoyLAhL4QQDXCQ4LCixXgQIT6YeLGjx0UZQz7wUeujyY8hUxpQwOCkS4spY6748LJmwZg4SdyzyfMdTpwPXLTsSXTcz58oMhRdavAozgY+hjKdiszpURoIqGrdlaJECRIQNHhoYBXhAyBb0yKTkOGDghgQ/wyURRdDqtq7vDp8EEGD7NxgNC7gHYxsgQwRK/7+8mCDsONeHShAUMyqAYjHmHd1UJCYso/MoHOdKPBAcQm7oVOXsrDDw18SC1XLLsUABIa5EErO3g2q9m2rKCjyHv6JAQXXTjUIJ86ckQQYfpHqbk790IbJRyHErs690BkKpX/mQN29+wUSR1OUXz/ojILoKTmwn5+hc0wW89lbwPG0cf71O8AHkQc7/cfdAOGFhMJ2BlaXwQgxFdBgeR3YlxFaE+pTQgExiLADCwNkwKA1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"; const mh_loading_bak = "data:image/png;base64,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"; const autoPagerLoading = "data:image/gif;base64,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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="; const MutationObserverConfig = { childList: true, subtree: true }; //自定義站點規則 const customData = [{ name: "小黃書/8色人體攝影", host: ["xchina.co", "xchina.biz", "xchina.fun", "xchina.life", "8se.me"], reg: /(xchina|8se)\.(co|me|biz|life|fun)\/photo\/id-\w+\.html/, include: ".photos>a", imgs: async () => { let numP = fun.geT("//i[@class='fa fa-picture-o']/parent::div").match(/\d+/)[0]; //let pageSize = parseInt(fun.ge(".photos>a").href.match(/pageSize=(\d+)/i)[1], 10) || 17; //let max = Math.ceil(numP / pageSize); let max; try { max = parseInt([...new Set([...fun.gae(".pager a[href]")].map(e => e.href))].pop().match(/\/(\d+)\.html$/)[1], 10); } catch (e) { max = 1; } //if (max > 1 && [...fun.gae(".photos>a")].length < (pageSize + 1)) { if (max > 1) { let links = []; let url = siteUrl.replace(".html", ""); for (let i = 2; i <= max; i++) { links.push(url + "/" + i + ".html"); } await fun.getEle(links, ".photos>a", [".photos", 0], ".pager,.photos>.item,.photos>.photoMask", 200); } if (parseInt(numP, 10) != [...fun.gae("img.cr_only")].length) { setTimeout(() => { fun.hideMsg(); fun.showMsg("圖片數量不符合,請反饋", 5000); }, 1500) } thumbnailsSrcArray = [...fun.gae("img.cr_only")].map(e => e.src); return thumbnailsSrcArray.map(e => e.replace("_600x0", "")); }, button: [4], insertImg: [ ["//div[div[@class='photos']]/*[last()]", 2], 2 ], go: 1, customTitle: () => { let s = document.title.split("-"); let title = ""; if (/未分/.test(s[1])) { title += s[0].trim() } else { title += s[1].trim() + " - "; title += s[0].trim() } return title; }, css: "body{overflow:unset!important}.photos>div.item,.jquery-modal.blocker.current,.push-top,.push-bottom,.slider-ad,.article.ad,.pager>.tips,body>footer~*:not([id^='pv-']):not([class^='pv-']):not(.pagetual_tipsWords):not(#comicRead):not(#fab):not(.FullPictureLoadMsg):not(.FullPictureLoadFixedBtn):not(#FullPictureLoadOptions):not(a):not(*[class^=fancybox]),.photoMask,.banner_ad{display: none!important;}", topButton: true, category: "nsfw2" }, { name: "JavSX.com", host: ["w3.javsx.com"], link: "https://w3.javsx.com/photos.html", reg: /w3\.javsx\.com\/photos\/[\w-]+\.html$/, imgs: async () => { try { let max = fun.ge("//a[text()='Last']").href.match(/\d+$/)[0]; let links = []; for (let i = 2; i <= max; i++) { links.push(siteUrl + "?page=" + i); } await fun.getEle(links, ".col-photos>a", [".col-photos", 0], ".pagination"); [...fun.gae("img[data-src]")].forEach(e => e.src = e.dataset.src); } catch (e) {} thumbnailsSrcArray = [...fun.gae("img[data-src]")].map(e => e.dataset.src); return thumbnailsSrcArray.map(e => e.replace(/resize=[^&]+&/, "")); }, button: [4], insertImg: [ [".col-photos", 2], 2 ], go: 1, customTitle: () => fun.geT("h1.title").replace("| Body Photography", "").replace("- JVID", "").replace("- 未分类人体摄影", "").trim(), css: ".col-photos{margin-bottom:60px}.pagination{margin-top:0px!important}", category: "nsfw2" }, { name: "紳士会所", host: ["www.hentaiclub.net"], reg: /^https?:\/\/www\.hentaiclub\.net\/r\d+\/\d+\.html$/, imgs: "div[data-fancybox]", button: [4], insertImg: [ ["#masonry", 2, "#masonry"], 2 ], customTitle: () => fun.geT(".post-info-text"), fancybox: { v: 3, css: false }, css: ".banner-top{display:none!important;}", category: "nsfw2" }, { name: "Nlegs/HoneyLeg www.nlegs.com www.honeyleg.com", //無法完全應對此站的人機驗證,請使用專用腳本 https://greasyfork.org/scripts/463123 enable: 0, reg: /(www\.nlegs\.com|www.honeyleg.com)\/(girls|article)\//, init: () => { let loopFind = setInterval(() => { fun.ge(".pagination>li:last-child>a") && (clearInterval(loopFind), fun.getNP("//div[a/div[contains(@style,'thumb') and span]]", "li.active+li>a", null, ".pagination")) }, 100); }, imgs: "js;return fun.getImgA('.img-res','a[href*=image]',1);", insertImg: ["//div[div[@class='col-md-2 col-sm-4 col-xs-12']]", 0], customTitle: () => fun.geT("strong"), threading: 1, fetch: 1, //css: ".col-md-2.col-sm-4.col-xs-12{width:1000px!important;height:auto!important;display:block!important;margin:0 auto !important;float: none!important;}", category: "nsfw2" }, { name: "雅拉伊", //免VIP僅支援PC版和圖片命名是簡單數字遞增的。 host: ["www.yalayi.com"], reg: /https?:\/\/www\.yalayi\.com\/gallery\/\d+\.html/i, imgs: async () => { await fun.waitEle(".bigimg>img"); let max = fun.ge(".tishiwenzi-box").innerText.match(/\d+/)[0]; let firstImg = fun.ge(".bigimg>img"); let path = firstImg.dataset.original.match(/.+\//)[0]; let testArr = [path + "1.jpg", path + "01.jpg", path + "001.jpg", path + "0001.jpg"]; let ok = false; let padStart; for (let i = 0; i < testArr.length; i++) { let obj = await fun.checkImgStatus(testArr[i]); console.log(`確認圖片[${i}]`, obj); if (obj.ok) { ok = true; padStart = parseInt(i, 10) + 1; break; } } let arr = []; if (ok) { arr.push(firstImg.src); for (let i = 1; i <= max; i++) { let src = path + String(i).padStart(padStart, "0") + ".jpg"; arr.push(src); } return arr; } else { return arr; } }, button: [4, "24%", 4], insertImg: [".bigimg", 2], customTitle: () => fun.title(" - ", 3), threading: 4, category: "nsfw1" }, { name: "JKF", host: ["www.jkforum.net"], reg: /www\.jkforum\.net\/thread/, imgs: "img[id^=aimg]", customTitle: () => fun.title("-", 1), category: "nsfw2" }, { name: "草榴", host: ["www.t66y.com", "cl.6962x.xyz"], reg: /\/htm_data\/\d+\/\d+\/\d+\.html/, include: "img[ess-data]", imgs: "img[ess-data]", customTitle: () => fun.geT("h4.f16").replace(/\[\d+P\]$/i, ""), category: "nsfw2" }, { name: "X成人论坛", host: ["xbbs.me"], link: "https://xbbs.me/forum/id-61fe70f2b9631.html", reg: /xbbs\.me\/thread\/id-\w+\.html$/, imgs: () => [...fun.gae(".xbbs-thread-image img[data]")].map(e => e.getAttribute("data")), customTitle: () => fun.geT(".article>h1").trim(), category: "nsfw2" }, { name: "优丝库HD", //免VIP host: ["yskhd.com", "ysk567.com", "yskhd.me"], reg: /(yskhd\.(com|me)|ysk567\.com)\/archives\/\d+/i, exclude: "#erphpdown", init: () => [...fun.gae(".gallery-blur-item")].forEach(e => e.className = "gallery-item gallery-fancy-item"), imgs: () => { thumbnailsSrcArray = [...fun.gae(".article-content img[src*='-285x285']")].map(e => e.src); let xhrNum = 0; let resArr = [...fun.gae(".article-content img[src*='-285x285']")].map(e => e.src.replace("-285x285", "")).map(async (src, i, arr) => { let res = await fun.xhrHEAD(src); fun.showMsg(`fun.xhrHEAD(${xhrNum+=1}/${arr.length})`, 0); let status = res.status; return status == 404 ? src.replace(/(\.[a-z]+)$/i, "-scaled$1") : src; }); return Promise.all(resArr).then(arr => { fun.hideMsg(); return arr; }); }, button: [4], insertImg: [ [".article-act", 1], 2 ], go: 1, autoDownload: [0], next: ".article-nav-prev>a", prev: ".article-nav-next>a", customTitle: () => fun.geT(".article-title").replace(/\s?\[\d+P\]/i, ""), fancybox: { v: 3, css: false }, category: "nsfw1" }, { name: "洛花秀", //免VIP host: ["luohuaxiu.com"], reg: /luohuaxiu\.com\/archives\/\d+/, exclude: ".single-video", init: () => new MutationObserver(() => document.body.classList.remove("compensate-for-scrollbar")).observe(document.body, MutationObserverConfig), imgs: async () => { let arr = []; let max = fun.gae(".gallery-item").length; let url = fun.ge(".gallery-item a").href; if (/\(\d+\)(-tic)?\./.test(url)) { let m = url.match(/^(.+\()(\d+)(\).+)$/i); for (let i = 1; i <= max; i++) { arr.push(decodeURI(m[1] + i + m[3])); } } else { try { let m = url.match(/^(.+\/)([\w-]+)(\.[a-z]{3,4})$/i); let path = m[1]; let fileName = m[2]; let ex = m[3]; let blur = fun.ge(".gallery-blur-item"); if (blur && fileName.length <= 4) { let n = url.match(/(\d+)\.[a-z]{3,4}$/)[1]; for (let i = parseInt(n, 10); i < (parseInt(n, 10) + parseInt(max, 10)); i++) { arr.push(decodeURI(path + String(i).padStart(fileName.length, "0") + ex)); } } else if (blur && fun.ge(".size-thumbnail[src*='-285x180']")) { arr = [...fun.gae(".size-thumbnail[src*='-285x180']")].map(e => e.src.replace("-285x180", "")); } else if (blur && fun.ge("img[src*='?width=285']")) { arr = [...fun.gae("img[src*='?width=285']")].map(e => decodeURI(e.src.replace(/\?width=285.+/, ""))); } else { arr = [...fun.gae(".gallery-item a")].map(e => e.href); } } catch (error) { console.log(error); } } if (options.fancybox == 1) { fun.showMsg("預覽縮圖轉DataURL中...", 0); thumbnailsSrcArray = arr.map(e => fun.xhr(e + "?width=100", "blob").then(blob => fun.blobToDataURL(blob))); thumbnailsSrcArray = await Promise.all(thumbnailsSrcArray).then(arr => { fun.hideMsg(); return arr; }); } return arr; }, button: [4], insertImg: [ [".article-shares", 2], 2 ], go: 1, autoDownload: [0], next: ".article-nav-prev a", prev: ".article-nav-next a", customTitle: () => fun.geT(".article-title"), fancybox: { v: 3, css: false }, category: "nsfw1" }, { name: "24FA", host: ["www.24fa.com"], link: "https://www.24fa.com/c49.aspx", reg: /(www\.)?\d{2,3}(m|w|faw|fa|aa)?\.[a-z]{2,4}\/m?n\w+\.aspx/, init: "document.onkeydown=null", imgs: () => fun.getImgA("#content img", ".pager a:not([title])"), button: [4], insertImg: ["#content", 1], autoDownload: [0], next: ".prevNews>a", prev: ".nextNews>a", customTitle: () => fun.geT("h1"), css: "body>section[id],#footer~*:not([id^='pv-']):not([class^='pv-']):not(.pagetual_tipsWords):not(#comicRead):not(#fab):not(.FullPictureLoadMsg):not(.FullPictureLoadFixedBtn):not(#FullPictureLoadOptions):not(*[class^=fancybox]){display:none!important}", category: "nsfw2" }, { name: "Hit-x-Hot/Hitxhot Album Archive II", host: ["www.hitxhot.org", "hitxhot.com"], reg: /www\.hitxhot\.org\/(gallerys|articles|photos)\/(?!\?page=|\?m=|hot|top|tag)\w+\.html(\?m=1)?$|^https?:\/\/hitxhot\.com\/blog\/\w+\.html(\?m=1)?$/i, imgs: () => { let max; try { max = fun.geT(".entry-title").match(/\d+$/)[0]; } catch (e) { max = 1; } return /\?m=1/.test(siteUrl) ? fun.getImg(".entry-content img", max, "8") : fun.getImg(".entry-content img", max); }, button: [4], insertImg: [".entry-content", 2], customTitle: () => document.title.split("|")[0].slice(10).trim(), category: "nsfw2" }, { name: "www.depvailon.com pic.yailay.com nungvl.net www.kaizty.com lootiu.com depday.info", host: ["www.depvailon.com", "pic.yailay.com", "nungvl.net", "www.kaizty.com", "lootiu.com", "depday.info"], reg: /(pic\.yailay\.com|www\.kaizty\.com)\/(gallerys|articles|photos)\/(?!\?page=|\?m=|hot|top|tag)\w+\.html$|www\.depvailon\.com\/(?!\?page=|\?m=).+\.html$|nungvl\.net\/gallerys\/\d+\.cg$|lootiu\.com\/gallery\/.+\.cfg$|(pic\.yailay\.com|www\.kaizty\.com)\/(gallerys|articles|photos)\/(?!\?page=|\?m=|hot|top|tag)\w+\.html\?m=1$|www\.depvailon\.com\/(?!\?page=|\?m=).+\.html\?m=1$|nungvl\.net\/gallerys\/\d+\.cg\?m=1$|lootiu\.com\/gallery\/.+\.cfg\?m=1$|depday\.info\/v2\/\w+\.html/i, imgs: () => { let max; try { max = fun.geT("h1,h2").match(/\d+$/)[0]; } catch (e) { max = 1; } return /\?m=1/.test(siteUrl) ? fun.getImg(".contentme img,.contentme2 img", max, "8") : fun.getImg(".contentme img,.contentme2 img", max); }, button: [4], insertImg: [".contentme,.contentme2", 2], customTitle: () => document.title.split("|")[0].replace(/^[a-z-\s\.]+:/i, "").replace("NứngVL.net:", "").replace(/【\d+P】|\[\d+[\w\s\+\.]+\]/i, "").trim(), css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}", category: "nsfw2" }, { name: "TGStat Show more", reg: /^https?:\/\/([a-z]{2}\.)?tgstat\.com\//, observerClick: "//button[contains(text(),'Show more')]", category: "autoPager" }, { name: "Telegram Web", host: ["telegra.ph"], reg: /^https?:\/\/telegra\.ph\/.+/, exclude: "strong+a,a+strong", imgs: ".figure_wrapper img", customTitle: () => fun.geT("h1").replace(/\|/g, "").replace(/(\s?-\s?)?\d+P/i, ""), category: "nsfw2" }, { name: "新闻吧/新娱乐在线/新娱乐网/福建热线/山东热线/广西热线/武汉热线/天津热线/云南热线/甘肃热线", host: ["www.xinwenba.net", "m.xwbar.com", "www.dv67.com", "m.dv67.com", "www.xinent.net", "m.xinent.net", "www.fjrx.org", "m.fjrx.org", "www.sdrx.org", "m.sdrx.org", "www.gxrx.org", "m.gxrx.org", "www.whrx.org", "m.whrx.org", "www.tjrx.org", "m.tjrx.org", "www.ynrx.org", "m.ynrx.org", "www.gsrx.org", "m.gsrx.org"], link: "https://www.xinwenba.net/web/meinv/", reg: /(www\.xinwenba\.net|m\.xwbar\.com|(www|m)\.dv67\.com|(www|m)\.xinent\.net|(www|m)\.fjrx\.org|(www|m)\.sdrx\.org|(www|m)\.gxrx\.org|(www|m)\.whrx\.org|(www|m)\.tjrx\.org|(www|m)\.ynrx\.org|(www|m)\.gsrx\.org)\/plus\/view-\d+-\d+\.html/, include: ".main img", imgs: () => { let max; try { max = fun.geT(".paging>li>a,.tags>li>a,.pre_next>li>a").match(/\d+/)[0]; } catch (e) { max = 1; } return fun.getImg(".main img", max, "5"); }, button: [4], insertImg: [".view_img", 2], autoDownload: [0], next: "//li[contains(text(),'上一篇')]/a", prev: "//li[contains(text(),'下一篇')]/a", customTitle: () => fun.geT(".title>h1"), css: "div.web{display:none!important;}", category: "nsfw1" }, { name: "四海资讯/娱乐吧", host: ["www.shzx.org", "m.shzx.org", "www.yuleba.org", "m.entba.net"], link: "https://www.shzx.org/b/12-0.html", reg: /((www|m)\.shzx\.org|www\.yuleba\.org|m\.entba\.net)\/a\/[\d-]+\.html/, imgs: () => { let max; try { max = fun.geT(".paging>a").match(/\d+/)[0]; } catch (e) { max = 1; } return fun.getImg(".main img", max, "5"); }, button: [4], insertImg: [".main", 2], autoDownload: [0], next: ".pre_next li:last-child a", prev: ".pre_next li:first-child a", customTitle: () => fun.geT(".title>h1"), css: ".a_img .main img{max-width:100%!important}", category: "nsfw1" }, { name: "留园酷", host: ["www.cool18.com"], reg: /(www\.cool18\.com\/bbs\d*\/index\.php\?app=forum&act=threadview&tid=\d+|wap\.cool18\.com\/index\.php\?app=index&act=view&cid=\d+)/, imgs: "img[mydatasrc],#shownewsc img,.show_content img", customTitle: () => fun.geT(".show_content b,h1.article-tit").replace(/(\s?\.?)?\s?\(\d+P\)\s?/i, ""), css: ".img_ad_list{display:none!important}", category: "nsfw2" }, { name: "萌物语", host: ["www.uamoe.com"], reg: /^https?:\/\/www\.uamoe\.com\/\d+\/$/i, include: ".article-content img", exclude: ".hidden-box", imgs: ".article-content img", button: [4], insertImg: [".wp-posts-content", 2], autoDownload: [0], next: "//a[p[text()='上一篇']]", prev: "//a[p[text()='下一篇']]", customTitle: () => fun.geT(".article-title>a"), category: "nsfw1" }, { name: "ACG 资源网", host: ["meituzyw.com"], reg: /meituzyw\.com\/\d+\.html/i, exclude: ".ri-hide-warp", imgs: "img[data-lazy-src],.content-wrapper img", button: [4], insertImg: ["//p[img]", 2], autoDownload: [0], next: "a.entry-page-prev", prev: "a.entry-page-next", customTitle: () => fun.geT(".post-title,.entry-title").replace(/\[\d+p\]/i, "").trim(), category: "nsfw1" }, { name: "秀人集", host: ["www.2xiuren.cc", "www.xr01.vip", "a.xiu.cloudns.org"], reg: /^https?:\/\/[^\/]+\/\w+\/\d+\.html/i, include: "//div[@class='item_info']//a[text()='秀人集']", imgs: () => fun.getImg('.content>p img[alt]', fun.geT(".page a:last-child", 2), 3, [null, null], 200), init: () => { let pag = [...fun.gae(".page")]; if (pag.length > 0) pag[0].remove(); }, button: [4], insertImg: ["//div[p[img[@alt and @title]]]", 2], autoDownload: [0], next: "//span[contains(text(),'下一篇')]/a[contains(@href,'html')]", prev: "//span[contains(text(),'上一篇')]/a[contains(@href,'html')]", customTitle: () => fun.geT(".item_title>h1"), //threading: 4, css: ".content br{display:none!important}", category: "nsfw1" }, { name: "秀人美女網", host: ["www.xrmn03.com", "m.xrmn.xyz"], reg: /^https?:\/\/[^\/]+\/\w+\/\d+\/\d+\.html/i, include: "//div[@class='single-cat']/a[text()='秀人美女网']", imgs: () => fun.getImg('.content p img[alt]', fun.geT(".page a:last-child", 2), 3, [null, null], 200), button: [4], insertImg: ["//div[p[img[@alt]]]", 2], autoDownload: [0], next: "//span[contains(text(),'下一篇')]/a[contains(@href,'html')]", prev: "//span[contains(text(),'上一篇')]/a[contains(@href,'html')]", customTitle: () => fun.geT(".item_title>h1").replace(/\d+P$/i, ""), //threading: 4, css: ".item_title>a,.content br,.bottom_fixed,.update_area_lists>div[id],body>div[id]:not([id^='pv-']):not([class^='pv-']):not(.pagetual_tipsWords):not(#comicRead):not(#fab):not(.FullPictureLoadMsg):not(.FullPictureLoadFixedBtn):not(#FullPictureLoadOptions):not(*[class^=fancybox]){display:none!important}", category: "nsfw1" }, { name: "极品性感美女", host: ["www.xgmn01.cc", "m.xg08.xyz"], reg: /^https?:\/\/[^\/]+\/\w+\/\w+\.html/i, include: "//div[@class='toptip']/a[text()='极品性感美女']", init: () => { let pag = [...fun.gae(".pagination")]; if (pag.length > 0) pag[0].remove(); let p = [...fun.gae("//article/p[not(img)]")]; if (p.length > 0) { let te = fun.ge(".article-content"); p.forEach(e => te.parentNode.insertBefore(e, te)); } }, imgs: () => fun.getImg(".article-content img[alt]", fun.geT("a.current~*:last-child", 2), 3, [null, null], 200), button: [4], insertImg: [ ["//div[@class='pagination'][last()]", 1, "//p[img[@alt]]"], 2 ], go: 1, autoDownload: [0], next: ".article-nav-next>a[href$=html]", prev: ".article-nav-prev>a[href$=html]", customTitle: () => fun.geT(".article-title").replace(/\d+p$/i, ""), //threading: 4, css: ".article-header>a,.article-content br,img[src*='zz1.gif'],.bottom_fixed,.article-content~a,#bottom-banner,.content>div[id],body>.footer~*:not([id^='pv-']):not([class^='pv-']):not(.pagetual_tipsWords):not(#comicRead):not(#fab):not(.FullPictureLoadMsg):not(.FullPictureLoadFixedBtn):not(#FullPictureLoadOptions):not(a):not(*[class^=fancybox]){display:none!important}", category: "nsfw1" }, { name: "爱美女网", host: ["www.imn5.xyz"], reg: /^https?:\/\/www\.imn5\.\w+\/\w+\/\w+\/\d+\.html/i, imgs: () => fun.getImg('.imgwebp p img[alt]', fun.geT(".page a:last-child", 2), 3, [null, null], 200), button: [4], insertImg: ["//div[p[img[@alt]]]", 2], autoDownload: [0], next: "//span/b[contains(text(),'下一篇')]/a[contains(@href,'html')]", prev: "//span/b[contains(text(),'上一篇')]/a[contains(@href,'html')]", customTitle: () => fun.geT(".focusbox h1+div").replace(/\d+P$/i, ""), //threading: 4, css: ".imgwebp br,img[src*='zz2.gif']{display:none!important}", category: "nsfw1" }, { name: "爱看美女网", host: ["www.ikmn03.cc"], reg: /^https?:\/\/www\.ikmn(\d+)?\.\w+\/\w+\/\d+\.html/i, include: ".info-pagebar>a", init: () => { let pag = [...fun.gae(".pagebar")]; if (pag.length > 0) pag[0].remove(); }, imgs: () => fun.getImg('.info-imtg-box img[alt]', fun.geT(".pagebar>*:last-child", 2), 3, [null, null], 200), button: [4], insertImg: ["//p[img[@alt]]", 2], autoDownload: [0], next: ".info-next li:last-child a", prev: ".info-next li:first-child a", customTitle: () => fun.geT("h1").replace(/\d+p$/i, ""), //threading: 4, category: "nsfw1" }, { name: "美人图", host: ["meirentu.cc"], reg: /meirentu\.\w+\/pic\/\d+\.html/i, imgs: () => fun.getImg('.content_left img[alt]', fun.geT(".page a:last-child", 2), 5), button: [4], insertImg: [".content_left", 2], autoDownload: [0], next: "//span[contains(text(),'下一篇')]/a[contains(@href,'html')]", prev: "//span[contains(text(),'上一篇')]/a[contains(@href,'html')]", customTitle: () => fun.geT(".item_title>h1").replace(/\d+P$/i, ""), //threading: 4, css: "img[alt]~br{display:none!important}", category: "nsfw1" }, { name: "美女秀", host: ["www.22mm.net"], reg: /www\.22mm\.net\/a\/\w+\.html$/i, imgs: () => fun.getImg(".content img", fun.ge(".page>li:last-child>a").href.match(/_(\d+)/)[1], 9), button: [4], insertImg: [".content", 2], autoDownload: [0], next: "//span[contains(text(),'上一篇')]/a", prev: "//span[contains(text(),'下一篇')]/a", customTitle: () => fun.geT(".item_title>h1"), css: "union,.update_area_lists>li:nth-child(n+3):nth-child(-n+4){display:none!important}", category: "nsfw1" }, { name: "卡卡美女网", host: ["www.kaka234.cc", "m.kaka234.cc"], reg: /^https?:\/\/(www|m)\.kaka234\.cc\/HTM\/\w+\/(\w+\/)?\d+\/\d+\/\d+\.html/i, include: ".Title>h1,.PsBox", init: () => { let ele = fun.ge(".PsBox"); if (ele) { let eleParent = ele.parentNode; eleParent.parentNode.insertBefore(ele.cloneNode(true), eleParent); } }, imgs: () => { let max; try { max = fun.geT(".dede_pages li>a,.article_page li>a").match(/\d+/)[0]; } catch (e) { max = 1; } return fun.getImg(".content img,.ArticleImageBox img", max, 9); }, button: [4], insertImg: ["//div[@class='content'] | //div[div[@class='ArticleImageBox']]", 2], autoDownload: [0], next: () => { let next = fun.ge("//li[contains(text(),'上一篇')]/a"); return next ? next.href : null; }, prev: 1, customTitle: () => fun.geT(".Title>h1,.PsBox"), css: ".m_adv{display:none!important}", category: "nsfw1" }, { name: "ROSI美女写真", host: ["www.rosixiezhen.cc", "rosixiezhen.cc", "www.rosi365.cc", "www.rosi360.cc", "www.2meinv.cc", "www.silk-necktie.com"], reg: /^https?:\/\/((www\.)?rosixiezhen\.cc|(www\.)?rosi\d+\.cc|(www\.)?\dmeinv\.cc|www\.silk-necktie\.com)\/\w+\/\w+\.html/i, exclude: "//span/a[text()='ROSI视频']", init: () => { let pag = [...fun.gae(".pagination2")]; if (pag.length > 0) pag[0].remove(); fun.remove(".content>b,.content>br,.asst"); }, imgs: () => { let max; try { max = fun.geT("//a[contains(text(),'共')]").match(/\d+/)[0]; } catch (e) { max = 1; } return fun.getImg(".article-content img", max, 9); }, button: [4], insertImg: [".article-content", 2], autoDownload: [0], next: ".article-nav-prev>a", prev: ".article-nav-next>.a", customTitle: () => fun.geT(".article-title"), category: "nsfw1" }, { name: "ROSI小莉最新写真", host: ["www.rosi211.cc"], reg: /^https?:\/\/(www\.)?rosi\d+\.cc\/\d+$/i, init: () => { let pag = [...fun.gae(".wp-pagenavi")]; if (pag.length > 0) pag[0].remove(); let ele = fun.ge(".entry-header"); if (ele) { let x = fun.ge("article.post"); x.parentNode.insertBefore(ele, x); } }, imgs: () => { let links = [...new Set([...fun.gae(".wp-pagenavi a")].map(a => a.href))]; return fun.getImgA("article img", links); }, button: [4], insertImg: ["article.post", 2], autoDownload: [0], next: ".nav-previous>a", prev: ".nav-next>a", customTitle: () => fun.geT(".entry-title"), css: "@media only screen and (max-width:480px){#primary{padding:6px !important}.col-md-12{padding:0px !important}}", category: "nsfw1" }, { name: "闺秀网", host: ["www.guixiu.org", "guixiu.org"], reg: /^https:\/\/(www\.)?guixiu\.org\/post\/\d+\.html/i, imgs: () => fun.getImgA("#lightgallery img", "#ipage a[href*=ipage]"), button: [4], insertImg: ["#lightgallery", 2], customTitle: () => fun.geT(".focusbox-title"), category: "nsfw1" }, { name: "福利图", host: ["fulitu.me"], reg: /fulitu\.me\/pic\/\d+\.html/i, imgs: () => fun.getImg(".content_left img", fun.geT("//a[text()='下页']", 2), 5), button: [4], insertImg: [".content_left", 2], autoDownload: [0], next: "//span[contains(text(),'下一篇')]/a", prev: "//span[contains(text(),'上一篇')]/a", customTitle: () => fun.geT(".item_title>h1").replace(/\d+P$/i, "").trim(), css: ".content br{display:none!important}", category: "nsfw1" }, { name: "爱图门/佼人馆", host: ["aitu.men", "jaoren.com"], reg: /^https:\/\/(aitu\.men|jaoren\.com)\/[^\/]+\/\d+\.html/i, imgs: async () => { await fun.getNP(".context img", ".pagelist span+a", null, ".pagelist", 0, null, 0); return [...fun.gae(".context img")]; }, button: [4], insertImg: [".context", 1], autoDownload: [0], next: ".post-previous a", prev: ".post-next a", customTitle: () => fun.geT("#content h1"), category: "nsfw1" }, { name: "女神排行榜", host: ["nsphb.com"], reg: /^https:\/\/nsphb\.com\/\w+\/\d+\.html/i, imgs: () => fun.getImgA(".article-content img", ".post-nav-links a"), button: [4], insertImg: [".article-content", 2], autoDownload: [0], next: "//a[p[text()='上一篇'] and not(starts-with(@href,'java'))]", prev: "//a[p[text()='下一篇'] and not(starts-with(@href,'java'))]", customTitle: () => fun.geT(".article-title>a").replace(/\d+p/i, ""), category: "nsfw1" }, { name: "K55", host: ["k55.net"], link: "https://k55.net/arttype/2.html", reg: /^https?:\/\/k55\.net\/artdetail-\d+\.html/i, include: ".photo_box", imgs: () => [...fun.gae(".photo_box img")].map(e => e.src).sort((a, b) => a.match(/(\d+)\.\w+$/)[1] - b.match(/(\d+)\.\w+$/)[1]), button: [4], insertImg: [".photo_box", 2], autoDownload: [0], next: ".item_prev_next>.item_right>a", prev: ".item_prev_next>.item_left>a", customTitle: () => fun.geT(".title-box>.h3-md.mb-1").replace(/\s?\[\d+P\].+$/i, ""), fancybox: { v: 3, css: false }, category: "nsfw1" }, { name: "Hotgirl.biz", host: ["hotgirl.biz"], reg: /^https?:\/\/hotgirl\.biz\/[^\/]+\/$/i, imgs: ".entry-content img", button: [4], insertImg: [ [".entry-content", 0], 2 ], go: 1, customTitle: () => fun.geT(".entry-title"), category: "nsfw1" }, { name: "AsupanPenyegar", host: ["asupanpenyegar.com"], reg: /^https?:\/\/asupanpenyegar\.com\/[^\/]+\/$/i, imgs: ".s-post-content img", button: [4, "23%"], insertImg: [".s-post-content", 2], go: 1, customTitle: () => fun.geT(".entry-title").replace(/\[\d+[-\.\+\s\w]+\]/, "").trim(), category: "nsfw1" }, { name: "XLUST.ORG", host: ["xlust.org"], reg: /^https?:\/\/xlust\.org\/[^\/]+\/$/i, imgs: ".rl-gallery-item a", button: [4], insertImg: [ [".rl-gallery", 2], 2 ], go: 1, customTitle: () => fun.geT(".entry-title").replace(/\([\d\s]+pics\)\s?/, ""), fancybox: { blacklist: 1 }, category: "nsfw1" }, { name: "秀人网", host: ["xiurenwang.me"], reg: /^https?:\/\/xiurenwang\.me\/photo\.php\?id=\w+/i, imgs: () => { thumbnailsSrcArray = [...fun.gae(".intro>img")].map(e => e.src) return thumbnailsSrcArray.map(e => e.replace("_600x0", "")) }, button: [4], insertImg: [".intro", 2], customTitle: () => fun.geT("h1").replace(/\(\d+P\)/i, "").trim(), css: "@media only screen and (max-width:640px){.paragraph .intro img{width:100%!important}}", category: "nsfw1" }, { name: "秀人图", host: ["www.xiurento.com", "www.aixiuren.com"], reg: /^https?:\/\/www\.(xiurento|aixiuren)\.com\/\d+\.html/i, exclude: "//button[contains(text(),'登录购买')]", imgs: () => fun.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: () => fun.geT(".entry-title").replace(/\d+p/i, "").trim(), fancybox: { v: 3, css: false }, category: "nsfw1" }, { name: "牛牛美图", host: ["www.uyn8.cn"], reg: /^https?:\/\/www\.uyn8\.cn\/archives\/\d+/i, init: "fun.clearAllTimer();", imgs: ".entry-content img", button: [4], insertImg: [".entry-content", 2], customTitle: () => fun.geT(".entry-title"), category: "nsfw1" }, { name: "图片屋", host: ["www.tupianwu.com", "tupianwu.com"], reg: /^https?:\/\/(www\.)?tupianwu\.com\/post\/\d+\//i, init: "fun.clearAllTimer();", autoClick: ".readmore>a", imgs: () => [...fun.gae(".LightGallery_Item")].map(e => e.getAttribute("lg-data-src")), button: [4], insertImg: [ [".umBody", 0, ".LightGallery_Item"], 2 ], autoDownload: [0], next: ".prev>a", prev: ".next>a", customTitle: () => fun.geT(".postTitle>h1"), css: "@media only screen and (max-width:480px){.container{padding:0px !important}}", category: "nsfw1" }, { name: "图片屋 分類自動翻頁", enable: 1, reg: /^https?:\/\/(www\.)?tupianwu\.com\/(page\/\d+\/)?$|^https?:\/\/(www\.)?tupianwu\.com\/category\/\d+\/(\d+\/)?$/, include: ".pagebar", autoPager: { mode: 1, waitEle: "#article[style]", ele: "#article", observer: "#article", next: "span.current+a", re: ".pagebar", title: doc => "Page " + fun.geT("span.current", 1, doc), history: 1 }, openInNewTab: "#article a:not([target=_blank])", category: "autoPager" }, { name: "微密猫", host: ["wememiao.com", "wememao.com", "weme.su", "weme2.com", "weme4.com", "weme5.com", "weme6.com", "weme7.com", "weme9.com"], reg: /(wememiao\.com|wememao\.com|weme\.su|weme\d\.com)\/archives\/\d+/i, imgs: "figure.wp-block-image a[data-fancybox]", button: [4], insertImg: [ [".article-content", 0, "figure.wp-block-image,.code-block"], 2 ], autoDownload: [0], next: ".article-nav-prev a", prev: ".article-nav-next a", customTitle: () => fun.geT(".article-title").replace(/\[[0-9a-z-\.\s]+\]/i, "").trim(), go: 1, fancybox: { v: 3, css: false }, css: ".code-block{display:none!important;}", category: "nsfw1" }, { name: "优美图录", host: ["umei.net"], reg: /umei\.net\/\w+\/\d+\.html/i, imgs: () => fun.getImg(".image_div img", fun.geT(".item_info span"), 9, [null, null], 200), button: [4], insertImg: [".image_div", 2], customTitle: () => fun.geT(".item_title>h1"), css: ".content_left img{cursor:unset}.affs,.xg_content>li:nth-child(n+1):nth-child(-n+2){display:none!important}.image_div a img{cursor:unset}", category: "nsfw1" }, { name: "秀人图集", host: ["xiuren0.com"], reg: /xiuren\d\.com\/\d+\.html/i, include: ".article-paging>*:last-child", init: () => fun.remove("//p[img[@decoding and not(contains(@src,'/pic/'))]]"), imgs: () => fun.getImg(".article-content img:not([src*='/pic/'])", fun.geT(".article-paging>*:last-child"), "4"), button: [4], insertImg: [ [".article-paging", 1], 1 ], next: ".article-nav-prev>a", prev: 1, customTitle: () => fun.geT(".article-title"), css: ".modown-ad{display:none!important}", category: "nsfw1" }, { name: "秀人图集", host: ["xiuren0.com"], reg: /xiuren\d\.com\/\d+\.html/i, imgs: ".article-content img:not([src*='p.xiurenb.top'])", next: ".article-nav-prev>a", prev: 1, customTitle: () => fun.geT(".article-title"), category: "nsfw1" }, { name: "Xiutaku/Kiutaku", host: ["xiutaku.com", "kiutaku.com"], reg: /(xiutaku\.com|kiutaku\.com)\/\d+$/, init: () => fun.remove(".search-form~*,.blog~*:not([class]),.pagination~*:not([class]):not(hr),.article.content~*:not([class]):not(hr),.bottom-articles~*"), imgs: () => fun.getImg(".article-fulltext img", fun.geT(".pagination-list>span:last-child")), button: [4], insertImg: [".article-fulltext", 2], customTitle: () => fun.geT(".article-header>h1").replace("(mitaku.net)", "").trim(), category: "nsfw1" }, { name: "私图网", host: ["baoruba.com", "tukuku.cc"], reg: /(baoruba\.com|tukuku\.cc)\/(bb|t)\d+\.html/i, imgs: "img[decoding]", button: [4], insertImg: [".entry-content", 2], customTitle: () => fun.title(" - 私图网"), go: 1, css: "[id].widget_text,.gridmode-post-thumbnail-single,.gridbit-thumbnail-alignwide{display:none!important}", category: "nsfw1" }, { name: "找套图", host: ["www.zhaotaotu.cc"], reg: /www\.zhaotaotu\.cc\/thread-\d+\.htm/i, imgs: ".message>img:not(:first-of-type)", button: [4], insertImg: [".message", 2], customTitle: () => fun.geT(".media-body>h4").replace(/\(\d+P\)/i, ""), category: "nsfw1" }, { name: "豆花520", host: ["www.douhua520.com"], reg: /www\.douhua520\.com\/p\/\d+/i, imgs: () => [...fun.gae(".tm-container-content div>.img-fluid")].map(e => encodeURI("https://www.douhua520.com/" + e.alt)), button: [4], insertImg: ["//div[div[div[img[@class='img-fluid']]]]", 2], customTitle: () => fun.geT(".tm-container-content h2.tm-text-primary"), category: "nsfw1" }, { name: "尤美图库", host: ["www.umeitu.com"], reg: /www\.umeitu\.com\/img\/\d+\.html/, imgs: () => fun.getImg(".vipimglist img", fun.geT(".stitle>h1>span").match(/\d+/)[0], 9), button: [4], insertImg: [".vipimglist", 2], customTitle: () => fun.title(" - 尤美图库", 1).replace(/\[\d+P\]/i, ""), css: ".sb.list2>li:nth-child(n+2):nth-child(-n+3){display:none!important}.vipimglist img{min-height:unset!important;}", category: "nsfw1" }, { name: "美图库", host: ["www.meituku.org"], reg: /www\.meituku\.org\/\d+\/\d+\.html/, imgs: () => [...fun.doc(imgs.join("")).images], button: [4], insertImg: ["#content", 2], autoDownload: [0], next: "//div[contains(text(),'下一篇')]/a", prev: "//div[contains(text(),'上一篇')]/a", customTitle: () => fun.geT(".info-title>a:nth-child(3)"), category: "nsfw1" }, { name: "秀爱美女网/秀套图吧", host: ["www.2mn.cc", "www.taotu8.cc"], reg: /(www\.2mn\.cc|www\.taotu8\.cc)\/mm\/\d+\.html/i, imgs: () => { let max; try { max = fun.ge(".page_navi a:last-child").href.split("_")[1].match(/\d+/)[0]; } catch (e) { max = 1; } return fun.getImg(".sg_img img", max, 9); }, button: [4], insertImg: [".sg_img", 2], customTitle: () => fun.geT("h1"), css: "#divpsg,.tujia{display:none!important}.sg_img img{min-height:unset!important}", category: "nsfw1" }, { name: "Xiuren 秀人网", host: ["www.xiuren.org"], reg: /www\.xiuren\.org\/.+\.html/i, imgs: "a[rel='gallery']:not([href*='html']", button: [4], insertImg: [ [".post p>a:not([title])", 2, ".post p>a[title],.post p>span"], 2 ], customTitle: () => fun.geT("#title>h1").replace(/\d+p$/i, "").trim(), css: "#post .post img{max-width:100% !important}", category: "nsfw2" }, { name: "微圖坊", host: ["www.v2ph.com", "www.v2ph.net", "www.v2ph.ru", "www.v2ph.ovh"], reg: () => { if (/^https?:\/\/www\.v2ph\.(com|net|ru|ovh)\/album\//.test(siteUrl)) { if (!siteUrl.includes("?page=")) { return true; } } return false; }, include: ".photos-list", imgs: async () => { let picTotalNum = fun.geT("dd:last-child").match(/\d+/)[0]; let pagePicNum = [...fun.gae(".album-photo img[alt]")].length; let max = Math.ceil(picTotalNum / pagePicNum); let links = fun.arr(max).map((_, i) => siteUrl.replace(/\?hl=.+|\?page=\d+/, "") + `?page=${(i + 1)}`); let srcArr = []; let status = 200; let vip = false; let fetchNum = 0; fun.showMsg(displayLanguage.str_01, 0); for (let page = 0; page < links.length; page++) { await fetch(links[page]).then(res => { if (res.status == 403) status = 403; fun.showMsg(`${displayLanguage.str_02}${fetchNum+=1}/${links.length}`, 0); return res.arrayBuffer(); }).then(buffer => { const decoder = new TextDecoder(document.characterSet || document.charset || document.inputEncoding); const htmlText = decoder.decode(buffer); const doc = fun.doc(htmlText); debug(`\n${links[page]}\n`, doc); let vipEle = fun.ge(".lead", doc); if (vipEle) vip = true; let imgs = [...fun.gae(".album-photo img[alt]", doc)]; imgs.length == 0 ? debug(`\n${links[page]}\n沒有任何圖片`) : debug(`\n${links[page]}\n此頁圖片`, imgs); let tE = [...fun.gae("div.album-photo")].pop(); imgs.forEach(img => { img.dataset.src ? srcArr.push(img.dataset.src) : srcArr.push(img.src); if (page != 0) tE.parentNode.insertBefore(img.parentNode.cloneNode(true), tE.nextSibling); }); if (page != 0) fun.ge(".pagination").outerHTML = fun.ge(".pagination", doc).outerHTML; }); if (status == 403) { setTimeout(() => { fun.showMsg("403請先登錄網站!", 0); }, 1200); return srcArr; } if (vip) { setTimeout(() => { fun.showMsg("VIP限定專輯圖片!", 5000); }, 1200); return srcArr; } await fun.delay(600, 0); } if (picTotalNum != srcArr.length && !vip) { setTimeout(() => { fun.hideMsg(); fun.showMsg("圖片有缺,請看主控台訊息", 5000); }, 1300) } return srcArr; }, button: [4], insertImg: [".photos-list", 2], customTitle: () => fun.geT("h1"), css: ".albums-list img,.photos-list img{opacity:1!important}", threading: 8, category: "nsfw2" }, { name: "柠檬皮", host: ["www.emonl.com", "www.cybesx.com"], reg: /(www\.emonl\.com|www\.cybesx\.com)\/\d+\.html$/i, include: ".page-links", exclude: ".read-point-box", imgs: () => fun.getImg(".single-content img", (fun.geT(".page-links>a:last-child", 2) || 1), 7), button: [4], insertImg: [".single-content", 1], customTitle: () => fun.geT("h1.entry-title"), fancybox: { v: 3, css: false }, category: "nsfw1" }, { name: "柠檬皮", host: ["www.emonl.com", "www.cybesx.com"], reg: /(www\.emonl\.com|www\.cybesx\.com)\/\d+\.html$/i, include: ".single-content img", exclude: ".read-point-box", imgs: ".single-content img", button: [4], insertImg: [".single-content", 1], customTitle: () => fun.geT("h1.entry-title"), fancybox: { v: 3, css: false }, category: "nsfw1" }, { name: "Cherryfans", host: ["cherryfans.cc"], reg: /cherryfans\.cc\/[^/]+\/$/i, imgs: ".entry-content img[data-src]", button: [4], insertImg: [".entry-content", 2], autoDownload: [0], next: "a[rel=prev]", prev: "a[rel=next]", customTitle: () => fun.geT("h1.entry-title"), css: ".entry-featured-media-main{display:none!important}", category: "nsfw2" }, { name: "51sex", host: ["51sex.vip"], reg: /51sex\.vip\/pic\/\d+/i, init: () => { let url = siteData.next(); fun.addUrlHtml(url, ".headling_main", 1, "下一篇"); }, imgs: () => { let max; try { max = fun.geT(".headling_swiper_num_small").match(/\d+/)[0]; } catch (e) { max = 1; } let links = fun.arr(max).map((_, i) => siteUrl + "/" + (i + 1)); return fun.getImgA("#bigimg", links); }, button: [4, "24%"], insertImg: [".headling_main", 2], next: () => { let num = siteUrl.match(/\d+$/)[0]; return siteUrl.replace(/\d+$/, "") + (parseInt(num, 10) - 1); }, customTitle: () => fun.geT('.headling_word_main_box_title').replace(/\[\d+P\]/i, "").replace(/\d+P$/i, "").replace(/\(\d+P\)/i, "").trim(), css: ".headling_main{height:auto}", category: "nsfw1" }, { name: "51sex分類自動翻頁", host: ["51sex.vip"], reg: /https?:\/\/51sex\.vip\/category\/\d+/i, init: () => { location.pathname.split("/").length == 3 ? currentPageNum = 1 : currentPageNum = parseInt(location.pathname.split("/").pop(), 10); }, autoPager: { ele: ".headling_main_a", observer: ".headling_main_a", next: () => { let url = siteUrl.match(/https?:\/\/51sex\.vip\/category\/\d+/)[0] + `/${currentPageNum += 1}`; return url; }, stop: doc => { let currentEles = [...fun.gae(".headling_main_a")]; if (currentEles.length < 24) { return true; } else { if (currentEles.length > 24) currentEles = currentEles.slice(-24); let nextEles = [...fun.gae(".headling_main_a", doc)]; for (let i in currentEles) { for (let n in nextEles) { if (currentEles[i].href == nextEles[n].href) return true; } } } return false; }, history: 1, title: doc => doc.title + ` - Page ${currentPageNum}` }, openInNewTab: "a.headling_main_a:not([target=_blank])", category: "autoPager" }, { name: "美图乐", host: ["www.meitule.net"], reg: /www\.meitule\.\w+\/photo\/\d+\.html/i, imgs: () => { let max; try { max = fun.ge(".page>li:last-child>a").href.split("_")[1].match(/\d+/)[0]; } catch (e) { max = 1; } return fun.getImg(".content img", max, 9); }, button: [4], insertImg: [".content", 2], customTitle: () => fun.geT("h1.h5"), css: "#dtag>center,#divpsg,.tujia,.list-album>li:nth-child(n+1):nth-child(-n+2){display:none!important}", category: "nsfw1" }, { name: "美桌", host: ["www.win4000.com"], link: "http://www.win4000.com/meitu.html", reg: /www\.win4000\.com\/meinv\d+\.html/, imgs: () => fun.getImgA(".pic-large", "#scroll>li:not(.current)>a", 200), button: [4], insertImg: ["#pic-meinv,.pic-meinv", 2], autoDownload: [0], next: ".group-next>a", prev: ".group-prev>a", customTitle: () => fun.geT(".ptitle>h1"), threading: 3, category: "nsfw1" }, { name: "MM1311", host: ["www.mm1311.net", "m.mm1311.net"], reg: /(www|m)\.mm1311\.net\/\w+\/\d+\.html/, imgs: () => { let max; fun.ge(".page-ch") ? max = fun.geT(".page-ch").match(/\d+/)[0] : max = fun.geT(".fenye>.rw").match(/\d+\/(\d+)/)[1]; return fun.getImg(".content-pic img,.post-content img", max, 9); }, button: [4], insertImg: [".content-pic,.post-content", 1], autoDownload: [0], next: ".updown_r", prev: ".updown_l", customTitle: () => fun.geT(".content>h5,.mm-title"), css: "union{display:none!important}", category: "nsfw1" }, { name: "依依图片网/精选美女网", host: ["www.eemm.cc", "www.jxmm.net"], reg: /(www\.eemm\.cc|www\.jxmm\.net)\/pic\/\d+\.html/, imgs: async () => { await fun.getNP("#content img", "a.on+a:not(.next)", null, ".page", 0, null, 0, 0); return [...fun.gae('#content img')]; }, button: [4], insertImg: ["#content", 1], customTitle: () => fun.geT(".article>h1"), css: ".article .content img{max-width:100%!important}", category: "nsfw1" }, { name: "依依图片网M/精选美女网M", host: ["m.eemm.cc", "m.jxmm.net"], reg: /(m\.eemm\.cc|m\.jxmm\.net)\/pic\/\d+\.html/, imgs: () => { let max = fun.geT(".contentpage").match(/\d+\/(\d+)/)[1]; return fun.getImg(".content img", max, 9); }, button: [4], insertImg: [".content", 1], customTitle: () => fun.geT(".content>h1"), css: ".topad,.mdiv{display:none!important}", category: "nsfw1" }, { name: "内涵吧", host: ["www.neihantu.net"], reg: /(www|wap)\.neihantu\.net\/zhainannvshen\/\d+\.html$/, imgs: () => { let max = fun.geT("a[title=Page]>b:last-child"); return fun.getImg("#adcon img,.newsbox img", max, 9); }, button: [4], insertImg: ["#adcon,.newsbox", 1], autoDownload: [0], next: "//li[@id='pre']/a | //a[text()='上一篇']", prev: "//li[@id='next']/a | //a[text()='下一篇']", customTitle: () => fun.geT(".inner>h1,.titbox>h1"), category: "nsfw1" }, { name: "青年美圖", host: ["jrants.com"], reg: /^https?:\/\/jrants\.com\/\d+\.html$/, imgs: () => fun.ge(".page-links") ? fun.getImg(".entry-content img", fun.geT(".page-links>a:last-child"), 7) : [...fun.gae(".entry-content img")], button: [4], insertImg: [".entry-content", 1], autoDownload: [0], next: "span.prev>a", prev: "span.next>a", customTitle: () => fun.geT(".entry-title").replace(/\(\d+P\)|\[\d+P\]|\[\d+P\/\d+1M\]/gi, "").trim(), css: ".code-block{display:none!important;}", category: "nsfw2" }, { name: "CosBlay/風流雜誌/泰撲美圖", host: ["cosblay.com", "trendszine.com", "www.tiplogo.com"], reg: /^https?:\/\/(cosblay\.com|trendszine\.com|www\.tiplogo\.com)\/\d+\.html/i, imgs: () => fun.getImg(".entry-content img", fun.geT(".pgntn-page-pagination-block>*:last-child", 2) || 1, 7), button: [4], insertImg: [".entry-content", 2], autoDownload: [0], next: "span.prev>a", prev: "span.next>a", customTitle: () => fun.geT(".entry-title").replace(/\(\d+\s?Photos\)|\(\d+p\)/i, "").trim(), css: ".code-block{display:none!important;}@media (max-width:768px){.separate-containers .inside-article,.separate-containers .comments-area,.separate-containers .page-header,.separate-containers .paging-navigation,.one-container .site-content,.inside-page-header{padding:2px}.entry-content:not(:first-child),.entry-summary:not(:first-child),.page-content:not(:first-child){margin-top:2px}}", category: "nsfw2" }, { name: "MM5MM5美女图片", host: ["www.mm5mm5.com"], reg: /www\.mm5mm5\.com\/mm\/\d+/, imgs: () => picinfo[0].split(","), button: [4], insertImg: ["#content", 1], customTitle: () => fun.geT(".article>h2"), css: ".article .content img{max-width:100%!important}", category: "nsfw1" }, { name: "MM5MM5美女图片M", host: ["m.mm5mm5.com"], reg: /m\.mm5mm5\.com\/mm\/\d+/, imgs: () => { let max = fun.geT(".contentpage>span>i").match(/\/(\d+)/)[1]; let links = []; links.push(siteUrl); for (let i = 1; i < max; i++) { links.push(siteUrl + "/" + i); } return fun.getImgA("div>a>img", links, 333); }, button: [4], insertImg: ["//div[a[img]]", 2], customTitle: () => fun.geT(".content>h1"), css: "union[id],.pag-ts,.contentpage{display:none!important}", category: "nsfw1" }, { name: "888美女网", host: ["www.888meinv.com"], reg: /^https?:\/\/www\.888meinv\.com\/\w+\/\d+$/, include: ".suoyou", imgs: () => { let max = fun.geT(".suoyou").match(/\/(\d+)/)[1]; let links = fun.arr(max).map((_, i) => siteUrl + "/" + (i + 1)); return fun.getImgA(".pannel img", links); }, button: [4], insertImg: [".pannel", 1], autoDownload: [0], next: ".pre_pageload>a", prev: ".next_pageload>a", customTitle: () => fun.geT("h1"), css: ".nr .tupianqu img{margin-top:0px!important}@media only screen and (max-width:480px){.nr .tupianqu,.nr .tupianqu .pannel{padding:0px!important}}", category: "nsfw1" }, { name: "可爱小图", host: ["www.keaitupian.com", "m.keaitupian.com"], reg: /(www|m)\.keaitupian\.com\/pic\/\d+\.html/, imgs: () => { try { let max = fun.geT(".entry-title,.desk-tit>h1").match(/\/(\d+)/)[1]; let links = []; links.push(siteUrl) let url = siteUrl.replace(".html", ""); for (let i = 1; i < max; i++) { links.push(url + "-" + i + ".html"); } return fun.getImgA(".entry-content img,#content_pic img", links, 1000); } catch (e) { return [...fun.gae(".entry-content img,#content_pic img")]; } }, button: [4], insertImg: [".entry-content,#content_pic", 1], customTitle: () => fun.geT(".entry-title,.desk-tit>h1").replace(/(\d+\/\d+)/, "").trim(), category: "nsfw1" }, { name: "回车桌面", host: ["www.enterdesk.com", "m.enterdesk.com"], reg: /^https?:\/\/((m\.)?mm?\.|www\.|(m\.)?sj\.)enterdesk\.com\/\w+\/[0-9-]+\.html/, include: ".arc_pandn .swiper-wrapper img,.marc_pandn .swiper-wrapper img,.arc_main_pic_img,#main_img", imgs: () => [...fun.gae(".arc_pandn .swiper-wrapper img,.marc_pandn .swiper-wrapper img,.arc_main_pic_img,#main_img")].map(e => e.src.replace("_360_360", "")), button: [4], insertImg: [".arc_main_pic,.marc_img", 2], autoDownload: [0], next: "//a[div[text()='下一组']]|//div[@id='next_pics']", prev: 1, customTitle: () => fun.geT(".arc_location>a:last-child,.m_h1>a"), css: ".marc_img img{min-height:unset!important}", category: "nsfw1" }, { name: "女人吧", host: ["www.nvhai8.com", "m.nvhai8.com"], reg: /^https?:\/\/(www|m)\.nvhai8\.com\/body\/\d+\/\d+\.htm/, init: () => { fun.remove("//div[iframe] | //div[@class='hengfu2'] | //div[@onclick]"); document.body.removeAttribute("style"); }, imgs: () => { try { let max = fun.geT(".imgfooter>a").match(/\d+/)[0]; return fun.getImgA(".remark img,.ui-article-detail img", ".imgfooter>a[href]"); } catch (e) { return [...fun.gae(".remark img,.ui-article-detail img")] } }, button: [4], insertImg: [".remark,.ui-article-detail", 2], autoDownload: [0], next: "//label[contains(text(),'下一篇')]/preceding-sibling::a[1]", prev: "//label[contains(text(),'上一篇')]/following-sibling::a[1]", customTitle: () => fun.geT(".text_content>h1,.arc_location>a:last-child,.m_h1>a,h1"), category: "nsfw1" }, { name: "3G 壁纸", host: ["www.3gbizhi.com", "m.3gbizhi.com"], link: "https://www.3gbizhi.com/meinv", reg: /(www|m|desk)\.3gbizhi\.com\/meinv\/(\w+\/)?\w+\.html/, imgs: () => { thumbnailsSrcArray = [...fun.gae(".swiper-slide>a>img")].map(e => e.src); return fun.getImgA("#contpic,#mobile_c_img>img", ".swiper-slide:not(:first-child) a"); }, button: [4], insertImg: ["#showimg", 1], autoDownload: [0], next: "a.next[href$=html]", prev: "a.pver[href$=html]", customTitle: () => fun.geT("h2.title,.titlew>h2"), css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}.showcontw #showimg{height:auto!important}[class^=ad_id]{display:none!important}", category: "nsfw1" }, { name: "亿图全景图库", host: ["www.yeitu.com", "m.yeitu.com"], link: "https://www.yeitu.com/meinv/", reg: /(www|m)\.yeitu\.com\/\w+\/\w+\/\w+\.html/, imgs: () => { let max = fun.geT(".imageset-sum,span.num").match(/\/\s?(\d+)/)[1]; let links = []; links.push(siteUrl); let url = siteUrl.replace(".html", ""); for (let i = 2; i <= max; i++) { links.push(url + "_" + i + ".html"); } return fun.getImgA(".img_box img[alt],.gallery-item img[alt],.article-show img", links, 333); }, button: [4], insertImg: [".img_box,.gallery-item,.article-show", 2], customTitle: () => fun.geT("#title>h1,h1.article-title,.article-info>h1"), css: ".appbox,.uk-page~section,.yt-pages+.mssp{display:none!important}", category: "nsfw1" }, { name: "优美图库", host: ["www.umei.cc"], link: "https://www.umei.cc/meinvtupian/", reg: /www\.umei\.cc\/meinvtupian\/\w+\/\d+\.htm/i, imgs: () => { let a = fun.ge(".pages li:last-child>a"); let max = a.href.match(/_(\d+).htm/)[1]; return fun.getImg(".big-pic img", max, 17); }, button: [4], insertImg: [".big-pic", 1], autoDownload: [0], next: ".preandnext:not(.connext)>a", prev: ".preandnext.connext>a[href$=htm]", customTitle: () => fun.geT("#photos>h1"), css: ".photo img {max-width:100% !important}", category: "nsfw1" }, { name: "优美图库M", host: ["wap.umei.cc"], reg: /wap\.umei\.cc\/meinvtupian\/\w+\/\d+\.htm/i, imgs: () => { let max = fun.geT("a.noclick").match(/\/(\d+)/)[1]; return fun.getImg("#maincont img", max, 17); }, button: [4], insertImg: ["#maincont", 1], autoDownload: [0], next: () => { let next = fun.ge("a.f-r.l3"); return next ? next.href : null; }, prev: 1, customTitle: () => fun.geT(".title>h1"), css: "#maincont>div:not(#FullPictureLoadImgBox),dl:nth-child(n+1):nth-child(-n+2){display:none!important}", category: "nsfw1" }, { name: "MEITU131", host: ["www.meitu131.net", "m.meitu131.net"], link: "https://www.meitu131.net/nvshen/,https://www.meitu131.net/jigou/", reg: /(www|m)\.meitu131\.(com|net)\/(\w+\/)?meinv\/\d+\//, imgs: () => { let max = fun.geT("a[title],.uk-page>span").match(/\/(\d+)/)[1]; let links = []; let url = siteUrl.replace(/index(\w+)?\.html$/, ""); for (let i = 1; i <= max; i++) { i == 1 ? links.push(url + "index.html") : links.push(url + "index_" + i + ".html"); } return fun.getImgA(".work-content img,.uk-article-bd img", links, 333); //return fun.getImg(".work-content img,.uk-article-bd img", max, 15); }, button: [4], insertImg: [".work-content>p,.uk-article-bd", 1], customTitle: () => fun.geT(".contitle-box>h1,h1.uk-article-title"), css: ".appbox,.uk-page~section{display:none!important}.work-content img{max-width:100%!important}", category: "nsfw1" }, { name: "牛图114图库", host: ["www.niutu114.com"], reg: /^http:\/\/www\.niutu114\.com\/\w+\/\w+\/\d+\/\d+\.html/i, imgs: () => fun.getImg(".work-content img", fun.geT("//a[text()='下一页']", 2) || 1, 9), button: [4], insertImg: [".work-content", 2], customTitle: () => fun.geT(".contitle-box>h1"), css: ".work-content img{max-width:100%!important}", category: "nsfw1" }, { name: "晴空头像图库", host: ["www.qq7k.com"], reg: /www\.qq7k\.com\/\w+\/\w+\/\d+.html/i, init: () => { let a = fun.ge(".content a"); a.outerHTML = a.innerHTML; }, imgs: () => { let max = parseInt(qingtiancms_Details.Total, 10); return max > 1 ? fun.getImg(".content img", max, 9) : [...fun.gae(".content img")]; }, button: [4], insertImg: [".content", 1], autoDownload: [0], next: "//a[text()='上一篇']", prev: 1, customTitle: () => fun.geT(".contitle-box>h1"), css: ".content img{cursor:unset!important;margin:0px auto!important;border:none!important}", category: "nsfw1" }, { name: "晴空头像图库M", host: ["m.qq7k.com"], reg: /m\.qq7k\.com\/\w+\/\w+\/\d+.html/i, init: () => { let a = fun.ge(".show-simg a"); a.outerHTML = a.innerHTML; }, imgs: async () => { await fun.getNP(".show-simg img", "#playnext[href*=_]", null, ".show-pages", 0, null, 0); return [...fun.gae(".show-simg img")]; }, button: [4], insertImg: [".show-simg", 1], autoDownload: [0], next: "#playpre", prev: 1, customTitle: () => fun.geT(".m-article>h1"), css: "#bigImg{margin:0px!important}", category: "nsfw1" }, { name: "930图片网 有分頁", host: ["www.930tu.com", "m.930tu.com"], reg: /(www|m)\.930tu\.com\/\w+\/\w+\/\d+.html$/i, include: ".page a,a[title=Page]", init: () => { let a = fun.ge(".pic-main a,.pic-m a"); a.outerHTML = a.innerHTML; }, imgs: () => { let max = fun.ge("//a[text()='尾页']").href.match(/_(\d+)/)[1]; return fun.getImg(".pic-main img,.pic-m img", max, 9); }, button: [4], insertImg: [".pic-main,.pic-m", 1], autoDownload: [0], next: "//a[@class='pic-next']|//a[text()='下一组图']", prev: "//a[@class='pic-prew']|//a[text()='上一组图']", customTitle: () => fun.geT(".pic h1,.tit-m h1"), css: ".pic .pic-main img{max-width:100%!important}", category: "nsfw1" }, { name: "930图片网 無分頁", host: ["www.930tu.com", "m.930tu.com"], reg: /(www|m)\.930tu\.com\/\w+\/\w+\/\d+.html$/i, include: "//p[img]", imgs: ".pic-main img,.pic-m img", button: [4], insertImg: [ ["//p[img]", 1, "//p[img]"], 1 ], autoDownload: [0], next: "//a[@class='pic-next']|//a[text()='下一组图']", prev: "//a[@class='pic-prew']|//a[text()='上一组图']", customTitle: () => fun.geT(".pic h1,.tit-m h1"), css: ".pic .pic-main img{max-width:100%!important}", category: "nsfw1" }, { name: "唯一图库", host: ["www.mmonly.cc", "m.mmonly.cc"], reg: /^https?:\/\/(www|m)\.mmonly\.cc\/\w+\/\w+\/\d+\.html$/i, init: "$(document).off();", imgs: () => { let max; try { max = fun.geT(".pages a,.article_page a").match(/\d+/)[0]; } catch (e) { max = 1; } return fun.getImg(".big-pic img,#ArticleBox img", max, 9); }, button: [4], insertImg: [".big-pic,#ArticleBox", 2], customTitle: () => fun.geT(".imgtitle>h1,.PsBox").replace(/\(\d+\/\d+\)/, "").trim(), category: "nsfw1" }, { name: "和邪社", host: ["www.hexieshe.cn"], reg: /^https?:\/\/www\.hexieshe\.cn\/\d+\/$/i, init: async () => { await fun.getNP("#content-innerText>p", "span.current+a", null, ".post-links"); }, imgs: "#content-innerText img", customTitle: () => fun.geT(".entry-title").replace("为您朗读", "").trim(), category: "nsfw1" }, { name: "天极图片", host: ["pic.yesky.com"], reg: /^https?:\/\/pic\.yesky\.com\/\d+\/\d+\.shtml$/i, init: () => { fun.ge(".bigPic").outerHTML = '<div class="imgBox"></div>'; }, imgs: () => { thumbnailsSrcArray = [...fun.gae(".previewPic img")].map(e => e.src); return thumbnailsSrcArray.map(e => e.replace(/d-|\/180x320/g, "")); }, button: [4], insertImg: [".imgBox", 2], customTitle: () => fun.geT("h1"), css: ".atlasSwiper .floatR,.atlasSwiper .floatR .previewPic{width:unset!important}", category: "nsfw1" }, { name: "天极图片M", host: ["wap.yesky.com"], reg: /^https?:\/\/wap\.yesky\.com\/pic\/\d+\/\d+\.shtml$/i, init: () => { globalImgArray = [...fun.gae("[data-imgid] img")]; fun.ge(".swiper-container").outerHTML = '<div class="imgBox"></div>'; }, imgs: () => globalImgArray, button: [4], insertImg: [".imgBox", 2], customTitle: () => fun.geT(".atlas_introduce h1"), css: "[class^=ad]{display:none!important;}", category: "nsfw1" }, { name: "爱美女", host: ["www.2meinv.com"], reg: /www\.2meinv\.com\/article.+\.html/, imgs: () => { let max = fun.geT(".des>h1,.post_title_topimg").match(/\/\s?(\d+)/)[1]; let links = fun.arr(max).map((_, i) => siteUrl.replace(/\.html$/, "") + "-" + (i + 1) + ".html"); return fun.getImgA(".pp.hh img[alt],#image_div img", links, 200); }, button: [4], insertImg: [".pp.hh,.content", 1], autoDownload: [0], next: "//a[@class='active' and contains(text(),'下一篇')] | //a[@class='active' and contains(text(),'下一组')]", prev: "//a[@class='active' and contains(text(),'上一篇')] | //a[@class='active' and contains(text(),'上一组')]", css: ".pp img{max-width:100%!important}", customTitle: () => fun.title("_", 1), category: "nsfw1" }, { name: "爱美女M", host: ["mm.2meinv.com"], reg: /mm\.2meinv\.com\/article-\d+\.html/, imgs: () => { let max = fun.geT(".article-page>*:last-child", 2); let links = fun.arr(max).map((_, i) => siteUrl.replace(/\.html$/, "") + "-" + (i + 1) + ".html"); return fun.getImgA(".arcmain img,#image_div img", links, 200); }, button: [4], insertImg: [".clearfix.arcmain,.content", 1], autoDownload: [0], next: "a.f-r.l3", prev: "a.f-l.l2", css: "body>a{display:none!important}", customTitle: () => fun.title("_", 1), category: "nsfw1" }, { name: "绅士猫", host: "www.cos6.net", reg: /www\.cos6\.net\/\d+\.html/, exclude: ".tinymce-hide,.hidden-box", imgs: ".wp-posts-content img[data-src]", button: [4], insertImg: [".bialty-container", 2], autoDownload: [0], next: ".article-nav>div:first-child>a[href$=html]", prev: ".article-nav>div:last-child>a[href$=html]", customTitle: () => fun.geT("h1.article-title"), category: "nsfw1" }, { name: "泡泡", host: "paopoi.com", reg: /^https?:\/\/paopoi\.com\/\d+\.html/, imgs: ".article-content img", button: [4], insertImg: [ ["//p[img]", 2, "//p[img] | //div[@class='read-more']"], 2 ], customTitle: () => fun.geT(".article-title"), css: "div[data-nav=posts][style]{max-height:unset !important}", category: "nsfw1" }, { name: "涩涩乐园", host: "sesew.top", reg: /^https?:\/\/sesew\.top\/\w+\.html/i, imgs: ".wp-posts-content img[data-src]", button: [4], insertImg: [".wp-posts-content", 2], autoDownload: [0], next: ".article-nav>div:first-child>a[href$=html]", prev: ".article-nav>div:last-child>a[href$=html]", customTitle: () => fun.geT("h1.article-title"), category: "nsfw1" }, { name: "男人之家", host: "nanrenhome.cc", reg: /^https?:\/\/nanrenhome\.cc\/\d+\.html/i, include: "//a[@rel='category tag'][text()='福利美图']", imgs: () => { let pag = fun.ge(".article-paging a[href]"); return pag ? fun.getImgA(".article-content img", ".article-paging a[href]") : [...fun.gae(".article-content img")]; }, button: [4], insertImg: [ ["//article/p[img]", 2, "//article/p[img] | //div[@class='article-paging']"], 2 ], customTitle: () => fun.geT(".article-title"), category: "nsfw1" }, { name: "男人社区", host: "xxk222.com", link: "https://xxk222.com/arttype/meinv.html", reg: /^https?:\/\/xxk222\.com\/artdetail\/\w+\.html/i, include: "//strong[text()='美女美图']", imgs: async () => { await fun.getNP(".single-video-info-content>p,.single-video-info-content>img", ".pagination li.active+li>a", null, ".pagination"); return [...fun.gae(".single-video-info-content img")]; }, button: [4], insertImg: [".single-video-info-content", 2], customTitle: () => fun.geT(".single-video-title a").replace(/\[\d+p\]/i, ""), category: "nsfw2" }, { name: "RedBust redbust.com", reg: /redbust\.com\/[^\/]+\/$/, include: ".entry-inner img", imgs: () => { thumbnailsSrcArray = [...fun.gae(".entry-inner img")].map(e => e.src); //return fun.getImgA(".image-attachment img", ".gallery a"); return [...fun.gae(".entry-inner img")].map(img => { let srcset = img.getAttribute("srcset"); if (srcset) { let splitArr = srcset.split(","); splitArr = splitArr.sort((a, b) => { return a.match(/\s(\d+)w/)[1] - b.match(/\s(\d+)w/)[1]; }); return splitArr.pop().trim().split(" ")[0]; } else { return img.src.replace(/-\d+x\d+\./, "."); } }); }, button: [4], insertImg: [".entry-inner", 2], autoDownload: [0], next: ".previous>a", prev: ".next>a", customTitle: () => fun.geT("h1.post-title"), category: "nsfw2" }, { name: "妞妞之家", host: ["niuniuhome.club"], reg: /^https?:\/\/niuniuhome\.club\/[^\/]+\/$|^https?:\/\/niuniuhome\.club\/\?p=\d+$/, imgs: ".entry-content img", button: [4], insertImg: [".post-content", 2], autoDownload: [0], next: "a.post-nav-prev", prev: "a.post-nav-next", customTitle: () => fun.geT(".post-title").replace(/\(\d+P\)/i, ""), css: ".post-inner{width:98%!important;max-width:98%!important;padding:0!important}", category: "nsfw1" }, { name: "妞妞之家 分類自動翻頁", enable: 1, reg: /^^https?:\/\/niuniuhome\.club\/(\?paged=\d+|\?cat=\d+)?$/, autoPager: { mode: 1, waitEle: "#posts[style]", ele: "#posts", observer: "#posts", next: "a.archive-nav-older.fleft", re: ".archive-nav", title: () => "Page " + nextLink.match(/\d+$/)[0], history: 1 }, openInNewTab: ".post-container a:not([target=_blank])", css: ".post-container{opacity:1 !important}", category: "autoPager" }, { name: "PixiBB", host: ["www.pixibb.com"], reg: /^https?:\/\/www\.pixibb\.com\/$|^https?:\/\/www\.pixibb\.com\/\?list=/, openInNewTab: ".list-item-image a", category: "none" }, { name: "PixiBB", host: ["www.pixibb.com"], reg: /^https?:\/\/www\.pixibb\.com\/album\//, imgs: async () => { await fun.getNP("#list-most-recent>.pad-content-listing", ".pagination-next>a"); try { thumbnailsSrcArray = [...fun.gae(".list-item-image img")].map(e => e.src.replace(/(-\d+)-1(\.md\.\w+)$/i, "$1$2")).sort((a, b) => a.match(/-(\d+)\.md\./)[1] - b.match(/-(\d+)\.md\./)[1]); } catch (e) { thumbnailsSrcArray = [...fun.gae(".list-item-image img")].map(e => e.src).sort(); } return thumbnailsSrcArray.map(e => e.replace(".md.", ".")); }, button: [4], insertImg: ["#list-most-recent", 2], topButton: true, customTitle: () => fun.title(" - PixiBB", 1), category: "nsfw1" }, { name: "Luscious", host: ["www.luscious.net", "luscious.net"], reg: /^https?:\/\/(www\.)?luscious\.net\/albums\//, imgs: async () => { fun.showMsg(displayLanguage.str_05, 0); const getApiUrl = ((id, page) => `https://apicdn.luscious.net/graphql/nobatch/?operationName=PictureListInsideAlbum&query=%20query%20PictureListInsideAlbum(%24input%3A%20PictureListInput!)%20%7B%20picture%20%7B%20list(input%3A%20%24input)%20%7B%20info%20%7B%20...FacetCollectionInfo%20%7D%20items%20%7B%20__typename%20id%20title%20description%20created%20like_status%20number_of_comments%20number_of_favorites%20moderation_status%20width%20height%20resolution%20aspect_ratio%20url_to_original%20url_to_video%20is_animated%20position%20permissions%20url%20tags%20%7B%20category%20text%20url%20%7D%20thumbnails%20%7B%20width%20height%20size%20url%20%7D%20%7D%20%7D%20%7D%20%7D%20fragment%20FacetCollectionInfo%20on%20FacetCollectionInfo%20%7B%20page%20has_next_page%20has_previous_page%20total_items%20total_pages%20items_per_page%20url_complete%20%7D%20&variables={"input":{"filters":[{"name":"album_id","value":"${id}"}],"display":"position","items_per_page":50,"page":${page}}}`); let id = parseInt(new URL(fun.ge("a[href*='/read/'],.album-heading a").href).pathname.split("/")[2].match(/\d+$/)[0], 10); let max = await fetch(getApiUrl(id, 1)).then(res => res.json()).then(json => json.data.picture.list.info.total_pages); let fetchNum = 0; let resArr = fun.arr(max).map((_, i) => { let url = getApiUrl(id, (i + 1)); return fetch(url).then(res => { fun.showMsg(`${displayLanguage.str_06}${fetchNum+=1}/${max}`, 0); return res.json(); }).then(json => json.data.picture.list.items.map(e => { return e.url_to_video ? { video: e.url_to_video } : { original: e.url_to_original, thumbnail: e.thumbnails.pop().url } })); }); return Promise.all(resArr).then(data => { fun.hideMsg(); videosSrcArray = data.flat().filter(item => item.video).map(e => e.video); thumbnailsSrcArray = data.flat().filter(item => item.thumbnail).map(e => e.thumbnail); return data.flat().filter(item => item.original).map(e => e.original); }); }, button: [4], insertImg: ["article.o-padding-top-bottom,.picture-frame-wrapper", 3], downloadVideo: true, customTitle: () => fun.geT(".album-heading:not(.o-padding-sides),.album-heading.o-padding-sides a"), observerTitle: true, css: "body.o-modal-no-scroll{overflow:unset!important}#modal-root{display:none!important;}", category: "hcomic" }, { name: "E次元", host: ["www.evacg.org"], reg: /www\.evacg\.org\/archives\/\d+/, include: ".wp-caption img", imgs: ".wp-caption img", button: [4], insertImg: [ [".inn-singular__post__body__content", 0, ".wp-caption"], 2 ], customTitle: () => fun.geT(".inn-singular__post__title"), category: "nsfw1" }, { name: "次元岛", host: ["ciyuandao.com"], reg: /^https?:\/\/ciyuandao\.com\/photo\/show\/\d+/, imgs: ".talk_pic img", button: [4], insertImg: [".talk_pic", 2], customTitle: () => fun.geT("h1"), category: "nsfw1" }, { name: "萌次元", host: ["www.mtutuu.com"], reg: /^https?:\/\/www\.mtutuu\.com\/\d+\.html/, exclude: ".content-cap", imgs: ".entry-content img", button: [4], insertImg: [ ["//div[@class='entry-content']/p[img]", 2, "//div[@class='entry-content']/p[img]"], 2 ], customTitle: () => fun.geT(".post-style-3-title"), category: "nsfw1" }, { name: "次元小镇", host: ["dimtown.com"], reg: /^https?:\/\/dimtown\.com\/\d+\.html/, exclude: ".down-login", imgs: "#content img", button: [4], insertImg: [ ["//p[img]", 2, "//p[img]/img[@decoding] | //p[img]/img[@decoding]/following-sibling::br"], 2 ], autoDownload: [0], next: ".post-pre a", prev: ".post-next a", customTitle: () => fun.geT("h1"), category: "nsfw1" }, { name: "3楼猫图库", host: ["pic.3loumao.org"], reg: /pic\.3loumao\.org\/[a-z-]+\/\d+\.html/i, imgs: "article img", button: [4], insertImg: ["//p[img]", 2], customTitle: () => fun.geT("h1"), fancybox: { v: 3, insertLibrarys: 1 }, category: "nsfw1" }, { name: "Simply Cosplay", host: ["www.simply-cosplay.com"], reg: /www\.simply-cosplay\.com\/gallery\//, imgs: async () => { fun.showMsg(displayLanguage.str_04, 0); await fun.waitEle(".swipe-area img", 600); fun.hideMsg(); return [...fun.gae(".swiper-slide img")].map(e => e.dataset.src.replace("small_square_", "")); }, button: [4], insertImg: ["//div[div[div[div[@class='image-wrapper']]]]", 2], customTitle: async () => { await fun.waitEle("h1.content-headline", 600); return fun.geT("h1.content-headline"); }, fetch: 1, css: ".gallery-view .row{display:block}", category: "nsfw1" }, { name: "Cosplay Porn", host: ["cosplayporn.online"], link: "https://cosplayporn.online/category/cosplay/", reg: /^https?:\/\/cosplayporn\.online\/\w+\/[^\/]+\/$/, include: ".video-description img", exclude: ".responsive-player", imgs: ".video-description img", button: [4], insertImg: [".video-description", 2], customTitle: () => fun.geT(".entry-title"), category: "nsfw1" }, { name: "COSPLAY ZIP", host: ["www.coszip.com", "coszip.com"], reg: /^https?:\/\/(www\.)?coszip\.com\/\d+\.html(#small-1)?$/, init: () => { if (/#small-1/.test(location.href)) location.href = location.href.replace("#small-1", ""); }, imgs: () => { let max; try { max = fun.geT(".page_info").match(/\d+$/)[0]; } catch (e) { max = 1; } return fun.getImg(".entry-content img", max, 7); }, button: [4], insertImg: [ [".entry-content", 0, "//p[img[@decoding]] | //figure[@class='wp-block-image'] | //div[contains(@class,'jeg_pagelinks')]"], 2 ], go: 1, autoDownload: [0], next: "a.prev-post", prev: "a.next-post", customTitle: () => fun.geT("h1.jeg_post_title"), css: "pre{white-space:pre-wrap!important}", category: "nsfw2" }, { name: "COSPLAY ZIP M", host: ["www.coszip.com", "coszip.com"], reg: /^https?:\/\/(www\.)?coszip\.com\/\d+\.html\?amp=1$/, imgs: ".amp-wp-article-content amp-img", button: [4], insertImg: [ [".amp-wp-article-content", 0, "//p[amp-img] | //figure[@class='wp-block-image']"], 2 ], go: 1, customTitle: () => fun.geT(".amp-wp-title"), css: "pre{white-space:pre-wrap!important}", category: "nsfw2" }, { name: "萝莉少女", host: ["cosporn.online"], reg: /cosporn\.online\/.+\//, init: "setTimeout(()=>{fun.gae('.g1-nav-single a').forEach(e=>{e.removeAttribute('target')})},2000)", include: ".g1-content-narrow", imgs: () => { thumbnailsSrcArray = [...fun.gae(".g1-content-narrow img:not([id])")].map(e => e.dataset.lazySrc ?? e.src); return thumbnailsSrcArray.map(e => e.replace(/\?w=\d+&ssl=1/, "")); }, button: [4], insertImg: [".g1-content-narrow", 2], autoDownload: [0], next: "#content .g1-teaser-prev", prev: "#content .g1-teaser-next", customTitle: () => fun.geT("h1.entry-title"), css: "#simple-banner,.touchy-wrapper,.touchy-wrapper~*:not([id^='pv-']):not([class^='pv-']):not(.pagetual_tipsWords):not(#comicRead):not(#fab):not(.FullPictureLoadMsg):not(.FullPictureLoadFixedBtn):not(#FullPictureLoadOptions):not(*[class^=fancybox]),.code-block,#secondary{display:none!important}", category: "hcomic" }, { name: "女神社", host: ["nshens.com", "inewgirl.com"], reg: /(nshens\.com|inewgirl\.com)\/\d+\/\d+\/\d+\/[^/]+$/, exclude: ".justify-center>button>.v-btn__content", delay: 800, imgs: async () => { fun.showMsg(displayLanguage.str_05, 0); let max = fun.geT(".v-pagination li:last-child", 2); let links = fun.arr(max).map((_, i) => siteUrl + "/" + (i + 1)); let fetchNum = 0; let resArr = links.map((url, i, arr) => { return fun.fetchDoc(url).then(doc => { fun.showMsg(`${displayLanguage.str_06}${fetchNum+=1}/${arr.length}`, 0); let code = [...doc.scripts].find(s => s.innerHTML.search(/photoList/) > -1).innerHTML; return fun.run(code.match(/photoList:([^\]]+\])/)[1]); }); }); let photourl = await Promise.all(resArr).then(data => { fun.hideMsg(); return data.flat().map(e => e.photourl); }); if (photourl.length > [...new Set(photourl)].length) { setTimeout(() => { fun.showMsg("VIP套圖需升級為VIP", 5000); }, 1200) } return photourl; }, button: [4], insertImg: ["//div[a[div[@class='v-image v-responsive theme--light']]]", 2], customTitle: () => fun.geT("h3"), category: "nsfw2" }, { name: "女神社", host: ["nshens.com", "inewgirl.com", "lovens.cc"], reg: /(nshens\.com|inewgirl\.com)\/latestpost$/, delay: 500, observerClick: "//button[span[text()='加載更多'] or span[text()='加载更多'] or span[text()='Load More'] or span[text()='Tải thêm']]", category: "autoPager" }, { name: "Chottie", //很多都需要VIP,不然只會重複抓到第一頁的圖片 host: ["chottie.com"], reg: /chottie\.com\/blog\/(\w{2}\/)?archives\/\d+$/, exclude: ".justify-center>button>.v-btn__content", delay: 800, imgs: async () => { fun.showMsg(displayLanguage.str_05, 0); let max = fun.geT(".v-pagination li:last-child", 2); let links = fun.arr(max).map((_, i) => siteUrl + "/" + (i + 1)); let fetchNum = 0; let resArr = links.map((url, i, arr) => { return fun.fetchDoc(url).then(doc => { fun.showMsg(`${displayLanguage.str_06}${fetchNum+=1}/${arr.length}`, 0); let code, imgs; try { code = [...doc.scripts].find(s => s.innerHTML.search(/imgList/) > -1).innerHTML; imgs = fun.run(code.match(/imgList:([^\]]+\])/)[1]); } catch (e) { code = [...doc.scripts].find(s => s.innerHTML.search(/snapshotList/) > -1).innerHTML; imgs = fun.run(code.match(/snapshotList:([^\]]+\])/)[1]); } return imgs; }); }); let data = await Promise.all(resArr).then(data => { fun.hideMsg(); return data.flat(); }); if (data.length > [...new Set(data)].length) { setTimeout(() => { fun.showMsg("VIP套圖需升級為VIP", 5000); }, 1200) } return data; }, button: [4], insertImg: ["//div[a[div[@class='v-image v-responsive theme--light']]]", 2], //css: ".text-center{display:none!important}", customTitle: () => fun.geT("h3"), category: "nsfw2" }, { name: "街角图片社", host: ["ijjiao.com"], reg: /^https?:\/\/ijjiao\.com\/\d+\/\d+\/\d+\/album/, include: ".v-pagination", exclude: "//span[text()='加载更多']", delay: 800, imgs: async () => { let max = fun.geT("//li[button[@aria-label='Next page']]", 2); let url = siteUrl.replace(/\/\d+$/, ""); let links = fun.arr(max).map((_, i) => url + "/" + (i + 1)); fun.showMsg(displayLanguage.str_07, 0); let check = await fun.fetchDoc(links[1]).then(doc => { let code = [...doc.scripts].find(s => s.innerHTML.search(/photoList/) > -1).innerHTML; let photoList = fun.run(code.match(/photoList:([^\]]+\])/)[1]); return photoList.length < 1 ? false : true; }); if (check) { fun.showMsg(displayLanguage.str_05, 0); let fetchNum = 0; let resArr = links.map((url, i, arr) => { return fun.fetchDoc(url).then(doc => { fun.showMsg(`${displayLanguage.str_06}${fetchNum+=1}/${arr.length}`, 0); let code = [...doc.scripts].find(s => s.innerHTML.search(/photoList/) > -1).innerHTML; let photoList = fun.run(code.match(/photoList:([^\]]+\])/)[1]); return photoList; }); }); return Promise.all(resArr).then(data => { fun.hideMsg(); return data.flat().map(e => e.photourl); }); } else { fun.hideMsg(); alert("登錄狀態已失效!請手動點擊第2頁,觸發密碼輸入框重新登錄。"); return []; } }, button: [4], insertImg: ["//div[div[@class='image-item']]", 2], customTitle: () => fun.geT("h3"), category: "nsfw1" }, { name: "美妹妹", host: ["www.meimeimei.org"], reg: /www\.meimeimei\.org\/\d+\/\d+\/$|www\.meimeimei\.org\/\d+\/\d+\/\d+\.html/, imgs: () => { let max = fun.geT(".chapterpage>a:last-child", 2); let links = []; if (/\.html/.test(siteUrl)) { let url = fun.ge(".pageCurr").href.replace("_1.html", ""); links = fun.arr(max).map((_, i) => url + "_" + (i + 1) + ".html"); } else { let url = fun.ge(".pageCurr").href.replace("1.html", ""); links = fun.arr(max).map((_, i) => url + (i + 1) + ".html"); } return fun.getImgA(".img>img", links, 100); }, button: [4], insertImg: [".txt_tcontent", 1], autoDownload: [0], next: "//div[contains(text(),'上一篇')]/a[not(@href='#')]", prev: "//div[contains(text(),'下一篇')]/a[not(@href='#')]", customTitle: () => fun.geT(".bread>li:last-child>a"), category: "nsfw1" }, { name: "tu928美女写真网", host: ["tu928.com"], reg: /^https?:\/\/tu928\.com\/\d+\.html/, imgs: () => fun.getImgA(".wp-block-image img", ".page-links>a", 300), button: [4], insertImg: [ [".post-item-metadata", 1, ".wp-block-image"], 2 ], autoDownload: [0], next: ".nav-previous>a", prev: ".nav-next>a", customTitle: () => fun.geT(".entry-title"), css: "#af-preloader{display:none!important;}", category: "nsfw1" }, { name: "爱死美女图片站", host: ["www.24tupian.org"], reg: /^https?:\/\/www\.24tupian\.org\/\w+\/\d+\/\d+\/\d+\.html$/, include: "img[data-original*='imgs.diercun.com']", imgs: async () => { await new Promise(async resolve => { fun.showMsg(displayLanguage.str_08, 0); for (let i = 1; i <= 100; i++) { if (fun.ge("//div[@class='moremsg'][contains(text(),'没有更多图片了')]")) { fun.hideMsg(); resolve(); break; } let ele = fun.ge(".mores>a"); if (ele) ele.click(); await fun.delay(200); } }); /* if (options.fancybox == 1) { fun.showMsg("預覽縮圖轉DataURL中...", 0); thumbnailsSrcArray = [...fun.gae("#piclist img[data-original]")].map(e => fun.xhr(e.dataset.original, "blob").then(blob => fun.blobToDataURL(blob))); thumbnailsSrcArray = await Promise.all(thumbnailsSrcArray).then(arr => { fun.hideMsg(); return arr; }); } */ thumbnailsSrcArray = [...fun.gae("#piclist img[data-original]")].map(e => e.dataset.original); return thumbnailsSrcArray.map(e => { let arr = e.split("/"); arr[2] = arr[2].replace("imgs.diercun.com", "big.diercun.com"); arr[arr.length - 1] = arr[arr.length - 1].replace(/^m/, ""); let bigSrc = arr.join("/"); return bigSrc; }); }, button: [4], insertImg: [ [".mores", 2], 2 ], go: 1, topButton: true, threading: 12, customTitle: () => fun.geT(".gtitle1>h1"), css: "body>.mask{display:none!important}", category: "nsfw1" }, { name: "爱死cos美女图片站", host: ["www.24cos.org", "www.lovecos.net"], reg: /(www\.24cos\.org|www\.lovecos\.net)\/\w+\/\d+\.html$/, imgs: async () => { let pages = [...fun.gae(".page>a")].map(a => a.href); let liImgs = [...fun.gae(".mtp>li")]; if (pages.length > 0 && liImgs.length < 21) { await fun.getEle(pages, ".mtp>li", [".mtp", 0]); } /* if (options.fancybox == 1) { fun.showMsg("預覽縮圖轉DataURL中...", 0); thumbnailsSrcArray = [...fun.gae(".mtp img")].map(e => fun.xhr(decodeURI(e.src), "blob").then(blob => fun.blobToDataURL(blob))); thumbnailsSrcArray = await Promise.all(thumbnailsSrcArray).then(arr => { fun.hideMsg(); return arr; }); debug("\n爱死cos美女图片站 thumbnailsSrcArray", thumbnailsSrcArray) } */ thumbnailsSrcArray = [...fun.gae(".mtp img")].map(e => decodeURI(e.src)); return [...fun.gae(".mtp img")].map(e => decodeURI(e.src.replace("/m", "/"))); }, insertImg: [ [".mtp", 2], 2 ], go: 1, topButton: true, threading: 5, customTitle: () => fun.geT(".tmsg>h1"), category: "nsfw1" }, { name: "Huamao wallpaper 花猫壁纸", host: ["ja.huamaobizhi.com", "en.huamaobizhi.com"], reg: /^https?:\/\/[a-z]{2}\.huamaobizhi\.com\/mix\/\d+/, init: async () => { let load = fun.ge(".load-more-photos"); if (load) load.remove(); await fun.getNP(".images-card", "li.active+li>a", null, ".pagination"); }, imgs: async () => { thumbnailsSrcArray = [...fun.gae(".images-card img")].map(e => e.dataset.src ?? e.src); fun.clearAllTimer(2); fun.showMsg(displayLanguage.str_05, 0); let fetchNum = 0; const resBlobUrl = (id) => { return fetch(`https://${location.host}/normal-download/`, { "headers": { "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9", "content-type": "application/x-www-form-urlencoded" }, "body": `wallpaperId=${id}`, "method": "POST" }).then(res => res.blob()).then(blob => { fun.showMsg(`${displayLanguage.str_06}${fetchNum+=1}/${IDs.length}`, 0); return URL.createObjectURL(blob); }); }; let IDs = [...fun.gae("span[data-imgid]")].map(e => e.dataset.imgid); let bigImgsArr = []; for (let i = 0; i < IDs.length; i++) { bigImgsArr.push(await resBlobUrl(IDs[i])); //await fun.delay(1500, 0); } return Promise.all(bigImgsArr).then(arr => { fun.hideMsg(); return arr; });; }, ex: "jpg", button: [4], insertImg: [ ["#main", 2], 0 ], go: 1, customTitle: () => fun.geT(".title>h1"), fetch: 1, category: "nsfw1" }, { name: "Huamao wallpaper 花猫壁纸 en.huamaobizhi.com 分類自動翻頁", host: ["ja.huamaobizhi.com", "en.huamaobizhi.com"], enable: 1, reg: /^https?:\/\/[a-z]{2}\.huamaobizhi\.com\/(mixs|tags|artists|people-tags)\/\?/, autoPager: { ele: "//div[@class='row'][div[div[@class='mixs-card']]] | //div[@class='table-responsive table-sm-no-border'] | //div[div[div[@class='thumbnail']]] | //div[@class='tags-wrap']", next: ".pagination li.active+li>a", re: ".pagination", title: doc => "Page " + fun.ge(".pagination li.active", doc).innerText, bF: doc => { [...fun.gae(".mixs-card-img:not(.lock)", doc)].forEach(e => { let url = e.attributes[1].value.replaceAll("'", ""); e.outerHTML = `<div class="mixs-card-img" data-src="${url}" lazy="loaded" style="background-image: url("${url}");"></div>`; }); [...fun.gae(".thumbnail .img-circle[v-lazy]", doc)].forEach(e => { let url = e.getAttribute("v-lazy").replaceAll("'", ""); e.outerHTML = `<img src="${url}" alt="${e.alt}" class="img-circle" data-src="${url}" lazy="loaded">`; }); [...fun.gae(".tags-item img[v-lazy]", doc)].forEach(e => { let url = e.getAttribute("v-lazy").replaceAll("'", ""); e.outerHTML = `<img src="${url}" alt="${e.alt}" data-src="${url}" lazy="loaded">`; }); } }, openInNewTab: ".mixs-card-content>a:not([target=_blank])", category: "autoPager" }, { name: "云边网盘", host: ["qinzhi.top"], reg: /^https?:\/\/qinzhi\.top\/[^\/]+\/[^\/]+\/.+$/, init: async () => { await fun.waitEle("div.list"); let div = document.createElement("div"); div.className = "imgBox"; let x = fun.ge(".body"); x.appendChild(div); }, imgs: async () => { let paths = [...document.querySelectorAll("a.list-item")].map(a => decodeURI(a.getAttribute("href"))).map(href => /\.jpe?g$|\.png$/i.test(href) ? href : null).filter(item => item); fun.showMsg(displayLanguage.str_05, 0); let fetchNum = 0; let resArr = paths.map((path, i, arr) => { return fetch("/api/fs/get", { "headers": { "accept": "application/json, text/plain, */*", "content-type": "application/json;charset=UTF-8" }, "body": `{\"path\":\"${path}\",\"password\":\"\"}`, "method": "POST" }).then(res => res.json()).then(json => { fun.showMsg(`${displayLanguage.str_06}${fetchNum+=1}/${arr.length}`, 0); return json.code == 200 ? decodeURI(json.data.raw_url) : null; }); }); return Promise.all(resArr).then(arr => { fun.hideMsg(); return arr; }); }, repeat: 1, button: [4], insertImg: [".imgBox", 3], go: 1, observerTitle: true, customTitle: () => fun.title(" | 云边网盘").replace(/\s?\d+p\s?/i, ""), category: "nsfw1" }, { name: "新美图录/臺灣美腿女郎", host: ["www.xinmeitulu.com", "www.twlegs.com"], reg: /(www\.xinmeitulu\.com|www\.twlegs\.com)\/photo\/.+/, imgs: "img[data-original]", button: [4], insertImg: [".text-center", 2], customTitle: () => fun.geT("h1.h3"), category: "nsfw1" }, { name: "美图录", host: ["meitulu.me"], reg: /meitulu\.me\/item\/\d+\.html/, imgs: () => fun.getImg(".mb-4>img[alt]", fun.geT(".pagination>li:last-child", 2), 9), button: [4], insertImg: [".mb-4", 1], customTitle: () => fun.geT(".top-title"), category: "nsfw1" }, { name: "爱图集谷", host: ["www.tujigu.top"], reg: /^https?:\/\/www\.tujigu\.top\/photo\//, imgs: ".entry-body img", button: [4], insertImg: [".entry-body", 2], customTitle: () => fun.geT(".entry-title"), category: "nsfw1" }, { name: "jk-coser", host: ["www.jk-coser.com"], reg: /www.\jk-coser\.com\/m\d\/\d+\.html/, imgs: ".image_div img", button: [4], insertImg: [".image_div", 2], autoDownload: [0], next: ".article-nav-prev a,.nav-links .next", prev: 1, customTitle: () => fun.geT(".item_title>h1").replace(/\/?\(\d+P\)/i, "").trim(), css: ".content_left img{cursor:unset!important;}", category: "nsfw1" }, { name: "秀窝/RMM吧/赞MM/恩图集/美Girl图集", host: ["www.xiuwo.net", "rmm8.com", "www.zanmm.com", "www.entuji.com", "www.mhgirl.com"], reg: /(www\.xiuwo\.net|rmm8\.com|www\.mhgirl\.com)\/tu([\w]+)?\/\d+\.html|www\.zanmm\.com\/tupian\/\d+\.html|www\.entuji\.com\/\w+\/\d+\.html/, imgs: () => { let max = fun.geT("//p[contains(text(),'图片数量')]").match(/\d+/)[0]; return fun.getImg("#showimg img", max, 9); }, button: [4], insertImg: ["#showimg", 2], customTitle: () => fun.geT(".weizhi h1"), css: "@media only screen and (max-width:3840px){.content img{max-width:100%!important}}", category: "nsfw1" }, { name: "妹妹图", host: ["mm.tvv.tw"], reg: /mm\.tvv\.tw\/archives\/\d+\.html/, imgs: ".img-responsive", button: [4], insertImg: ["//p[img]", 2], customTitle: () => fun.geT(".blog-details-headline"), category: "nsfw1" }, { name: "小姐姐", host: ["www.nvsheng.cc"], reg: /nvsheng\.cc\/\w+\/\d+\.html/, imgs: () => fun.getImg(".info-imtg-box>img[alt]", fun.geT(".pagebar>*:last-child", 3)), button: [4], insertImg: [".info-imtg-box", 1], autoDownload: [0], next: "//a[p[text()='上一篇']]", prev: "//a[p[text()='下一篇']]", customTitle: () => fun.title("-", 1), //threading: 4, category: "nsfw1" }, { name: "洛秀网", host: ["loxiu.com"], reg: /loxiu\.com\/post\/\d+\.html/, imgs: () => fun.getImg(".info-imtg-box>img[alt]", fun.geT(".pagebar>*:last-child", 3)), button: [4], insertImg: [".info-imtg-box", 1], autoDownload: [0], next: "//a[p[text()='上一篇']]", prev: "//a[p[text()='下一篇']]", customTitle: () => fun.geT(".info-title>h1"), category: "nsfw1" }, { name: "女神网", host: ["m888.top"], reg: /^https?:\/\/m888\.top\/\w+\/\d+\.html/, imgs: () => { let max; try { max = fun.ge("//a[text()='尾页']").href.match(/(\d+)\.html$/)[1]; } catch (e) { max = 1; } return fun.getImg(".entry-content img", max, 9); }, button: [4], insertImg: [".entry-content", 1], autoDownload: [0], next: ".article-nav-prev a", prev: ".article-nav-next a", customTitle: () => fun.geT(".entry-title").replace(/\d+p/i, ""), category: "nsfw1" }, { name: "遛无写真/KP写真/美女云图网/tck天天番号/4tck番号库/5tck天天番号/6K美女/7tck番号网/1凸5宅男福利/有脾气美图/极品番号社/过热E宅男天堂/杰瑞宅男频道/宅男番号库/54k5宅男必备/0niz宅男频道/7k1a番号库", host: ["www.6evu.com", "www.6kpo.com", "www.c0h.net", "www.3tck.com", "www.4tck.com", "www.5tck.com", "www.6tck.com", "www.7tck.com", "www.1tu5.com", "www.wsqap.com", "www.gr2e.com", "www.joerei.com", "www.game1313.net", "www.54k5.com", "www.0niz.com", "www.7k1a.com"], reg: /^https?:\/\/www\.(6evu|6kpo|c0h|\dtck|1tu5|wsqap|gr2e|joerei|game1313|54k5|0niz|7k1a)\.(com|net)\/\d+\.html/, exclude: "//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: () => fun.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: () => fun.geT("h1").replace(/\(\d+P\)/i, "").replace(/无删减写真大图流出|无圣光壁纸图片良心推荐|无圣光绝版网图传疯了|无水印私房照片收藏合集|高品质壁纸图片传疯了|高品质壁纸图片珍藏版|无圣光壁纸图片免费在线|无圣光私房写真良心推荐|超高清私家拍摄作品珍藏版|超高清私房照片在线浏览|无圣光写真作品流出|无水印壁纸图片良心推荐|无水印绝版网图在线浏览|无水印私房照片珍藏版|无水印私房照片个人分享/g, "").trim(), css: ".article_container{padding:10px 0px!important}#post_content{padding:0px!important}@media only screen and (max-width:640px){.container{max-width:100% !important}}", category: "nsfw1" }, { name: "出物社区写真网", host: ["www.ywsq.cc"], reg: /^https?:\/\/www\.ywsq\.cc\/[^\/]+\/[^.]+\.html$/, imgs: () => fun.getImgA("#post_content img", ".pagelist a"), button: [4], insertImg: ["#post_content", 2], autoDownload: [0], next: ".post-previous a", prev: ".post-next a", customTitle: () => fun.geT(".article_container>h1").replace(/\(\d+P\)|\d+P$/i, "").trim(), css: ".article_container{padding:10px 0px!important}#post_content{padding:0px!important}@media only screen and (max-width:640px){.container{max-width:100% !important}}", category: "nsfw1" }, { name: "原创妹子图/尤物私房图/极品美女图/免费私房图/私房网红图/尤物妹妹图", host: ["www.ycmzt.com", "www.ywsft.com", "www.jpmnt.com", "www.mfsft.com", "www.sfwht.com", "www.ywmmt.com"], reg: /www\.(ywmmt|mnwht|ycmeinv|yhsft|yhmnt|mfsft|jpsft|akxzt|flwht|threnti|ywnmt|ztmeinv|mstaotu|tstaotu|ywmtw|mgtaotu|prmzt|xrtaotu|jjtaotu|prmeinv|axtaotu|mgmeinv|xsmeinv|ugtaotu|msmeinv|flxzw|axmeinv|swtaotu|hjtaotu|nsxzw|ugmeinv|hytaotu|xrmeinv|zfmeinv|jpmnt|zttaotu|mfmzt|ykmeinv|qjtaotu|pmtaotu|ddtaotu|plxzw|mfxzt|mtgqt|fltuku|yhtuku|ycmeitu|mttuku|xhtuku|qjtuku|jpflt|ycwht|yctuk|akywt|ywtuk|jctuk|xstuk|xgtuk|mztuk|xztuk|sytuk|gcxzt|tsxzt|gqxzt|mfnmt|spxzt|yhxzt|mtxzt|nsxzt|jdxzt|spmeitu|jpmzw|yhmeitu|mzmeitu|qpmzt|flsft|ywsft|wkmzt|snmzt|thmzt|brtaotu|aimzt|qtmzt|mtmnt|jrmzt|yztaotu|jrmeinv|xsmzt|zbtaotu|yhmnw|zbmzt|xjjtaotu|jpnst|ywmeitu|jrmnt|ftmeinv|xjjmzt|smtaotu|mtywt|sfsnt|jdtaotu|xgyouwu|ywmzt|xgywt|mtflt|nmtaotu|mtmnw|flmeitu|gqtaot|plmeitu|zpmzt|mtmzt|mtwht|sfwht|gqsft|yhmeinv|jdmnt|yctaotu|wkrenti|yzrenti|mtsyt|sptaotu|mttaotu|wsgtu|ywtaotu|sfmzt|sftaotu|gcmeinv|nstaotu|xhtaotu|jdwht|mtmeinv|gqwht|jpywt|jcwht|tptaotu|spyouwu|xgmeitu|nsmeitu|jstaotu|yhtaotu|sytaotu|nsxiez|swmzt|jpmzt|yhflt|sfywt|ywxzt|plmzt|sfmtw|jpyouwu|sfxzt|zftaotu|ycmzt|whtaotu|jpxzt|sftuku|plwht|symzt|sfmnt|sfnmt|jcmeinv|tsmnt|jjmeinv|wsgmzt|gqnmt)\.com\/[a-z]+\/[a-z]+\/\d+\/\d+\.html$/, include: "#picg", init: () => { [...fun.gae(".b a")].forEach(a => a.removeAttribute("target")); [...fun.gae("#picg a")].forEach(a => a.outerHTML = a.innerHTML); fun.remove("iframe", 2000); }, imgs: async () => { let max = fun.geT(".pagelist font~*:last-child", 2); let links = []; links.push(siteUrl.replace(/(_\d+)?\.html$/, "") + ".html"); let imgsArr = []; for (let i = 2; i <= max; i++) { links.push(siteUrl.replace(/(_\d+)?\.html$/, "") + `_${i}.html`); } for (let i = 0; i < links.length; i++) { let doc = await new Promise(async resolve => { for (let check = 1; check <= 100; check++) { let res = await fetch(links[i]); if (res.status == 304 || res.status == 200) { let buffer = await res.arrayBuffer(); let decoder = new TextDecoder(document.characterSet || document.charset || document.inputEncoding); let htmlText = decoder.decode(buffer); let doc = fun.doc(htmlText); resolve(doc); break; } else { fun.showMsg(`第${parseInt(i, 10) + 1}頁${res.status}重試第${check}次`, 2900); await fun.delay(3000, 0); } } }); let imgs = [...fun.gae("#picg img[alt]", doc)]; let te = [...fun.gae("#picg img[alt]")].pop(); imgs.forEach(e => { imgsArr.push(e.cloneNode(true)); if (i != 0) te.parentNode.insertBefore(e.cloneNode(true), te.nextSibling); }); if (i != 0) { let ne = [...fun.gae("h1,.page .pagelist")]; let re = [...fun.gae("h1,.page .pagelist", doc)]; if (ne.length == re.length) { for (let i in ne) { ne[i].outerHTML = re[i].outerHTML; } } } await fun.delay(200, 0); } return imgsArr; }, button: [4], insertImg: ["#picg", 2], autoDownload: [0], next: "//div[@class='b' and contains(text(),'上一')]/a", prev: "//div[@class='b' and contains(text(),'下一')]/a", customTitle: () => fun.geT("h1").replace(/\/(\d+P)?|\||第\d+页/gi, "").trim(), topButton: true, fancybox: { v: 3, insertLibrarys: 1 }, css: "#imgc img{margin:0px auto!important}#picg{max-width: 1110px!important;margin: 0 auto;}#picg img:hover{transform:none !important}#picg img{filter:blur(0px)!important}body>br,#apic,#bzs7,.interestline+center,center+#pic,#d4a,#divone,#xzpap1,#divpsgx,#bdivpx,#divfts,#divftsp,#app+div,#xzappsq,div.bg-text,#divpsg,#divStayTopright2,#bdssy,#qrcode2>.erweima-text,#qrcode2>center,#qrcode2>center+div,#d5tig,#pcapicb,#google_translate_element,#d5a>*:not([id]):not([class]),.slide>a+div,.slide>img+div,#xtjpp,.interestline+.nav~*:not([id^='pv-']):not([class^='pv-']):not(.pagetual_tipsWords):not(#comicRead):not(#fab):not(.FullPictureLoadMsg):not(.FullPictureLoadFixedBtn):not(#FullPictureLoadOptions):not(*[class^=fancybox]){display:none !important}", category: "nsfw2" }, { name: "魅狸图片网/美女私房照/看妹图", host: ["www.rosi8.com", "www.sfjpg.com", "www.kanmeitu.net", "www.kanmeitu1.cc", "kanmeitu.net", "kanmeitu1.cc"], reg: /(www\.rosi8\.\w+|www\.sfjpg\.com|www\.sfjpg\.net|kanmeitu\.net|kanmeitu1\.cc)\/\w+\/\d+\.html$/, init: () => { [...fun.gae(".b a")].forEach(a => a.removeAttribute("target")); [...fun.gae("#picg a")].forEach(a => a.outerHTML = a.innerHTML); }, imgs: () => { let max = fun.geT(".pagelist span,.pagelist a[title=Page]").match(/\/(\d+)/)[1]; return fun.getImgO("#picg img", max, 9, [null, null], 200, ".page .pagelist", siteUrl, 0); }, button: [4], insertImg: ["#picg", 2], autoDownload: [0], next: "//div[@class='b' and contains(text(),'上一')]/a", prev: "//div[@class='b' and contains(text(),'下一')]/a", customTitle: () => fun.geT("h1").replace(/\/(\d+P)?/i, ""), topButton: true, fancybox: { v: 3, insertLibrarys: 1 }, css: "#imgc img{margin:0px auto!important}#picg{max-width: 1110px!important;margin: 0 auto;}#picg img:hover{transform:none !important}#picg img{filter:blur(0px)!important}body>br,.interestline+center,center+#pic,#xzpap1,#divpsgx,#bdivpx,#divfts,#divftsp,#app+div,#xzappsq,div.bg-text,#divpsg,#divStayTopright2,#bdssy,#qrcode2>center,#d5tig,#pcapicb,#pcapic,#google_translate_element,#d5a>*:not([id]):not([class]),union[id]{display:none !important}", category: "nsfw2" }, { name: "六色美图", host: ["www.06se.com"], reg: /^https?:\/\/www\.06se\.com\/\d+\.html/, imgs: ".article-content img", button: [4], insertImg: [ [".wp-posts-content", 2, ".wp-posts-content"], 2 ], autoDownload: [0], next: "//a[p[text()='上一篇']]", prev: "//a[p[text()='下一篇']]", customTitle: () => fun.geT(".article-title").replace(/\[\d([/\+\.\w]+)?\]\s?|【\d+P】/i, ""), css: "#modal-system-notice,.container.fluid-widget{display:none!important;}", category: "nsfw1" }, { name: "丝袜客", host: ["siwake.cc"], reg: /^https?:\/\/siwake\.cc\/post\//, imgs: ".Content>a", button: [4], insertImg: [".Content", 2], autoDownload: [0], next: "a.fas", prev: "a.next.fas", customTitle: () => fun.geT(".title"), css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}@media only screen and (max-width:480px){#wrapper .single{padding:0!important}}", category: "nsfw1" }, { name: "丝袜客 分類自動翻頁", enable: 1, reg: /^https?:\/\/siwake\.cc\//, autoPager: { ele: "#main.gallery", observer: "#main.gallery>.thumb", next: "a.next.fas", re: ".pagelist", history: 1 }, openInNewTab: "#main.gallery a:not([target=_blank])", category: "autoPager" }, { name: "柔丝映画", host: ["www.mfpho.com"], reg: /^https?:\/\/www\.mfpho\.com\/\d+\.html$/i, imgs: () => fun.getImgA(".single-content img", ".page-links a"), button: [4], insertImg: [".single-content", 2], category: "nsfw1" }, { name: "爱妹子", host: ["xx.knit.bid", "mm.187187.xyz"], reg: /^https?:\/\/(xx\.knit\.bid|mm\.187187\.xyz)\/([\w-]+\/)?article\/\d+\//i, init: () => fun.clearAllTimer(2), imgs: () => fun.getImg(".item-image img,#img-box img", (fun.geT("li.next-page", 2) || 1)), button: [4], insertImg: ["#img-box", 2], customTitle: () => fun.geT(".focusbox-title").replace(/\[\d+P\]/i, "").replace(/\d+P/i, "").trim(), css: "a{white-space:unset!important}", category: "nsfw1" }, { name: "爱妹子 反反廣告提示", host: ["xx.knit.bid"], reg: /xx\.knit\.bid\//, init: () => fun.clearAllTimer(2), openInNewTab: ".excerpts-wrapper a:not([target=_blank])", category: "ad" }, { name: "美女写真", host: ["portrait.knit.bid"], reg: /portrait\.knit\.bid\/\w+\/\d+$/, imgs: async () => { let max = fun.geT("//li[a[text()='下页']]", 2); let links = fun.arr(max).map((_, i) => siteUrl + "?page=" + (i + 1)); return fun.getImgA(".container>.container>img", links, 300); }, button: [4], insertImg: [ [".container>.container>nav", 2, "nav[aria-label=pagination],.img-fluid"], 2 ], customTitle: () => fun.geT(".container h1"), category: "nsfw1" }, { name: "萌图社", host: ["www.446m.com", "446m.com"], reg: /^https?:\/\/(www\.)?446m\.com\/index\.php\/\w+\/\d+\.html/, imgs: "span.post-item", button: [4], insertImg: [".post-content", 2], customTitle: () => document.title.slice(0, -6), fancybox: { v: 3, css: false }, category: "nsfw1" }, { name: "日式JK", host: ["www.jk.rs"], reg: /^https?:\/\/www\.jk\.rs\/\d+\/\d+\/\d+\/\d+\.html/, imgs: "div[data-fancybox]", button: [4], insertImg: ["#masonry", 2], customTitle: () => fun.title(" - 日式JK"), fancybox: { v: 3, css: false }, css: "#masonry{position:unset!important;height:unset!important}", category: "nsfw1" }, { name: "爱若传媒映画", host: ["www.inini.win"], reg: /^https?:\/\/www\.inini\.win\/\d+\/\d+\.html/, imgs: "article.post a", button: [4], insertImg: ["article.post", 2], customTitle: () => fun.title(" - 爱若传媒映画"), fancybox: { v: 3, css: false }, category: "nsfw1" }, { name: "妹妹美", host: ["mmm.red"], reg: /(www\.)?mmm\.red\/art\/\d+$/, exclude: ".login-tip", imgs: "div[data-fancybox][data-src]", autoDownload: [0], next: "//div[text()='上一篇']/following-sibling::a", prev: "//div[text()='下一篇']/following-sibling::a", customTitle: () => fun.geT(".post-info-text"), category: "nsfw1" }, { name: "胴体的诱惑", host: ["dongti.blog.2nt.com"], reg: /dongti\.blog\.2nt\.com\/blog-entry-\d+.html/, imgs: ".inner-contents img", button: [4], insertImg: [".entry-content", 2], autoDownload: [0], next: "//a[div[@class='pager_entry-box next-justify']]", prev: "//a[div[@class='pager_entry-image-prev']]", customTitle: () => fun.geT("#entry-title").replace(/\[\d+[-\s\.\+\w]+\]/i, "").trim(), category: "nsfw1" }, { name: "好圖屋", host: ["www.haotuwu.com", "m.haotuwu.com"], reg: /(www|m)\.haotuwu\.com\/\w+\/\d+(\/page\/\d+)?(\.html)?$/, include: ".suoyou", init: () => { let url = location.href; if (/\/page\/\d+/.test(url)) { location.href = url.replace(/\/page\/\d+/, ""); } }, imgs: () => { let links = []; links.push(siteUrl); let url = siteUrl.replace(".html", ""); let max = fun.geT(".suoyou").match(/\d+\/(\d+)/)[1]; for (let i = 2; i <= max; i++) { links.push(url + "/page/" + i + ".html"); } return fun.getImgA("#showimg img,.img-box img", links); }, button: [4], insertImg: ["#showimg,.img-box", 2], autoDownload: [0], next: "//div[contains(text(),'上一篇')]/a | //span[contains(text(),'上一篇')]/following-sibling::a[1]", prev: "//div[contains(text(),'下一篇')]/a | //span[contains(text(),'下一篇')]/following-sibling::a[1]", customTitle: () => fun.geT(".showtitle>h2,.imgTitle-name"), css: "#imgshow .flow-box:nth-child(n+1):nth-child(-n+2){display:none!important}", category: "nsfw1" }, { name: "秀色女神", host: ["www.xsnvshen.co"], reg: /www\.xsnvshen\.(co|com)\/album\/\d+/, imgs: () => { thumbnailsSrcArray = [...fun.gae("img[id^='imglist'][data-original]")].map(e => e.dataset.original); return [...fun.gae("img[id^='imglist'][data-original]")].map(e => e.dataset.original.replace("thumb_600x900/", "")); }, button: [4], insertImg: ["//li[img[@id='bigImg']]", 2], customTitle: () => fun.geT("h1"), css: ".workShow li img{max-width:100%!important}", category: "nsfw1" }, { name: "秀色女神M", host: ["m.xsnvshen.co"], reg: /m\.xsnvshen\.(co|com)\/album\/\d+/, imgs: async () => { let max = fun.geT(".pg_current").match(/\d+$/)[0]; thumbnailsSrcArray = await fun.getImg("#arcbox img.lazy", max, 6); return thumbnailsSrcArray.map(e => e.replace("thumb_600x900/", "")); }, button: [4], insertImg: [ ["#arcbox", 0, "//div[@id='arcbox']/p[img]"], 2 ], customTitle: () => fun.geT("h1>a"), css: "#arcbox img{max-width:100%!important;margin:10px auto!important;min-height:50px!important;min-width:50px!important}", category: "nsfw1" }, { name: "秀色女神news", host: ["www.xsnvshen.co", "m.xsnvshen.co"], reg: /^https?:\/\/(www|m)\.xsnvshen\.co\/news\/\d+/, imgs: "#arcbox img", button: [4], insertImg: [ ["#arcbox>*:first-child", 1, "//p[img]"], 2 ], customTitle: () => fun.geT("h1"), css: "#arcbox img{max-width:100%!important;margin:auto!important;min-height:50px!important;min-width:50px!important}", category: "nsfw1" }, { name: "HotAsiaGirl分頁模式", host: ["hotgirl.asia"], reg: /hotgirl\.asia\/.+\//, include: ".galeria_img", imgs: () => fun.getImgA(".galeria_img>img", ".pagination a[href]"), button: [4], insertImg: [".mx-auto", 1], customTitle: () => fun.geT("h3"), css: ".galeria_img{display:none!important}", category: "nsfw2" }, { name: "HotAsiaGirl幻燈片模式", host: ["hotgirl.asia"], reg: /hotgirl\.asia\/.+\//, include: "#carouselImageIndicators", imgs: "#carouselImageIndicators img", button: [4], insertImg: [".mx-auto", 2], customTitle: () => fun.geT("h3"), css: ".galeria_img{display:none!important}", category: "nsfw2" }, { name: "HotGirl World", host: ["www.hotgirl.world"], reg: /^https?:\/\/www\.hotgirl\.world\/g\/\w+\.html\//, imgs: () => { let max = fun.geT(".pagination__total"); return fun.getImg(".article__image-list img", max); }, button: [4], insertImg: [".article__image-list", 2], go: 1, customTitle: () => fun.geT(".article-header__title"), fancybox: { v: 3, css: false }, category: "nsfw1" }, { name: "HotGirl World 分類自動翻頁", enable: 1, reg: /^https?:\/\/www\.hotgirl\.world\/(\?page=\d+)?$|^https?:\/\/www\.hotgirl\.world\/(category|agency|tag)\/\d+\.html\/(\?page=\d+)?$|^https?:\/\/www\.hotgirl\.world\/search\.html\/\?(page=\d+&)?q=/, include: ".pagination", init: () => [...fun.gae(".blur-image")].forEach(e => e.classList.remove("blur-image")), autoPager: { ele: ".articles-grid", observer: ".articles-grid .articles-grid__item", next: ".pagination__item--active+a", re: ".pagination", lazySrc: "img[data-src]", title: doc => "Page " + fun.geT(".pagination__item--active", 1, doc), aF: () => siteData.init(), history: 1 }, openInNewTab: ".articles-grid a:not([target=_blank])", category: "autoPager" }, { name: "1Y Beauties", host: ["www.1y.is"], reg: /^https?:\/\/www\.1y\.is\/\w+\/[^\.]+\.html$/, imgs: async () => { let max; try { max = fun.ge(".page-links>a:last-child").href.match(/\d+$/)[0]; } catch (e) { max = 1; } let arr = await fun.getImg(".entry-content img", max); return arr.sort((a, b) => a.match(/(\d+)\.\w+$/)[1] - b.match(/(\d+)\.\w+$/)[1]); }, button: [4], insertImg: [ [".entry-content", 0, "//p[img] | //div[@class='page-links']"], 1 ], customTitle: () => fun.geT(".entry-title"), category: "nsfw1" }, { name: "BeautyLeg", host: ["www.beautyleg6.com"], reg: /www\.beautyleg6\.com\/\w+\/\d+\/\d+\.html/i, imgs: () => { let max; try { max = fun.geT(".page a").match(/\d+/)[0]; } catch (e) { max = 1; } return fun.getImg(".contents img[alt]", max, 9); }, button: [4], insertImg: [".contents", 2], autoDownload: [0], next: ".pre>a", prev: ".next>a", customTitle: () => fun.geT(".content>h1").replace(/\[\d+P\/\d+M\]/i, ""), css: ".content .contents img{max-width:100%!important}", category: "nsfw1" }, { name: "BeautyLegM", host: ["m.beautyleg6.com"], reg: /m\.beautyleg6\.com\/view\.php\?aid=\d+/, imgs: async () => { let links = []; links.push(siteUrl); for (let i = 2; i <= totalpage; i++) { links.push(siteUrl + "&pageno=" + i); } await fun.getEle(links, "#bigImg", ".show-simg", ".show-pages"); return [...fun.gae("#bigImg")]; }, button: [4], insertImg: [".show-simg", 2], autoDownload: [0], next: () => { let next = fun.ge("a.f-r.l3"); return next ? next.href : null; }, prev: 1, customTitle: () => fun.geT(".showcontbt>h1").replace(/\s?\(\d+\/\d+\)/, ""), category: "nsfw1" }, { name: "Asianude4u", host: ["www.asianude4u.net"], reg: /www\.asianude4u\.net\/.+\/.+\/(#small-1)?$/, exclude: "//a[@rel='category tag' and text()='Videos'] | //a[@rel='category tag' and text()='Madonna-AV']", imgs: () => fun.ge(".wp-block-image a[href*=attachment_id]") ? [...fun.gae(".wp-block-image img[data-id]")] : [...fun.gae(".wp-block-image>a,.mgl-img-container>a,.gallery a")].map(e => e.href), button: [4], //insertImg: ["//li[img[@id='bigImg']]", 1], insertImg: [ ["div.entry>*:last-child", 2], 2 ], go: 1, customTitle: () => fun.geT("h1.entry-title"), css: ".single-box,.entry-img-300{display:none!important}@media only screen and (max-width:409px){.entry{width:100%!important}}button.rmp_menu_trigger{z-index:100!important}", category: "nsfw1" }, { name: "NICEGIRL4U", host: ["nicegirl4u.cyou"], reg: /^https?:\/\/nicegirl4u\.cyou\/[^\/]+\/$/, include: ".wp-block-image>img", imgs: async () => { let pag = fun.ge(".page-links"); if (pag) { let max = fun.geT(".page-links>a:last-child"); return fun.getImg(".wp-block-image>img", max, 14); } else { return [...fun.gae(".wp-block-image>img")]; } }, button: [4], insertImg: [ [".responsive-tabs-wrapper", 2], 2 ], customTitle: () => fun.geT(".entry-title"), category: "nsfw1" }, { name: "Nudegirls4u", host: ["nudegirls4u.com"], reg: /^https?:\/\/nudegirls4u\.com\/[^\/]+\/$/, imgs: ".rgg-imagegrid>a", button: [4], insertImg: [".rgg-container", 2], customTitle: () => fun.geT(".entry-title"), css: ".rgg-imagegrid{height:auto!important}", category: "nsfw1" }, { name: "Chinese Beauties", host: ["sxchinesegirlz.one", "sxchinesegirlz01.xyz"], reg: /sxchinesegirlz(\d+)?\.\w+\/\d+\/\d+\/\d+\/.+\/$/, imgs: () => fun.getImg(".wp-block-image img", fun.geT(".pagination>*:last-child", 2), 4), button: [4], insertImg: [".thecontent", 1], customTitle: () => fun.geT("h1.entry-title"), category: "nsfw2" }, { name: "爱看 INS", host: ["www.ikanins.com"], reg: /www\.ikanins\.com\/[\w-]+\//, imgs: "img[srcset]", button: [4], insertImg: [ [".entry-content", 0, "//p[img]"], 2 ], go: 1, autoDownload: [0], next: "a[rel=prev]", prev: "a[rel=next]", customTitle: () => fun.geT(".entry-title").replace(/\s?\d+P\s?$/i, "").trim(), category: "nsfw1" }, { name: "Dmmtu 美女图", host: ["www.dmmtu.com"], reg: /www\.dmmtu\.com\/\w+\/\d+\.html/, imgs: () => { let max = fun.geT("a[title=Page]>b").match(/共(\d+)/)[1]; return fun.getImg(".main-body img", max, 9); }, button: [4], insertImg: [".main-body", 1], autoDownload: [0], next: "//a[text()='上一组']", prev: 1, customTitle: () => fun.geT(".main-title"), css: ".single .main-body img{max-width:100%!important}#showlast1{display:none!important;}", category: "nsfw2" }, { name: "好女神网", host: ["www.haonvshen.com"], reg: /www\.haonvshen\.com\/gallery\/\d+\.html/, imgs: () => { let max; fun.ge(".page") ? max = fun.geT(".page").match(/\d+\/(\d+)/)[1] : max = fun.geT("#pages>*:last-child", 3) || 1; return fun.getImg("#hgallery>img,#imgwrap img", max, 9); }, button: [4], insertImg: ["#hgallery,#imgwrap", 1], customTitle: () => fun.title(" - 第1页-美女图片-好女神网"), css: ".f_b_c_d{display:none!important}", category: "nsfw1" }, { name: "Jablehk", host: ["jablehk.com"], reg: /jablehk\.com\/\w+/, imgs: () => { thumbnailsSrcArray = [...fun.gae("figure.gallery-strips-item")].map(e => e.dataset.thumb); return [...fun.gae(".gallery-strips-lightbox-link>img[data-src]")]; }, button: [4], insertImg: [ [".gallery-strips-wrapper", 2], 2, 2000 ], autoDownload: [0], next: ".item-pagination-link--next", prev: ".item-pagination-link--prev", go: 1, customTitle: () => fun.geT("h1>strong"), category: "nsfw1" }, { name: "TangMoc", host: ["tangmoc.com"], reg: /^https?:\/\/tangmoc\.com\/blog\/show\/\w+\/view/, init: async () => { fun.remove("//div[@class='row mt-3'] | //div[ins[@class='adsbygoogle']] | //div[@class='mt-3'][@id] | //div[@class='row my-5'] | //iframe[@id]"); }, imgs: () => fun.ge(".btn-warning+.btn-secondary") ? fun.getImgA("a[href*=media]>.media-preview", "a.btn-secondary") : [...fun.gae("a[href*=media]>.media-preview")], button: [4], insertImg: ["//media[article]", 2], go: 1, customTitle: () => fun.geT("h1"), category: "nsfw1" }, { name: "TangMoc去廣告", host: ["tangmoc.com"], reg: /^https?:\/\/tangmoc\.com\//, init: () => { fun.remove("//div[@class='row mt-3'] | //div[ins[@class='adsbygoogle']] | //div[@class='mt-3'][@id] | //div[@class='row my-5'] | //iframe[@id]"); new MutationObserver(() => fun.remove("//div[@class='row mt-3'] | //div[ins[@class='adsbygoogle']] | //div[@class='mt-3'][@id] | //div[@class='row my-5'] | //iframe[@id]")).observe(document.body, MutationObserverConfig); }, category: "ad" }, { name: "☆ Ảnh đẹp ☆", host: ["tuyetnhan.com"], reg: /^https?:\/\/tuyetnhan\.com\/[^\/]+\/$/, init: () => { let ele = fun.ge("//div[@class='entry-content']/p[em]"); if (ele) { let x = fun.ge(".entry-footer"); x.parentNode.insertBefore(ele, x); } }, imgs: ".entry-content img", button: [4], insertImg: [".entry-content", 2], customTitle: () => fun.geT(".entry-title"), category: "nsfw1" }, { name: "Fapello", host: ["fapello.com"], reg: /^https?:\/\/fapello\.com\/[^\/]+\/$/, init: async () => { if (fun.ge("#showmore")) { fun.run("scrollMore=()=>{};"); let ele = fun.ge("#showmore"); let max = ele.dataset.max; fun.remove("#showmore"); let links = []; for (let i = 2; i <= max; i++) { links.push(siteUrl + `page-${i}/`); } await fun.getEle(links, "#content>div", ["#content", 0]); fun.remove("#next_page"); } }, imgs: () => { let imgSrcs = [...fun.gae("#content>div")].map(node => { if (fun.ge("img[src*='icon-play.svg']", node)) { let videoSrc = fun.ge("img", node).src.replace("https://fapello.com/", "https://cdn.fapello.com/").replace("_300px", "").replace(/\.jpg$/i, ".mp4"); videosSrcArray.push(videoSrc); return null; } else { thumbnailsSrcArray.push(fun.ge("img", node).src); let imgSrc = fun.ge("img", node).src.replace("_300px", ""); return imgSrc; } }).filter(item => item); return imgSrcs; }, button: [4], insertImg: ["#content", 2], downloadVideo: true, category: "nsfw2" }, { name: "Thotsbay", host: ["thotsbay.tv"], reg: /^https?:\/\/thotsbay\.tv\/\w+(\/photo)?$/i, init: () => { //if (/\/photo/.test(location.href)) fun.clearAllTimer(); if (location.href.split("/").length == 4) { location.href = location.href + "/photo"; } }, imgs: async () => { if (/\/photo/.test(location.href)) fun.clearAllTimer(); let ptext = fun.geT('#photos-tab'); let m = ptext.match(/\(([\d\.K]+)\)/)[1]; let num; if (/\./.test(m) && /K/.test(m)) { num = (parseInt(m.replace(/\.|K/g, ""), 10) + 1) * 100; } else if (/K/.test(m)) { num = parseInt(m.replace(/K/g, ""), 10) * 1000 + 100; } else { num = parseInt(m, 10); } let pages = Math.ceil(num / 48); let actorName = siteUrl.split("/")[3]; let imgsSrcArr = []; let fetchNum = 0; fun.showMsg(displayLanguage.str_05, 0); for (let i = 1; i <= pages; i++) { let json = await fetch(`https://thotsbay.tv/${actorName}?page=${i}&type=photos&order=0`, { "headers": { "x-requested-with": "XMLHttpRequest" } }).then(res => { fun.showMsg(`${displayLanguage.str_06}${fetchNum+=1}/${pages}`, 0); return res.json(); }); if (json.length == 0) break; let images = json.map(e => "https://thotsbay.tv/storage/" + e.image); let thumbnails = json.map(e => e.thumbnail); imgsSrcArr = imgsSrcArr.concat(images); thumbnailsSrcArray = thumbnailsSrcArray.concat(thumbnails); if (json.length < 48) break; } return imgsSrcArr; }, button: [4], insertImg: ["#photos", 3], customTitle: () => fun.geT(".actor-name>h1"), category: "nsfw2" }, { name: "Hot Girl Pix", host: ["www.hotgirlpix.com"], reg: /^https?:\/\/www\.hotgirlpix\.com\/p\//, imgs: () => fun.getImgA("article img", "#singlePostPagination a", 300), button: [4], insertImg: ["article", 2], customTitle: () => fun.geT("#singlePostTitle"), css: "#modalAdblock{display:none!important}", category: "nsfw1" }, { name: "Hot Girl Pix", host: ["www.hotgirlpix.com"], reg: /^https?:\/\/www\.hotgirlpix\.com\//, css: "#modalAdblock{display:none!important}", category: "ad" }, { name: "LUVBP", host: ["luvbp.com"], reg: /^https?:\/\/luvbp\.com\/\d+\//, exclude: "//a[text()='网盘下载'] | //h4[text()='此文章仅供订阅者阅读']", imgs: "figure img", button: [4], insertImg: [".c-content", 2], customTitle: () => fun.geT(".c-post-hero__title"), css: "@media(max-width:39.99em){.c-content img{max-width:100%!important}}", category: "nsfw1" }, { name: "自拍图库", host: ["自拍图库.com", "zipaipic.com"], reg: /^https?:\/\/[^\/]+\/content_\d+\.html/i, include: "//title[contains(text(),'自拍图库')]", init: () => fun.clearAllTimer(), imgs: ".showimg", button: [4], insertImg: ["#imgviewer", 2], go: 1, autoDownload: [0], next: "//a[text()='下一组']", prev: "//a[text()='上一组']", customTitle: () => fun.geT(".ttle").replace(/\n|\d+p/gi, "").trim(), referer: "", css: "a[rel]{display:none!important}", category: "nsfw2" }, { name: "美拍 - 我自拍", host: ["7aipai.com", "35zipai.com", "9zipai.net"], reg: /^https?:\/\/(\d+aipai\.com|\d+zipai.com|\d+zipai\.net)\/\w+\/\d+\/\d+\.html/i, init: () => fun.clearAllTimer(), imgs: async () => { await fun.waitEle("#showCon img"); videosSrcArray = [...fun.gae("#showCon video")].map(e => /\.mp4/.test(e.src) ? e.src : null).filter(item => item); thumbnailsSrcArray = [...fun.gae("#showCon img")].map(e => /zipai/.test(e.src) ? e.src.replace(/&w=\d+/, "&w=100") : null).filter(item => item); return [...fun.gae("#showCon img")].map(e => /zipai/.test(e.src) ? e.src.replace(/&output.+/, "") : null).filter(item => item); }, button: [4], insertImg: ["#showCon", 2], go: 1, autoDownload: [0], next: ".article-nav-prev a", prev: 1, customTitle: () => fun.geT(".item_title>h1").replace(/\[[\d\+PV]+\]/i, "").trim(), referer: "", css: ".affs{display:none!important}.content_left img{cursor:unset}", category: "nsfw2" }, { name: "套圖TAOTU.ORG", host: ["taotu.org"], reg: /^https?:\/\/(\w{2}\.)?taotu\.org\/[\w-]+\//i, include: ".piclist", imgs: () => { thumbnailsSrcArray = [...fun.gae("a[data-fancybox=gallery] img")].map(e => e.src); return [...fun.gae("a[data-fancybox=gallery]")]; }, button: [4], insertImg: [ ["#wrapper-footer", 2], 2 ], autoDownload: [0], next: ".next a", prev: ".prev a", customTitle: () => fun.geT(".suit_title>h1").replace(/\d+p/i, "").trim(), go: 1, css: "#right-bottom,#ad,.ad{display:none!important;}", category: "nsfw1" }, { name: "Taotuxp.com", host: ["www.taotucc.com"], reg: /www\.taotucc\.com\/\d+\.html/, imgs: () => fun.getImg("#post_content img[alt]", fun.geT(".pagelist>*:last-child"), 7), button: [4], insertImg: ["#post_content", 1], autoDownload: [0], next: "a[rel=prev]", prev: "a[rel=next]", customTitle: () => fun.geT("h1"), category: "nsfw1" }, { name: "MM 范", host: ["www.95mm.vip"], reg: /www\.95mm\.\w+\/\d+\.html/, init: "$(document).unbind('keydown');$(document).unbind('keyup');", imgs: () => { let max = fun.geT(".post-title").match(/\/(\d+)/)[1]; return fun.getImg(".post img[alt]", max, 2); }, button: [4], insertImg: [".post", 1], autoDownload: [0], next: "//div[div[text()='上一组']]/preceding-sibling::div/a", prev: "//div[div[text()='下一组']]/preceding-sibling::a", customTitle: () => fun.geT(".post-title").replace(/(\d+\/\d+)$/, ""), category: "nsfw1" }, { name: "推图网", host: ["www.tuiimg.com"], link: "https://www.tuiimg.com/meinv/", reg: /(www|m)\.tuiimg\.com\/meinv\/\d+\//, init: "goshowall();", imgs: () => { let max = fun.geT("#allbtn").match(/\/(\d+)/)[1]; let imgDir = fun.ge("#content>img").src.match(/.+\//)[0]; return fun.arr(max).map((_, i) => imgDir + (i + 1) + ".jpg"); }, button: [4], insertImg: ["#content", 2], autoDownload: [0], next: "#nextbtn>a", prev: "#prebtn>a", customTitle: () => fun.geT("#main>h1,.main>h1"), category: "nsfw1" }, { name: "18AV", host: ["18av.mm-cg.com"], link: "https://18av.mm-cg.com/zh/cg_random/all/index.html", reg: /18av\.mm-cg\.com\/(\w{2}\/)?\w+\/\d+\/content\.html|18av\.mm-cg\.com\/.+\.html/, include: ".sel_enlarge_page,.sel_enlarge", imgs: () => Large_cgurl, button: [4], insertImg: ["#show_cg_html,#showcg_container", 2], customTitle: () => fun.geT('.archive-title>h1,h1').replace(/\s?\[\d+p\]|\s?\(\d+p\)/i, "").trim(), category: "nsfw1" }, { name: "Xgirls", host: ["xgirlscollection.com", "img3xgirls.com"], reg: /(xgirlscollection\.com|img3xgirls\.com)\/(collection|album)\/\d+/, imgs: () => fun.getImg("img[id].collection-image,.album-image[data-pin-media]", (fun.geT(".pagination>*:last-child", 2) || 1)), button: [4], insertImg: ["//div[img[@data-pin-url]]", 1], customTitle: () => fun.geT(".container>h1"), category: "nsfw1" }, { name: "SexyAsianGirl", host: ["www.sexyasiangirl.xyz"], reg: /www\.sexyasiangirl\.xyz\/album\/\d+\.html/, init: () => fun.remove("//article/div[a[img]]"), imgs: () => fun.getImg("img.block", fun.geT("//a[text()='Next']", 2) || 1), button: [4], insertImg: ["//div[img[@title]]", 1], customTitle: () => fun.geT("header>h2").replace(/\s?\(\d+\s?photos\s?\)/, "").trim(), category: "nsfw2" }, { name: "尤物丧志", host: ["youwu.asia"], reg: /^https?:\/\/youwu\.asia\/albums\//, imgs: () => fun.getImg("img.block", fun.geT("a[rel=next]", 2) || 1), button: [4], insertImg: ["//div[img[@title]]", 1], customTitle: () => fun.geT("#main>h1").replace(/未分类性感写真|^.+人体|AI图区/, "").trim(), category: "nsfw2" }, { name: "福利姬美图", host: ["fuligirl.net"], reg: /fuligirl\.net\/albums\/\d+/, imgs: () => fun.getImg("img.block", (fun.geT("a[rel=next]", 2) || 1)), button: [4], insertImg: ["//div[@class='my-1' and img[@class='block my-1']]", 1], customTitle: () => fun.geT("#main h1").replace(/(\d+月\d+打赏群资源)|\[\d+P(\d+v)?-[\d\.]+(M|G)B\]|\[\d+P\]|\d+mb|\s?\d+p/gi, "").trim(), category: "nsfw2" }, { name: "顶尖美女图", host: ["djjpg.com"], reg: /^https?:\/\/djjpg\.com\/\d+.html/, imgs: ".post-countent-data img", autoDownload: [0], next: "//a[div[h5[text()=' 上一篇']]]", prev: "//a[div[h5[text()=' 下一篇']]]", customTitle: () => fun.geT('.multi-single-header>h1').replace(/\(\d+\/\d+\)|(\s–\s)?\(\d+P\)/i, "").trim(), category: "nsfw1" }, { name: "秀人图吧", host: ["www.502x.com"], reg: /^https?:\/\/www\.502x\.com\/\w+\/\d+\.html/, button: [4], //imgs: () => fun.getImg("#image_div img", (fun.geT("a.prev", 2) || 1), 9), imgs: () => fun.getImgA("#content img", ".post_au>a"), button: [4], insertImg: ["#image_div", 2], customTitle: () => fun.geT(".item_title>h1"), css: ".affs{display:none!important}.image_div a img{cursor:unset}", category: "nsfw1" }, { name: "Nude Bird", host: ["nudebird.biz"], reg: /nudebird\.biz\/.+\//, imgs: ".thecontent a", button: [4], insertImg: ["//p[a[img]]", 2], customTitle: () => fun.geT("h1"), category: "nsfw1" }, { name: "R18 Cosplay", host: ["r18cosplay.com"], reg: /r18cosplay\.com\/\?p=\d+/, imgs: ".wp-block-image img", button: [4], insertImg: [ [".content-inner", 0, ".wp-block-image"], 2 ], customTitle: () => fun.geT(".entry-header>h1"), category: "nsfw1" }, { name: "NUDECOSPLAY", host: ["nudecosplaygirls.com"], reg: /nudecosplaygirls\.com\/.+\/$/, exclude: "//span[text()='Nude Cosplay Videos']", imgs: ".single-thumb>.wp-post-image,img[class*='wp-image'],.icon-overlay>img[decoding],.msacwl-img,.entry-content>img,.gallery-item img", button: [4], insertImg: [".entry-content", 2], autoDownload: [0], next: ".g1-nav-single-next>a", prev: ".g1-nav-single-prev>a", customTitle: () => fun.geT("h1.entry-title").replace(/“[0-9a-z ]+”/i, "").trim(), category: "nsfw2" }, { name: "Cosplaytele", host: ["cosplaytele.com"], reg: /cosplaytele\.com\/[^/]+\//, include: "figure.gallery-item", imgs: "figure.gallery-item a", button: [4, "21%"], insertImg: [".gallery", 2], customTitle: () => fun.geT("h1.entry-title").replace(/\s?“[^”]+”/, "").trim(), css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}", category: "nsfw2" }, { name: "X Cosplay", host: ["xcosplay.top"], reg: /xcosplay\.top\/\d+\/\d+\/\d+\//, imgs: ".galeria_img>img", button: [4], insertImg: [".entry-content", 2], autoDownload: [0], next: "a[rel=prev]", prev: "a[rel=next]", customTitle: () => fun.geT("h1.entry-title"), category: "nsfw1" }, { name: "AsiaOnTop", host: ["asiaon.top"], reg: /^https?:\/\/asiaon\.top\/[^\/]+\/$/, include: ".modula-items", init: () => new MutationObserver(() => fun.remove("#mdpDeblocker-css")).observe(document.body, MutationObserverConfig), imgs: "a[data-image-id]", button: [4], insertImg: [ [".modula-items", 2], 2 ], autoDownload: [0], next: "a#prepost", prev: "a#nextpost", customTitle: () => fun.geT(".single_post_title_main").replace(":", " -"), go: 1, category: "nsfw2" }, { name: "AsiaOnTop", reg: /^https?:\/\/asiaon\.top\//, init: () => new MutationObserver(() => fun.remove("#mdpDeblocker-css")).observe(document.body, MutationObserverConfig), css: ".mdpDeblocker-wrapper,.mdpDeblocker-blackout.active{display:none!important;}[data-aos^=fade][data-aos^=fade]{opacity:1!important;transition-property:unset!important}[data-aos=fade-up]{transform:unset!important}", category: "ad" }, { name: "Mitaku", host: ["mitaku.net"], reg: /mitaku\.net\/.+\/.+\/$/, imgs: () => [...fun.gae(".msacwl-img")].slice(1, -1), button: [4], insertImg: [ [".article-content", 2], 2 ], autoDownload: [0], next: ".previous>a", prev: ".next>a", customTitle: () => fun.geT("h1.entry-title"), category: "nsfw2" }, { name: "Byoru", host: ["byoru.net"], reg: /^https?:\/\/byoru\.net\/[\w-]+\/$/, imgs: () => { if (fun.ge(".msacwl-slide>a")) { return [...fun.gae(".msacwl-slide>a")].map(a => a.dataset.mfpSrc).sort((a, b) => a.match(/(\d+)\.\w+$/)[1] - b.match(/(\d+)\.\w+$/)[1]); } else if (fun.ge("figure.wp-block-image img[data-src]")) { return [...fun.gae("figure.wp-block-image img[data-src]")].map(e => e.dataset.src.replace(/-\d+x\d+(\.\w+)/, "$1")).sort((a, b) => { try { return a.match(/(\d+)\.\w+$/)[1] - b.match(/(\d+)\.\w+$/)[1]; } catch (e) { try { return a.match(/\((\d+)\)\.\w+$/)[1] - b.match(/\((\d+)\)\.\w+$/)[1]; } catch (e) { return a; } } }); } else { return []; } }, button: [4, "23%"], insertImg: [".s-post-content", 2], autoDownload: [0], next: "a.next-page-link", prev: "a.prev-page-link", customTitle: () => fun.geT("h1.entry-title").replace(/Byoru – | \(Cosplay\)/g, ""), category: "nsfw1" }, { name: "NudesLegion", host: ["nudeslegion.com"], reg: /nudeslegion.com\/[^\/]+\/$/i, include: ".msacwl-slider-wrap", imgs: () => [...fun.gae(".msacwl-img")].slice(1, -1), button: [4], insertImg: [ [".msacwl-slider-wrap", 2], 2 ], customTitle: () => fun.geT("h1.entry-title").replace(/\([\w\/\s]+\)/i, "").trim(), css: "footer+script+div[id]{display:none!important}", category: "nsfw2" }, { name: "MrCong.com/MissKON.com", host: ["mrcong.com", "misskon.com"], reg: /^https?:\/\/(mrcong\.com|misskon\.com)\/[^\/]+\/$/, imgs: () => fun.getImg(".entry img[decoding]", fun.geT(".page-link>*:last-child"), 4), button: [4], insertImg: ["//p[img[@decoding]]", 1], customTitle: () => fun.geT("h1").replace(/\(\d+\s?photos?\s?(\+\s?\d+\s?videos?)?\)/gi, "").trim(), category: "nsfw1" }, { name: "Xiuren", host: ["xiuren.biz"], reg: /^https?:\/\/xiuren\.biz\/[^\/]+\//, include: ".content-inner a[data-lbwps-srcsmall]", imgs: ".content-inner a[data-lbwps-srcsmall]", button: [4], insertImg: [".content-inner", 2], autoDownload: [0], next: "a.post.prev-post", prev: "a.post.next-post", customTitle: () => fun.geT('h1.jeg_post_title').replace(/\d+P/i, ""), category: "nsfw1" }, { name: "4KHD", host: ["www.4khd.com", "www.4kep.com", "xjav.cc", "hhhy.quest", "vxkk.cc"], reg: /(www\.4k(hd|ep)\.com|xjav\.cc|hhhy\.quest|vxkk\.cc)\/\d+\/\d+\/\d+\/.+\.html/, imgs: async () => { await fun.getNP("#basicExample>a,figure.wp-block-image", ".current+li>a", null, ".page-link-box", 0, null, 1, 0); let mobile = fun.ge("figure.wp-block-image>a"); if (mobile) { thumbnailsSrcArray = [...fun.gae("#basicExample>a>img,figure.wp-block-image>a>img")].map(e => e.src.replace("?w=1000", "?w=100")); return [...fun.gae("figure.wp-block-image>a")]; } else { thumbnailsSrcArray = [...fun.gae("#basicExample>a>img,#gallery a img")].map(e => e.src.replace("?w=1000", "?w=100")); return fun.getImgA("#gallery a", "#basicExample>a"); } }, button: [4], insertImg: [ [".page-link-box,.wp-block-post-content>*:last-child,#khd", 1, "#basicExample,.wp-block-image"], 2 ], //autoDownload: [0], //next: ".post-navigation-link-previous>a", //prev: ".post-navigation-link-next>a", customTitle: () => fun.geT("h3.wp-block-post-title").replace(/\[(\d+)?mb-\d+photos\]|\[\d+photos\]|\(\d+8MB\)\(\d+photos\)/i, "").trim(), fetch: 1, //threading: 4, css: ".popup,.wp-container-13{display:none!important}.FullPictureLoadImage{max-width:100%!important}", category: "nsfw2" }, { name: "Buon Dua", host: ["buondua.com", "buondua.us"], reg: /buondua\.(com|us)\/(?!hot|collection)[^\?]+$/, imgs: () => { let max = fun.geT(".pagination-list>span:last-child>a").match(/\d+/)[0]; return fun.getImg(".article-fulltext img[alt]", max); }, button: [4], insertImg: [".article-fulltext", 1], customTitle: () => fun.geT(".article-header>h1").replace(/\(\d+\s?photos\s?\)/i, "").trim(), category: "nsfw2" }, { name: "BaoBua.Com", host: ["baobua.com"], reg: /^https?:\/\/baobua\.com\/post\/\w+\.html/i, imgs: () => { let max; try { max = fun.geT(".article-header>h1").match(/Page\s?\d+\/(\d+)/i)[1]; } catch (e) { max = 1; } return /\?m=1/.test(siteUrl) ? fun.getImg(".contentme img", max, "8") : fun.getImg(".contentme img", max); }, button: [4], insertImg: [".contentme", 2], customTitle: () => fun.geT(".article-header>h1").split("|")[0].trim(), category: "nsfw2" }, { name: "BaoBua.Net", host: ["www.baobua.net"], reg: /www\.baobua\.net\/post\/.+/, imgs: () => fun.getImg(".wp-block-image img[alt]", (fun.geT(".nav-links>*:last-child") || 1), 6), button: [4], insertImg: [".entry-content.read-details", 2], customTitle: () => fun.title("|", 1), category: "nsfw2" }, { name: "blog.baobua.net", host: ["www.baobua.net"], reg: /(blog|fb|vn)\.baobua\.net\/\w+\/.+/, imgs: "a.fancybox", button: [4], //insertImg: [".article-body", 2], insertImg: [ [".article-body", 2], 2 ], go: 1, customTitle: () => fun.title("@BaoBua", 1), css: "#fix_scale img:hover{transform:none!important}", category: "nsfw2" }, { name: "HOTGIRLchina格式", host: ["hotgirlchina.com", "hotgirlasian.com", "thechinagirls.com", "theasiagirl.com", "cutexinh.com", "girlxinhxinh.com", "asiaceleb.com", "chinagirly.com", "nudeasiangirl.com"], reg: /(hotgirlchina\.com|thechinagirls\.com|theasiagirl\.com|anhsec\.com|cutexinh\.com|girlxinhxinh\.com|asiaceleb\.com|chinagirly\.com|nudeasiangirl\.com)\/.+(photos?|videos?|anh)?\/?|^https?:\/\/babeasia\.com\/\d+\/[^\/]+\/$|^https?:\/\/hotgirlasian\.com\/\d+\/$/, include: ".entry-inner img[alt]", imgs: () => { let max; try { max = fun.geT("span.pages").match(/\d+$/)[0]; } catch (e) { max = 1 } return fun.getImg(".entry-inner img[alt]", max, 4); }, button: [4], insertImg: [ [".pagination", 1, ".entry-inner>p:not(#FullPictureLoadEnd)"], 2 ], customTitle: () => fun.geT(".post-title").replace(/\(\d+\s?photos\s?\)|(\s?\(\d+\s?photos?\s?\+\s?\d+\s?videos?\))|\([0-9\s]+ảnh[0-9\s\+]+video\)|\([0-9\s]+ảnh\)/i, "").trim(), css: ".boxzilla-container,.boxzilla-overlay{display:none!important}", category: "nsfw1" }, { name: "HOTGIRLchina格式", reg: /(hotgirlchina\.com|thechinagirls\.com|theasiagirl\.com|anhsec\.com|cutexinh\.com|girlxinhxinh\.com|asiaceleb\.com|chinagirly\.com|nudeasiangirl\.com|hotgirlasian\.com)\//, css: ".boxzilla-container,.boxzilla-overlay{display:none!important}", category: "ad" }, { name: "FoamGirl", host: ["foamgirl.net"], reg: /foamgirl\.net\/\d+\.html/, imgs: () => { let max; try { max = fun.geT(".mbx-nav-right").match(/\d+\/(\d+)/)[1]; } catch (e) { max = 1; } return fun.getImg("a.imageclick-imgbox", max, 9); }, button: [4], insertImg: [ ["#image_div>*:last-child", 1, "#image_div br,a.imageclick-imgbox"], 1 ], customTitle: () => fun.geT(".item_title>h1").replace(/\(\d+P\)|\n/gi, ""), css: ".affs{display:none!important}", category: "nsfw2" }, { name: "photo.camcam.cc", host: ["photo.camcam.cc"], reg: /photo\.camcam\.cc\/[^/]+\/$/, imgs: "a.rgg-img", button: [4], insertImg: [ [".rgg-imagegrid", 2], 2 ], go: 1, next: "a[rel=prev]", prev: "a[rel=next]", customTitle: () => fun.geT(".page-title").replace(/\[\d+P-?\d+MB?\]/i, "").trim(), category: "nsfw2" }, { name: "Everia.club", host: ["everia.club"], reg: /(everia\.club|everiaeveria\.b-cdn\.net)\/\d+\/\d+\/\d+\/[^/]+\//, imgs: ".wp-block-image img", button: [4], insertImg: [".entry-content", 2], customTitle: () => fun.geT("h1"), category: "nsfw2" }, { name: "Everia club", host: ["www.everiaclub.com"], reg: () => { if (/^https?:\/\/www\.everiaclub\.com\/(?!tags).+/.test(siteUrl)) { if (!siteUrl.includes(".html")) { return true; } } return false; }, //exclude: ".pagination", imgs: ".mainleft img", button: [4], insertImg: [".mainleft", 2], customTitle: () => fun.geT(".mainleft h1"), category: "nsfw2" }, { name: "SexyGirl", host: ["sexygirl.cc"], reg: /sexygirl\.cc\/a\/\d+\.html/, imgs: "div>img.img-fluid", button: [4], insertImg: ["//div[img]", 2], next: "//a[text()='Previous']", prev: "//a[text()='Next']", category: "nsfw2" }, { name: "dongojyousan.com", host: ["dongojyousan.com"], reg: /www\.dongojyousan\.com\/articles\/\w+\.html/i, imgs: () => { let max; try { max = fun.geT(".entry-title>a").match(/Page\s1\/(\d+)/)[1]; } catch (e) { max = 1; } return /\?m=1/.test(siteUrl) ? fun.getImg(".entry-content img", max, "8") : fun.getImg(".entry-content img", max); }, button: [4], insertImg: [".entry-content", 2], customTitle: () => fun.geT(".entry-title>a").split("|")[0].trim(), category: "nsfw1" }, { name: "Kenh69", host: ["kenh69.co"], reg: /^https?:\/\/kenh69\.co\/[^/]+\/$/, init: "$(document).off();", imgs: () => { try { let max = fun.geT(".page-links a[onclick]", 2); let links = []; links.push(siteUrl); for (let i = 2; i <= max; i++) { links.push(siteUrl + "p-" + i); } return fun.getImgA(".wp-content-ex img[data-src]", links); } catch (e) { return [...fun.gae(".wp-content-ex img[data-src]")]; } }, button: [4], insertImg: [".wp-content-ex", 2], customTitle: () => fun.geT(".title>h1").replace(/\(\d+[-\.\+\s\w]+\)/, "").trim(), css: "#rtb,.float-ck-center-lt,#popupContact,#backgroundPopupp,.col-9>.col-12,.col-3{display:none!important}.col-9{flex:unset!important;max-width:100%!important}", category: "nsfw2" }, { name: "Kenh69 自動翻頁", host: ["kenh69.co"], enable: 1, reg: /^https?:\/\/kenh69\.co\/(page\/\d+)?$|^https?:\/\/kenh69\.co\/category\//, init: () => { fun.run("$(document).off();"); fun.remove("//div[div[a[@title='OnlyFans Videos']]] | //div[@id='tfads']"); }, autoPager: { ele: "//div[@class='row space-ad'][1]/div[@class='col-6' or @class='col-5'][not(@id='tfads')]", observer: "//div[@class='row space-ad'][1]/div[@class='col-6' or @class='col-5'][not(@id='tfads')]", next: "a.next", re: ".wp-pagenavi", title: () => "Page " + nextLink.match(/\d+$/)[0], history: 1 }, openInNewTab: ".space-ad a:not([target=_blank])", css: ".autoPagerTitle{width:100%!important}#backgroundPopupp,#popupContact,.float-ck-center-lt,center[style*='z-index']{display:none!important}", category: "autoPager" }, { name: "Kenh69去廣告", host: ["kenh69.co"], reg: /^https?:\/\/kenh69\.co\//, init: "$(document).off();", css: "#backgroundPopupp,#popupContact,.float-ck-center-lt,center[style*='z-index']{display:none!important}", category: "ad" }, { name: "Phym18/Bongda21h", host: ["phym18.org", "bongda21h.co"], link: "https://phym18.org/tag/%E1%BA%A3nh-sex,https://bongda21h.co/anh-hot/", reg: /phym18\.org\/anh\/[^/]+$|^https?:\/\/bongda21h\.co\/anh-hot\/[^\/]+\/$/, init: "$(document).off();", imgs: () => { try { let max = fun.geT("select>option:last-child").match(/\d+/)[0]; let links = []; links.push(siteUrl); for (let i = 2; i <= max; i++) { links.push(siteUrl + "/phan-" + i); } return fun.getImgA(".ndtruyen>img", links); } catch (e) { return [...fun.gae(".ndtruyen>img")]; } }, button: [4], insertImg: [".ndtruyen", 2], go: 1, customTitle: () => fun.geT("h1.header-title,h1.title").replace(/\s?\(\d+\s?photos?\)|\s?\(\d+\s?photos?(\s?\+\s?\d+\s?videos?)\)/g, ""), css: "#wap_bottombannerr,#wap_bottombanner,#backgroundPopupp,#popupContact,center[style*='z-index']{display:none!important}", category: "nsfw2" }, { name: "Phym18 圖片分類自動翻頁", host: ["phym18.org"], link: "https://phym18.org/tag/%E1%BA%A3nh-sex", enable: 1, reg: /^https?:\/\/phym18\.org\/tag\/[^n]+nh-sex/, init: () => { fun.run("$(document).off();"); fun.remove("//div[div[a[div[text()='Free']]]]"); }, autoPager: { ele: "div.item-list", observer: "div.item", next: "a.w-pagination-next", re: ".w-pagination-wrapper", lazySrc: "a[data-src]", title: () => "Page " + nextLink.match(/\d+$/)[0], aF: () => fun.remove("//div[div[a[div[text()='Free']]]]"), history: 1 }, openInNewTab: "div.item a:not([target=_blank])", css: "#bn_top,#backgroundPopupp,#popupContact,#wap_bottombannerr,#wap_bottombanner,center[style*='z-index']{display:none!important}", category: "autoPager" }, { name: "Phym18/bongda21h去廣告", host: ["phym18.org", "bongda21h.co"], reg: /phym18\.org|bongda21h\.co/, init: "$(document).off();", css: "#bn_top,#backgroundPopupp,#popupContact,#wap_bottombannerr,#wap_bottombanner,center[style*='z-index']{display:none!important}", category: "ad" }, { name: "Porn Pics", host: ["www.pornpics.com"], reg: /www\.pornpics\.com\/.*galleries\//, imgs: () => { thumbnailsSrcArray = [...fun.gae("#tiles a.rel-link>img")].map(e => e.dataset.src); return [...fun.gae("#tiles a.rel-link")]; }, button: [4], insertImg: ["#main", 3], customTitle: () => fun.geT(".title-section h1"), category: "nsfw2" }, { name: "HD Porn Pictures", host: ["hdpornpictures.net"], reg: /^https?:\/\/hdpornpictures\.net\/id\/\d+\//, imgs: () => { let imgs = [...fun.gae("#tiles a.rel-link")].map(a => a.href); thumbnailsSrcArray = imgs.map(e => e + "?w=300"); return imgs; }, button: [4], insertImg: ["#main", 3], customTitle: () => fun.title(" - HD Porn Pictures"), category: "nsfw2" }, { name: "Freebigtit", host: ["www.freebigtitpornpics.com"], reg: /www\.freebigtitpornpics\.com\/content\/\d+\//, imgs: () => { thumbnailsSrcArray = [...fun.gae("ul#dylan a>img[data-src]")].map(e => e.dataset.src); return [...fun.gae("//ul[@id='dylan']//a[img[@data-src]]")]; }, button: [4], insertImg: [ ["#dylan", 2], 1 ], go: 1, category: "nsfw2" }, { name: "Freejappic", host: ["www.freejapanpornpics.com"], reg: /www\.freebigtitpornpics\.com\/content\/\d+\//, imgs: () => { thumbnailsSrcArray = [...fun.gae("ul#dylan a>img[data-src]")].map(e => e.dataset.src); return [...fun.gae("//ul[@id='dylan']//a[img[@data-src]]")]; }, button: [4], insertImg: [ ["#dylan", 2], 1 ], category: "nsfw2" }, { name: "NongMo.Zone", host: ["www.ilovexs.com"], reg: /www\.ilovexs\.com\/post_id\/\d+\//, imgs: ".separator img", button: [4], insertImg: [".entry-content", 2], customTitle: () => fun.geT(".entry-title"), category: "nsfw2" }, { name: "idol.gravureprincess.date", host: ["idol.gravureprincess.date"], reg: /idol\.gravureprincess\.date\/\d+\/\d+\/.+\.html/, imgs: ".separator img", button: [4], insertImg: [ [".entry-content", 0], 2 ], go: 1, autoDownload: [0], next: "a.blog-pager-older-link", prev: "a.blog-pager-newer-link", customTitle: () => fun.geT(".post-title"), category: "nsfw2" }, { name: "劍心回憶", host: ["kenshin.hk"], link: "https://kenshin.hk/category/jnews/photoalbum/", reg: /kenshin\.hk\/\d+\/\d+\/\d+\/[^/]+\/(#small-1)?$/, include: "//div[@class='entry-utility']/a[1][text()='寫真組圖'] | //div[@class='cat-tags']/a[1][text()='寫真組圖']", init: async () => { let p = fun.ge("//p[contains(text(),'寫真')]"); if (p) { let tE = fun.ge(".entry-content,.post-page-content"); tE.parentNode.insertBefore(p, tE); } let links = [...fun.gae("//a[button[contains(text(),'寫真')]]")].map(e => e.href); await fun.getEle(links, ".entry-content>p>img,.post-page-content>p>img,.videoWrapper", ".entry-content,.post-page-content"); let v = fun.ge(".videoWrapper"); if (v) { let tE = fun.ge(".entry-content,.post-page-content"); tE.parentNode.insertBefore(v, tE); } }, imgs: ".entry-content>img,.post-page-content>img", button: [4], insertImg: [".entry-content,.post-page-content", 2], go: 1, customTitle: () => fun.geT("h1.entry-title,h2.post-title").replace(/【寫真】|\s?\(\d+P,片\)/gi, ""), category: "nsfw1" }, { name: "韩剧组", host: ["www.hanjuzu.com"], link: "https://www.hanjuzu.com/hantype/23.html", reg: /www\.hanjuzu\.com\/handetail-\d+\.html/, imgs: () => { let max = fun.geT(".num").match(/\d+\/(\d+)/)[1]; return fun.getImg(".hl-article-box>img", max, ); }, button: [4], insertImg: [".hl-article-box", 2], autoDownload: [0], next: ".hl-next", prev: ".hl-prev", customTitle: () => fun.geT(".hl-article-title"), category: "nsfw1" }, { name: "J M G T", host: ["www.qiuyeshudian.com"], reg: /^https?:\/\/www\.qiuyeshudian\.com\/[^\/]+\/$/, imgs: () => { thumbnailsSrcArray = [...fun.gae(".feature-box img,.entry-content img")].map(e => e.dataset.src ?? e.src); return thumbnailsSrcArray.length > 1 ? thumbnailsSrcArray.map(e => e.replace(/\?w=\d+&ssl=1/, "").replace(/\?resize.+/, "")) : []; }, button: [4], insertImg: [".entry-content", 2], go: 1, autoDownload: [0], next: "a[rel=prev]", prev: "a[rel=next]", customTitle: () => fun.geT("article h1"), category: "nsfw1" }, { name: "Gravia", host: ["gravia.site"], reg: /gravia\.site\/box\/show\.php\?id=\d+$/, imgs: () => { thumbnailsSrcArray = [...fun.gae(".thums img")].map(e => e.src); return [...fun.gae(".slideshow .item>img")]; }, button: [4], insertImg: [".slideshow.for_box", 2], customTitle: () => fun.geT(".container>h1").replace(/\s?【\d+枚】/, ""), css: "img.small{max-width:100% !important;max-height:auto !important}.cmd_bar.wide{display:none!important}", category: "nsfw1" }, { name: "グラビア週刊誌 9/グラビア週刊誌 5/グラビア週刊誌 6", host: ["gravurezasshi9.doorblog.jp", "magazinejapanese5.blog.jp", "magazinejapanese6.blog.jp"], reg: /(gravurezasshi9\.doorblog\.jp|magazinejapanese(5|6)\.blog\.jp)\/archives\/\d+\.html(\?ref=)?/, imgs: () => { thumbnailsSrcArray = [...fun.gae(".article-body-inner>a>img,#article-contents>a>img")].map(e => e.src); return [...fun.gae(".article-body-inner>a,#article-contents>a")]; }, button: [4], insertImg: [".article-body-inner,#article-contents", 2], autoDownload: [0], next: "//li[text()='前の記事: ']/a | //a[text()='前の記事']", prev: "//li[text()='次の記事: ']/a | //a[text()='次の記事']", customTitle: () => fun.geT("h1.article-title>a,.article-header>h1").trim(), category: "nsfw1" }, { name: "グラビア週刊誌 9/グラビア週刊誌 5/グラビア週刊誌 6 - 分類自動翻頁", host: ["gravurezasshi9.doorblog.jp", "magazinejapanese5.blog.jp", "magazinejapanese6.blog.jp"], reg: /^https?:\/\/(gravurezasshi9\.doorblog\.jp|magazinejapanese(5|6)\.blog\.jp)\/(\?p=\d+)?$|^https?:\/\/(gravurezasshi9\.doorblog\.jp|magazinejapanese(5|6)\.blog\.jp)\/archives\/([\d-]+|cat_\d+)\.html(\?p=\d+)?$/, autoPager: { ele: ".autopagerize_page_element,.article-list-outer", observer: "article.article,.article-list-outer>li", next: "//li[@class='current']/following-sibling::li[1]/a | //a[span[text()='次へ']]", re: ".pager,.pager_fixed,.fractional-page", history: 1, title: doc => "Page " + nextLink.match(/\?p=(\d+)/)[1] }, openInNewTab: ".autopagerize_page_element a[href]:not([target=_blank]),.article-list-outer a[href]:not([target=_blank])", category: "autoPager" }, { name: "エロ役場", host: ["eroyakuba.com"], reg: /eroyakuba\.com\/[^/]+\/$/, imgs: () => { return [...fun.gae(".flexitem_content img[srcset],.entry-content img[srcset]")].map(img => { if (img.dataset.srcset !== "") { let splitArr = img.dataset.srcset.split(","); splitArr = splitArr.sort((a, b) => a.match(/\s(\d+)w/)[1] - b.match(/\s(\d+)w/)[1]); return splitArr.pop().trim().split(" ")[0]; } return img.dataset.src ?? null; }); }, customTitle: () => fun.geT("h1.entry-title"), category: "nsfw2" }, { name: "エロ画像まとめ", host: ["geinou-nude.com"], reg: /geinou-nude\.com\/[^/]+\/$/, imgs: ".post_content>p>a[href*=uploads]", autoDownload: [0], next: "a.nav_link_l", prev: "a.f_row_r", customTitle: () => fun.geT("h1.post_title"), category: "nsfw2" }, { name: "JANidolig", host: ["janidolig.com"], reg: /janidolig\.com\/\?p=\d+/, imgs: ".entry-content img.size-full", button: [4], insertImg: [".entry-content", 2], customTitle: () => fun.geT("h1.entry-title"), category: "nsfw2" }, { name: "Gravure", host: ["Idols gravureidols.top"], reg: /gravureidols\.top\/\d+\/\d+\/\d+\/[^/]+\//, imgs: ".content-inner p>a", autoDownload: [0], next: "a.prev-post", prev: "a.next-post", customTitle: () => fun.geT(".jeg_post_title"), category: "nsfw2" }, { name: "復刻書林", host: ["reprint-kh.com"], reg: /reprint-kh\.com\/archives\/\d+/, imgs: async () => { await fun.getNP(".gallery-row", "//a[span[text()='次のページ']]"); thumbnailsSrcArray = [...fun.gae(".tiled-gallery a img")].map(e => e.src); return [...fun.gae(".tiled-gallery a")]; }, button: [4], insertImg: [ [".single-post-main>.share,.single-post-main .content", 2], 2 ], go: 1, autoDownload: [0], next: ".previous_post>a", prev: ".next_post>a", customTitle: () => fun.geT(".single-post-title").replace(/\d+photos/, "").trim(), category: "nsfw2" }, { name: "マブい女画像集", host: ["mabui-onna.com"], reg: /^https?:\/\/mabui-onna\.com\/blog-entry-\d+\.html/, imgs: ".topentry_text div>a:not([href*='.html']),.entry_body div>a:not([href*='.html'])", button: [4], insertImg: [".topentry_text,.entry_body", 2], autoDownload: [0], next: "a.pager_next,.next_entry>a", prev: "a.pager_prev,.prev_entry>a", customTitle: () => fun.geT(".topentry_title span,.entry_title h1>strong").replace(/\d+枚/, "").replace(/\s\s/g, " ").trim(), category: "nsfw1" }, { name: "Love Asian Babes", host: ["amazon-love.com"], reg: /^https?:\/\/amazon-love\.com\/[^.]+\.html/, imgs: () => { let max = fun.geT("//a[text()='Next Page »']", 2) || 1; return fun.getImg(".entry-content img", max, 7); }, button: [4], insertImg: [".entry-content", 2], autoDownload: [0], next: "span.prev>a", prev: "span.next>a", customTitle: () => fun.geT(".entry-title"), category: "nsfw1" }, { name: "ドッグ速報", host: ["dog-sokuhou.com"], reg: /^https?:\/\/dog-sokuhou\.com\/archives\/\d+\/[^\/]+\//, imgs: ".eye-catch>img,.wp_rss_scrapeing_post-content div>a", button: [4], insertImg: [".wp_rss_scrapeing_post-content", 2], customTitle: () => fun.geT(".entry-title").replace(/\d+枚/, "").replace(/\s\s/g, " ").trim(), css: "#oxzilla-overlay,boxzilla-overlay{display:none!important}", category: "nsfw1" }, { name: "IVPhoto_Gravure", host: ["ivphoto.tistory.com"], reg: /ivphoto\.tistory\.com\/(m\/)?\d+/, imgs: ".imageblock img", button: [4], insertImg: [".entry-content,.blogview_content", 2], customTitle: () => fun.geT('.tit_blogview,.hgroup h1').replace(/\[\d+p\]/i, "").trim(), category: "nsfw1" }, { name: "MIC MIC IDOL", host: ["www.micmicidol.club"], reg: /www\.micmicidol\.club\/\d+\/\d+\/.+\.html/, imgs: async () => { let imgsSrcArr = [...fun.gae(".entry-content a[href*=blog]")].map(a => { let arr = a.href.split("/"); if (arr.length === 9) { arr[7] = "s16000"; return arr.join("/"); } else { return a.href; } }); thumbnailsSrcArray = imgsSrcArr.map(e => e.replace("/s16000/", "/w100/")); return imgsSrcArr; }, button: [4], insertImg: [ [".entry-content", 0, ".entry-content a[href*=blog]:not([data-fancybox]),.entry-content br"], 2 ], customTitle: () => fun.geT(".entry-title").trim(), topButton: true, css: ".post img{max-width:100% !important}.post-body{margin:0px!important;}", category: "nsfw2" }, { name: "MIC MIC IDOL - 分類自動翻頁", host: ["www.micmicidol.club"], reg: /^https?:\/\/www\.micmicidol\.club\/(\?m=1)?$|^https?:\/\/www\.micmicidol\.club\/search/, include: ".date-outer", init: () => fun.run("$('.snips-image').unbind();$('.snips-image img').unbind();"), autoPager: { //mode: 1, ele: ".blog-posts", next: "a.blog-pager-older-link", http: "https", observer: ".post.hentry", re: "#blog-pager", stop: doc => fun.ge(".date-outer", doc) ? false : true, history: 1, aF: () => { [...fun.gae("//div[@class='snips-image']/a[not(img)]")].forEach(a => { let script = fun.ge("script", a); if (script) { let code = script.innerText; if (/document\.write/.test(code)) { let arr = code.split('"'); let url = arr[1]; let alt = arr[3]; let img = new Image(); img.src = url.replace("/s72-c/", "/w400/").replace("=s72-c", "=w400"); img.alt = alt; script.parentNode.insertBefore(img, script.nextSibling); } } }); }, title: doc => { let num; if (/start=/.test(nextLink)) { if (siteUrl.includes("unc.micmicdoll.com")) { num = parseInt(nextLink.match(/start=(\d+)/)[1], 10); num % 2 == 0 ? num = num / 50 + 1 : num = num / 39 + 1; } else { num = parseInt(nextLink.match(/start=(\d+)/)[1], 10) / 50 + 1; } } else { num = 1; } return doc.title + ` - Page ${num}`; } }, openInNewTab: ".date-outer a[href]:not([target=_blank])", category: "autoPager" }, { name: "Kemono/Coomer", host: ["kemono.su", "coomer.su"], link: "https://kemono.su/fantia/user/17148/post/1633768", reg: /(kemono\.party|kemono\.su|coomer\.party|coomer\.su)\/.+\/post/, delay: 300, include: "a.fileThumb.image-link", imgs: () => { videosSrcArray = [...fun.gae("video>source")].map(e => e.src); thumbnailsSrcArray = [...fun.gae("a.fileThumb.image-link>img")].map(e => { if (e.dataset.src) { return /^\/\//.test(e.dataset.src) ? location.protocol + e.dataset.src : e.dataset.src; } else { return e.src; } }); return [...fun.gae("a.fileThumb.image-link")]; }, button: [4], insertImg: [ [".post__body", 0], 2 ], go: 1, autoDownload: [0], next: "a.next", prev: "a.prev", customTitle: () => fun.geT(".post__title"), downloadVideo: true, topButton: true, threading: 4, category: "nsfw2" }, { name: "半次元", host: ["bcy.net"], reg: /bcy\.net\/item\/detail\/\d+\?_source_page=\w+/, imgs: ".inner-container img", customTitle: () => fun.title(" - ", 1), category: "none" }, { name: "套图之家", host: ["taotuhome.com"], reg: /taotuhome\.com\/\d+\.html/i, imgs: () => fun.getImg(".single-content img[alt]", (fun.geT(".page-links>*:last-child", 2) || 1), 7), button: [4], insertImg: [".single-content", 1], autoDownload: [0], next: "a[rel=prev]:not([href^=j])", prev: "a[rel=next]:not([href^=j])", customTitle: () => fun.geT('.entry-title').replace("-套图之家", ""), category: "nsfw1" }, { name: "俊美图", host: ["www.meijuntu.com", "www.junmeitu.com", "www.jeya.de", "www.jeya.jp"], reg: /(www\.meijuntu\.com|(www\.)?junmeitu\.com|(www\.)?jeya\.\w+)\/\w+\/\w+\.html/i, include: ".pictures img[alt]", imgs: async () => { let imgsArr = []; let max = fun.geT("#pages>*:last-child", 2) || 1; let url = siteUrl.replace(/(-\d+)?\.html$/, ""); let links = fun.arr(max).map((_, i) => url + "-" + (i + 1) + ".html") for (let i = 0; i < links.length; i++) { let doc = await new Promise(async resolve => { for (let check = 1; check <= 100; check++) { let res = await fetch(links[i]); if (res.status == 304 || res.status == 200) { let buffer = await res.arrayBuffer(); let decoder = new TextDecoder(document.characterSet || document.charset || document.inputEncoding); let htmlText = decoder.decode(buffer); let doc = fun.doc(htmlText); resolve(doc); break; } else { fun.showMsg(`第${parseInt(i, 10) + 1}頁${res.status}重試第${check}次`, 2900); await fun.delay(3000, 0); } } }); let imgs = [...fun.gae(".pictures img[alt]", doc)]; let te = [...fun.gae(".pictures img[alt]")].pop(); imgs.forEach(e => { imgsArr.push(e.cloneNode(true)); if (i != 0) te.parentNode.insertBefore(e.cloneNode(true), te.nextSibling); }); if (i != 0) { let ne = [...fun.gae("#pages")]; let re = [...fun.gae("#pages", doc)]; if (ne.length == re.length) { for (let i in ne) { ne[i].outerHTML = re[i].outerHTML; } } } await fun.delay(1000, 0); } return imgsArr; }, button: [4], insertImg: [".pictures", 1], autoDownload: [0], next: "//span[contains(text(),'下一')]/following-sibling::a", prev: "//span[contains(text(),'上一')]/following-sibling::a", customTitle: () => fun.geT("h1.title"), css: ".pre_picture,.next_picture{display:none!important}", category: "nsfw1" }, { name: "x6o", host: ["x6o.com"], link: "https://x6o.com/topics/14#articles", reg: /(www\.)?x6o\.com\/articles\/\d+/, delay: 500, imgs: ".content img", button: [4], insertImg: [".content", 2, 2000], customTitle: () => fun.geT("h1.title").replace(/\[\d+P-\d+MB\]|\[\d+P\]|\s?\d+P$/gi, "").trim(), category: "nsfw2" }, { name: "妹子图", host: ["mt316.com"], reg: /mt316\.com\/\w+\/\d+\.html/, imgs: ".m-list-content img", button: [4], insertImg: [".m-list-content", 2], autoDownload: [0], next: ".sxpage_l>a", prev: 1, customTitle: () => fun.geT(".m-list-tools>h2").replace(/\/?\(\d+P\)/i, "").trim(), css: ".m-list-content img{max-width:100%!important}", category: "nsfw1" }, { name: "硬盘少女", host: ["diskgirl.com"], reg: /diskgirl\.com\/image\/\w+/, imgs: "a[data-fancybox]", button: [4], insertImg: [ [".flexauto>*:last-child", 1, "a[data-fancybox=gallery]"], 2 ], customTitle: () => fun.geT(".image-title").replace(/\[\d+(\+\d+)?PB?\]|\(\d+(\+\d+)?PB?\)/i, ""), fancybox: { v: 3, css: false }, category: "nsfw1" }, { name: "心动美图", host: ["www.wai76.com", "www.wai77.com"], reg: /^https?:\/\/www\.wai\d+\.com\/[^\/]+\//, include: ".entry-content div[data-src]", imgs: async () => { let divDataSrcs = await fun.getImgA(".entry-content div[data-src]", ".page-links a"); thumbnailsSrcArray = divDataSrcs.map(src => { let arr = src.split("/"); arr[arr.length - 1] = "thumbnail/s" + arr[arr.length - 1]; return arr.join("/"); }); return divDataSrcs; }, button: [4], insertImg: [".entry-content", 2], customTitle: () => fun.geT(".entry-title"), category: "nsfw1" }, { name: "美女库", host: ["www.meinvku.org.cn"], reg: /www\.meinvku\.org\.cn\/album\/\d+(\/)?(\.html)?$/, imgs: async () => { let firstImg = fun.ge("#img_src img").src; let imgDir = firstImg.match(/.+\//)[0]; let max = fun.geT("//span[contains(text(),'页次')]").match(/\/(\d+)/)[1]; let arr = fun.arr(max).map((_, i) => imgDir + (i + 1) + ".jpg"); let a = fun.ge("#img_src"); if (a) a.outerHTML = `<div class="CustomPictureBox">${fun.ge("img", a).outerHTML}</div>`; return arr; /* let links = []; let url = siteUrl; links.push(url); let max = fun.geT("//span[contains(text(),'页次')]").match(/\/(\d+)/)[1]; for (let i = 2; i <= max; i++) { links.push(url + "/page/" + i + ".html"); } return fun.getImgA(".post-content img", links); */ /* await fun.getNP(".CustomPictureBox img,#img_src img", ".pagination li.active+li>a", null, ".pagination", 0, null, 0); return [...fun.gae(".CustomPictureBox img")]; */ }, button: [4], insertImg: [".CustomPictureBox", 1], css: ".CustomPictureBox>img{max-width:100%}", category: "nsfw1" }, { name: "图宅网/咔咔西三/YouFreeX", host: ["www.tuzac.com", "dev.tuzac.com", "www.kkc3.com", "www.youfreex.com"], reg: /(www\.tuzac\.com|dev\.tuzac\.com|www\.kkc3\.com|www\.youfreex\.com)\/file\/.+/, imgs: async () => { let a = fun.ge("#the-photo-link"); if (a) a.outerHTML = a.innerHTML; await fun.getNP("#fdp-photo img,#fdp-photo-old img,.file-detail img", ".page-curr+a", null, "#pager", 0, null, 0); return [...fun.gae("#fdp-photo img,#fdp-photo-old img,.file-detail img")]; }, button: [4, "22%"], insertImg: ["#task,#fdp-photo,#fdp-photo-old", 2], customTitle: () => fun.geT(".fc-text-content>h1").replace(/(\[\d+P\]|\n|\(\d+P\))/gi, "").trim(), css: ".content-container .content{margin-right:0px!important}.fdp-click-area,.ad-side-right,.footer{display:none!important}", category: "nsfw2" }, { name: "七仙子图片", host: ["www.qixianzi.com"], reg: /www\.qixianzi\.com\/\w+\/\d+\.html$/, imgs: async () => { let a = fun.ge(".picture_content>a"); a.outerHTML = a.innerHTML; await fun.getNP(".picture_content img", "//a[text()='下一页']", null, ".pagination", 0, null, 0); return [...fun.gae(".picture_content img")]; }, button: [4], insertImg: [".picture_content", 2], next: "//li[contains(text(),'上一篇')]/a", prev: "//li[contains(text(),'下一篇')]/a", customTitle: () => fun.geT("h1.diy-h1").replace(/\d+p/i, "").trim(), css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}", category: "nsfw1" }, { name: "七仙子图片M", host: ["www.qixianzi.com"], link: "https://www.qixianzi.com/e/wap/", reg: /www\.qixianzi\.com\/e\/wap\/show\.php\?/, imgs: ".arcmain img", button: [4], insertImg: [".arcmain", 1], customTitle: () => fun.geT(".header>span"), category: "nsfw1" }, { name: "嘿~色女孩", host: ["heysexgirl.com"], reg: /heysexgirl\.com\/archives\/\d+$/, imgs: () => { let max = fun.geT(".page-links>*:last-child"); return fun.getImg(".entry-content p>a,.entry-content p>img", max, "4"); }, button: [4], insertImg: [".entry-container", 2], autoDownload: [0], next: ".nav-previous>a", prev: ".nav-next>a", customTitle: () => fun.geT("h1.page-title"), category: "nsfw2" }, { name: "2LSP", host: ["2lsp.xyz"], reg: /2lsp\.xyz\/[^/]+\/$/, include: ".entry-content img[data-srcset]", exclude: ".content-hide-tips", observerClick: ".swal2-close", imgs: () => [...fun.gae(".entry-content img[data-srcset]")].map(e => e.dataset.srcset), button: [4], insertImg: [".entry-content", 2], autoDownload: [0], next: ".article-nav-prev>a", prev: ".article-nav-next>a", customTitle: () => fun.geT("h1.entry-title"), category: "nsfw1" }, { name: "2LSP", host: ["2lsp.xyz"], reg: /2lsp\.xyz\//, observerClick: ".swal2-close", category: "none" }, { name: "性趣套图/H漫画", host: ["myjkwd.com", "enpeta.com", "534798.xyz", "539765.xyz", "123548.xyz"], reg: /(myjkwd\.com|enpeta\.com|534798\.xyz|539765\.xyz|123548\.xyz)\/e\/action\/ShowInfo\.php/i, include: ".entry img", imgs: () => fun.getImg(".entry img", fun.geT("a[title=总数]"), 8), button: [4], insertImg: ["//div[@class='entry']//img/parent::*", 1], autoDownload: [0], next: "//p[contains(text(),'上一')]/a", prev: "//p[contains(text(),'下一')]/a", customTitle: () => fun.geT(".contitle"), css: "aside.side{display:none!important;}.main-content{margin-left:0px!important;}body{background:#EDEDED!important;}", category: "nsfw2" }, { name: "苍井优图", host: ["www.28tyu.com", "www.28rty.com", "www.28wer.com", "sldlxz.com", "282471.xyz"], reg: /(www\.(\d+tyu|\d+rty|\d+wer)\.com|sldlxz\.com|282471\.xyz)\/e\/action\/ShowInfo\.php/i, imgs: "img[id^='aimg'],.entry img", button: [4], insertImg: [".entry", 2], autoDownload: [0], next: "//p[contains(text(),'上一')]/a", prev: "//p[contains(text(),'下一')]/a", customTitle: () => fun.geT(".contitle").replace(/【\d+P】|\(\d+P\)/i, "").trim(), category: "nsfw2" }, { name: "YY美女图片/美眉大宝贝", host: ["www.yyzhenshun.com", "www.mmdabaobei.com"], reg: /(www\.yyzhenshun\.com|www.mmdabaobei\.com)\/\d+\.html/i, imgs: ".wzy_body img[alt]", button: [4, "22%"], insertImg: ["//p[img] | //p[strong[img]] | //div[@class='wzy_body']", 2], autoDownload: [0], next: "//li[contains(text(),'上一篇')]/a", prev: "//li[contains(text(),'下一篇')]/a", customTitle: () => fun.geT(".wzy_tit"), css: "body>section[id],a[href*=download]{display:none!important}header{margin-top:0px!important}", category: "nsfw1" }, { name: "爱看美图网", host: ["www.ikmt.net", "m.ikmt.net"], reg: /(www|m)\.ikmt\.net\/\w+\/\w+\/\d+\/\d+\.html/i, imgs: () => { let mouse_page = fun.ge("#mouse_page"); if (mouse_page) { let max = fun.geT("//li[a[text()='下一页']]", 2) || fun.geT("//a[text()='下一张']", 2).match(/\/(\d+)/)[1]; return fun.getImg("#picBody img,.post-content img", max, 9); } else { return [...fun.gae("#picBody img,.post-content img")]; } }, button: [4], insertImg: ["#picBody,.post-content", 2], autoDownload: [0], next: "//div[contains(text(),'上一篇')]/a", prev: "//div[contains(text(),'下一篇')]/a", customTitle: () => fun.geT(".articleV2Title>h1,.mm-title"), css: ".articleV2Body img{max-width:100% !important}", category: "nsfw1" }, { name: "妮兔美图", host: ["www.nitutu.com", "m.nitutu.com"], reg: /(www|m)\.nitutu\.com\/\w+\/\w+\/\d+\.html/i, imgs: () => fun.getImg(".pic-body img,.picshow-second img", totalpage, 9), button: [4], insertImg: [".pic-body,.picshow-second", 2], autoDownload: [0], next: "//li[@class='next']/a | //a[text()='下一篇']", prev: "//li[@class='prev']/a | //a[text()='上一篇']", customTitle: () => fun.geT(".pictitle>h1,.picart-title").replace(/\[\d+P\]/i, ""), css: ".FullPictureLoadImage.small{width:unset!important}", category: "nsfw1" }, { name: "犀牛图片网", host: ["www.xintp.com"], reg: /www\.xintp\.com\/(\w+\/\w+\/\d+\.html|\w+\/\d+\.html)/i, imgs: async () => { let pages = fun.ge(".page-links"); if (pages) { await fun.getNP(".single-content img", "//span[@class='post-page-numbers current']/following-sibling::a[span][1]", null, ".page-links"); return [...fun.gae(".single-content img")]; } else { return [...fun.gae(".single-content img")]; } }, button: [4], insertImg: [ [".single-content", 0, ".wp-block-image,.single-content>p~p:not(#FullPictureLoadEnd)"], 2 ], customTitle: () => fun.geT(".entry-title"), fancybox: { v: 3, css: false }, css: ".header-sub,.tg-box{display:none!important}", category: "nsfw1" }, { name: "小姐姐图库", host: ["xjjtk.link"], reg: /xjjtk\.link\/posts\/\w+\/$/i, imgs: "img.block", button: [4], insertImg: ["//div[img]", 2], customTitle: () => fun.geT("h1"), category: "nsfw2" }, { name: "AVJB", host: ["avjb.com"], link: "https://avjb.com/albums/", reg: /^https?:\/\/(avjb\.com|avjb\.fun|av\d{2}\.fun|bav\d{2}\.xyz|bbav\d{3}\.com|onebookcms\.com)\/(\w{2}\/)?albums\/\d+\/[\w-]+\/$/i, init: () => { new MutationObserver((mutations, observer) => { if (fun.ge(".chatra--webkit")) { fun.ge(".chatra--webkit").remove(); observer.disconnect(); } }).observe(document.body, MutationObserverConfig); }, imgs: () => { thumbnailsSrcArray = [...fun.gae(".images>a>img")].map(e => e.dataset.original ?? e.src); return [...fun.gae(".images>a")]; }, button: [4], insertImg: [ [".images", 2], 2 ], go: 1, customTitle: () => fun.geT(".headline>h1"), css: ".sponsor,.chatra--webkit{display:none!important}", category: "nsfw2" }, { name: "AVJB 去廣告", reg: /^https?:\/\/(avjb\.com|avjb\.fun|av\d{2}\.fun|bav\d{2}\.xyz|bbav\d{3}\.com|onebookcms\.com)\//i, init: () => { new MutationObserver((mutations, observer) => { if (fun.ge(".chatra--webkit")) { fun.ge(".chatra--webkit").remove(); observer.disconnect(); } }).observe(document.body, MutationObserverConfig); }, css: ".sponsor,.chatra--webkit{display:none!important}", category: "ad" }, { name: "Asian To Lick", host: ["asiantolick.com"], reg: /asiantolick\.com\/post/, imgs: () => { thumbnailsSrcArray = [...fun.gae("div[data-src]>img")].map(e => e.src); return [...fun.gae("div[data-src]")]; }, button: [4], insertImg: [ ["#categoria_tags_post", 1], 2 ], go: 1, customTitle: () => fun.geT("h1"), css: "#touch_to_see{display:none!important}", category: "nsfw2" }, { name: "Models Vibe", host: ["www.modelsvibe.com"], reg: /^https?:\/\/www\.modelsvibe\.com\/[^/]+\/$/, include: ".td-post-content img", init: () => { let ele = fun.ge("//p[br and not(contains(text(),'[ad_1]'))]"); if (ele) { ele = ele.cloneNode(true); [...fun.gae("img", ele)].forEach(img => img.remove()); let tE = fun.ge(".td-post-content"); tE.parentNode.insertBefore(ele, tE); } let ele2 = fun.ge("//p[contains(text(),'Number of pictures')]"); if (ele2) { if (ele2.previousSibling.tagName == "P") { ele2.previousSibling.innerHTML = ele2.previousSibling.innerHTML + "<br>" + ele2.innerText; let e = ele2.previousSibling; let te = ele2.previousSibling.parentNode; te.parentNode.insertBefore(e, te); } } }, imgs: () => { if (fun.ge(".page-nav")) { let max = fun.geT(".page-nav>*:last-child", 2); return fun.getImg(".td-post-content img", max, 4); } else if (fun.ge(".td-post-content img[srcset]")) { let srcs = [...fun.gae(".td-post-content img[src]")].map(e => e.src); let srcsets = [...fun.gae(".td-post-content img[srcset]")].map(img => { let splitArr = img.getAttribute("srcset").split(","); splitArr = splitArr.sort((a, b) => a.match(/\s(\d+)w/)[1] - b.match(/\s(\d+)w/)[1]); return splitArr.pop().trim().split(" ")[0]; }); return [...new Set(srcs.concat(srcsets))]; } else { return [...fun.gae(".td-post-content img")]; } }, button: [4], insertImg: [".td-post-content .tdb-block-inner", 2], go: 1, customTitle: () => fun.geT("h1.tdb-title-text"), css: ".tdb_header_menu .tdb-menu .tdb-mega-menu-inactive,.tdb_header_menu .tdb-menu .tdb-menu-item-inactive{pointer-events:auto!important}.tdb_header_menu .tdb-menu .tdb-mega-menu-inactive > ul,.tdb_header_menu .tdb-menu .tdb-menu-item-inactive>ul{visibility:unset!important;opacity:1!important}.tdb_header_menu .tdb-normal-menu ul .tdb-menu-item{list-style-type:auto!important}", category: "nsfw1" }, { name: "Models Vibe - 分類自動翻頁", host: ["www.modelsvibe.com"], reg: /^https?:\/\/www\.modelsvibe\.com\/(albums\/.+)?(page\/\d+\/)?$/, init: () => { /page\/\d+\//.test(location.pathname) ? currentPageNum = parseInt(location.pathname.match(/\/page\/(\d+)/)[1], 10) : currentPageNum = 1; }, autoPager: { ele: ".td_flex_block:not(.td-flex-radius),.td_block_inner.tdb-block-inner", observer: ".td-cpt-post", next: () => { let url = siteUrl.replace(/page\/\d+\/?/, "") + `page/${currentPageNum += 1}/`; return url; }, re: ".page-nav", stop: doc => fun.ge(".td-404-title", doc) ? true : false, history: 1, bF: doc => { [...fun.gae("span[data-img-url]", doc)].forEach(span => { span.classList.add("td-animation-stack-type0-2"); span.style.backgroundImage = `url('${span.dataset.imgUrl}')`; }); }, title: doc => "Page " + currentPageNum }, openInNewTab: ".td-cpt-post a:not([target=_blank])", css: ".tdi_60.td-a-rec{display:none!important;}.tdb_header_menu .tdb-menu .tdb-mega-menu-inactive,.tdb_header_menu .tdb-menu .tdb-menu-item-inactive{pointer-events:auto!important}.tdb_header_menu .tdb-menu .tdb-mega-menu-inactive > ul,.tdb_header_menu .tdb-menu .tdb-menu-item-inactive>ul{visibility:unset!important;opacity:1!important}.tdb_header_menu .tdb-normal-menu ul .tdb-menu-item{list-style-type:auto!important}", category: "autoPager" }, { name: "Models Vibe - 修正選單CSS和去廣告", host: ["www.modelsvibe.com"], reg: /^https?:\/\/www\.modelsvibe\.com\//, css: ".tdi_60.td-a-rec{display:none!important;}.tdb_header_menu .tdb-menu .tdb-mega-menu-inactive,.tdb_header_menu .tdb-menu .tdb-menu-item-inactive{pointer-events:auto!important}.tdb_header_menu .tdb-menu .tdb-mega-menu-inactive > ul,.tdb_header_menu .tdb-menu .tdb-menu-item-inactive>ul{visibility:unset!important;opacity:1!important}.tdb_header_menu .tdb-normal-menu ul .tdb-menu-item{list-style-type:auto!important}", category: "autoPager" }, { name: "Goddess247/BestPrettyGirl", host: ["goddess247.com", "bestprettygirl.com"], reg: /(goddess247|bestprettygirl)\.com\/(?!tag).+\//, imgs: ".elementor-widget-container p img[alt]", button: [4], insertImg: ["//p[img]", 2], go: 1, customTitle: async () => { let ele = "#content h1.elementor-heading-title"; await fun.waitEle(ele); return fun.geT(ele); }, fancybox: { v: 3, css: false }, category: "nsfw1" }, { name: "BestGirlSexy", host: ["bestgirlsexy.com"], reg: /bestgirlsexy\.com\/(?!tag).+\//, imgs: ".elementor-widget-theme-post-content img", button: [4], insertImg: ["//p[img]", 2], go: 1, customTitle: async () => { let ele = "#content h1.elementor-heading-title"; await fun.waitEle(ele); return fun.geT(ele); }, fancybox: { v: 3, css: false }, category: "nsfw1" }, { name: "eyval.net", host: ["www.eyval.net"], reg: /^https?:\/\/www\.eyval\.net\/\d+\/\d+\/[\w-]+\.html/, imgs: async () => { let imgsSrcArr = [...fun.gae(".entry-content a[href*=blog]")].map(a => { let arr = a.href.split("/"); if (arr.length === 9) { arr[7] = "s16000"; return arr.join("/"); } else { return a.href; } }); thumbnailsSrcArray = imgsSrcArr.map(e => e.replace("/s16000/", "/w100/")); return imgsSrcArr; }, button: [4], insertImg: [".entry-content", 2], customTitle: () => fun.geT(".entry-title"), category: "nsfw1" }, { name: "eyval.net - 分類自動翻頁", host: ["www.eyval.net"], reg: /^https?:\/\/www\.eyval\.net\//, autoPager: { mode: 1, ele: ".blog-posts>.date-outer", next: "a.blog-pager-older-link", observer: ".blog-posts>.date-outer", re: "#blog-pager", stop: doc => fun.ge(".date-outer", doc) ? false : true, history: 1, title: () => "Page" + (currentPageNum += 1) }, openInNewTab: ".date-outer a[href]:not([target=_blank])", category: "autoPager" }, { name: "PhimVu", host: ["m.phimvuspot.com"], reg: /m\.phimvuspot\.com\/\d+\/\d+\/[\w-]+\.html/, imgs: ".separator>a", button: [4], insertImg: [".post-content", 2], customTitle: () => fun.geT("h1.post-title").replace(/\s?\(\d+\s?photos(\s?\+\s?\d+\s?videos?)?\)/i, ""), category: "nsfw1" }, { name: "Chinese Nude Art Photos", host: ["chinesenudeart.blogspot.com"], reg: /^https?:\/\/chinesenudeart\.blogspot\.com\/\d+\/\d+\/[\w-]+\.html/i, imgs: () => { thumbnailsSrcArray = [...fun.gae(".entry-content a[href]>img")].map(e => e.src); return [...fun.gae(".entry-content a[href]")]; }, button: [4], insertImg: [".entry-content", 2], autoDownload: [0], next: "a.blog-pager-older-link", prev: "a.blog-pager-newer-link", customTitle: () => fun.geT(".entry-title").trim().replace("Chinese beautiful model Amanda -", "").replace("Beautiful Chinese girl -", "").replace("Beautiful Chinese girl ", "").replace("Chinese Beautiful girl -", "").replace(" |18+ Nude model Amateur", ""), css: "@media only screen and (max-width:479px){#outer-wrapper{margin:0px!important;width:100%!important}}", category: "nsfw1" }, { name: "CUTE GIRLS ADDICT", host: ["cutegirlsaddict.blogspot.com"], reg: /cutegirlsaddict\.blogspot\.com\/\d+\/\d+\/[a-z0-9-]+\.html/i, imgs: async () => { thumbnailsSrcArray = [...fun.gae(".separator>a>img")].map(e => { let arr = e.src.split("/"); arr[7] = "w100"; return arr.join("/"); }); let srcArr = [...fun.gae(".separator>a")].map(a => a.href); let firstSrcArr = srcArr[0].split("/"); if (firstSrcArr.length === 9) { firstSrcArr[7] = "s16000"; let testMaxSrc = firstSrcArr.join("/"); let obj = await fun.checkImgStatus(testMaxSrc); debug("\n確認圖片狀態\n", obj); if (obj.ok) { srcArr = srcArr.map(src => { let arr = src.split("/"); arr[7] = "s16000"; return arr.join("/"); }); return srcArr; } else { return srcArr; } } else { return srcArr; } }, button: [4], insertImg: [".entry-content", 2], customTitle: () => fun.geT("h1.post-title,h3.entry-title").trim(), category: "nsfw1" }, { name: "4KUP", host: ["4kup.net"], reg: /^https?:\/\/4kup\.net\/(?!getlink)[^\/]+\/$/, exclude: "//button[text()='Click here to continue']", imgs: () => { thumbnailsSrcArray = [...fun.gae("a.thumb-photo>img")].map(e => e.src); return [...fun.gae("a.thumb-photo")]; }, button: [4], insertImg: ["#gallery", 2], go: 1, autoDownload: [0], next: "a[rel=prev]", prev: "a[rel=next]", customTitle: () => fun.geT(".entry-title"), category: "nsfw2" }, { name: "Imgasd", host: ["imgasd.com"], reg: /^https?:\/\/imgasd\.com\/article\/\d+$/, imgs: ".imgs>img[alt]", button: [4], insertImg: [".imgs", 2], customTitle: () => fun.geT(".content>h1"), category: "nsfw1" }, { name: "Fliporn", host: ["fliporn.biz"], reg: /fliporn\.biz\/videos\//, include: "//span[@class='entry-category']/a[text()='亚洲贴图' or text()='写真' or text()='动漫贴图' or text()='性感贴图' or text()='欧美贴图' or text()='网友自拍']", imgs: () => [...fun.gae(".entry-content img")].map(e => e.dataset.src ? e.dataset.src.replace(/\?w=858(&ssl=1)?/, "") : e.src.replace("%3C/center%3E%3C/p%3E%3Cdiv%20class=", "").replace(/\?w=858(&ssl=1)?/, "")), button: [4], insertImg: ["//center[img] | //center[p[img]] | //div[@id='conttpc' and img] | //div[@id='conttpc' and p[img]]", 2], customTitle: () => document.title.replace(/\s?\[[0-9p\s]+\]|\[\d+P\]/i, "").trim(), category: "nsfw2" }, { name: "91图录", host: ["www.91tulu.com"], reg: /^https?:\/\/www\.91tulu\.com\/\d+\.html/, imgs: ".wp-posts-content img", button: [4], insertImg: [".wp-posts-content", 2], autoDownload: [0], next: "//a[p[text()='上一篇']]", prev: "//a[p[text()='下一篇']]", customTitle: () => fun.geT(".article-title"), css: ".wp-posts-content{max-height:unset!important}", category: "nsfw1" }, { name: "萌妹社区", host: ["www.mmav.me"], link: "https://www.mmav.me/photo/", reg: /^https?:\/\/www\.mmav\.me\/photo\/\d+\.html/, imgs: () => { thumbnailsSrcArray = [...fun.gae(".imglist img[data-original]")].map(e => location.origin + e.dataset.original); return thumbnailsSrcArray.map(e => e.replace(/_t(\.\w+)$/, "$1")); }, button: [4], insertImg: [".main.warp.row", 2], customTitle: () => fun.geT(".play-title").replace(/_?(\s-\s)?\(\d+P\)/i, ""), css: "#top-img-list,#tonglanad_t1,#ajdjs{display:none!important}body{padding-bottom:0px!important}", category: "nsfw2" }, { name: "萌妹社区去廣告", host: ["www.mmav.me"], reg: /^https?:\/\/www\.mmav\.me\//, css: "#top-img-list,#tonglanad_t1,#ajdjs{display:none!important}", category: "ad" }, { name: "人妻租借所", host: ["jingunav.info"], reg: /jingunav\.info\/index\.php\/artdetail-\d+\.html/, imgs: ".embed-responsive img", button: [4], insertImg: [".embed-responsive", 2], customTitle: () => fun.title(/ - 貼圖| - 歐美美女/, 1).replace(/【\d+P】\s?\n?/i, "").replace(/\s?完整版無水印寫真/, ""), css: "body>.wrap{display:none!important}.player img{max-width:100% !important}", category: "nsfw2" }, { name: "麻豆村/糖心vlog", host: ["madoucun.com", "tangxvlog.com"], link: "https://madoucun.com/arttype/57.html,https://tangxvlog.com/arttype/57.html", reg: /^https?:\/\/(madoucun\.com|tangxvlog\.com)\/artdetail-\d+\.html/, include: ".hl-article-box img", imgs: ".hl-article-box img", button: [4], insertImg: [".hl-article-box", 2], customTitle: () => fun.geT("hl-article-title"), category: "nsfw2" }, { name: "淫淫小说写真馆", host: ["books.xxgirls.vip"], reg: /^https?:\/\/books\.xxgirls\.vip\/artdetail-\d+\//, imgs: "#read_tpc img", button: [4], insertImg: ["#read_tpc", 2], autoDownload: [0], next: ".hl-next", prev: ".hl-prev", customTitle: () => fun.geT(".hl-article-title"), category: "nsfw2" }, { name: "ACGN小鎮", host: ["www.bbsacgn.com"], reg: /www\.bbsacgn\.com\/archives\/\d+/, imgs: ".entry-content img", button: [4], insertImg: ["//p[img]", 0], autoDownload: [0], next: ".entry-page-prev", prev: ".entry-page-next", customTitle: () => fun.geT("h1.entry-title"), fancybox: { blacklist: 1 }, category: "nsfw1" }, { name: "皮皮动漫社", host: ["pipidm.top", "www.pipidm.top"], reg: /pipidm\.top\/\d+\.html/, imgs: ".content_left img", button: [4], insertImg: ["//p[img]", 2], autoDownload: [0], next: ".entry-page-prev", prev: ".entry-page-next", customTitle: () => fun.geT("h1.entry-title"), fancybox: { v: 3, css: false }, category: "nsfw1" }, { name: "成人图片 Qinimg", host: ["www.qinimg.com"], reg: /www\.qinimg\.com\/image\/\d+\.html/, imgs: () => { thumbnailsSrcArray = [...fun.gae("#image a>img")].map(e => e.getAttribute("img") != "" ? e.getAttribute("img") : e.src); return [...fun.gae("#image a")]; }, button: [4], insertImg: [ ["#image", 2], 2 ], go: 1, customTitle: () => fun.geT(".box>h1").replace(/\[\d+P\]/i, "").trim(), category: "nsfw2" }, { name: "零零COS", host: ["00cos.com"], reg: /00cos\.com\/\d+\.html/, exclude: ".tinymce-hide,.fa-info-circle[aria-hidden=true]", imgs: ".article-content img", customTitle: () => fun.geT(".article-title>a").replace(/\s?\[\d+P-\d+MB\]|\s\[\d+P\s?\d+V\s?\d+M\]\s?/gi, "").trim(), category: "nsfw1" }, { name: "Elite Babes格式", host: ["www.elitebabes.com", "pmatehunter.com", "www.jperotica.com", "www.metarthunter.com", "www.femjoyhunter.com"], reg: /(www\.)?(elitebabes|pmatehunter|jperotica|metarthunter|femjoyhunter)\.com\/.+\//, exclude: "#content video", imgs: () => { thumbnailsSrcArray = [...fun.gae(".list-gallery a[data-fancybox]>img")].map(e => e.src); return [...fun.gae(".list-gallery a[data-fancybox]")]; }, button: [4, "23%"], insertImg: [ [".list-gallery", 2], 2 ], go: 1, customTitle: () => fun.geT("#content>p"), fancybox: { v: 3, css: false }, category: "nsfw2" }, { name: "NSFWalbum", host: ["nsfwalbum.com"], reg: /^https?:\/\/nsfwalbum\.com\/album\/\d+$/, imgs: () => { thumbnailsSrcArray = [...fun.gae(".albumPhoto")].map(e => e.dataset.src ?? e.src); fun.showMsg(displayLanguage.str_05, 0); let fetchNum = 0; let resArr = [...fun.gae(".album .item>a")].map((a, i, arr) => { let img = fun.ge("img", a); let src = img.dataset.src ?? img.src; if (/imx\.to/.test(src)) { return src.replace("/t/", "/i/"); } else { return fetch(a.href).then(res => res.text()).then(text => { let id = a.href.split("/").pop(); let spirit = fun.run(text.match(/var\sspirit\s?=\s?([^;]+);/)[1]); let api = `https://nsfwalbum.com/backend.php?&spirit=${spirit}&photo=${id}`; return fetch(api).then(res => res.json()).then(json => { fun.showMsg(`${displayLanguage.str_06}${fetchNum+=1}/${arr.length}`, 0); return json[0]; }); }); } }); return Promise.all(resArr).then(data => { fun.hideMsg(); return data; }); }, button: [4], insertImg: [ [".album", 0], 2 ], go: 1, customTitle: () => fun.geT(".gallery_name"), category: "nsfw2" }, { name: "Good Sex Porn", host: ["goodsexporn.org"], reg: /^https?:\/\/goodsexporn\.org\/galleries\/\d+\.html/, init: () => { [...fun.gae("#gallery>*:not(#galleryImages)")].forEach(e => { let x = e.parentNode.parentNode.parentNode.nextElementSibling; x.parentNode.insertBefore(e, x); }); }, imgs: () => { thumbnailsSrcArray = [...fun.gae("#galleryImages>.blockItem img")].map(e => e.dataset.src ?? e.src).sort((a, b) => a.match(/(\d+)\.\w+$/)[1] - b.match(/(\d+)\.\w+$/)[1]); return thumbnailsSrcArray.map(e => e.replace("thumbs/", "")); }, button: [4], insertImg: [".content", 2], customTitle: () => fun.geT(".player-title"), css: "@media only screen and (max-width:450px){.related-block .block .blockItem.blockItemBox{width:120px !important}.block .blockItem{display:inline-block !important}}", category: "nsfw2" }, { name: "R18hub", host: ["r18hub.com"], link: "https://r18hub.com/photos", reg: /^https?:\/\/r18hub\.com\/photo\/[\w-]+/, imgs: () => { thumbnailsSrcArray = [...fun.gae("#photos>li")].map(e => e.dataset.thumb); return [...fun.gae("#photos>li")].map(e => e.dataset.src); }, button: [4], insertImg: ["#photos", 2], customTitle: () => fun.title(" - R18hub"), category: "nsfw2" }, { name: "ZzUp.Com", host: ["zzup.com"], link: "https://zzup.com/user-album/3338/petmer/index.html", reg: /^https?:\/\/zzup\.com\/content\/.+index\.html/i, init: () => fun.remove("iframe[src*='ad'],font[color=red]"), imgs: async () => { let max; try { max = fun.ge(".imgpagebar>a:last-child").href.match(/page-(\d+)/)[1]; } catch (e) { max = 1; } if (max > 1) { let links = []; let url = siteUrl.replace("index.html", ""); for (let i = 2; i <= max; i++) { links.push(url + "page-" + i + ".html"); } await fun.getEle(links, "//div[div[@class='picbox']]", ["//div[div[div[@class='picbox']]]", 0]); } thumbnailsSrcArray = [...fun.gae(".picbox img")].map(img => img.src); let links = [...fun.gae(".picbox>a")].map(a => a.href); return fun.getImgA("//main//a[img]", links, 100); }, button: [4], insertImg: [ ["//div[div[div[@class='picbox']]]", 2], 2 ], go: 1, customTitle: () => fun.title(" - ZzUp.Com").replace(/\[\d+[\w\s\.\+]+\]/i, ""), category: "nsfw2" }, { name: "ZzUp.Com 分類自動翻頁", enable: 1, reg: /^https?:\/\/zzup\.com\//, init: () => fun.remove("iframe[src*='ad']"), autoPager: { ele: "//div[div[@class='picbox']]", observer: "//div[div[@class='picbox']]", next: "//a[h3[span[@class='glyphicon glyphicon-arrow-right']]]", re: "//div[div[@class='imgpagebar']]", history: 1, title: () => "Page" + nextLink.match(/page-(\d+)/)[1] }, category: "autoPager" }, { name: "FreeXcafe", host: ["www.freexcafe.com"], reg: /www\.freexcafe\.com\/erotica\/[\w-]+\/[\w-]+\/index\.php/, imgs: () => { thumbnailsSrcArray = [...fun.gae(".thumbs>a>img")].map(e => e.src); return fun.getImgA("#imagelink>img", ".thumbs>a", 500); }, button: [4], insertImg: [ ["#content>*:last-child", 2], 2 ], go: 1, category: "nsfw2" }, { name: "EPORNER Photo", host: ["www.eporner.com"], link: "https://www.eporner.com/profile/namaiki/,https://www.eporner.com/profile/janekhansen/", reg: /\w{2,3}\.eporner\.com\/gallery\/.+\//, imgs: () => { thumbnailsSrcArray = [...fun.gae("#container img")].map(e => e.src); return thumbnailsSrcArray.map(e => e.replace("_296x1000", "")); }, button: [4], insertImg: [ [".photosgrid", 2], 2 ], go: 1, customTitle: () => fun.geT("#galleryheader>h1"), css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}", category: "nsfw2" }, { name: "Asian Porn", host: ["asianporn.li"], link: "https://asianporn.li/photos/", reg: /^https?:\/\/asianporn\.li\/photo\/\d+\/[^\/]+\/$/i, imgs: () => { thumbnailsSrcArray = [...fun.gae(".photos img.thumb")].map(e => e.dataset.src ?? e.src); return fun.getImgA("#image .img-reponsive", ".photos a"); }, button: [4], insertImg: [ [".photos", 2], 2 ], go: 1, customTitle: () => fun.geT(".content-title"), category: "nsfw2" }, { name: "Xasiat", host: ["www.xasiat.com"], link: "https://www.xasiat.com/albums/", reg: /www\.xasiat\.com\/([\w]{2}\/)?albums\/\d+\/[\w-]+\//i, init: () => { [...fun.gae("img.thumb[data-original]")].forEach(img => img.src = img.dataset.original); fun.remove(".sponsor,.footer-margin"); }, imgs: () => { thumbnailsSrcArray = [...fun.gae(".images>a>img[data-original]")].map(e => e.dataset.original ?? e.src); return [...fun.gae(".images>a")]; }, button: [4], insertImg: [ [".album-holder", 2], 2 ], go: 1, customTitle: () => fun.geT(".headline>h1"), css: ".block-album{display:block!important}.block-album>.table,.top,.footer~*:not([id^='pv-']):not([class^='pv-']):not(.pagetual_tipsWords):not(#comicRead):not(#fab):not(.FullPictureLoadMsg):not(.FullPictureLoadFixedBtn):not(#FullPictureLoadOptions):not(*[class^=fancybox]){display:none!important}", category: "nsfw2" }, { name: "Xasiat loadMore", host: ["www.xasiat.com"], link: "https://www.xasiat.com/albums/", reg: /www\.xasiat\.com\/albums\//, include: "#list_albums_common_albums_list_pagination", init: () => { setInterval(() => { fun.remove("//div[iframe] | //iframe"); if (document.body.getAttribute("class").length > 13) { document.body.setAttribute("class", "big-container"); } }, 500); }, observerClick: ".load-more>a", openInNewTab: ".list-albums a:not([target=_blank])", category: "ad" }, { name: "Xasiat去廣告", host: ["www.xasiat.com"], link: "https://www.xasiat.com/albums/", reg: /(www\.xasiat\.com\/albums\/$|www\.xasiat\.com\/albums\/categories\/)/, init: () => { [...fun.gae("img.thumb[data-original]")].forEach(img => img.src = img.dataset.original); fun.remove(".footer~*", 2000); }, css: ".footer~*{display:none!important}", category: "ad" }, { name: "Erotic Pics", host: ["erotic.pics"], reg: /^https:\/\/erotic\.pics\/[^\/]+\/$/, include: ".entry-content img", imgs: ".entry-content img", button: [4], insertImg: [".entry-content", 2], customTitle: () => fun.geT(".entry-title").replace(/\s–\s\d+\spics/, ""), category: "nsfw2" }, { name: "Erotic Pics 分類自動翻頁", enable: 1, reg: /^https:\/\/erotic\.pics\//, autoPager: { ele: "#masonry", observer: "#masonry>article", next: "span.current+a", re: ".wp-pagenavi", title: (doc) => "Page " + fun.geT("span.current", 1, doc), history: 1 }, openInNewTab: "a.entry-thumbnail:not([target=_blank])", category: "autoPager" }, { name: "xHamster gallery", host: ["xhamster.com"], link: "https://zh.xhamster.com/users/eros721_official/photos", reg: /xhamster\.com\/photos\/gallery\/[^/]+$/, include: ".gallery-section", imgs: async () => { await fun.getNP(".photo-thumb", "//div[@class='gallery-section']//li[a[contains(@class,'active')]]/following-sibling::li[1]/a", null, ".gallery-section .pager-section"); thumbnailsSrcArray = [...fun.gae("div.image-thumb[data-lazy]")].map(e => e.dataset.lazy); [...fun.gae(".photo-thumb")].forEach(ele => { let width, height; if (parseInt(ele.dataset.w, 10) > parseInt(ele.dataset.h, 10)) { width = 374; height = 251; } else { width = 168; height = 251; } ele.style = `margin-right:10px;width:${width}px;height:${height}px;display:block;`; fun.ge(".dots-loader", ele).remove(); let thumb = fun.ge(".image-thumb", ele); thumb.style.backgroundImage = `url('${thumb.dataset.lazy}')`; }); let links = [...fun.gae("a.photo-thumb")].map(a => a.href); let resArr = []; let fetchNum = 0; for (let i = 0; i < links.length; i += 3) { let res = fun.fetchDoc(links[i]).then(doc => { fun.showMsg(`${displayLanguage.str_06}${fetchNum+=1}/${Math.ceil(links.length/3)}`, 0); let items = JSON.parse(fun.ge("#initials-script", doc).innerHTML.replace(/window.initials=|;/g, "")).photosGalleryModel.photos.items; return items; }); resArr.push(res); await fun.delay(300, 0); } let imageURLs = await Promise.all(resArr).then(data => { fun.hideMsg(); return data.flat().map(e => e.imageURL); }); return [...new Set(imageURLs)]; /* const callback = async n => { let resArr = []; let fetchNum = 0; for (let i = n; i < links.length; i += 16) { let res = fun.fetchDoc(links[i]).then(doc => { fun.showMsg(`${displayLanguage.str_06}${fetchNum+=1}/${Math.ceil(links.length/16)}`, 0); let items = JSON.parse(fun.ge("#initials-script", doc).innerHTML.replace(/window.initials=|;/g, "")).photosGalleryModel.photos.items; return items; }); resArr.push(res); await fun.delay(300, 0); } let imageURLs = await Promise.all(resArr).then(data => { fun.hideMsg(); return data.flat().map(e => e.imageURL); }); debug(`\n起始為第${parseInt(n, 10) + 1}張圖片的imageURLs\n`, imageURLs); debug(`\n起始為第${parseInt(n, 10) + 1}張圖片去重複後的imageURLs\n`, [...new Set(imageURLs)]); return imageURLs; }; for (let i = 0; i <= 16; i++) { if (i == 16) { return []; } let images = await callback(i); if (parseInt(images.length, 10) === parseInt(fun.geT(".page-title__count"), 10)) { return images; } else if (parseInt(images.length, 10) < 16) { console.clear(); let one = await callback(0); let concat = one.concat(images); debug(`\n起始為第${parseInt(i, 10) + 1}張圖片的imageURLs\n`, images); debug(`\n起始為第${parseInt(i, 10) + 1}張圖片並合併起始為1的imageURLs\n`, concat); debug(`\n合併後去重複的imageURLs\n`, [...new Set(concat)]); return concat; } else { fun.showMsg("圖片數量不正確重新獲取", 1900); await fun.delay(2000, 0); } } return []; */ }, init: "fun.remove('.mixed-list>.flex-element')", button: [4], insertImg: [ ["main>article", 2], 2 ], go: 1, customTitle: () => fun.geT(".page-title h1"), css: "div[data-role=promo-messages-wrapper]{display:none!important}", category: "nsfw2" }, { name: "xHamsterM gallery", host: ["xhamster.com"], reg: /xhamster\.com\/photos\/gallery\/[^/]+$/, imgs: async () => { await fun.getNP(".items[data-role='gallery-photos']>.item-container", "//ol[@class='page-list']/li[@class='page-button' and a[@class='page-button-link page-button-link--active']]/following-sibling::li[1]/a", null, "//ol[@class='page-list']"); return fun.getImgA("#photoCurr", "a.item.slided", 1, [null, null], 0); }, button: [4], insertImg: [".items[data-role=gallery-photos]", 1], customTitle: () => fun.geT("h1.page-title"), css: ".items[data-role=gallery-photos]>.item-container{width:100%!important}aside[data-role=yld-mdtop],.yld-md--bottom,.yld-pc--bottom,aside[data-role=yld-pctop],div[data-role=promo-messages-wrapper]{display:none!important}", category: "nsfw2" }, { name: "PornHub photo", //很容易會被短暫封IP host: ["pornhub.com"], link: "https://pornhub.com/albums", enable: 1, reg: /pornhub\.com\/album\/\d+/, imgs: () => fun.getImgA("#photoImageSection img", ".js_lazy_bkg a", 200), button: [4], insertImg: [ [".photoBlockBox .clear", 1], 1 ], go: 1, customTitle: () => fun.geT(".photoAlbumTitleV2").trim(), category: "nsfw2" }, { name: "BITCHES GIRLS", host: ["bitchesgirls.com"], reg: /^https?:\/\/bitchesgirls\.com\/[^\/]+\/[^\/]+\/[^\/]+\/$/, imgs: async () => { await fun.getNP(".albumgrid a", "a#loadMore"); const selector = "script[type='application/ld+json']"; const getUrls = (ele, doc) => { let text = fun.ge(ele, doc).innerText; let thumbnailUrls = text.match(/"thumbnailUrl":\s?"[^"]+/g).map(e => e.replace(/"thumbnailUrl":\s?"/, "")).filter(e => !/\/logos\//.test(e)); thumbnailsSrcArray = thumbnailsSrcArray.concat(thumbnailUrls); let urls = text.match(/"url":\s?"[^"]+/g).map(e => e.replace(/"url":\s?"/, "")); return urls.filter(e => !/\/logos\//.test(e)); } const max = adConstants.pagesAmount; if (max > 1) { let links = []; links.push(siteUrl); for (let i = 2; i <= max; i++) { links.push(siteUrl + `${i}/`); } let fetchNum = 0; let resArr = links.map((url, i, arr) => { return fun.fetchDoc(url).then(doc => { fun.showMsg(`${displayLanguage.str_06}${fetchNum+=1}/${max}`, 0); return getUrls(selector, doc); }); }); return Promise.all(resArr).then(data => { fun.hideMsg(); return data.flat(); }); } else { return getUrls(selector, document); } }, repeat: 1, button: [4], insertImg: [ [".button-container", 2], 2 ], go: 1, css: "a#loadMore{display:none!important}", category: "nsfw2" }, { name: "EroMe", host: ["www.erome.com"], reg: /^https?:\/\/www\.erome\.com\/a\/\w+$/i, imgs: "div[data-src],.img>img[data-src]", customTitle: () => fun.geT(".page-content h1"), category: "nsfw2" }, { name: "DirtyChicks", host: ["dirtychicks.net"], reg: /^https?:\/\/dirtychicks\.net\/gallery\/[^\/]+\/$/i, imgs: () => [...fun.gae("#album img")].map(e => e.src.replace(/-\d+x\d+./, ".")), button: [4], insertImg: [".gallery_grid", 2], customTitle: () => fun.title(" - DirtyChicks"), category: "nsfw2" }, { name: "Amateur Likes", host: ["amateurlikes.com"], reg: /^https?:\/\/amateurlikes\.com\/n\/[^\/]+\/\d+$/i, imgs: "#gallery img", button: [4], insertImg: ["#gallery .masonry", 2], customTitle: () => fun.geT(".full_h1").replace(/\([\d\s]+Photos\)/i, "").trim(), css: "#gallery .masonry{display:block!important}", category: "nsfw2" }, { name: "Nakedsex", host: ["nakedsex.pics"], reg: /^https?:\/\/nakedsex\.pics\/.+\.php$/i, imgs: ".gallerycontent a", button: [4], insertImg: [ [".tags", 2], 2 ], go: 1, customTitle: () => fun.title(" - Best adult videos and photos"), css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}", category: "nsfw2" }, { name: "Onlyfans Leaks", host: ["topleaks.net"], reg: /^https?:\/\/topleaks\.net\/[^\/]+\/$/i, imgs: () => [...fun.gae(".entry-content img")].map(e => e.src.replace(/-\d+x\d+./, ".")), customTitle: () => fun.geT(".entry-title"), category: "nsfw2" }, { name: "ThotHub Leaks", host: ["thothub.vip"], reg: /^https?:\/\/thothub\.vip\/[^\/]+\/$/i, imgs: ".entry-content img", customTitle: () => fun.geT(".entry-title").replace(/\([\d\s]+Photos\)/i, "").trim(), category: "nsfw2" }, { name: "MrDeepFakes", host: ["mrdeepfakes.com"], reg: /^https?:\/\/mrdeepfakes\.com\/photo\/\d+\//, init: () => { fun.remove(".player-adv"); fun.ge(".page-columns").classList.remove("page-columns"); }, imgs: () => { if (fun.ge("#album_view_album_view_pagination")) { fun.showMsg(displayLanguage.str_05, 0); let max = parseInt(fun.geT("//li[@class='next action-item']/preceding-sibling::li[1]//span[@class='text']"), 10); let fetchNum = 0; let resArr = fun.arr(max).map((_, i) => { let url = siteUrl + "?mode=async&function=get_block&block_id=album_view_album_view&sort_by=&from=" + (i + 1); return fun.fetchDoc(url).then(doc => { fun.showMsg(`${displayLanguage.str_06}${fetchNum+=1}/${max}`, 0); return [...fun.gae("a[data-fancybox-type=image]", doc)].map(a => { let img = fun.ge("img", a); return { original: a.href, thumbnail: img.dataset.original ?? img.src } }); }); }); return Promise.all(resArr).then(arr => { fun.hideMsg(); thumbnailsSrcArray = arr.flat().map(e => e.thumbnail); return arr.flat().map(e => e.original); }); } else { thumbnailsSrcArray = [...fun.gae(".content img.thumb")].map(e => e.dataset.original ?? e.src); return [...fun.gae("a[data-fancybox-type=image]")]; } }, button: [4], insertImg: ["#album_view_album_view", 2], viewMode: 1, customTitle: () => fun.geT(".player-title"), category: "nsfw2" }, { name: "PicHunter", host: ["www.pichunter.com"], reg: /www\.pichunter\.com\/gallery\/\d+\/.+/, imgs: () => { thumbnailsSrcArray = [...fun.gae(".flex-images figure>a>img")].map(e => e.getAttribute("xs")); return [...fun.gae(".flex-images figure>a")]; }, button: [4], insertImg: [ [".flex-images", 2], 1 ], go: 1, customTitle: () => fun.geT("h1"), category: "nsfw2" }, { name: "Pictoa", host: ["www.pictoa.com"], reg: /www\.pictoa\.com\/(thumbs|albums)\/.+\.html/i, imgs: () => { thumbnailsSrcArray = [...fun.gae(".thumb-nav-img img")].map(e => e.dataset.src); return fun.getImgA("#player img", ".thumb-nav-img a"); }, button: [4], insertImg: ["#player", 2], customTitle: () => fun.geT(".title>h1"), css: "#gallery #player{cursor:unset!important}", category: "nsfw2" }, { name: "PimpAndHost", host: ["pimpandhost.com"], link: "https://pimpandhost.com/site/trending", reg: /pimpandhost\.com\/(image|album)\/\d+/, init: () => { if (/image/.test(location.href)) location.href = fun.ge('a[title=Album]').href; fun.remove(".flex-block-1,.flex-block-2,#comments,.ano_po"); }, imgs: async () => { await fun.getNP("#album-images>.image-block", "li.active+li:not(.next)>a", null, ".pagination"); return [...fun.gae("#album-images .image-block a[data-src]")]; }, button: [4, "18%"], insertImg: [ [".summary", 2], 2 ], go: 1, customTitle: () => fun.geT(".author-header__album-name"), category: "nsfw2" }, { name: "PimpAndHost 隱藏廣告", reg: /pimpandhost\.com\//, init: "fun.remove('.flex-block-1,.flex-block-2,#comments,.ano_po')", css: ".list-view:not(#main-list-view) .item:not(.image-block){display:none!important}", category: "ad" }, { name: "BabeSource", host: ["babesource.com"], reg: /babesource\.com\/galleries\/.+\.html/i, imgs: ".box-massage__card-link", button: [4], insertImg: [ [".albaums-box", 1], 2 ], go: 1, customTitle: () => fun.title("|", 1), category: "nsfw2" }, { name: "Pornpaw 圖片清單頁", host: ["www.pornpaw.com"], reg: /www\.pornpaw\.com\/gallery\/[\w-]+\.html/i, delay: 500, imgs: () => { thumbnailsSrcArray = [...fun.gae("img[data-src]")].map(e => e.dataset.src); return [...fun.gae("img[data-src]")].map(e => e.dataset.src.replace("x160.", ".")); }, button: [4], insertImg: [ [".container>.row", 2], 2 ], go: 1, customTitle: () => fun.geT("h1"), category: "nsfw2" }, { name: "ImageFap 圖片清單頁", reg: /www\.imagefap\.com\/(gallery|pictures)\/\d+/i, init: () => fun.getNP("//tr[td[@id]]", "b+a.link3", null, "#gallery>font>span", 100, null, 0), category: "autoPager" }, { name: "ImageFap", host: ["www.imagefap.com"], reg: /www\.imagefap\.com\/photo\/\d+\//i, init: () => { fun.remove("//td[div[@id='main']]/following-sibling::td[1] | //div[iframe]"); fun.ge("#main").removeAttribute("style"); fun.ge("//table[@width='750']").width = "1000"; }, imgs: async () => { let max = parseInt(fun.attr("div[data-total]", "data-total"), 10); let pages = Math.ceil(max / 24); let m = siteUrl.match(/\/photo\/(\d+).+gid=(\d+)/); let pid = m[1]; let gid = m[2]; let resArr = []; let fetchNum = 0; fun.showMsg(displayLanguage.str_05, 0); for (let i = 0; i < max; i += 24) { let url = `${location.origin}/photo/${pid}/?gid=${gid}&idx=${i}&partial=true`; let res = await fun.fetchDoc(url).then(doc => { fun.showMsg(`${displayLanguage.str_06}${fetchNum+=1}/${pages}`, 0); if (!fun.ge(".thumbs a", doc)) { alert("Encountered human-machine verification"); window.location.href = siteUrl; } return [...fun.gae(".thumbs a", doc)].map(a => { let original = a.href; let thumb = fun.ge("img", a).src; return { original: original, thumb: thumb } }); }); resArr.push(res); await fun.delay(1000, 0); } return Promise.all(resArr).then(data => data.flat()).then(arr => { let thumbs = arr.map(e => e.thumb); thumbnailsSrcArray = thumbs; let originals = arr.map(e => e.original); return originals; }); }, button: [4], insertImg: ["//td[div[@id='slideshow']]", 2], customTitle: () => fun.geT("#main h1"), threading: 8, category: "nsfw2" }, { name: "Fuskator 圖片清單頁", host: ["fuskator.com"], reg: /fuskator\.com\/thumbs\/[\w-~]+\/[\w-~]+\.html/i, imgs: async () => { fun.showMsg(displayLanguage.str_04, 0); await fun.waitEle(".pic_pad"); fun.hideMsg(); thumbnailsSrcArray = [...fun.gae("#thumbimages a>img,.swipebox a>img")].map(e => e.src); return [...fun.gae("#thumbimages a,.swipebox a")]; }, insertImg: [ ["//a[text()='View full images']", 2], 2 ], go: 1, //customTitle: "return fun.geT('#info+h1')", category: "nsfw2" }, { name: "Fuskator 大圖頁", host: ["fuskator.com"], reg: /^https?:\/\/fuskator\.com\//i, include: "//a[text()='View gallery thumbnails']", imgs: "img.full", insertImg: ["#fullimages", 2, 1000], category: "nsfw2" }, { name: "TOKYO Motion", host: ["www.tokyomotion.net"], link: "https://www.tokyomotion.net/albums", reg: /^https?:\/\/www\.tokyomotion\.net\/album\/\d+\/.+/, imgs: async () => { await fun.getNP("div[id^=album_photo]", ".pagination li.active+li>a", null, ".pagination"); thumbnailsSrcArray = [...fun.gae(".thumb-overlay img")].map(e => e.src); return thumbnailsSrcArray.map(e => e.replace("tmb/", "")); }, button: [4], insertImg: [ ["//div[div[div[contains(@id,'album_photo')]]]", 0], 2 ], go: 1, customTitle: () => [...fun.gae(".pull-left")][2].innerText.trim(), category: "nsfw2" }, { name: "JavBangers", host: ["javbangers.com"], reg: /www\.javbangers\.com\/albums\/.+/, imgs: async () => { thumbnailsSrcArray = [...fun.gae(".images img")].map(e => e.dataset.original ?? e.src); return [...fun.gae(".images a")]; }, button: [4], insertImg: [ [".album-info", 2], 2 ], go: 1, customTitle: () => fun.geT(".headline>h1").trim(), category: "nsfw2" }, { name: "multi.xnxx.com", host: ["multi.xnxx.com"], reg: /multi\.xnxx\.com\/gallery\/.+/, imgs: ".galleryPage .boxImg", button: [4], insertImg: [ [".originalLink", 2], 1 ], go: 1, category: "nsfw2" }, { name: "色情圖片網", host: ["www.photos18.com"], reg: /www\.photos18\.com\/(\w+-hans\/)?\w+\/\w+/i, imgs: ".imgHolder a[data-fancybox]", button: [4], insertImg: ["#content", 2], customTitle: () => fun.geT("h1.title").replace(/\d+P|\s?\(\d+P\)/i, ""), fancybox: { v: 3, css: false }, category: "nsfw2" }, { name: "趣事館", host: ["17sex.vip"], link: "https://17sex.vip/list/4858", reg: /^https?:\/\/17sex\.vip\/pic\/\d+$/i, imgs: () => { let max = fun.geT(".count-pageindex") || 1; return fun.getImg(".page>img", max, "4"); }, button: [4], insertImg: [ [".page", 0], 2 ], go: 1, customTitle: () => document.title.replace(/\[\d+[\w\s\.\+]+\]|\d+P$/i, ""), category: "nsfw2" }, { name: "GavPorn 相冊", host: ["cav103.com"], link: "https://cav103.com/albums/", reg: /cav\d+\.com\/albums\/\d+\/\w+\//, imgs: "a[data-fancybox-type]", button: [4], insertImg: [".sponsor", 2], customTitle: () => fun.geT(".headline>h1"), css: ".top{display:none!important}", category: "nsfw2" }, { name: "BuzzAV", host: ["www.buzzav.com"], reg: /old\.buzzav\.com\/album\/\d+\//, imgs: async () => { await fun.getNP("//div[a[div[img[contains(@id,'album_photo')]]]]", ".pagination li.active+li>a", null, ".d-sm-block>.pagination"); return [...fun.gae("[id^=album_photo]")].map(e => e.src.replace("tmb/", "")); }, button: [4], insertImg: [ [".well-info+.content-row", 2], 1 ], go: 1, //customTitle: "return fun.geT('.box>h1').replace(/\\[\\d+P\\]/i,'').trim();", //css: ".well-info+.content-row{display: block!important;}#FullPictureLoadEnd{color:rgb(255, 255, 255)}", css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}", category: "nsfw2" }, { name: "Hentai Image 單張", host: ["hentai-img.com", "hentai-cosplays.com", "porn-images-xxx.com", "porn-gravure-idol.com"], reg: /(hentai-img|hentai-cosplays|porn-images-xxx|porn-gravure-idol)\.com\/image\/[^/]+\//, include: "//a[text()='DETAIL PAGE' or text()='DETAIL HALAMAN' or text()='詳細へ' or text()='详细信息页面' or text()='Страница сведений' or text()='상세 페이지' or text()='página de detalles' or text()='หน้ารายละเอียด' or text()='TRANG CHI TIẾT']", imgs: async () => { let max = document.title.split("/").pop().match(/\d+/)[0]; let url = siteUrl.replace(/\/\d+\/$/, ""); let links = fun.arr(max).map((_, i) => url + `/${(i + 1)}/`); let imgSrcArray = await fun.getImgA("#display_image_detail a,#detail_list a", links, 100); thumbnailsSrcArray = imgSrcArray.map(e => { let arr = e.split("/"); arr[arr.length - 1] = "p=305/" + arr[arr.length - 1]; return arr.join("/"); }); return imgSrcArray; }, button: [4], insertImg: ["#display_image_detail,#detail_list", 2], customTitle: () => fun.geT("#title>h2,#page h3").replace(/\s?Photo\s?\d+P|\s?-\s?\d+\/\d+\s?|\([0-9\s]+ảnh\)/i, "").trim(), css: "#display_image_detail img{max-width:100% !important}", category: "nsfw2" }, { name: "Hentai Image", host: ["hentai-img.com", "hentai-cosplays.com", "porn-images-xxx.com", "porn-gravure-idol.com"], reg: /(hentai-img|hentai-cosplays|porn-images-xxx|porn-gravure-idol)\.com\/image\/[^/]+\/(page\/\d+\/)?$/, init: () => { let ele = fun.ge("//div[span[a]]"); if (ele) { let tE = fun.ge("#display_image_detail,#detail_list"); tE.parentNode.insertBefore(ele, tE); } }, imgs: async () => { let max = fun.geT("#paginator>*:last-child", 3) || fun.geT(".paginator_page[rel=next]", 2) || 1; let url = siteUrl.replace(/page\/\d+\/$/, ""); let links = fun.arr(max).map((_, i) => url + `page/${(i + 1)}/`); thumbnailsSrcArray = await fun.getImgA(".icon-overlay img,#display_image_detail img", links, 100); thumbnailsSrcArray = thumbnailsSrcArray.map(e => { let arr = e.split("/"); arr[arr.length - 2] = "p=305"; return arr.join("/"); }); return thumbnailsSrcArray.map(e => e.replace(/\/p=(700|305)/, "")); }, button: [4], insertImg: ["#display_image_detail,#detail_list", 2], autoDownload: [0], next: () => { let next = fun.ge("//a[text()='Prev Article' or text()='前の記事' or text()='前一篇']"); return next ? next.href : null; }, prev: "//a[text()='Next Article' or text()='次の記事' or text()='下一篇文章']", customTitle: () => fun.geT("#title>h2,#page h3").replace(/\s?Photo\s?\d+P|\s?-\s?\d+\/\d+\s?|\([0-9\s]+ảnh\)/i, "").trim(), css: "#display_image_detail img{max-width:100% !important}", category: "nsfw2" }, { name: "Hentai Cosplay", host: ["www.hentaicos.com"], reg: /^https?:\/\/www\.hentaicos\.com\/\w+\/\d+\.html/, include: ".main-picture", imgs: () => { let max = fun.geT("//a[text()='Next']", 2) || 1; return fun.getImg(".main-picture img", max, 9); }, button: [4], insertImg: [".main-picture", 2], next: ".next_pics>.fr>a", prev: ".next_pics>.fl>a", customTitle: () => fun.geT(".content-title"), category: "nsfw1" }, { name: "Fapator 圖片清單頁", host: ["www.fapator.com"], reg: /www\.fapator\.com\/\?content_id=/i, init: () => fun.remove("//div[@class='img' and a[@target and img]]"), imgs: () => { thumbnailsSrcArray = [...fun.gae("a[data-lightbox]>img")].map(e => e.src); return [...fun.gae("a[data-lightbox]")]; }, button: [4], insertImg: [".fcon+.fapad", 1], next: "//a[contains(text(),'next photos')]", prev: 1, go: 1, css: ".fapad{width:auto !important;height:auto !important}", category: "nsfw2" }, { name: "SMUTPOND", host: ["www.smutpond.com"], reg: /www\.smutpond\.com\/gallery-pics\/\?uid=/i, imgs: () => { thumbnailsSrcArray = [...new Set([...fun.gae(".viewerPreview img")].slice(5).map(e => e.dataset.lazy ?? e.src))] return [...fun.gae("img[alt=Pic]")]; }, button: [4], insertImg: [".viewerBox", 2], customTitle: async () => { await fun.delay(2000, 0); return fun.geT("h2.sectionTitleLeft"); }, fancybox: { v: 3, css: false }, category: "nsfw2" }, { name: "SexyGirlsPics", host: ["sexygirlspics.com"], reg: /sexygirlspics\.com\/pics\/[\w-]+\//i, imgs: () => { thumbnailsSrcArray = [...fun.gae("a.ss-image>img")].map(e => e.src); return [...fun.gae("a.ss-image")]; }, button: [4], insertImg: [ [".sponsor-button", 2], 1 ], go: 1, category: "nsfw2" }, { name: "PornPic", host: ["www.pornpic.com"], reg: /www\.pornpic\.com\/gallery\/[\w-]+/i, imgs: () => { thumbnailsSrcArray = [...fun.gae(".gallery-grid a.item-link img")].map(e => e.src); return [...fun.gae(".gallery-grid a.item-link")]; }, button: [4], insertImg: [ [".gallery-info", 2], 1 ], go: 1, fancybox: { v: 3, css: false }, category: "nsfw2" }, { name: "Nuded Photo", host: ["www.nudedxxx.com"], reg: /^https?:\/\/www\.nudedxxx\.com\/photo\/[^\.]+\.shtml$/i, imgs: ".elementor-element-1f729717 .elementor-widget-container img", button: [4], insertImg: [".elementor-element-1f729717 .elementor-widget-container", 2], autoDownload: [0], next: "a[rel=prev]", prev: "a[rel=next]", customTitle: () => fun.title(" – Nuded Photo"), css: "@media only screen and (max-width:480px){.hm-container{padding:0px!important}}", category: "nsfw2" }, { name: "Girlsreleased 載入更多", host: ["girlsreleased.com"], delay: 1000, reg: /girlsreleased\.com\//, include: "//button[text()='more']", observerClick: "//button[text()='more']", openInNewTab: ".content .main a", category: "autoPager" }, { name: "Girlsreleased", host: ["girlsreleased.com"], reg: /girlsreleased\.com\/set\/\d+/, imgs: async () => { let ele = ".images .imageContainer .image img"; await fun.waitEle(ele); thumbnailsSrcArray = [...fun.gae(".images .imageContainer .image img")].map(e => e.src); let src = fun.ge(ele).src; let images = [...fun.gae(ele)]; if (/imx\.to/.test(src)) { let tempSrc = src.replace("https://imx.to/u/t/", "https://i.imx.to/i/"); return new Promise(async resolve => { let obj = await fun.checkImgStatus(tempSrc); if (obj.ok && obj.width > 200) { resolve(images.map(e => e.src.replace("https://imx.to/u/t/", "https://i.imx.to/i/"))); } else { resolve(images.map(e => e.src.replace("/t/", "/i/"))); } }); } else if (/imgadult\.com/.test(src)) { return images.map(e => e.src.replace("small-medium/", "big/")); } else if (/pixhost\.to/.test(src)) { return images.map(e => e.src.replace("https://t", "https://img").replace("/thumbs/", "/images/")); } else if (/imagevenue/.test(src)) { return fun.getImgCorsA("#main-image", "a[target=imageView]"); } else { return []; } }, button: [4], insertImg: [ [".images", 2], 2 ], go: 1, referer: "src", category: "nsfw2" }, { name: "Eropics", // vipr.im,Imagetwist.com圖床無法外連但可以下載 host: ["eropics.to"], reg: /eropics\.\w+\/\d+\/\d+\/\d+\//i, init: () => { document.addEventListener("keydown", event => { if (event.ctrlKey && event.altKey && event.key == "c") { event.preventDefault(); let arr = [...fun.gae(".entry-content a")].map(a => a.href); let str = arr.join("\n"); console.log(str); copyToClipboard(str); fun.showMsg(displayLanguage.str_11); } }); }, imgs: async () => { let imgsSrcArr = []; let URLs = [...fun.gae(".entry-content a[href*='postimg.cc'],.entry-content a[href*='fastpic.org'],.entry-content a[href*='vipr.im'],.entry-content a[href*='pixhost.to']:not([href*='/gallery/']),.entry-content a[href*='turboimagehost'],.entry-content a[href*='imgbox.com'],.entry-content a[href*='imagevenue'],.entry-content a[href*='imx.to'],.entry-content a[href*='imagebam']")]; if (URLs.length > 0) { fun.showMsg(displayLanguage.str_01, 0); let xhrNum = 0; let resArr = URLs.map(async (a, i, arr) => { await fun.delay(100 * i, 0); let url = a.href; if (/imx\.to/.test(url)) { return fun.imxXHR(url).then(doc => { fun.showMsg(`${displayLanguage.str_02}${xhrNum+=1}/${arr.length}`, 0); let img = fun.ge("#container img", doc); return img ? img.src : null; }); } else if (/imagebam/.test(url)) { return fun.imageBamXHR(url).then(doc => { fun.showMsg(`${displayLanguage.str_02}${xhrNum+=1}/${arr.length}`, 0); let img = fun.ge("img.main-image", doc); return img ? img.src : null; }); } else if (/postimg/.test(url)) { return fun.xhr(url, "document").then(doc => { fun.showMsg(`${displayLanguage.str_02}${xhrNum+=1}/${arr.length}`, 0); let a = fun.ge("a#download", doc); return a ? a.href : null; }); } else { return fun.xhr(url, "document").then(doc => { fun.showMsg(`${displayLanguage.str_02}${xhrNum+=1}/${arr.length}`, 0); let img = fun.ge("#image,.pic.img.img-responsive,#imageid,#img.image-content,.card-body img,.image.img-fluid", doc); return img ? img.src : null; }); } }) await Promise.all(resArr).then(arr => { fun.hideMsg(); let thumbnails = URLs.map(a => fun.ge("img", a).src); thumbnailsSrcArray = thumbnailsSrcArray.concat(thumbnails); imgsSrcArr = imgsSrcArr.concat(arr.filter(item => item)); }); } return imgsSrcArr; }, button: [4], insertImg: [ [".entry-footer", 2], 3 ], go: 1, threading: 10, customTitle: () => fun.geT("h1.entry-title"), category: "nsfw2" }, { name: "imx.to gallery", host: ["imx.to"], reg: /^https?:\/\/imx\.to\/g\/\w+$/i, imgs: () => [...fun.gae("img.imgtooltip")].map(e => e.src.replace("/u/t/", "/u/i/")), button: [4], insertImg: [ ["#content", 2], 2 ], go: 1, category: "nsfw2" }, { name: "imx.to", host: ["imx.to"], reg: /^https?:\/\/imx\.to\/i\/\w+$/i, autoClick: ".button.blue.large,#continuebutton,a[title='Show gallery']", category: "none" }, { name: "ShowGirlx", host: ["showgirlx.net"], reg: /^https?:\/\/showgirlx\.net\/[^/]+\/(\d+\/)?$/, init: "Function.prototype.constructor=()=>{}", imgs: () => { return [...fun.gae(".wp-block-gallery img")].map(img => { let srcset = img.getAttribute("srcset"); if (srcset) { let splitArr = srcset.split(","); splitArr = splitArr.sort((a, b) => a.match(/\s(\d+)w/)[1] - b.match(/\s(\d+)w/)[1]); return splitArr.pop().trim().split(" ")[0]; } else { return img.src; } }); }, button: [4], insertImg: [ [".penci-single-link-pages", 2], 2 ], go: 1, category: "nsfw2" }, { name: "ShowGirlx album", host: ["showgirlx.net"], reg: /ngamgaixinh\.\w+\/album\/.+/, imgs: () => [...fun.gae(".list-item-image img")].map(img => img.src.replace(/\.(th|md)\./, ".")), button: [4], insertImg: [ [".pad-content-listing", 2], 2 ], go: 1, category: "nsfw2" }, { name: "Degoo Cloud", host: ["app.degoo.com"], reg: /^https?:\/\/app\.degoo\.com\/share\//, imgs: async () => { let max = prompt(displayLanguage.str_13, "100"); let img = ".preview-media .hidden"; await fun.waitEle(img); let arr = []; arr.push(fun.ge(img).cloneNode(true)); fun.showMsg(`${displayLanguage.str_02}1/${max}`, 0); let n = 1; for (let i = 1; i < max; i++) { fun.ge("#nextFileButton").click(); await fun.delay(200, 0); if (await fun.waitEle(img)) { arr.push(fun.ge(img).cloneNode(true)); fun.showMsg(`${displayLanguage.str_02}${n+=1}/${max}`, 0); } } fun.hideMsg(); arr = arr.map(e => e.src); return [...new Set(arr)]; }, category: "nsfw2" }, { name: "Bunkr", host: ["bunkr-albums.io"], reg: /^https:\/\/bunkrr\.su\/a\/\w+/i, imgs: () => fun.getImgA(".lightgallery img", "a[href^='/i/']"), button: [4], insertImg: [ [".grid-images", 2], 2 ], go: 1, customTitle: () => fun.geT("h1"), category: "nsfw2" }, { name: "Bunkr 列表自動翻頁", host: ["bunkr-albums.io"], reg: /^https?:\/\/bunkr-albums\.io\//, autoPager: { ele: ".table-auto>tbody", next: "a.bg-gray-300+a", re: ".justify-center", observer: ".table-auto>tbody", history: 1, title: doc => "Page " + fun.ge("a.bg-gray-300", doc).innerText }, category: "autoPager" }, { name: "亚洲色吧", host: ["yazhouseba.com"], reg: /^https?:\/\/yazhouseba\.com\/meinv\/[\w-]+\.html/, imgs: async () => { let pid = fun.ge("#next-url").rel; let json = await new Promise(resolve => { $.post("ajax.php", { "action": "src", "pid": pid }, data => { resolve(data); }, "json"); }); return json.error_code == "0" ? json.urls.map(e => img_dir + e) : []; }, button: [4], insertImg: [".content>.image", 2], customTitle: () => fun.geT(".content>h1").replace(/\(\d+\)/, "").trim(), category: "nsfw2" }, { name: "1000艺术摄影/169图片大全", host: ["www.1000yishu.com", "www.169tp.com", "wap.169tp.com"], reg: /^https?:\/\/(www\.1000yishu\.com|www\.169tp\.com|wap\.169tp\.com)\/\w+\/\d+\/\d+\/\d+\.html/, imgs: () => { let max; try { max = fun.geT(".pagelist a").match(/\d+/)[0]; } catch (e) { max = 1; } return fun.getImg(".big-pic img,.inside_box img", max, 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", css: "union{display:none!important;}", category: "nsfw1" }, { name: "3K图片网/桃子啦 格式", host: ["www.3ktu.com", "www.tufada.com"], reg: /^https?:\/\/www\.(3ktu|zkjmpx|tufada|ksxx365|tzala|mash120|wslak|777url|xr70|t7mm|sqhyyz|gxwpjc|ycwlx|ksxx360|ngptp|zlsmm|mmdmlt|hsnmm|mmxsl|i9ke|jsjfgkgs|yjpfxs|cmylzx|sskge|iduobi|woxiutu|lcylaa|gmcpx|803352|rzjyz|cpbdj|gkiev|wjjlf|hceday|fs120yy|aolangde|fssrr|wt768|lql1|xhtrz|zggsdh|xhycg|mokhee|zqydc)\.com\/\w+\/\d+\.html|^https?:\/\/www\.tufada\.com\/tu\d+\.html/, include: "#showimg img,.img-box img", imgs: () => { let max; try { max = fun.ge(".endpage").href.match(/-(\d+)\.html/)[1]; } catch (e) { max = 1; } return fun.getImg("#showimg img,.img-box img", max, 5, [null, null], 300); }, button: [4], insertImg: ["#showimg,.img-box", 2], autoDownload: [0], next: "a[title='上一篇']", prev: "a[title='下一篇']", category: "nsfw1" }, { name: "亿秀美女", host: ["www.tu11.com", "m.itu11.com"], reg: /^https?:\/\/(www|m)\.i?tu11\.com\/\w+\/\d+\/\d+\.html/, include: "#showimg img,.img-box img", imgs: async () => { await fun.getNP("#showimg img,.img-box img", "a.curpage+a:not(.prepage)", null, "#paginationEle", 0, null, 0); return [...fun.gae("#showimg img,.img-box img")]; }, button: [4], insertImg: ["#showimg,.img-box", 2], autoDownload: [0], next: "//div[contains(text(),'上一篇')]/a | //a[text()='上一篇']", prev: "//div[contains(text(),'下一篇')]/a | //a[text()='下一篇']", category: "nsfw1" }, { name: "Girl Girl Go", host: ["girlgirlgo.org", "girlgirlgo.net", "girlgirlgo.top", "girlgirlgo.icu", "girlgirlgo.biz", "girlygirlpic.com"], reg: /^https?:\/\/\w{2}\.(girlgirlgo|girlygirlpic)\.(org|net|icu|com|biz|top)\/a\/\w+/, imgs: ".figure-link", button: [4], insertImg: [".post-media-body", 2], next: async () => { await fun.waitEle("a[rel=next]", 30); let next = fun.ge("a[rel=next]"); return next ? next.href : null; }, prev: "a[rel=prev]", customTitle: async () => { await fun.waitEle(".figure-link"); return fun.geT(".entry-title a").split(" No.")[0].trim(); }, category: "nsfw1" }, { name: "QGirlz/CuteLadyPic", host: ["qgirlz.com", "cuteladypic.com"], reg: /^https?:\/\/(\w{2}\.)?(qgirlz|cuteladypic)\.(com)\/a\/[\w-]+/, imgs: () => fun.getImg("//a[@data-title and picture/source]", (fun.geT(".next", 2) || 1), 16), button: [4], insertImg: [".main-image", 2], customTitle: () => fun.geT(".main-title").split(" No.")[0].trim(), category: "nsfw1" }, { name: "cn.angirlz.com", //SPA host: ["cn.angirlz.com"], reg: /^https?:\/\/\w{2}\.angirlz\.com\/album\/\w+/, imgs: async () => await fun.waitEle(".loading[style$=hidden]") ? [...fun.gae("#divGallery a")] : [], button: [4], insertImg: ["div[key=album_main]", 2], customTitle: () => fun.geT("h1"), category: "nsfw2" }, { name: "KawaiiX系列", host: ["bunnyxgirl.com", "letsgirlz.com", "bootyxgirl.com", "xbeautyzone.com"], reg: /^https?:\/\/(bunnyxgirl|letsgirlz|bootyxgirl|xbeautyzone)\.com\/[^/]+\/.+/, include: ".separator>a", imgs: ".separator>a", button: [4], insertImg: [ [".album-post-inner,.album-postmeta-primarypix", 2, ".separator"], 2 ], customTitle: () => fun.geT(".breadcrumbs>span:last-child"), category: "nsfw2" }, { name: "KawaiiX系列", host: ["cn.bunnyxgirl.com", "cn.letsgirlz.com", "cn.bestxleg.com", "cn.xbeautyzone.com"], reg: /^https?:\/\/\w{2}\.(bunnyxgirl|letsgirlz|bestxleg|xbeautyzone)\.com\/[^/]+\/\w+/, include: ".separator>a", imgs: () => fun.getImg(".separator>a", (fun.geT(".nav-links>*:last-child", 2) || 1), 16), insertImg: [ [".album-post-body .clear,.album-post-share-wrap", 1, "div[itemprop='description articleBody'],.album-post-body>*:not(.album-post-inner):not(.album-post-share-wrap):not(.FullPictureLoadImage):not(#FullPictureLoadEnd)"], 2 ], customTitle: () => fun.geT(".breadcrumbs>span:last-child"), category: "nsfw2" }, { name: "KawaiiX系列", host: ["kawaiix.com", "kawaiixgirl.com", "kawaiixpic.com", "kinkygirlz.com", "kawaiimetas.com", "assxpic.com", "metaxgirl.com", "eroticxgirl.com", "sexyxpic.com", "hottyxpic.com", "thongxxx.com", "juicexgirl.com", "adultmetas.com", "eroticxpic.com", "bustyxgirl.com", "beautyxgirl.com", "bellexpic.com", "pantyxpic.com", "www.peachgirlz.com", "peachgirlz.com", "pantyxart.com", "beautyxpic.com", "cutemetas.com", "cutexpic.com", "perfectxbody.com", "sexyqgirl.com", "bestxhips.com", "assgirlz.com", "beautifulmetas.com", "pantyxgirl.com", "greatxpic.com", "xartpic.com", "perfectxpic.com", "bestxboobs.com", "artthong.com", "hotbeautypic.com", "greatxgirl.com", "asianxpic.com", "bestxleg.com", "tokyohotgirl.com", "bestxass.com"], reg: /^https?:\/\/(r18\.|www\.)?(kawaiix|kawaiixgirl|kawaiixpic|kinkygirlz|kawaiimetas|assxpic|metaxgirl|eroticxgirl|sexyxpic|hottyxpic|thongxxx|juicexgirl|adultmetas|eroticxpic|bustyxgirl|beautyxgirl|bellexpic|pantyxpic|peachgirlz|pantyxart|beautyxpic|cutemetas|cutexpic|perfectxbody|sexyqgirl|bestxhips|assgirlz|beautifulmetas|pantyxgirl|greatxpic|xartpic|perfectxpic|bestxboobs|artthong|hotbeautypic|greatxgirl|asianxpic|bestxleg|tokyohotgirl|bestxass)\.com\/[^/]+\/.+/, include: "//a[@data-title and picture/source]", imgs: "//a[@data-title and picture/source]", button: [4], insertImg: [".hero+.hero,.entry-content,.d-flex>.col-24,.album-post,.album-h1", 2], customTitle: () => fun.title(/( - Kawa| - KinkyGirlz| - BelleXPic| - Peach| - Panty| - Beauty| - Cute| - Ass| - Beaut| - Great| - Xart| - Perfect| - Art| - GreatXGirl)/i, 1).replace(/\s?\(\d+\s?photos\)/, "").trim(), category: "nsfw2" }, { name: "KawaiiX系列", host: ["cn.kawaiix.com", "cn.kawaiixgirl.com", "cn.kawaiixpic.com", "cn.kinkygirlz.com", "cn.kawaiimetas.com", "cn.assxpic.com", "cn.metaxgirl.com", "cn.eroticxgirl.com", "cn.sexyxpic.com", "cn.hottyxpic.com", "cn.thongxxx.com", "cn.juicexgirl.com", "cn.eroticxpic.com", "cn.bustyxgirl.com", "cn.beautyxgirl.com", "cn.bellexpic.com", "cn.pantyxpic.com", "cn.peachgirlz.com", "cn.pantyxart.com", "cn.beautyxpic.com", "cn.cutemetas.com", "cn.cutexpic.com", "cn.perfectxbody.com", "cn.sexyqgirl.com", "cn.bestxhips.com", "cn.bestxass.com", "cn.assgirlz.com", "cn.bestxbum.com", "cn.adultmetas.com cn", "eroticxpic.com", "cn.xxxthong.com", "cn.thongxgirl.com", "cn.bestxlingerie.com", "cn.sexyxart.com", "cn.hotxhips.com", "cn.hotbeautypic", "cn.greatxgirl.com", "cn.asianxpic.com", "cn.bootyxgirl.com", "cn.tokyohotgirl.com"], reg: /^https?:\/\/\w{2}\.(kawaiix|kawaiixgirl|kawaiixpic|kinkygirlz|kawaiimetas|assxpic|metaxgirl|eroticxgirl|sexyxpic|hottyxpic|thongxxx|juicexgirl|eroticxpic|bustyxgirl|beautyxgirl|bellexpic|pantyxpic|peachgirlz|pantyxart|beautyxpic|cutemetas|cutexpic|perfectxbody|sexyqgirl|bestxhips|bestxass|assgirlz|bestxbum|adultmetas|eroticxpic|xxxthong|thongxgirl|bestxlingerie|sexyxart|hotxhips|hotbeautypic|greatxgirl|asianxpic|bootyxgirl|tokyohotgirl)\.com\/[^/]+\/\w+/, include: "//a[@data-title and picture/source]", imgs: () => fun.getImg("//a[@data-title and picture/source]", (fun.geT(".nav-links>*:last-child", 2) || 1), 16), button: [4], insertImg: [".hero+.hero,.entry-content,.d-flex>.col-24,.album-post", 2], customTitle: () => fun.geT(".entry-title,.album-title,.album-post-title,.col-12>h1,.album-h1").split(" No.")[0].trim(), css: ".flex-grid:not(.masonry){display:block!important;}", category: "nsfw2" }, { name: "gogo人体艺术M", reg: /\/(wap|mip|m)\.(gogortrt|gogo38|956n|48mp|133rt|xixirt|488xm|rtys96|renti92|rt211|gogo44|xixi78|816mm|999zv|28rtys|454t|454t|784z|34tp|28xv|22bb|444rp|03hb|39um|45xm|444wp|005mm|188rt|7m11|61ak|34bu|344F|23bp|rty6|22gs|44aq|291103|508332|693350|660183|702038|873750|981070)\.(com|org)\/\w+\/\d+\/$/i, init: () => fun.remove("//div[div[@class='ad-16 clearfix']]"), imgs: () => fun.getImg(".tal a>img[alt]", fun.gae(".p_select option").length, 11), button: [4], insertImg: [".tal", 2], category: "nsfw2" }, { name: "gogo人体艺术M2", reg: /\/(m)\.(98ah|02aj|139tu)\.com\/\w+\/(\d+\/)?\d+\.html$/i, imgs: () => fun.getImg(".tal a>img[alt]", fun.gae(".p_select option").length, 9), button: [4], insertImg: [".tal", 2], css: "div[style='margin:3px 0 0 0;']{display:none!important}", category: "nsfw2" }, { name: "666人体艺术M", reg: /\/(m)\.(6666rt)\.com\/\w+\/\d+\/1\.html$/i, imgs: () => { let max = fun.geT(".article_page a").match(/\/(\d+)/)[1]; return fun.getImg(".tal a>img[alt]", max, 11); }, button: [4], insertImg: [".tal", 2], customTitle: () => fun.title("-第1张", 1), css: "div[style='margin:2px 0 0 0;']{display:none!important}", category: "nsfw2" }, { name: "gogo人体艺术", host: ["gogortrt.com", "956n.com"], reg: /\/(gogortrt|956n)\.[a-z]{2,3}\/[a-z]+\/\d+\//i, imgs: () => { let max = fun.geT("//span[@class='current']/preceding-sibling::a|//a[@class='thisclass']/preceding-sibling::a").match(/\d+/)[0]; return fun.getImg(".main>div>a>img[alt],.warp .content>a>img[alt]", max, 11); }, button: [4], insertImg: ["//div[contains(@class,'main')]/div/a/parent::* | //div[contains(@class,'content') and a/img[@alt]]", 2], autoDownload: [0], next: ".crc_l_pic.left>a:not([href^=j])", prev: ".crc_r_pic.right>a:not([href^=j])", customTitle: () => /gogortrt\.com/.test(location.origin) ? fun.geT(".content_title") : fun.title(",", 1), category: "nsfw2" }, { name: "GOGO人体艺术", host: ["48mp.com", "133rt.com", "816mm.com"], reg: /(48mp\.com|133rt\.com|816mm\.com)\/\w+\/\d+\//i, imgs: () => { let max = fun.geT(".main span", 2).match(/\d+/)[0]; return fun.getImg(".main>div>a>img[alt]", max, 11); }, button: [4], insertImg: ["//div[contains(@class,'main')]/div[a/img[@alt]]", 2], autoDownload: [0], next: ".crc_l_pic.left>a:not([href^=j])", prev: ".crc_r_pic.right>a:not([href^=j])", customTitle: () => fun.geT(".content_title"), category: "nsfw2" }, { name: "666人体艺术 只翻預覽圖", host: ["6666rt.com"], reg: /6666rt\.com\/\w+\/\d+\/(index\.html)?/i, enable: 0, include: "//div[@class='boxx']//li[a[@target]/img]", init: () => fun.getNP("//div[@class='boxx']//li[a[@target]/img]", "a.curent+a[href]", null, ".pagelist"), category: "nsfw2" }, { name: "666人体艺术 大圖頁聚圖", host: ["6666rt.com"], reg: /6666rt\.com\/\w+\/\d+\//i, enable: 0, init: "document.onkeydown=null;", imgs: () => { let max = fun.geT(".page>span#hover", 3).match(/\d+$/)[0]; return fun.getImg(".imgbox>a>img[alt]", max, 11); }, button: [4], insertImg: ["//div[@class='imgbox' and a/img[@alt]]", 2], customTitle: () => fun.geT(".contitle h1>a"), css: "#FullPictureLoadEnd{color:rgb(0, 0, 0)}", category: "nsfw2" }, { name: "666人体艺术 翻完預覽圖立即插入大圖 getNP搭配getImgA", host: ["6666rt.com"], reg: /6666rt\.com\/\w+\/\d+\/(index\.html)?/i, enable: 1, include: "//div[@class='boxx']//li[a[@target]/img]", imgs: async () => { await fun.getNP("//div[@class='boxx']//li[a[@target]/img]", "a.curent+a[href]", null, ".pagelist"); thumbnailsSrcArray = [...fun.gae("//div[@class='boxx']//li/a[@target]/img")].map(e => e.src); return fun.getImgA(".imgbox>a>img[alt]", "//div[@class='boxx']//li/a[@target and img]"); }, button: [4], //insertImg: [".boxx ul", 1], insertImg: [ [".footdh", 1], 2 ], go: 1, autoDownload: [0], next: "//li[contains(text(),'上一')]/a", prev: "//li[contains(text(),'下一')]/a", customTitle: () => fun.title("_", 1), css: ".fzltp img{height:auto!important;width:100%!important}", category: "nsfw2" }, { name: "508人体艺术", host: ["508332.com"], reg: /508332\.com\/\w+\/\d+\//i, imgs: () => { let max = fun.geT(".pagelist>a").match(/\d+/)[0]; return fun.getImg(".imgbox>a>img[alt]", max, 11); }, button: [4], insertImg: ["//div[contains(@class,'imgbox') and a/img[@alt]]", 1], autoDownload: [0], next: "//li[contains(text(),'下一')]/a", prev: 1, customTitle: () => fun.title(" - 508", 1), category: "nsfw2" }, { name: "444人体艺术", host: ["444rp.com"], reg: /444rp\.com\/\w+\/\d+\//i, imgs: () => { let max = fun.geT(".pagelist>a").match(/\d+/)[0]; return fun.getImg(".imgbox>a>img[alt]", max, 11); }, button: [4], insertImg: ["//div[contains(@class,'imgbox') and a/img[@alt]]", 2], autoDownload: [0], next: ".zuopre>a", prev: ".younext>a", customTitle: () => fun.geT("font>a:nth-child(3)"), category: "nsfw2" }, { name: "64人体艺术", host: ["www.64ay.com"], reg: /www\.64ay\.com\/\w+\/\d+/i, imgs: () => { let max = fun.geT(".page-show>span.current", 2).match(/\d+/)[0]; return fun.getImg(".tu>a>img[alt]", max, 9); }, button: [4], insertImg: ["//div[@class='tu' and a/img[@alt]]", 2], autoDownload: [0], next: "//div[contains(text(),'下一')]/a[1]", prev: "//div[contains(text(),'上一')]/a[2]", customTitle: () => fun.title(",", 1), category: "nsfw2" }, { name: "45人体艺术/873人体艺术", host: ["45xm.com", "873750.com"], reg: /(45xm\.com|873750\.com)\/\w+\/\d+/i, imgs: () => { let max = fun.geT(".page-show>span.current", 2).match(/\d+/)[0]; return fun.getImg(".tu>a>img[alt]", max, 11); }, button: [4], insertImg: ["//div[contains(@class,'tu') and a/img[@alt]]", 2], autoDownload: [0], next: "//div[contains(text(),'下一')]/a[1]", prev: "//div[contains(text(),'上一')]/a[2]", customTitle: () => { try { return fun.geT(".wzbody>h1").split(/,|_/)[0]; } catch (e) { return fun.geT(".wzbody>h1"); } }, category: "nsfw2" }, { name: "98人体艺术", host: ["www.98ah.com"], reg: /www\.98ah\.com\/\w+\/\d+\.html/i, imgs: () => { let max = fun.geT(".current", 2).match(/\d+/)[0]; return fun.getImg(".content-pic img[alt]", max, 9); }, button: [4], insertImg: [".content-pic", 2], autoDownload: [0], next: "//div[contains(text(),'下一')]/a[1]", prev: "//div[contains(text(),'下一')]/a[2]", customTitle: () => fun.geT("h5").split(",")[0], category: "nsfw2" }, { name: "54人体艺术", host: ["www.54aj.com"], reg: /www\.54aj\.com\/\w+\/\d+\.html/i, imgs: () => { let max = fun.geT("#hover", 2).match(/\d+/)[0]; return fun.getImg(".content img[alt]", max, 9); }, button: [4], insertImg: [".content", 2], autoDownload: [0], next: "//span[contains(text(),'下一')]/a", prev: "//span[contains(text(),'上一')]/a", customTitle: () => fun.geT(".content>h1").split(",")[0], category: "nsfw2" }, { name: "03人体艺术网", host: ["03hb.com"], reg: /03hb\.com\/\w+\/\d+\//i, imgs: () => { let max = fun.geT("#hover", 2).match(/\d+/)[0]; return fun.getImg(".content img[alt]", max, 11); }, button: [4], insertImg: [".content", 2], autoDownload: [0], next: "//span[contains(text(),'下一')]/a", prev: "//span[contains(text(),'上一')]/a", customTitle: () => fun.geT(".currentpath span:nth-child(2)>a:nth-child(2)").split(",")[0], category: "nsfw2" }, { name: "48人体艺术", host: ["www.48gd.com"], reg: /www\.48gd\.com\/\w+\/\d+\.html/i, init: "document.onkeydown=null;", imgs: () => { let max = fun.geT('.pagelist>strong', 2).match(/\d+/)[0]; return fun.getImg('#content img[alt]', max, 9); }, button: [4], insertImg: ["#content", 2], autoDownload: [0], next: "//span[contains(text(),'下一')]/a", prev: "//span[contains(text(),'上一')]/a", customTitle: () => fun.geT(".photo-tit>h3").split(",")[0], category: "nsfw2" }, { name: "693人体艺术", host: ["693350.com"], reg: /693350\.com\/\w+\/\d+\//i, imgs: () => { let max = fun.geT(".pagelist>a").match(/\d+/)[0]; return fun.getImg("#content img[alt]", max, 11); }, button: [4], insertImg: ["#content", 2], autoDownload: [0], next: "//span[contains(text(),'下一')]/a", prev: "//span[contains(text(),'上一')]/a", customTitle: () => fun.geT(".photo-tit>h3").split(",")[0], category: "nsfw2" }, { name: "42人体艺术", host: ["www.42jd.com"], reg: /www\.42jd\.com\/\w+\/\d+\.html/i, imgs: () => { let max = fun.geT(".pagelist>.curent", 2).match(/\d+/)[0]; return fun.getImg(".imgbox img[alt]", max, 9); }, button: [4], insertImg: [".imgbox", 2], autoDownload: [0], next: "//li[contains(text(),'下一')]/a", prev: "//li[contains(text(),'上一')]/a", customTitle: () => fun.geT(".imgbox h1").split(",")[0], category: "nsfw2" }, { name: "36人体艺术", host: ["www.36ut.com"], reg: /www\.36ut\.com\/\w+\/\d+\.html/i, init: "document.onkeydown=null;", imgs: () => { let max = fun.geT(".page-show>.current", 2).match(/\d+/)[0]; return fun.getImg(".pp.hh img[alt]", max, 9); }, button: [4], insertImg: [".pp.hh", 2], customTitle: () => fun.geT(".des>h1").split(",")[0], category: "nsfw2" }, { name: "西西人体艺术", host: ["xixirt.org", "291103.com"], reg: /(xixirt\.org|291103\.com)\/\w+\/\d+\//i, init: "document.onkeydown=null;", imgs: () => { let max = fun.geT(".page-show>.current", 2).match(/\d+/)[0]; return fun.getImg(".pp.hh img[alt]", max, 11); }, button: [4], insertImg: [".pp.hh", 2], customTitle: () => fun.geT(".des>h1").split(",")[0], category: "nsfw2" }, { name: "366人体艺术/660人体艺术/18人体艺术", host: ["366807.com", "660183.com", "18renti.com"], reg: /(366807\.com|660183\.com|18renti\.com)\/\w+\/\d+\//i, imgs: () => { let max = fun.geT(".page-show>a,.page>a").match(/\d+/)[0]; return fun.getImg(".content img[alt]", max, 11); }, button: [4], insertImg: [".content", 2], autoDownload: [0], next: "//span[contains(text(),'下一')]/a", prev: "//span[contains(text(),'上一')]/a", customTitle: () => fun.title(/_西西| - 660| - 18/, 1), category: "nsfw2" }, { name: "702人体艺术/211人体艺术", host: ["702038.com", "rt211.com"], reg: /(702038\.com|rt211.com)\/\w+\/\d+\//i, imgs: () => { let max = fun.geT(".page-show>a").match(/\d+/)[0]; return fun.getImg(".content-pic img[alt],#bomei img[alt]", max, 11); }, button: [4], insertImg: [".content-pic,#bomei", 2], autoDownload: [0], next: ".updown>a,#prenext a", prev: 1, customTitle: () => fun.title(/- 702| - 211/, 1), category: "nsfw2" }, { name: "188人体艺术", host: ["188rt.com"], reg: /188rt\.com\/\w+\/\d+\//i, imgs: () => { let max = fun.geT(".page-show>a").match(/\d+/)[0]; return fun.getImg("#bomei img[alt]", max, 11); }, button: [4], insertImg: ["#bomei", 2], autoDownload: [0], next: "#prenext a", prev: "#prenext li:last-child>a", customTitle: () => fun.geT("#bobox>h1").split(",")[0], category: "nsfw2" }, { name: "39人体艺术", host: ["39um.com"], reg: /39um\.com\/\w+\/\d+\//i, imgs: () => { let max = fun.geT(".page-show>a").match(/\d+/)[0]; return fun.getImg(".content-pic img[alt],#bomei img[alt]", max, 11); }, button: [4], insertImg: [".content-pic", 2], autoDownload: [0], next: ".updown>a", prev: 1, customTitle: () => fun.geT(".content>h5"), category: "nsfw2" }, { name: "23人体艺术", host: ["www.23fe.com"], reg: /www\.23fe\.com\/\w+\/\d+\.html/i, imgs: () => { let max = fun.geT(".thispg", 2).match(/\d+/)[0]; return fun.getImg("#content-p img[alt]", max, 9); }, button: [4], insertImg: ["#content-p", 2], autoDownload: [0], next: "//span[contains(text(),'下一')]/a", prev: "//span[contains(text(),'上一')]/a", customTitle: () => fun.geT("#ctt>h1").split(",")[0], category: "nsfw2" }, { name: "AJ人体艺术", host: ["www.02aj.com"], reg: /www\.02aj\.com\/\w+\/\d+\.html/i, imgs: () => { let max = fun.geT(".thisclass", 2).match(/\d+/)[0]; return fun.getImg(".content img[alt]", max, 9); }, button: [4], insertImg: [".content", 2], autoDownload: [0], next: "//div[contains(text(),'下一')]/a", prev: "//div[contains(text(),'上一')]/a", customTitle: "return fun.geT('.title>h1');", category: "nsfw2" }, { name: "gogo人体艺术", host: ["gogo44.com"], reg: /gogo44\.com\/\w+\/\d+\//i, init: "fun.ge('.content a').removeAttribute('href')", imgs: () => { let max = fun.geT(".thisclass", 2).match(/\d+/)[0]; return fun.getImg(".content img[alt]", max, 11); }, button: [4], insertImg: [".content a", 2], autoDownload: [0], next: ".updown a", prev: ".updown span:last-child>a", customTitle: () => fun.title(/ - gogo/, 1), category: "nsfw2" }, { name: "28人体艺术/4F人体艺术", host: ["28rtys.com", "344f.com"], reg: /(28rtys\.com|344f\.com)\/\w+\/\d+\//i, imgs: () => { let max = fun.geT(".thisclass", 2).match(/\d+/)[0]; return fun.getImg(".picbox img[alt]", max, 11); }, button: [4], insertImg: [".picbox", 2], autoDownload: [0], next: ".page+.content-msg a", prev: 1, customTitle: () => fun.title(/ - 28| - 4F/, 1), category: "nsfw2" }, { name: "西西人体艺术", host: ["44aq.com"], reg: /44aq\.com\/\w+\/\d+\//i, imgs: () => { let max = fun.geT(".page a").match(/\d+/)[0]; return fun.getImg(".picbox img[alt]", max, 11); }, button: [4], insertImg: [".picbox", 2], autoDownload: [0], next: ".updown_r>a", prev: ".updown_l>a", customTitle: () => fun.title(/,/, 1), category: "nsfw2" }, { name: "139人体艺术", host: ["www.139tu.com"], reg: /www\.139tu\.com\/\w+\/\d+\/\d+\.html/i, imgs: () => { let max = fun.geT("#hover", 2).match(/\d+/)[0]; return fun.getImg(".img_content img[alt]", max, 9); }, button: [4], insertImg: [".img_content", 2], customTitle: () => fun.geT("#title>h1"), category: "nsfw2" }, { name: "GOGO人体艺术网", host: ["gogo38.com"], reg: /(gogo38\.com|981070\.com)\/\w+\/\d+\//i, imgs: () => { let max = fun.geT(".current", 2).match(/\d+/)[0]; return fun.getImg(".content_pic img[alt]", max, 11); }, button: [4], insertImg: [".content_pic", 2], customTitle: () => fun.geT(".content>h1>a"), category: "nsfw2" }, { name: "488人体艺术", host: ["488xm.com"], reg: /488xm\.com\/\w+\/\d+\//i, imgs: () => { let max = fun.geT(".pagelist>strong", 2).match(/\d+/)[0]; return fun.getImg("#content img[alt]", max, 11) }, button: [4], insertImg: ["#content", 2], autoDownload: [0], next: "//span[contains(text(),'下一')]/a", prev: "//span[contains(text(),'上一')]/a", customTitle: () => fun.geT("h3>a").split(",")[0], category: "nsfw2" }, { name: "92人体艺术", host: ["renti92.com"], reg: /renti92\.com\/\w+\/\d+\//i, imgs: () => { let max = fun.geT(".pagination>a").match(/\d+/)[0]; return fun.getImg("#gallery img[alt]", max, 11); }, button: [4], insertImg: ["#gallery", 2], autoDownload: [0], next: ".other-prev a", prev: ".other-next a", customTitle: () => fun.title(/ - 92/, 1), category: "nsfw2" }, { name: "005人体艺术", host: ["005mm.com"], reg: /005mm\.com\/\w+\/\d+\//i, imgs: () => { let max = fun.geT(".pagination>a").match(/\d+/)[0]; return fun.getImg("#gallery img[alt]", max, 11); }, button: [4], insertImg: ["#gallery", 2], autoDownload: [0], next: ".other-prev a", prev: ".other-next a", customTitle: () => fun.geT(".post-nav>a:nth-child(3)"), category: "nsfw2" }, { name: "西西人体艺术/711人体艺术", host: ["xixi78.com", "7m11.com"], reg: /(xixi78\.com|7m11\.com)\/\w+\/\d+\//i, imgs: () => { let max = fun.geT(".content-page>a").match(/\d+/)[0]; return fun.getImg("#content img[alt]", max, 11); }, button: [4], insertImg: ["#content", 2], customTitle: () => fun.title(/ - 西西| - 711/, 1), category: "nsfw2" }, { name: "96人体艺术/61人体艺术", host: ["rtys96.com", "61ak.com"], reg: /(rtys96\.com|61ak.com)\/\w+\/\d+\//i, imgs: () => { let max = fun.geT(".bigpages>a").match(/\d+/)[0]; return fun.getImg("#showimages img[alt]", max, 11); }, button: [4], insertImg: ["#showimages", 2], autoDownload: [0], next: "#pageNum a", prev: 1, customTitle: () => fun.title(/ - 96| - 61/, 1), category: "nsfw2" }, { name: "999人体艺术/西西人体艺术", host: ["999zv.com", "34bu.com"], reg: /(999zv\.com|34bu.com)\/\w+\/\d+\//i, imgs: () => { let max = fun.geT(".pages a").match(/\d+/)[0]; return fun.getImg(".section.fix.tc img[alt]", max, 11); }, button: [4], insertImg: [".section.fix.tc", 2], autoDownload: [0], next: ".arcLocal.r a", prev: 1, customTitle: () => fun.title(",", 1), category: "nsfw2" }, { name: "454人体艺术/爱上人体艺术", host: ["454t.com", "23bp.com"], reg: /(454t\.com|23bp\.com)\/\w+\/\d+\//i, imgs: () => { let max = fun.geT(".page a").match(/\d+/)[0]; return fun.getImg("#content-p img[alt]", max, 11); }, button: [4], insertImg: ["#content-p", 2], customTitle: () => fun.title(",", 1), category: "nsfw2" }, { name: "748人体艺术/66人体艺术", host: ["784z.com", "rty6.com"], reg: /(784z\.com|rty6.com)\/\w+\/\d+\//i, imgs: () => { let max = fun.geT(".pages a").match(/\d+/)[0]; return fun.getImg(".image-view img[alt]", max, 11); }, button: [4], insertImg: [".image-view", 2], autoDownload: [0], next: ".i-digg>.article-adbottom a", prev: 1, customTitle: () => fun.title(/,|_/, 1), category: "nsfw2" }, { name: "34人体艺术/高清人体艺术", host: ["34tp.com", "22gs.com"], reg: /(34tp\.com|22gs.com)\/\w+\/\d+\//i, imgs: () => { let max = fun.geT(".gengduo a").match(/\d+/)[0]; return fun.getImg("#content-p img[alt]", max, 11); }, button: [4], insertImg: ["#content-p p", 2], autoDownload: [0], next: ".gg a", prev: 1, customTitle: () => fun.title(/ - 34|,/, 1), category: "nsfw2" }, { name: "22bb人体艺术", host: ["22bb.org"], reg: /22bb\.org\/\w+\/\d+\//i, imgs: () => { let max = fun.geT(".page-show>a").match(/\d+/)[0]; return fun.getImg(".content img[alt]", max, 11); }, button: [4], insertImg: [".content", 2], autoDownload: [0], next: "//span[contains(text(),'下一')]/a", prev: "//span[contains(text(),'上一')]/a", customTitle: () => fun.title(",", 1), category: "nsfw2" }, { name: "444人体艺术", host: ["444wp.com"], reg: /444wp\.com\/\w+\/\d+\//i, imgs: () => { let max = fun.geT(".page a").match(/\d+/)[0]; return fun.getImg(".content img[alt]", max, 11); }, button: [4], insertImg: [".content", 2], autoDownload: [0], next: ".page+.page a", prev: ".page+.page a+a", customTitle: () => fun.geT("h2"), category: "nsfw2" }, { name: "爱人体艺术", host: ["28xv.com"], reg: /28xv\.com\/\w+\/\d+\//i, imgs: () => { let max = fun.geT(".page a").match(/\d+/)[0]; return fun.getImg(".imgTip+a>img[alt]", max, 11); }, button: [4], insertImg: [".imgTip+a", 2], autoDownload: [0], next: ".updown_r>a", prev: ".updown_l>a", customTitle: () => fun.geT("h1").split(",")[0], category: "nsfw2" }, { name: "XO福利圖", host: ["diedk1123-ake33i.xofulitu2za222.sbs"], link: "https://diedk1123-ake33i.xofulitu2za222.sbs/xoxo", reg: /^https?:\/\/[^\/]+\/art\/pic\/id\/\d+\/$/i, include: "//title[contains(text(),'XO福利圖')]", imgs: ".picture-wrap img", button: [4], insertImg: [".container.clearfix", 2], go: 1, customTitle: () => fun.geT(".main-title:not(.recommend-title)").replace(/\s?-?\s?\(\d+P\)|\[\d+[\+\.\w\s-]+\]|【\d+P】|\s?\d+P/i, ""), category: "nsfw2" }, { name: "XO福利圖 分類自動翻頁", enable: 1, reg: /^https?:\/\/[^\/]+\/arttype\//, include: "//title[contains(text(),'XO福利圖')]", autoPager: { ele: ".container.clearfix", observer: ".container.clearfix .album", next: ".paging-item--current+a", re: ".pagging-div", lazySrc: "img[data-src]", history: 1, title: doc => "Page" + fun.geT(".paging-item--current", 1, doc) }, category: "autoPager" }, { name: "MOMO图库", host: ["www.momotk.com", "momotk5.uno"], link: "https://www.rb1.es/momotk/", reg: /^https?:\/\/(www\.momotk\.com|momotk\d\.uno)\/\d+\.html$/i, imgs: async () => { await fun.getNP(".ngg-gallery-thumbnail-box", "span.current+a", null, ".ngg-navigation"); thumbnailsSrcArray = [...fun.gae(".ngg-gallery-thumbnail-box a")].map(a => a.dataset.thumbnail); return [...fun.gae(".ngg-gallery-thumbnail-box a")].map(a => a.dataset.src); }, button: [4], insertImg: [".article-content", 2], go: 1, customTitle: () => fun.geT(".article-title"), css: ".asst-single-header{display:none!important;}", category: "nsfw2" }, { name: "魅影画廊", host: ["www.wc1.es", "myhl5.uno", "www.jb9.es"], link: "https://wc2.es/myhl", reg: /^https?:\/\/(www\.wc1\.es|myhl\d.uno|www\.jb\d\.es)\/\d+\.html$/i, imgs: () => { thumbnailsSrcArray = [...fun.gae(".gallery a")].map(a => a.href); let xhrNum = 0; fun.showMsg("fun.xhrHEAD...", 0); let getRes = thumbnailsSrcArray.map(e => e.replace("-scaled", "")).map(async (src, i) => { let res = await fun.xhrHEAD(src); fun.showMsg(`fun.xhrHEAD(${xhrNum+=1}/${thumbnailsSrcArray.length})`, 0); let status = res.status; return status == 404 ? thumbnailsSrcArray[i] : src; }); return Promise.all(getRes).then(arr => { fun.hideMsg(); return arr; }); }, button: [4], insertImg: [ [".gallery", 2, ".gallery"], 2 ], autoDownload: [0], next: ".article-nav-prev>a", prev: ".article-nav-next>a", customTitle: () => fun.geT(".article-title"), fancybox: { v: 3, css: false }, css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}", category: "nsfw2" }, { name: "色色葫芦", host: ["151.lat"], reg: /^https?:\/\/151\.lat\/\w+\/[^\.]+.\html$/i, imgs: "a[data-fancybox]", button: [4], insertImg: [".post-content", 2], go: 1, customTitle: () => fun.title(" - 色色葫芦").replace("–", "-").replace(/\[\d+P\]/i, ""), fancybox: { v: 3, css: false }, category: "nsfw1" }, { name: "色色图库", host: ["www.sstuku13.xyz", "sstuku6.xyz", "sstuku7.xyz", "sstuku8.xyz", "sstuku9.xyz", "sstuku10.xyz", "sstuku11.xyz", "sstuku12.xyz", "sstuku13.xyz", "sstuku14.xyz", "sstuku15.xyz"], reg: /^https?:\/\/(www\.)?sstuku\d+\.xyz\/artshow-\d+\.html$/i, imgs: ".entry-media img", button: [4], insertImg: [".entry-content", 2], go: 1, customTitle: () => fun.geT(".single-post-detail").replace("😋 ", ""), category: "nsfw1" }, { name: "美女写真图集", host: ["www.112ze.com"], reg: /^https?:\/\/www\.112ze\.com\/index\.php\/\w+\/\d+\.html$/i, imgs: ".post-content img", button: [4], insertImg: [".post-content", 2], customTitle: () => fun.geT(".mdui-text-black"), fancybox: { v: 3, css: false }, category: "nsfw1" }, { name: "51控美图网", host: ["www.871651.com"], reg: /^https?:\/\/www\.871651\.com\/\d+\.html$/i, init: () => fun.remove("audio"), imgs: ".text img[src^=http]", button: [4], insertImg: [".text", 2], autoDownload: [0], next: "//p[contains(text(),'上一篇')]/a", prev: "//p[contains(text(),'下一篇')]/a", customTitle: () => fun.geT(".tit>h1"), css: ".news_article .left .text img{width:100%!important}", category: "nsfw1" }, { name: "18少女团", host: ["18cute.monster"], reg: /^https?:\/\/18cute\.monster\/chapter\/\d+$/i, imgs: ".comicpage img,#cp_img img", button: [4], insertImg: [".comiclist,#cp_img", 2], customTitle: () => fun.ge(".comic-name") ? fun.geT(".comic-name").replace(/\s?-?\s?\(\d+P\)/i, "") : bookInfo.book_name.replace(/\s?-?\s?\(\d+P\)/i, ""), category: "nsfw1" }, { name: "聚姬集", host: ["18jjj.cyou", "18jjj.xyz"], reg: /^https?:\/\/18jjj\.\w+\/chapter\/\d+$/i, include: "#enc_img img", init: () => { fun.clearAllTimer(); fun.remove("//div[@class='comicpage']/a[img[@alt]] | //div[@class='comicpage']/div[script] | //div[@id='cp_img']/a[img[@alt]] | //div[@id='cp_img']/div[script]"); }, imgs: async () => { await fun.getNP("#enc_img>div,#enc_img>img", "//a[text()='下一页'][@href]", null, ".fanye,.view-bottom-bar"); return [...fun.gae("#enc_img img")]; }, button: [4], insertImg: ["#enc_img", 2], customTitle: () => fun.ge(".comic-name") ? fun.geT(".comic-name") : bookInfo.book_name, css: "#pubcdnModal{display:none!important;}img{opacity:1!important;}", category: "nsfw1" }, { name: "adultspic色情成人圖片", host: ["adultspic.com"], reg: /^https?:\/\/adultspic\.com\/\d+\.html$/i, imgs: () => [...fun.gae(".wp-block-image img")].map(e => e.src), button: [4], insertImg: [".article-content", 2], autoDownload: [0], next: ".article-nav-prev>a", prev: ".article-nav-next>a", customTitle: () => fun.geT(".article-title"), css: ".ssr-content{display:none!important;}", category: "nsfw2" }, { name: "福利兔", host: ["www.fulitu.cc"], reg: /^https?:\/\/www\.fulitu\.cc\/\d+\/\d+\/\d+\/\d+\.html$/i, imgs: "div[data-fancybox]", button: [4], insertImg: [ ["#masonry", 2, "#masonry"], 2 ], customTitle: () => fun.geT(".post-info>h2"), fancybox: { v: 3, css: false }, category: "nsfw1" }, { name: "中国街拍", host: ["www.cnjiepai.xyz"], reg: /^https?:\/\/www\.cnjiepai\.xyz\/\d+\/[\w-]+\.html$/i, imgs: "a[data-fancybox]", button: [4], insertImg: [ ["//p[a[img]]", 2, "//p[a[img]]"], 2 ], customTitle: () => fun.geT("article>h1"), fancybox: { v: 3, css: false }, css: "@media only screen and (max-width:480px){article{width:100%!important}}", category: "nsfw1" }, { name: "Ai19 Art/Ai art nude/Hentaimama", host: ["ai19.art", "ainudesporn.art", "hentaimama.xyz"], reg: /^https?:\/\/(ai19\.art|ainudesporn\.art|hentaimama\.xyz)\/news\//, imgs: ".entry-content img", button: [4], insertImg: [ ["//p[img]", 2, "//p[img]"], 2 ], customTitle: () => fun.geT(".entry-header").replaceAll("|", "-"), css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}", category: "nsfw1" }, { name: "Kungfutv", host: ["kungfutv.net"], reg: /^https?:\/\/kungfutv\.net\/cosplay\/[^\/]+\//, imgs: "#readerarea img", button: [4], insertImg: [ ["#readerarea img", 1, ".ts-main-image"], 2 ], customTitle: () => fun.geT(".entry-title"), css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}", category: "nsfw1" }, { name: "禁漫天堂", host: ["18comic.vip", "18comic.org", "18comic-fun.xyz", "jmcomic.me", "jmcomic1.me", "jm-comic1.art", "jm-comic2.art", "jm-comic3.art"], reg: /^https?:\/\/(18comic.(vip|org)|18comic-fun\.xyz|jmcomic\d?\.me|jm-comic\d.art)\/photo\/\d+/, init: () => { fun.remove("//div[contains(text(),'插件')] | //div[@class='col-xs-6'][div[@data-group]] | //div[@class='panel-body']//div[@data-group] | //div[@class='row'][div[div[@data-group]]] | //div[@class='div_sticky2 hidden-lg']"); fun.remove("#billboard-modal,#guide-modal"); }, imgs: async () => { fun.showMsg(displayLanguage.str_01, 0); let arr = []; let fetchNum = 0; let imgs = [...document.querySelectorAll(".scramble-page img,.owl-item .center img")]; for (let i = 0; i < imgs.length; i++) { let getRedraw = new Promise(async resolve => { const url = imgs[i].dataset.original ?? imgs[i].dataset.src; if (url.includes(".gif") || aid < scramble_id) { resolve(url); } else { const blob = await fetch(url).then(res => res.blob()); const fileName = new URL(url).pathname.split("/").pop(); const [id, ex] = fileName.split("."); const img = new Image(); img.src = URL.createObjectURL(blob); await new Promise((resolve, reject) => (img.onload = resolve, img.onerror = reject)); const imgWidth = img.width; const imgHeight = img.height; const canvas = new OffscreenCanvas(imgWidth, imgHeight); const canvas_2d = canvas.getContext("2d"); const num = get_num(btoa(aid), btoa(id)); const cropHeight = parseInt(imgHeight % num, 10); const sHeight = Math.floor(imgHeight / num); let sy = imgHeight - cropHeight - sHeight; let dy = cropHeight; canvas_2d.drawImage(img, 0, sy, imgWidth, cropHeight + sHeight, 0, 0, imgWidth, cropHeight + sHeight); for (let i = 1; i < num; ++i) { canvas_2d.drawImage(img, 0, sy -= sHeight, imgWidth, sHeight, 0, dy += sHeight, imgWidth, sHeight); } URL.revokeObjectURL(img.src); canvas.convertToBlob({ type: blob.type, quality: 0.9 }).then(blob => { fun.showMsg(`drawImage ${fetchNum+=1}/${imgs.length}`, 0); resolve(URL.createObjectURL(blob)); }); } }); arr.push(getRedraw); await fun.delay(100); } return arr; /* return [...document.querySelectorAll(".scramble-page img,.owl-item .center img")].map(async (img, index, arr) => { const url = img.dataset.original ?? img.dataset.src; if (url.includes(".gif") || aid < scramble_id) { return url; } else { const blob = await fetch(url).then(res => res.blob()); const fileName = new URL(url).pathname.split("/").pop(); const [id, ex] = fileName.split("."); const img = new Image(); img.src = URL.createObjectURL(blob); await new Promise((resolve, reject) => (img.onload = resolve, img.onerror = reject)); const imgWidth = img.width; const imgHeight = img.height; const canvas = new OffscreenCanvas(imgWidth, imgHeight); const canvas_2d = canvas.getContext("2d"); const num = get_num(btoa(aid), btoa(id)); const cropHeight = parseInt(imgHeight % num, 10); const sHeight = Math.floor(imgHeight / num); let sy = imgHeight - cropHeight - sHeight; let dy = cropHeight; canvas_2d.drawImage(img, 0, sy, imgWidth, cropHeight + sHeight, 0, 0, imgWidth, cropHeight + sHeight); for (let i = 1; i < num; ++i) { canvas_2d.drawImage(img, 0, sy -= sHeight, imgWidth, sHeight, 0, dy += sHeight, imgWidth, sHeight); } URL.revokeObjectURL(img.src); return await canvas.convertToBlob({ type: blob.type, quality: 1 }).then(blob => { fun.showMsg(`${displayLanguage.str_02}${fetchNum+=1}/${arr.length}`, 0); return URL.createObjectURL(blob); }); } }); */ }, button: [4, "24%", 1], insertImg: ["//div[@class='panel-body'][div[@class='row thumb-overlay-albums']]", 0], next: "//a[span[text()='下一話']][@href]", prev: 1, customTitle: () => { return fun.fetchDoc(fun.ge("//a[span[text()='漫畫簡介']]").href).then(albumDoc => { let comicName = fun.geT(".panel-heading h1", 1, albumDoc).replaceAll("/", "").replace(/\s?\[禁漫漢化組\]/, ""); let episode = fun.ge(".episode", albumDoc); if (episode) { let id = location.pathname.match(/\d+/)[0]; let selector = `.episode a[data-album="${id}"]`; let text = fun.geT(selector, 1, albumDoc); let chapterName = text.split("\n").filter(item => item)[0]; return comicName + " - " + chapterName; } else { return comicName; } }); }, fetch: 1, css: ".hidden-lg:not(.panel)[style*='z-index']{display:none!important;}", category: "hcomic" }, { name: "禁漫天堂", reg: /^https?:\/\/(18comic.(vip|org)|18comic-fun\.xyz|jmcomic\d?\.me|jm-comic\d.art)\//, init: () => { fun.remove("//div[contains(text(),'插件')] | //div[@class='col-xs-6'][div[@data-group]] | //div[@class='panel-body']//div[@data-group] | //div[@class='row'][div[div[@data-group]]][not(div[@id='album_photo_cover'])][not(div[*[@class='panel panel-default']])] | //div[@class='div_sticky2 hidden-lg']"); fun.remove("#billboard-modal,#guide-modal"); }, css: ".hidden-lg:not(.panel)[style*='z-index']{display:none!important;}", category: "ad" }, { name: "E-Hentai圖片清單頁", host: ["e-hentai.org", "exhentai.org"], reg: /(e-hentai|exhentai).org\/g\/\d+\/\w+\/$/, exclude: "//h1[text()='Content Warning']", init: async () => { await fun.getNP(".gdtm,.gdtl", ".ptds+td>a", null, "//tr[td[@class='ptds']]"); }, imgs: async () => { if (options.fancybox == 1 && !downloading) { //預覽縮圖網址需要裁剪難弄... if (fun.ge(".gdtm img[style],.gdtl img[style]")) { let thumbnailsHeightData = [...document.querySelectorAll(".gdtm img,.gdtl img")].map(e => parseInt(e.style.height.match(/\d+/)[0], 10)); let thumbnailUrls = [...new Set([...document.querySelectorAll(".gdtm>div,.gdtl>div")].map(div => div.getAttribute("style").split("url(")[1].split(")")[0]))]; let getThumbnai = 0; fun.showMsg("Get Thumbnailsing...", 0); let blobs = thumbnailUrls.map((url, i, arr) => { return fun.xhr(url, "blob").then(blob => { fun.showMsg(`Get Thumbnails ${getThumbnai += 1}/${arr.length}`, 0); return blob; }); }); let heightIndex = 0; let crop = 0; await Promise.all(blobs).then(async blobArr => { fun.hideMsg(); for (let i = 0; i < blobArr.length; i++) { fun.showMsg(`Thumbnails Crop ${crop += 1}/${blobArr.length}`, 0); //console.log(`預覽縮圖裁切第${crop}張`); let img = new Image(); img.src = URL.createObjectURL(blobArr[i]); await new Promise((resolve, reject) => (img.onload = resolve, img.onerror = reject)); for (let w = 0; w < img.width; w += 100) { let canvas = document.createElement("canvas"); canvas.height = thumbnailsHeightData[heightIndex]; canvas.width = 100; canvas.getContext("2d").drawImage(img, -Math.abs(w), 0); let dataURL = canvas.toDataURL("image/webp", 0.5); let thumbnailBlobURL = fun.dataURLtoBlobURL(dataURL); thumbnailsSrcArray.push(thumbnailBlobURL); //console.log(thumbnailBlobURL); heightIndex++; } } }); fun.hideMsg(); } else { thumbnailsSrcArray = [...document.querySelectorAll(".gdtm img,.gdtl img")].map(e => e.src); } } fun.showMsg(displayLanguage.str_07, 0); let doc = await fun.fetchDoc(fun.ge(".gdtm a,.gdtl a").href); let fullimg = fun.ge("a[href*=fullimg]", doc); if (fullimg) { let url = fullimg.href; let res = await fun.xhrHEAD(url); let finalUrl = res.finalUrl; return /login\.php/.test(finalUrl) ? fun.getImgA("#img", ".gdtm a,.gdtl a", 100) : fun.getImgA("a[href*=fullimg]", ".gdtm a,.gdtl a", 100); } else { return fun.getImgA("#img", ".gdtm a,.gdtl a", 100); } }, button: [4], insertImg: [ ["#gdt", 0], 3 ], customTitle: () => { let t = fun.geT("#gj").replace(/\//, ""); return t.length > 0 ? t : fun.geT("#gn").replace(/\|.+/, "").trim(); }, go: 1, topButton: true, threading: 4, category: "hcomic" }, { name: "E-Hentai圖片清單頁", host: ["e-hentai.org"], link: "https://e-hentai.org/lofi/", reg: /^https?:\/\/e-hentai\.org\/lofi\/g\/\w+\/\w+\//, init: async () => { await fun.getNP(".gi", "//a[text()='Next Page >']", null, "#ia"); }, imgs: () => fun.getImgA("#sm", ".gi>a", 100), button: [4], insertImg: [ ["#ia", 2], 2 ], customTitle: () => fun.title(" - E-Hentai", 1).replace(/\|.+/, "").replace(/\//, "").trim(), go: 1, topButton: true, threading: 8, category: "hcomic" }, { name: "nhentai圖片清單頁", host: ["nhentai.net", "nyahentai.red", "www.hentai.name", "nhentai.xxx", "nhentai.to", "simplyhentai.org", "simplyhentai.red"], reg: /(nhentai\.net|nyahentai\.red|www\.hentai\.name|nhentai\.xxx|nhentai\.to|simplyhentai\.org|simplyhentai\.red)\/g\/\d+\/?$/, imgs: async () => { thumbnailsSrcArray = [...fun.gae("a.gallerythumb>img")].map(e => e.dataset.src ?? e.src); if (/nhentai\.net/.test(siteUrl)) { const hostArray = ["i", "i3", "i5", "i7"]; const randomHost = arr => { let choose = Math.floor(Math.random() * Math.floor(arr.length)); let rValue = arr[choose]; return rValue; }; return _gallery.images.pages.map((img, index) => `https://${randomHost(hostArray)}.nhentai.net/galleries/${gallery.media_id}/${index + 1}.${{ j: "jpg", p: "png", g: "gif" }[img.t]}`); } else if (/nyahentai\.red|nhentai\.xxx|nhentai\.to|simplyhentai\.org|simplyhentai\.red/.test(siteUrl)) { return [...fun.gae(".thumbs img,.thumb-container img")].map(e => e.dataset.src ? e.dataset.src.replace(/t\.jpg/, ".jpg").replace(/t\.png/, ".png") : e.src.replace(/t\.jpg/, ".jpg").replace(/t\.png/, ".png")); } else if (/www\.hentai\.name/.test(siteUrl)) { return [...fun.gae(".thumb-container img")].map(e => e.src.replace("_thumb.jpg", ".jpg").replace("_thumb.png", ".png")); } }, button: [4], insertImg: [ [".thumbs,#thumbnail-container", 0], 2 ], autoClick: ["#show-all-images-button"], customTitle: () => { if (/nhentai\.net/.test(siteUrl)) { return gallery.title.japanese ?? gallery.title.english; } else { let h2 = fun.geT("h2.title,h2"); return h2.length > 4 ? h2 : fun.geT("h1.title,h1"); } }, threading: 8, go: 1, topButton: true, css: ".advt{display:none!important}", category: "hcomic" }, { name: "Cathentai/Hentaibeeg/Hentaicolor/圖片清單頁showAll", host: ["cathentai.net", "hentaibeeg.com", "hentaicolor.net"], reg: /(cathentai\.net|hentaibeeg\.com|hentaicolor\.net)\/[^/]+\/(#collapse)?$/i, autoClick: ["#showAll"], category: "none" }, { name: "Cathentai/Hentaibeeg/Hentaicolor/List Read頁", host: ["cathentai.net", "hentaibeeg.com", "hentaicolor.net", "nyahentai.info"], reg: /(cathentai\.net|hentaibeeg\.com|hentaicolor\.net|nyahentai\.info)\/read\/\d+\.html$/i, imgs: () => fun.run(fun.geT("#listImgH")), button: [4], insertImg: ["#image-container", 2], customTitle: () => fun.title(/ - Cathentai| - Hentaicolor| - Hentaibeeg| - Nyahentai.info/, 1), category: "hcomic" }, { name: "3hentai圖片清單頁", host: ["3hentai.net"], reg: /(www\.3hentai1\.buzz|3hentai\.net)\/\??d\/\d+$/, imgs: () => { thumbnailsSrcArray = [...fun.gae(".single-thumb>a>img")].map(e => e.dataset.src ?? e.src); return fun.getImgA(".js-main-img", ".single-thumb>a", 100); }, button: [4], insertImg: [ ["#thumbnail-gallery", 0], 2 ], customTitle: () => fun.geT("#main-info>h2"), go: 1, topButton: true, threading: 4, //css: "#header-ban-agsy,#middle-ban-agsy,#footer-ban-agsy{display:none!important}.single-thumb-col{padding:0px!important;width:100%!important}", category: "hcomic" }, { name: "HentaiFox圖片清單頁", host: ["hentaifox.com"], reg: /hentaifox\.com\/gallery\/\d+\/$/, include: ".view_group", imgs: async () => { fun.showMsg(displayLanguage.str_04, 0); await fun.waitEle(".view_group[style]"); fun.hideMsg(); thumbnailsSrcArray = [...fun.gae(".gallery_thumb img")].map(e => e.dataset.src ?? e.src); return thumbnailsSrcArray.map(e => e.replace("t.", ".")); //return fun.getImgA("#gimg", ".g_thumb>a", 300); }, button: [4], insertImg: [ ["#append_thumbs", 0], 2 ], autoClick: ["#load_all"], customTitle: () => fun.geT(".info>h1"), go: 1, topButton: true, threading: 4, category: "hcomic" }, { name: "HentaiFox圖片清單頁", host: ["hentaifox.com"], reg: /hentaifox\.com\/gallery\/\d+\/$/, imgs: () => { return [...fun.gae(".gallery_thumb img")].map(e => e.dataset.src.replace("t.", ".")); //return fun.getImgA("#gimg", ".g_thumb>a", 300); }, button: [4], insertImg: [ ["#append_thumbs", 0], 2 ], customTitle: () => fun.geT(".info>h1"), go: 1, topButton: true, threading: 4, category: "hcomic" }, { name: "nhentai/HentaiHand閱讀頁", host: ["nhentai.com", "hentaihand.com"], reg: /(nhentai\.com|hentaihand\.com)\/\w+\/comic\/[^/]+\/reader\//i, imgs: ".vertical-image img[data-src]", button: [4], insertImg: [".reader", 2], customTitle: async () => { await fun.delay(1000, 0); return fun.geT(".router-link-active") }, category: "hcomic" }, { name: "nhentai.xxx/lhentai.com/simplyhentai.red閱讀頁", host: ["nhentai.xxx", "lhentai.com", "simplyhentai.red"], reg: /^https?:\/\/(nhentai\.xxx|lhentai\.com|simplyhentai\.red)\/g\/\d+\/\d+\/$/, imgs: () => { let imgDir = fun.ge(".fit-horizontal").src.match(/.+\//)[0]; return images_ext.map((e, i) => imgDir + (i + 1) + { "j": ".jpg", "p": ".png", "b": ".bmp", "g": ".gif" } [e]); }, button: [4], insertImg: ["#page-container", 2], category: "hcomic" }, { name: "Pururin圖片清單頁", host: ["pururin.to"], reg: /pururin\.to\/gallery\/\d+\/.+/, autoClick: ["//button[contains(text(),'View all')]"], category: "none" }, { name: "Pururin閱讀頁", host: ["pururin.to"], reg: /pururin\.to\/read\/\d+\/\d+\/.+/, imgs: () => { let ele = fun.ge(".img-viewer"); let svr = ele.dataset.svr; let data = JSON.parse(ele.dataset.img); //按頁數排列 let arr = data.images.sort((a, b) => a.page - b.page); arr = arr.map(e => svr + "/" + data.directory + "/" + e.filename); thumbnailsSrcArray = arr.map(e => e.replace(/(\.\w+)$/, "t$1")); return arr; }, button: [4], insertImg: [".img-viewer", 2], customTitle: () => fun.ge("[placeholder=Japanese]").value, css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}.box.img-reader .img-viewer{position:unset!important;white-space:unset!important}", category: "hcomic" }, { name: "9hentai閱讀頁", host: ["9hentai.to"], reg: /9hentai\.to\/g\/\d+\/\d+\/$/, init: async () => { let json = await fetch("/api/getBookByID", { method: "POST", body: JSON.stringify({ id: parseInt(/\d+/.exec(window.location.pathname).at(0) ?? 0, 10) }), headers: { "Content-Type": "application/json" } }).then(res => res.json());; debug("\n此頁JSON資料\n", json); siteJson = json; }, imgs: () => { let arr = fun.arr(siteJson.results.total_page).map((_, i) => `${siteJson.results.image_server + siteJson.results.id}/${i + 1}.jpg`); thumbnailsSrcArray = arr.map(e => e.replace(/(\d+)(\.\w+)$/, "preview/$1t$2")); return arr; }, button: [4], insertImg: [".image-viewer", 2], customTitle: () => siteJson.results.alt_title ?? siteJson.results.title, css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}", category: "hcomic" }, { name: "AsmHentai閱讀頁", host: ["asmhentai.com"], reg: /asmhentai\.com\/gallery\/\d+\/\d+\/$/, imgs: () => { let imgDir = fun.ge("#fimg").dataset.src.match(/.+\//)[0]; let max = fun.ge("#pages").value; let arr = fun.arr(max).map((_, i) => imgDir + (i + 1) + ".jpg"); thumbnailsSrcArray = arr.map(e => e.replace(/(\.\w+)$/, "t$1")); return arr; }, insertImg: [".rd_fimg", 2], customTitle: () => fun.title(" Page", 1), css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}", category: "hcomic" }, { name: "AsmHentai View All", host: ["asmhentai.com"], reg: /asmhentai\.com\/g\/\d+\/$/, autoClick: ["#load_all"], category: "none" }, { name: "MultPorn閱讀頁", host: ["multporn.net"], reg: /multporn\.net\//, include: "//script[contains(text(),'configUrl')]", imgs: () => { let str = [...document.scripts].find(s => s.innerHTML.search(/configUrl/) > -1).innerHTML.match(/configUrl":"[^,]+/g)[0].slice(12, -1).replaceAll("\\", ""); let url = location.origin + str; return fetch(url).then(res => res.text()).then(text => { let xml = fun.xml(text); let imgs = [...fun.gae("image", xml)]; thumbnailsSrcArray = imgs.map(e => e.getAttribute("thumbURL")); return imgs.map(e => e.getAttribute("linkURL")); }); }, button: [4], insertImg: [ [".juicebox-parent", 2], 2 ], go: 1, autoDownload: [0], next: "//a[text()='Next Part']", prev: "//a[text()='Previous Part']", customTitle: () => fun.geT("#page-title"), css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}", category: "hcomic" }, { name: "KingComiX閱讀頁", host: ["kingcomix.com"], reg: /^https?:\/\/kingcomix\.com\/[^\/]+\/$/, imgs: "figure img, .entry-content img.lazy", button: [4], insertImg: [".entry-content", 2], customTitle: () => fun.geT("h1.singleTitle-h1").replace(" – Kingcomix", ""), category: "hcomic" }, { name: "HentaiHere閱讀頁", host: ["hentaihere.com"], reg: /hentaihere\.com\/m\/\w+\/\d+\/\d+\/$/i, include: "//script[contains(text(),'rff_imageList')]", init: "$(document).off();", imgs: () => rff_imageList.map(e => "https://hentaicdn.com/hentai" + e), button: [4], insertImg: ["#reader-content", 2], autoDownload: [0], next: "//li[a[@class='bg-info']]/following-sibling::li[1]/a", prev: 1, customTitle: () => fun.geT("#detail span") + " - " + fun.geT("#chapter span"), css: ".afs_ads,[data-type]{display:none!important}", category: "hcomic" }, { name: "HentaiPaw圖片清單頁", host: ["hentaipaw.com"], reg: /hentaipaw\.com\/articles\/\d+/i, delay: 2000, imgs: async () => { fun.showMsg("獲取數據中...", 0); let url = fun.ge(".gallery-image-container a").href; let doc = await fun.fetchDoc(url); let data = [...doc.scripts].find(s => s.innerHTML.search(/startingPage/) > -1).innerHTML.replace(/\\/g, "").match(/\[{.+"}]/)[0]; fun.hideMsg(); thumbnailsSrcArray = [...fun.gae(".gallery-image-container a>img")].map(e => e.src); return JSON.parse(data).map(e => e.src); }, button: [4], insertImg: [ [".detail-gallery-list", 2], 2 ], go: 1, customTitle: () => fun.geT(".detail-ttl").replace(/\/|\|/g, " "), category: "hcomic" }, { name: "HDpornComics圖片清單頁", host: ["hdporncomics.com"], reg: /hdporncomics\.com\/[^/]+\/([^/]+\/)?$/i, include: ".my-gallery.scrollmenu", imgs: () => { thumbnailsSrcArray = [...fun.gae(".my-gallery a[data-size] img")].map(e => e.src); return [...fun.gae(".my-gallery a[data-size]")]; }, button: [4], insertImg: [ [".postContent>.items-center,#likeDislikeVue", 2], 2 ], go: 1, customTitle: () => fun.geT("#infoBox>h1").replace(" – Gay Manga", "").replace(" Comic Porn", ""), category: "hcomic" }, { name: "HDpornComics閱讀頁", host: ["hdporncomics.com"], reg: /hdporncomics\.com\/manhwa\/[^/]+\/chapter/i, imgs: "#imageContainer>img", button: [4], insertImg: ["#imageContainer", 2], autoDownload: [0], next: "//a[contains(text(),'Next')]", prev: "//a[contains(text(),'Prev')]", customTitle: () => fun.geT(".list-reset li:nth-child(5)>a") + " - " + fun.geT("option[selected]"), category: "hcomic" }, { name: "Doujins圖片清單頁", host: ["doujins.com"], reg: /doujins\.com\/.+\/.+/i, include: "#thumbnails", autoClick: ["button.loadmore"], imgs: () => { thumbnailsSrcArray = [...fun.gae("#thumbnails img")].map(e => e.src); return [...fun.gae(".swiper-wrapper>div:not(:first-of-type):not(:last-of-type) .swiper-lazy")]; }, button: [4], insertImg: [ ["#thumbnails", 2], 2, 2000 ], go: 1, customTitle: () => fun.geT(".folder-title>a:last-child"), category: "hcomic" }, { name: "Simply Hentai圖片清單頁", host: ["www.simply-hentai.com"], reg: /www\.simply-hentai\.com\/[0-9a-z-]+\/.+/i, include: "//main[@class='container' and div[div[a[div[@class='image-wrapper' and img]]]]]", exclude: "nav.pagination,#reader-image", imgs: () => { thumbnailsSrcArray = [...fun.gae("img[data-src]")].map(e => e.dataset.src); return thumbnailsSrcArray.map(e => e.replace("small_thumb_", "")); }, button: [4], insertImg: [ ["//main[@class='container']/*[last()]", 2], 2, 2000 ], go: 1, autoClick: "a[href$='all-pages']", customTitle: () => { try { return fun.geT("h1.content-headline>a").replace(/\/|\|/g, "-"); } catch (e) { return fun.geT("h1").replace(/\/|\|/g, "-"); } }, css: ".text-center{display:none!important}", category: "hcomic" }, { name: "Hanime1圖片清單頁", host: ["hanime1.me"], link: "https://hanime1.me/comics", reg: /hanime1\.me\/comic\/\d+$/, imgs: () => { thumbnailsSrcArray = [...fun.gae(".comics-thumbnail-wrapper img[data-srcset]")].map(e => e.dataset.srcset); return thumbnailsSrcArray.map(e => e.replace("t.n", "i.n").replace("t.jpg", ".jpg").replace("t.png", ".png")); }, button: [4], insertImg: [".comics-thumbnail-wrapper", 2, 1000], go: 1, autoClick: "#show-all-comics-btn", customTitle: () => fun.geT("h4.title"), threading: 4, referer: "src", css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}", category: "hcomic" }, { name: "My Hentai Gallery圖片清單頁", host: ["myhentaigallery.com"], reg: /^https?:\/\/myhentaigallery\.com\/g\/\d+$/, imgs: () => { thumbnailsSrcArray = [...fun.gae(".comic-thumb>img")].map(e => e.src); return thumbnailsSrcArray.map(e => e.replace("thumbnail", "original")); }, button: [4], insertImg: [ ["//div[@class='comic-listing'][center[center[ul[@class='comics-grid clear']]]]", 0], 2 ], go: 1, customTitle: () => fun.geT(".comic-description>h1"), css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}", category: "hcomic" }, { name: "XYZ PORN COMICS圖片清單頁", host: ["xyzcomics.com"], reg: /^https?:\/\/xyzcomics\.com\/[^\/]+\/$/, imgs: () => { thumbnailsSrcArray = [...fun.gae(".jig-link>img")].map(e => e.src); return [...fun.gae(".jig-link")]; }, button: [4], insertImg: [ [".entry-content", 0], 2 ], go: 1, customTitle: () => fun.geT(".entry-title"), css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}", category: "hcomic" }, { name: "IMHentai圖片清單頁", host: ["imhentai.xxx"], reg: /imhentai\.xxx\/gallery\/\d+\//, delay: 1000, autoClick: ["#load_all"], imgs: () => { thumbnailsSrcArray = [...fun.gae("#append_thumbs img")].map(e => e.dataset.src ?? e.src); return fun.getImhentaiSrc(); }, button: [4], insertImg: [ ["#append_thumbs", 0], 2, 3000 ], customTitle: async () => { await fun.waitVar("g_th"); let t = fun.geT(".subtitle"); return t.length > 0 ? t : fun.geT('h1').replace(/\||\+/g, ""); }, go: 1, topButton: true, threading: 4, category: "hcomic" }, { name: "IMHentai", host: ["imhentai.xxx"], reg: /imhentai\.xxx\/view\/\d+\/\d+\//, init: "setTimeout(()=>{fun.ge('.pre_img').removeAttribute('style');$('a.next_img').unbind('click');},1000)", imgs: () => fun.getImhentaiSrc(), button: [4], insertImg: [".pre_img", 2], customTitle: () => fun.title("-", 1), threading: 4, category: "hcomic" }, { name: "TSUMINO圖片清單頁", host: ["www.tsumino.com"], reg: /^https?:\/\/www\.tsumino\.com\/entry\/\d+/, include: "#thumbnails-container", delay: 300, autoClick: "#btn-view-all", imgs: async () => { thumbnailsSrcArray = [...fun.gae("#thumbnails-container img")].map(e => e.dataset.original ?? e.src); fun.showMsg(displayLanguage.str_05, 0); let fetchNum = 0; let resArr = [...fun.gae("#thumbnails-container a")].map(async (a, i, arr) => { await fun.delay(200 * i, 0); return fun.fetchDoc(a.href).then(doc => { fun.showMsg(`${displayLanguage.str_06}${fetchNum+=1}/${arr.length}`, 0); return fun.ge("div[data-cdn]", doc).dataset.cdn.replace("[PAGE]", parseInt(i, 10) + 1); }); }); return Promise.all(resArr).then(arr => { fun.hideMsg(); return arr; });; }, button: [4], insertImg: [ ["#thumbnails-container", 2], 2, 1000 ], go: 1, customTitle: () => { let title = fun.geT(".book-data"); if (/ \/ /.test(title)) { return title.split(" / ").pop(); } else if (/ \| /.test(title)) { let s = title.split(" | "); if (s.length == 2) { return s.pop(); } else { return title; } } return title; }, category: "hcomic" }, { name: "Hentai2Read", host: ["hentai2read.com"], reg: /hentai2read\.com\/\w+\/\d+\/(\d+\/)?$/, imgs: () => gData.images.map(e => "https://static.hentai.direct/hentai" + e), button: [4], insertImg: ["#js-reader", 2], autoDownload: [0], next: "//li[a[contains(@class,'bg-info')]]/preceding-sibling::li[1]/a", prev: 1, customTitle: () => fun.geT(".reader-left-text.text-ellipsis").replace(/\//g, "-"), //threading: 4, category: "hcomic" }, { name: "XlecX", host: ["xlecx.one"], reg: /xlecx\.one\/[\w-]+\.html$/, imgs: ".ug-thumb-image,img[data-src]", button: [4], insertImg: [ [".page__col-left", 0], 2 ], go: 1, customTitle: () => fun.geT(".page__col-left>h1"), category: "hcomic" }, { name: "HentaiPal.com", host: ["hentaipal.com"], reg: /^https?:\/\/hentaipal\.com\/viewalbum\/\w+\/[^\/]+\/index\.html$/, init: () => fun.remove("iframe[src*='ad'],font[color=red]"), imgs: async () => { let max; try { max = fun.ge(".imgpagebar>a:last-child").href.match(/page-(\d+)/)[1]; } catch (e) { max = 1; } if (max > 1) { let links = []; let url = siteUrl.replace("index.html", ""); for (let i = 2; i <= max; i++) { links.push(url + "page-" + i + ".html"); } await fun.getEle(links, ".justify-content-center img:not([src*=logo])", ["//div[@class='row justify-content-center'][not(a[img])]", 0]); } return [...fun.gae("//div[@class='row justify-content-center'][not(a[img])]//img")]; }, button: [4], insertImg: ["//div[@class='row justify-content-center'][not(a[img])]", 2], customTitle: () => fun.title("HentaiPal.com - "), category: "hcomic" }, { name: "HentaiPal.com 分類自動翻頁", enable: 1, reg: /^https?:\/\/hentaipal\.com\//, init: () => fun.remove("iframe[src*='ad']"), autoPager: { ele: "//div[@class='col-6 col-sm-3'][a[img]]", observer: "//div[@class='col-6 col-sm-3'][a[img]]", next: "//a[h3[span[@class='bi bi-caret-right-fill']]]", re: "//div[div[@class='imgpagebar']]", history: 1, title: () => "Page" + nextLink.match(/page-(\d+)/)[1] }, css: ".autoPagerTitle{width:100%!important}", category: "autoPager" }, { name: "HentaiPorns", host: ["hentaiporns.net"], reg: /hentaiporns\.net\/[\w-]+\/$/, include: ".gallery", imgs: () => { thumbnailsSrcArray = [...fun.gae(".gallery-item a>img")].map(e => e.dataset.src ?? e.src); return [...fun.gae(".gallery-item a")]; }, button: [4], insertImg: [ [".gallery", 0], 2, 1000 ], go: 1, customTitle: () => { let ele = fun.ge("#gn+h1"); return ele ? fun.geT("#gn+h1") : fun.geT("#gn,.entry-title"); }, fancybox: { v: 3, css: false }, category: "hcomic" }, { name: "8muses", host: ["comics.8muses.com"], reg: /^https?:\/\/comics\.8muses\.com\/comics\/album\/[\w-]+\/[\w-]+\//i, include: ".gallery", exclude: ".image-title>.title-text", imgs: () => { let th = [...fun.gae("img[data-src]")].map(e => e.dataset.src.replace("/image/th/", "https://comics.8muses.com/image/fl/")); let arr = []; let loadnum = 0; fun.showMsg("Loading...", 0); for (let i in th) { let promise = new Promise(resolve => { let temp = new Image(); temp.src = th[i]; temp.onload = () => { loadnum++; fun.showMsg(`Loading ${loadnum}/${th.length}`, 0); resolve(th[i]); } temp.onerror = () => { loadnum++; fun.showMsg(`Loading ${loadnum}/${th.length}`, 0); resolve(th[i].replace("/fl/", "/fm/")); } }); arr.push(promise); } return Promise.all(arr).then(arr => { fun.hideMsg(); return arr; }); }, button: [4], insertImg: [ [".gallery", 2], 1 ], go: 1, css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}", category: "hcomic" }, { name: "AllPornComic", host: ["allporncomic.com"], reg: /^https?:\/\/allporncomic\.com\/porncomic\/[^\/]+\/[^\/]+\/$/i, include: ".read-container", imgs: ".wp-manga-chapter-img", button: [4], insertImg: [".read-container", 2], autoDownload: [0], next: "a.next_page", prev: "a.prev_page", customTitle: () => fun.geT("#chapter-heading"), css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}", category: "hcomic" }, { name: "Hachirumi.com", host: ["hachirumi.com"], reg: /^https?:\/\/hachirumi.com\/read\/manga\/[^\/]+\/.+/, delay: 300, imgs: () => { let arr = []; let obj = Reader.current.chapters; for (let country of Object.keys(obj)) { arr.push(obj[country]); } let images = arr.map(e => e.images[Object.keys(e.images)[0]]).flat().map(e => location.origin + e); return images; }, customTitle: () => Reader.current.title, category: "hcomic" }, { name: "7mmtvH漫畫貼圖", host: ["7mmtv.sx"], reg: /7mmtv\.sx\/.*hcomic/, include: "//script[contains(text(),'Large_cgurl')]", imgs: () => { let arr = Large_cgurl.map(e => /imgur/.test(e) ? e : null).filter(item => item); return arr.length == 0 ? Large_cgurl : arr; }, button: [4], insertImg: ["#show_cg_html", 2], customTitle: () => fun.title(" - 7mmtv.sx", 1).replace(/\s?\(\d+P\)/i, ""), css: ".ut1_img_content_js,.ut_cg1_top{display:none!important}", category: "hcomic" }, { name: "18H", host: ["18h.mm-cg.com"], reg: /18h\.mm-cg\.com\/(zh\/?)\w+_content\/\d+\/content\.html/i, imgs: () => Large_cgurl, button: [4], insertImg: ["#show_cg_html", 2], customTitle: () => fun.title("-", 1), category: "hcomic" }, { name: "H 次元", host: ["h-ciyuan.com"], reg: /h-ciyuan\.com\/\d+\/\d+\/.+\//, include: "a[data-fancybox],.rl-gallery-container a", imgs: () => { thumbnailsSrcArray = [...fun.gae("a[data-fancybox] img,.rl-gallery-container a img")].map(e => e.src); return [...fun.gae("a[data-fancybox],.rl-gallery-container a")] }, button: [4], //insertImg: [".entry-content", 2], insertImg: [ [".entry-content,.rl-gallery-container", 2], 2 ], go: 1, next: ".nav-previous>a", prev: ".nav-next>a", customTitle: () => fun.geT(".post-title"), category: "hcomic" }, { name: "淫漫画", host: ["www.yinmh.com", "www.yinmh.top", "www.yinmh.xyz"], reg: /www\.yinmh\.(com|top|xyz)\/\d+\.html/, imgs: () => [...fun.gae(".left>.image img.lazy")].map(e => e.getAttribute("img") ?? e.src), button: [4], insertImg: [".left", 2], customTitle: () => fun.geT(".box>h1"), category: "hcomic" }, { name: "漫畫聯合國", host: ["www.comicun.com"], reg: /www\.comicun\.com\/index-look(-cid)?-name-.+/, FixURL: url => { if (/index-look-cid-name-/.test(url)) { let arr = url.split("-"); let str = ""; for (let i = 0; i < arr.length; i++) { if (i == 7) { str += arr[i]; } else if (i == 5) { str += "cid-" + arr[i] + "-"; } else if (i != 2) { str += arr[i] + "-"; } } return decodeURI(str); } else { return decodeURI(url); } }, init: () => { fun.run("$(document).unbind('click');"); if (/index-look-cid-name-/.test(siteUrl)) location.href = siteData.FixURL(siteUrl); [...fun.gae("//a[text()='下一章'] | //a[text()='上一章']")].forEach(a => a.href = siteData.FixURL(a.href)); }, imgs: (url = siteUrl, doc, msg = 1, request = 0) => fun.getImg("#ComicPic", fun.ge("#total", doc).value, 20, [null, null], 20, url, msg, request), button: [4, "24%", 1], insertImg: [".e", 2], autoDownload: [0], next: "//a[text()='下一章']", prev: 1, customTitle: doc => { let arr = fun.geT(".b", 1, doc).split("-"); return arr[2].trim() + " - " + arr[3].trim(); }, preloadNext: async (nextDoc, obj) => { fun.picPreload(await obj.imgs(nextLink, nextDoc, 0, 1), obj.customTitle(nextDoc), "next"); }, css: "body{overflow:unset!important}.awesome970{display:none!important;}", category: "comic" }, { name: "丽图·污漫画", host: ["litu100.xyz"], reg: /litu\d+\.xyz\/comic\/id-\w+\/\d+\.html/, imgs: ".article.comic img", button: [4], insertImg: [".article.comic", 2], autoDownload: [0], next: "a.next", prev: "a.prev", customTitle: () => fun.geT(".breadcrumb span:nth-child(2)").replace("首页", ""), css: ".banner_ad{display:none!important;}", category: "hcomic" }, { name: "韩国污漫画", host: ["www.ikanmh.xyz", "www.hmfby.com"], reg: /(www\.ikanmh\.xyz|www\.mxshm\.site|www\.92hm\.life|www\.ikanhm\.xyz|592mh\.top|592hm\.top|52wxz\.top|52kanmh\.top|52kanhm\.top|52hmw\.top|92comic\.top|91comic\.top|18comic2\.top|ikanyy\.top|18hm\.top|yycomic\.top|18hcomic\.top|18xcomic\.top|18xmh\.top|18xhm\.top|iikanwxz\.top|ikwxz\.top|wxzmh\.top)\/chapter\/\d+/, imgs: "img[data-original]", button: [4], insertImg: [".comicpage,#cp_img", 2], autoDownload: [0], next: "//a[text()='下一章']", prev: "//a[text()='上一章']", customTitle: () => fun.geT("h1.title"), referer: "src", category: "hcomic" }, { name: "Avbebe", host: ["avbebe.com"], link: "https://avbebe.com/archives/category/%e6%88%90%e4%ba%bah%e6%bc%ab%e7%95%ab", reg: /avbebe\.com\/archives\/\d+/, include: "//a[@rel='category tag' and text()='成人漫畫']", imgs: "img[decoding]", button: [4], insertImg: [".content-inner", 2], customTitle: () => fun.geT(".jeg_post_title").replace(/\[\d+P\]/i, ""), fancybox: { v: 3, css: false }, category: "hcomic" }, { name: "ACG漫画网", host: ["www.acgomh.com", "www.acgxmh.com", "www.acgomh.com", "www.cool-manga.com", "www.porn-comic.com", "porn-comic.com"], reg: /((www\.)?acg(x|o)mh\.com|(www\.)?cool-manga\.com|(www\.)?porn-comic\.com)\/(h|hentai)\/\d+\.html/, imgs: () => fun.getImg(".manga-page img", fun.geT("#pages>*:last-child", 2), 5), button: [4], insertImg: [".manga-page", 1], autoDownload: [0], next: ".next_pics>.fr>a[href$=html]", prev: ".next_pics>.fl>a[href$=html]", customTitle: () => fun.geT("h2.title,h1.title").replace(/_\d+P$/i, ""), category: "hcomic" }, { name: "紳士漫畫 圖片清單頁", host: ["wnacg.com", "www.wnacg.com", "m.wnacg.com", "www.wnacglink.top", "wn01.ru", "wn02.ru", "www.htmanga3.top", "www.htmanga4.top", "www.htmanga5.top", "www.hentaicomic.ru", "www.wn3.lol"], reg: /^https?:\/\/(wnacg\.com|www\.wnacg\.com|www\.wnacg\.org|m\.wnacg\.com|m\.wnacg\.org|www\.htmanga\d\.top|www\.hentaicomic\.ru|www\.wn3\.lol)\/photos-index(-page-\d+)?-aid-\d+\.html/, init: async () => { fun.remove(".dlh,iframe:not(#FullPictureLoadIframe)"); fun.remove("//body/div[a[img]] | //div[@class='Introduct']/a[div[img]] | //div[a[img[@alt='Game Tip']]]"); new MutationObserver(() => fun.remove(".dlh,iframe:not(#FullPictureLoadIframe)")).observe(document.body, MutationObserverConfig); await fun.getNP(".gallary_item", ".thispage+a", null, ".paginator", 0, null, 0); }, category: "autoPager" }, { name: "紳士漫畫 下拉閱讀頁", host: ["wnacg.com", "www.wnacg.com", "m.wnacg.com", "www.wnacglink.top", "wn01.ru", "wn02.ru", "www.htmanga3.top", "www.htmanga4.top", "www.htmanga5.top", "www.hentaicomic.ru", "www.wn3.lol"], reg: /^https?:\/\/(wnacg\.com|www\.wnacg\.com|www\.wnacg\.org|m\.wnacg\.com|m\.wnacg\.org|www\.htmanga\d\.top|www\.hentaicomic\.ru|www\.wn3\.lol)\/photos-(slide|slidelow|list|slist)-aid-\d+\.html/, imgs: () => imglist.map(e => e.url), button: [4], insertImg: ["#img_list", 2], customTitle: () => fun.title(" - 列表", 1), css: "div[align=center],#control_block{display:none!important;}", category: "hcomic" }, { name: "VN漫画网 下拉阅读", host: ["www.vnacg.com"], reg: /(www|m)\.vnacg\.com\/show\/\d+\.html/, imgs: async () => { fun.showMsg(displayLanguage.str_05, 0); let api = `/e/extend/api/show.php?id=${info.id}&page=`; let max = await fetch(`${api}1`).then(res => res.json()).then(res => res.pages); let fetchNum = 0; let resArr = fun.arr(max).map((_, i) => { return fetch(`${api + (i + 1)}`).then(res => res.json()).then(json => { fun.showMsg(`${displayLanguage.str_06}${fetchNum+=1}/${max}`, 0); return json.data; }); }); return Promise.all(resArr).then(data => { fun.hideMsg(); return data.flat().map(e => e.src); }); }, button: [4], insertImg: [".show,.read", 2], customTitle: () => fun.title("_免费阅读", 1), category: "hcomic" }, { name: "VN漫画网 清單頁 www.vnacg.com", host: ["www.vnacg.com"], reg: /www\.vnacg\.com\/detail\/\d+\.html/, observerClick: ".layui-flow-more>a", category: "autoPager" }, { name: "TWHentai/十八禁成人H漫 圖片清單頁", host: ["twhentai.com", "cn.hentai.desi"], reg: /^https?:\/\/(twhentai\.com|cn\.hentai\.desi)\/hentai_manga\/\d+\/$/, imgs: async () => { await fun.getNP("//div[div[a[@class='thumbnail'][img]]]", ".pagination li.active+li:not(.disabled)>a", null, ".pagination"); thumbnailsSrcArray = [...fun.gae(".recommended img")].map(e => e.src); return thumbnailsSrcArray.map(e => e.replace("-thumb265x385", "")); }, button: [4], insertImg: [ [".footer", 1], 2 ], go: 1, customTitle: () => { if (/twhentai/.test(location.host)) { return fun.geT(".recommended-info h3"); } else { let h3s = [...fun.gae(".recommended-info h3")]; return h3s.length > 1 ? h3s[1].innerText : h3s[0].innerText; } }, category: "hcomic" }, { name: "松鼠症倉庫", host: ["ahri8.top"], reg: /\/readOnline\d\.php\?ID=\d+&host_id=\d+/, include: "//div[@id='logo-group']//a[contains(text(),'松鼠症倉庫') or contains(text(),'松鼠症仓库')]", imgs: () => Original_Image_List.map(e => HTTP_IMAGE + e.new_filename + "_w1500." + e.extension), button: [4], insertImg: ["#Big_Image", 2], customTitle: () => fun.geT(".page-header").replace("線上閱讀", ""), css: "#content>.col-lg-12,[id^=read_online_ads_area],#Big_Image~*{display:none!important}", category: "hcomic" }, { name: "Caitlin.top", host: ["caitlin.top"], reg: /caitlin\.top\/index\.php\?route=comic\/readOnline&comic_id=\d+/, imgs: () => Image_List.map(e => location.protocol + HTTP_IMAGE + e.sort + "." + e.extension), button: [4], insertImg: ["#Big_Image", 2], customTitle: () => fun.geT(".page-header"), css: "#content>.col-lg-12,[id^=read_online_ads_area],#Big_Image~*{display:none!important}", category: "hcomic" }, { name: "Roku Hentai", host: ["rokuhentai.com"], reg: /^https?:\/\/rokuhentai\.com\/\w+\/\d+$/, imgs: ".site-reader__image", button: [4], insertImg: [".site-reader", 2], css: ".site-reader--right-to-left,.site-reader--left-to-right{overflow-x:auto!important;overflow-y:auto!important}.site-reader{padding-bottom:0px!important}.site-reader{display:block!important;}.site-bottom-ad-slot{display:none!important}", category: "hcomic" }, { name: "177 漫画/XXIAV寫真館", host: ["www.177pica.com", "www.177picyy.com", "www.xxiav.com"], reg: /www\.(177pica|177picyy|xxiav)\.com\/html\/\d+\/\d+\/\d+\.html/, imgs: () => fun.getImg(".single-content img[data-lazy-src]", (fun.geT(".page-links>*:last-child", 2) || 1), 10), button: [4], insertImg: [".single-content", 2], autoDownload: [0], next: "a[rel=prev]", prev: 1, customTitle: () => fun.geT(".entry-title").replace(/\[\d+P\]$/i, ""), category: "hcomic" }, { name: "18H 宅宅愛動漫", host: ["18h.animezilla.com"], reg: /18h\.animezilla\.com\/manga\/\d+/, imgs: () => { let max; try { max = fun.ge(".last").href.split("/").pop(); } catch (e) { max = 1; } return fun.getImgO("#comic", max, "4", [null, null], 0, ".entry-title,.wp-pagenavi", siteUrl, 0); }, button: [4], insertImg: ["#page-current", 1], customTitle: () => fun.geT("h1.entry-title").replace(/\s?\[\d+P\](\s?-\s?\d+\/\d+\s?)?/i, ""), category: "hcomic" }, { name: "18 禁漫", host: ["www.18mh.cc"], reg: /www\.18mh\.cc\/index-look-name-/, imgs: () => { let url = fun.attr("img[data-url]", "data-url"); let m = url.match(/(^.+\/)(\d+)(\.\w{2,4})$/); let path = m[1]; let start = m[2]; let ex = m[3]; let ps = fun.gae("select[onchange]>option").length; let end = parseInt(start, 10) + ps; let arr = []; for (let i = start; i < end; i++) { arr.push(path + i + ex); } return arr; }, button: [4], insertImg: [".e", 2], autoDownload: [0], next: "//a[text()='下一章']", prev: "//a[text()='上一章']", customTitle: () => { let s = fun.geT(".b").split(" - "); return s[2] + " - " + s[3]; }, css: ".p.fanye,select[onchange],.c_p.k_pag{display:none!important}", category: "hcomic" }, { name: "18 禁漫M", host: ["m.18mh.cc"], reg: /^https?:\/\/m\.18mh\.cc\/look\/name\//, imgs: () => { let url = fun.ge("#manga img").src; let m = url.match(/(^.+\/)(\d+)(\.\w{2,4})$/); let path = m[1]; let start = m[2]; let ex = m[3]; let ps = parseInt(fun.geT(".manga-page").match(/(\d+)P/)[1], 10); let end = parseInt(start, 10) + ps; let arr = []; for (let i = start; i < end; i++) { arr.push(path + i + ex); } return arr; }, button: [4], insertImg: ["#manga", 2], autoDownload: [0], next: "//a[text()='下一章']", prev: "//a[text()='上一章']", customTitle: () => fun.geT("#mangaTitle"), css: ".action-list li{width:50% !important}#action>ul>li:nth-child(n+2):nth-child(-n+3){display:none !important}", category: "hcomic" }, { name: "色漫网", host: ["www.cartoon18.com"], reg: /www\.cartoon18\.com\/story\/\d+\/full/, imgs: "img[data-src]", button: [4], insertImg: ["#lightgallery", 2], category: "hcomic" }, { name: "韓漫射/绅士同人H漫", host: ["h-webtoon.com", "h-doujinshi.xyz"], reg: /(h-webtoon\.com|h-doujinshi\.xyz)\/.+\//, init: "setTimeout(()=>{fun.gae('.g1-nav-single a').forEach(e=>{e.removeAttribute('target')})},2000)", include: ".g1-content-narrow", imgs: ".g1-content-narrow p img", button: [4], insertImg: [".g1-content-narrow", 2], autoDownload: [0], next: "#content .g1-teaser-next", prev: "#content .g1-teaser-prev", customTitle: () => fun.geT("h1.entry-title"), css: "#simple-banner,.touchy-wrapper,.touchy-wrapper~*:not([id^='pv-']):not([class^='pv-']):not(.pagetual_tipsWords):not(#comicRead):not(#fab):not(.FullPictureLoadMsg):not(.FullPictureLoadFixedBtn):not(#FullPictureLoadOptions):not(*[class^=fancybox]),.code-block,#secondary{display:none!important}", category: "hcomic" }, { name: "18H漫画", host: ["18hmanga.click"], reg: /(18hmanga\.click)\/.+\//, init: "setTimeout(()=>{fun.gae('.g1-nav-single a').forEach(e=>{e.removeAttribute('target')})},2000)", include: ".g1-content-narrow", imgs: () => { let selector = "//div[@itemprop='articleBody']//noscript[contains(text(),'upload')]"; return fun.ge(selector) ? [...fun.gae(selector)].map(e => e.innerText.match(/src="([^"]+)/)[1]) : [...fun.gae("div[itemprop=articleBody] img[src*=upload]")]; }, button: [4], insertImg: ["div[itemprop=articleBody]", 2], autoDownload: [0], next: "#content .g1-teaser-prev", prev: "#content .g1-teaser-next", customTitle: () => fun.geT("h1.entry-title"), css: "#simple-banner,.touchy-wrapper,.touchy-wrapper~*:not([id^='pv-']):not([class^='pv-']):not(.pagetual_tipsWords):not(#comicRead):not(#fab):not(.FullPictureLoadMsg):not(.FullPictureLoadFixedBtn):not(#FullPictureLoadOptions):not(*[class^=fancybox]),.code-block,#secondary{display:none!important}", category: "hcomic" }, { name: "18H漫画", host: ["18hmanga.click"], reg: /(18hmanga\.click)\/.+\//, init: "setTimeout(()=>{fun.gae('.g1-nav-single a').forEach(e=>{e.removeAttribute('target')})},2000)", imgs: () => { fun.showMsg(displayLanguage.str_01, 0); let fetchNum = 0; let resArr = [...fun.gae("//a[contains(text(),'Read More')]", doc)].map((a, i, arr) => { return fun.fetchDoc(a.href).then(doc => { fun.showMsg(`${displayLanguage.str_02}${fetchNum+=1}/${arr.length}`, 0); let selector = "//div[@itemprop='articleBody']//noscript[contains(text(),'upload')]"; return fun.ge(selector, doc) ? [...fun.gae(selector, doc)].map(e => e.innerText.match(/src="([^"]+)/)[1]) : [...fun.gae("div[itemprop=articleBody] img[src*=upload]", doc)]; }); }) return Promise.all(resArr).then(arr => { fun.hideMsg(); return arr.flat(); }); }, button: [4], insertImg: [ ["#primary", 0], 2 ], go: 1, customTitle: () => fun.geT(".g1-breadcrumbs-item>span[itemprop=name]"), css: "div[class][id][style*=fixed]{display:none!important;}", category: "hcomic" }, { name: "Hitomi.la", host: ["hitomi.la"], reg: /hitomi\.la\/reader\/\d+\.html/, init: "setTimeout(()=>{$(document).unbind('keydown');$(document).unbind('click')},1000)", imgs: async () => { await fun.waitEle("#mobileImages .lillie", 11); fun.ge("#comicImages").setAttribute("class", "fitVertical"); fun.ge("#mobileImages").setAttribute("class", "hidden"); if (options.fancybox == 1) { fun.showMsg("Get Thumbnailsing..."); let url = fun.ge("//a[text()='Gallery Info']").href; let doc = await fun.iframeDoc(url, ".gallery-preview img"); thumbnailsSrcArray = [...fun.gae(".gallery-preview img", doc)].map(e => e.dataset.src ?? e.src); fun.hideMsg(); } return galleryinfo.files.map((e, i) => url_from_url_from_hash(galleryinfo["id"], our_galleryinfo[i], "webp", undefined, "a")); }, button: [4], insertImg: ["#comicImages", 2], customTitle: () => fun.title("|", 1), css: "body{overflow:unset!important}#FullPictureLoadEnd{color:rgb(255, 255, 255)}", threading: 5, category: "hcomic" }, { name: "Orzqwq List模式", host: ["orzqwq.com"], reg: /orzqwq\.com\/manga\/.+style=list/, include: "//option[@selected and text()='List style']", imgs: async () => { fun.showMsg(displayLanguage.str_04, 0); await fun.waitEle(".img-responsive", 600); fun.hideMsg(); return [...fun.gae("img[data-src]")]; }, insertImg: [".reading-content", 2], customTitle: () => fun.geT(".breadcrumb>li:nth-child(2)").trim(), category: "hcomic" }, { name: "HO5HO", host: ["www.ho5ho.com"], reg: /www\.ho5ho\.com\/.+\/.+\/server.+\//, include: "//script[contains(text(),'chapter_preloaded_images')]", imgs: () => chapter_preloaded_images, button: [4], insertImg: [".entry-content", 2], customTitle: () => fun.geT(".breadcrumb>li:nth-child(2)").trim(), category: "hcomic" }, { name: "成人漫画 圖片清單頁", host: ["bad.news"], link: "https://bad.news/mh", reg: /^https?:\/\/bad\.news\/mh\/\w+\/id-\d+/, imgs: () => { thumbnailsSrcArray = [...fun.gae("img.img-responsive")].map(e => e.dataset.echo ?? e.src); let link = [fun.ge("a.post-thumb").href]; return fun.getImgA("img.img-responsive", link); }, button: [4], insertImg: [ ["//div[div[article[div[div[a[img[@class='img-responsive']]]]]]]", 2], 2 ], go: 1, threading: 4, category: "hcomic" }, { name: "成人漫画 閱讀頁", host: ["bad.news"], link: "https://bad.news/mh", reg: /bad\.news\/mh\/view\/id-\d+/, imgs: ".img-responsive", button: [4], insertImg: ["//div[img[@class='img-responsive']]", 2], threading: 4, category: "hcomic" }, { name: "H漫画", host: ["mhdnf.xyz", "www.mhdnf.xyz", "mhqwe.xyz", "www.mhqwe.xyz", "mhdao.xyz", "www.mhdao.xyz", "dsseo.xyz", "www.dsseo.xyz", "mh90sf.xyz", "www.mh90sf.xyz", "mh60pro.xyz", "www.mh60pro.xyz"], reg: /^https?:\/\/(www\.)?(mhdnf|mhqwe|mhdao|dsseo|mh90sf|mh60pro)\.xyz\/play\?linkId=\d+&bookId=\d+&path=\d+&key=.+/, imgs: "#imgList>img:not([src*=QRCode])", button: [4], insertImg: ["#imgList", 2], autoDownload: [0], next: "//a[text()='下一話']", prev: "//a[text()='上一話']", customTitle: () => fun.attr("meta[name='apple-mobile-web-app-title']", "content"), css: "#hfad{display:none!important;}", category: "hcomic" }, { name: "JComic", host: ["jcomic.net"], reg: /^https?:\/\/jcomic\.net\/page\/[^\/]+$/, imgs: ".comic-view,.comic-thumb", button: [4], insertImg: ["//div[img[@class='img-responsive comic-thumb']]", 2], threading: 10, customTitle: () => fun.geT("//ol/li[2]/a"), category: "hcomic" }, { name: "JComic", host: ["jcomic.net"], reg: /^https?:\/\/jcomic\.net\/page\/[^\/]+\/[0-9\.]+$/, imgs: ".comic-view,.comic-thumb", button: [4], insertImg: ["//div[img[@class='img-responsive comic-thumb']]", 2], autoDownload: [0], next: () => { let next = fun.ge("//a[button[text()='下一章']]"); return next && next.href != siteUrl ? next.href : null; }, prev: 1, threading: 10, customTitle: () => fun.geT("//ol/li[2]/a") + " - " + fun.geT("//ol/li[3]"), category: "hcomic" }, { name: "一之涩漫画", host: ["1zse.com"], reg: /^https?:\/\/1zse\.com\/index\.php\/\d+\.html/, imgs: () => { let max = fun.ge("a.last").href.split("/").pop(); return fun.getImg(".context img", max, 7); }, button: [4], insertImg: [".context", 2], autoDownload: [0], next: ".post-previous a", prev: ".post-next a", customTitle: () => fun.geT("#content h1").replace(/\[\d+P\]/i, ""), category: "hcomic" }, { name: "那露漫画", host: ["naluhd.com"], reg: /^https?:\/\/naluhd\.com\/index\.php\/\d+\.html/, imgs: () => fun.getImgA(".article-content img", "a.post-page-numbers"), button: [4], insertImg: [".article-content", 2], autoDownload: [0], next: "//a[p[text()='上一篇'] and not(starts-with(@href,'java'))]", prev: "//a[p[text()='下一篇'] and not(starts-with(@href,'java'))]", customTitle: () => fun.geT(".article-title>a").replace(/\[\d+P\]/i, ""), category: "hcomic" }, { name: "色色漫画/最新韩漫网", host: ["www.manhuasese.com", "www.zuixinhanman.com"], reg: /^https:\/\/www\.manhuasese\.com\/index\.php\/chapter\/\d+|^https?:\/\/www\.zuixinhanman\.com\/chapter_\d+\.html/, include: ".rd-article-wr,.comic-list", imgs: ".rd-article-wr img,.comic-list img", button: [4], insertImg: [".rd-article-wr,.comic-list", 2], autoDownload: [0], next: ".j-rd-next,.next-btn", prev: ".j-rd-prev,.prev-btn", customTitle: () => fun.geT(".comic-title>a,.comic-name,.mip-shell-header-title"), category: "hcomic" }, { name: "九妖漫画", host: ["mobile.jymhapp.com", "xn--ihqy4c7yra.jyaaa.info"], reg: /^https?:\/\/(mobile\.jymhapp\.com|xn--ihqy4c7yra\.jyaaa\.info)\/chapter\/\d+/, include: ".rd-article-wr,.comic-list", imgs: ".rd-article-wr img,.comic-list img", button: [4], insertImg: [".rd-article-wr,.comic-list", 2], autoDownload: [0], next: ".j-rd-next,.next-btn", prev: ".j-rd-prev,.prev-btn", customTitle: () => fun.title(" - 九妖漫画网"), css: "[class^=ad],.m-hm-ad1,p.result{display:none!important;}", category: "hcomic" }, { name: "韩漫库", host: ["se8.us"], reg: /^https?:\/\/se8\.us\/index\.php\/chapter\/\d+/, include: ".rd-article-wr,.comic-list", imgs: ".rd-article-wr img,.comic-list img", button: [4], insertImg: [".rd-article-wr,.comic-list", 1], autoDownload: [0], next: ".j-rd-next,.next-btn", prev: ".j-rd-prev,.prev-btn", customTitle: () => { if (fun.ge(".rd-article-wr")) { return fun.geT(".read__crumb").replace("首页 ", "").replace(" ", " - "); } else { return shareArr[0].match(/《([^》]+)/)[1] + " - " + fun.geT(".comic-name"); } }, category: "hcomic" }, { name: "日漫之家", host: ["rimanzhijia.com"], reg: /^https?:\/\/rimanzhijia\.com\/index\.php\/chapter\/\d+/, imgs: "#comic_pic", button: [4], insertImg: [ ["#comic_pic", 2, "#comic_pic"], 2 ], autoDownload: [0], next: "//a[contains(text(),'下一章')][starts-with(@href,'/')]", prev: "//a[contains(text(),'上一章')][starts-with(@href,'/')]", customTitle: () => fun.geT(".bo_tit").replace(">", "-"), css: "img[src*='/ad/']{display:none!important;}.bo_nav{width:97%!important;padding:10px!important}", category: "hcomic" }, { name: "最新韩漫网M", host: ["www.zuixinhanman.com"], reg: /^https?:\/\/www\.zuixinhanman\.com\/chapter_\d+\.html/, delay: 300, imgs: "#comic_pic", button: [4], insertImg: [ [".bo_tit", 2, "#comic_pic"], 2, ], autoDownload: [0], next: "//a[contains(text(),'下一章')][contains(@href,'html')]", prev: "//a[contains(text(),'上一章')][contains(@href,'html')]", customTitle: () => fun.geT(".mip-shell-header-title"), fancybox: { blacklist: 1 }, category: "hcomic" }, { name: "韩漫100", host: ["hanman100.com"], reg: /^https?:\/\/hanman100\.com\/index\.php\/chapter-\d+\.html/, imgs: "#img-content img,.comic-list img", button: [4, "24%", 4], insertImg: ["#img-content,.comic-list", 1], autoDownload: [0], next: ".pnext.next+a[href$=html],.next-btn", prev: 1, customTitle: () => fun.geT("h1.text-center,.comic-name").replace("漫画 ", ""), css: "#left,#right{display:none!important;}", category: "hcomic" }, { name: "免费韩漫看", host: ["www.hanmanfree.com"], reg: /^https?:\/\/www\.hanmanfree\.com\/index\.php\/chapter\/\d+/, imgs: "#ChapterContent img,.readForm img", button: [4], insertImg: ["#ChapterContent,.readForm", 2], autoDownload: [0], next: "//a[text()='下一章'][starts-with(@href,'/')]", prev: "//a[text()='上一章'][starts-with(@href,'/')]", customTitle: () => fun.ge("#ChapterContent") ? fun.geT(".arthor") + " - " + fun.geT(".title") : fun.title("免费观看 "), category: "hcomic" }, { name: "韩漫推荐", host: ["okhanman.com"], reg: /^https?:\/\/okhanman\.com\/index\.php\/chapter\/\d+/, include: "//div/div[@style]/img[@style]", imgs: "//div/div[@style]/img[@style]", button: [4], insertImg: ["//div[div[@style]/img[@style]]", 2], autoDownload: [0], next: "//a[text()='下一章'][starts-with(@href,'/')]", prev: "//a[text()='上一章'][starts-with(@href,'/')]", customTitle: () => fun.geT("h1[style]"), category: "hcomic" }, { name: "韩漫推荐M", host: ["okhanman.com"], reg: /^https?:\/\/okhanman\.com\/index\.php\/chapter\/\d+/, imgs: ".chapterbox img", button: [4], insertImg: [ [".chapterbox>*:first-child", 1, ".pic"], 2 ], autoDownload: [0], next: "//a[text()='继续阅读下一章节']", prev: 1, customTitle: () => fun.title("韩漫 "), category: "hcomic" }, { name: "韓漫天堂", host: ["18jin.top"], reg: /^https?:\/\/18jin\.top\/index\.php\/chapter\/\d+/, imgs: () => fun.ge(".rd-article-wr") ? [...fun.gae(".rd-article-wr img")] : [...fun.gae(".comic-list img:not([src$='empty.png'])")], button: [4], insertImg: [".rd-article-wr,.comic-list", 1], autoDownload: [0], next: ".j-rd-next,.next-btn", prev: ".j-rd-prev,.prev-btn", customTitle: () => { if (fun.ge(".rd-article-wr")) { return fun.geT(".j-comic-title") + " - " + fun.geT(".comic-title>a") } else { let t = fun.geT("h1.comic-name"); let tArr = t.split(":"); return tArr[1] + " - " + tArr[0]; } }, css: ".image-container{display:none!important;}", category: "hcomic" }, { name: "琴瑟漫畫/琴瑟書庫", host: ["sixcomic.com", "sixacg.com", "www.sixacg.org"], reg: /^https?:\/\/(sixcomic\.com|sixacg\.com|www\.sixacg\.org)\/chapter\/\d+$/, imgs: ".comicpage img:not([data-original*='qssk.top']),#cp_img img:not([data-original*='qssk.top'])", button: [4], insertImg: [".comicpage,#cp_img", 2], autoDownload: [0], next: "//a[@href and not(starts-with(@href,'java')) and text()='下一章']", prev: "//a[@href and not(starts-with(@href,'java')) and text()='上一章']", customTitle: () => fun.title(/免费阅读|在线阅读/, 1), category: "hcomic" }, { name: "特漫网", host: ["www.44te.com"], reg: /^https?:\/\/www\.44te\.com\/chapter\/\d+$/, imgs: ".comicpage img:not([src*='/banner/']),#cp_img img:not([src*='/banner/'])", button: [4], insertImg: [".comicpage,#cp_img", 2], autoDownload: [0], next: "//a[@href and not(starts-with(@href,'java')) and text()='下一章']", prev: "//a[@href and not(starts-with(@href,'java')) and text()='上一章']", customTitle: () => fun.title(/无删减/, 1), css: "body>div[style^=background],[id^=ad]{display:none!important;}", category: "hcomic" }, { name: "香香腐宅", host: ["boylove.cc", "boylove1.mobi"], reg: /^https?:\/\/boylove\d?\.\w+\/home\/book\/capter\/id\/\d+/, imgs: "img[data-original]", button: [4], insertImg: [".reader-cartoon-chapter", 2], autoDownload: [0], next: "a[data-value=next]", prev: "a[data-value=prev]", customTitle: () => fun.geT(".title a").trim(), category: "hcomic" }, { name: "一耽女孩", host: ["yidan.in", "yidan.one", "yidan.app"], reg: /^https?:\/\/yidan\.(in|one|app)\/#\/pages\/read\/read\?no=\d+&id=\d+(&episodesId=\d+)?/, delay: 1000, init: () => { $("uni-view.last-bum").on("click", () => { setTimeout(() => { location.reload(); }, 300); }); }, imgs: () => { let m = siteUrl.split("&"); let no = m[0].match(/\d+$/)[0]; let mhid = m[1].match(/\d+/)[0]; return fetch(`${location.origin}/prod-api/app-api/vv/mh-episodes/get?jiNo=${no}&mhid=${mhid}`).then(res => res.json()).then(json => json.data.pics.split(",").map(e => location.origin + e)); }, button: [4], insertImg: [".read-article", 2], autoDownload: [0], next: () => { let next = fun.ge("//a[text()='继续看下一话']"); if (next) { let m = siteUrl.split("&"); let no = parseInt(m[0].match(/\d+$/)[0], 10); let mhid = m[1].match(/\d+/)[0]; let url = `https://yidan.in/#/pages/read/read?no=${no+=1}&id=${mhid}`; return url; } return null; }, prev: 1, customTitle: () => fun.title(" - 一耽女孩_好看的一耽漫画官网").trim(), css: ".page-pagination{display:none!important}", category: "hcomic" }, { name: "久久漫画网", host: ["www.99hanman.top"], reg: /^https?:\/\/www\.99hanman\.top\/chapter\/\d+/, include: ".rd-article-wr", imgs: ".comiclist img", button: [4], insertImg: [".comiclist", 2], autoDownload: [0], next: "//a[text()='下一章' and @href]", prev: "//a[text()='上一章' and @href]", customTitle: () => fun.geT("h1.title"), category: "hcomic" }, { name: "久久漫画网M", host: ["www.99hanman.top"], reg: /^https?:\/\/www\.99hanman\.top\/chapter\/\d+/, imgs: "#cp_img img", insertImg: ["#cp_img", 2], autoDownload: [0], next: "//a[text()='下一章' and @href]", prev: "//a[text()='上一章' and @href]", customTitle: () => { let code = fun.geT("//script[contains(text(),'bookInfo')]"); let bookInfo = code.match(/bookInfo\s?=\s?([^;]+)/g)[0]; bookInfo = fun.run(bookInfo); return bookInfo.book_name + " - " + bookInfo.chapter_name; }, category: "hcomic" }, { name: "91禁漫", host: ["www.91jinman.com"], reg: /^https?:\/\/www\.91jinman\.com\/\d+\.html/, imgs: ".wp-posts-content img", button: [4], insertImg: [".wp-posts-content", 2], autoDownload: [0], next: "//a[p[text()='上一篇']]", prev: "//a[p[text()='下一篇']]", customTitle: () => fun.geT(".article-title"), css: ".wp-posts-content{max-height:unset!important}", category: "hcomic" }, { name: "鸟鸟韩漫", host: ["nnhanman.net"], reg: /^https?:\/\/nnhanman\.net\/comic\/[^\/]+\/chapter-\d+\.html/, imgs: async () => { if (/章$/.test(fun.geT(".BarTit>h1"))) { await fun.getNP("img[data-original]", "#k_Pic_nextArr", null, "#action"); return [...fun.gae("img[data-original]")]; } else { return [...fun.gae("img[data-original]")]; } }, button: [4], insertImg: ["//td[img] | //div[@class='view-imgBox']", 2], autoDownload: [0], next: "#k_Pic_nextArr", prev: 1, customTitle: () => fun.geT(".BarTit>h1").replace(" - 第1章", ""), category: "hcomic" }, { name: "肉漫画网", host: ["www.roumh.net", "m.roumh.net"], reg: /^https?:\/\/(www|m)\.roumh\.net\/(wap)?chapter\/\d+/, imgs: "img[data-original]", button: [4], insertImg: [ ["img[data-original]", 2, "img[data-original]"], 2 ], autoDownload: [0], next: "//a[text()='下一章节'] | //a[@class='s_page2']", prev: "//a[text()='上一章节'] | //a[@class='s_page1']", customTitle: () => fun.title("|韩国漫画网"), category: "hcomic" }, { name: "漫香阁", host: ["xn--wgv69rba1382b.com", "韩漫日漫.com"], reg: /^https?:\/\/[^\/]+\/content-[\w-]+\.html/, include: "//title[contains(text(),'漫香阁')]", imgs: "#contentimg img", button: [4], insertImg: ["#contentimg", 2], customTitle: () => fun.geT(".services-desc"), category: "hcomic" }, { name: "頂點漫畫", host: ["www.apexmh.com"], reg: /^https?:\/\/www\.apexmh\.com\/comic\/\d+\.html/, imgs: () => { let max = fun.geT("//p[contains(text(),'图片数量') or contains(text(),'圖片數量')]").match(/\d+/)[0]; return fun.getImg("#showimg img", max, 9); }, button: [4], insertImg: ["#showimg", 2], customTitle: () => fun.geT("h1"), category: "hcomic" }, { name: "亲亲漫画", host: ["m.qinqinmanhua.xyz"], reg: /^https?:\/\/m\.qinqinmanhua\.xyz\/view\/\d+\.html/, imgs: ".showimg img", autoDownload: [0], next: ".BtnBox>.next[href*=view]", prev: ".BtnBox>.prev[href*=view]", customTitle: () => document.title.match(/《(.+)》/)[1], category: "hcomic" }, { name: "ok漫画網", host: ["www.okcomic.net", "m.okcomic.net"], reg: /^https?:\/\/(www|m)\.okcomic\.net\/\w+\/\d+\/\d+\.html/, delay: 1000, init: () => fun.remove(".imgBox"), imgs: () => atob(qTcms_S_m_murl_e).split("$qingtiandy$").map(e => e.replace("////", "//")), button: [4], insertImg: ["//td[//img[@onclick]]", 2], go: 1, autoDownload: [0], next: "#k_Pic_nextArr", prev: "#k_Pic_backArr", customTitle: async () => { await fun.waitEle("//script[contains(text(),'qTcms_S_m_murl_e')]"); return qTcms_S_m_name + " - " + qTcms_S_m_playm; }, category: "hcomic" }, { name: "狮城漫画", host: ["hdcomic.com"], reg: /^https?:\/\/hdcomic\.com\/chapter\/\d+/, init: () => fun.clearAllTimer(), imgs: ".comicpage img,#cp_img img", button: [4], insertImg: [".comiclist,#cp_img", 2], autoDownload: [0], next: "//a[text()='下一章'][@href]", prev: "//a[text()='上一章'][@href]", customTitle: () => fun.title(/免费阅读-狮城漫画|在线阅读-狮城漫画/).replace(/\s-\s\(\d+P\)-高清全集/i, ""), category: "hcomic" }, { name: "顶通漫画", host: ["toptoon.shop", "toptoon.buzz", "toptooncn.club", "toptooncn.info", "toptooncn.life", "toptooncn.top", "toptoonapp.com", "toptoon123.xyz", "toptooncn.xyz", "toptoon123.link", "toptoonapp.club"], reg: /^https?:\/\/toptoon(\w+)?\.\w+\/\w+\/\d+\.html/, imgs: "#txtbox img", button: [4], insertImg: ["#txtbox", 2], autoDownload: [0], next: "a.nexturl.on", prev: "a.prevurl.on", customTitle: () => { let arr = fun.geT(".place").split(" > "); return arr[2] + " - " + arr[3]; }, css: ".ads_plugin,.ad-top-info{display:none!important;}", category: "hcomic" }, { name: "H肉番动漫", host: ["www.rhmanhua11.xyz", "www.rhmanhua12.xyz"], reg: /^https?:\/\/www\.rhmanhua(\d+)?\.xyz\/artshow-\d+\.html/, imgs: () => { thumbnailsSrcArray = [...fun.gae(".margin-fix img")].map(e => e.dataset.original ?? e.src); return thumbnailsSrcArray.map(e => e.replace(/t(\.\w+)$/, "$1")); }, button: [4], insertImg: [".list-videos", 2], go: 1, category: "hcomic" }, { name: "色漫集", host: ["sobt.lat"], reg: /^https?:\/\/sobt\.lat\/\w+\/[^\.]+\.html/, imgs: ".post-content a", button: [4], insertImg: [".post-content", 2], customTitle: () => fun.title(" - 色漫集"), fancybox: { v: 3, css: false }, category: "hcomic" }, { name: "155漫画", host: ["155comic.bio", "155comic.cfd", "155comic.buzz", "155comic.autos", "155.lat"], reg: /^https?:\/\/155comic\.\w+\/\d+\.html/, imgs: "#post-comic img", button: [4], insertImg: ["#post-comic", 2], customTitle: () => fun.geT("#post-data>h1"), category: "hcomic" }, { name: "18H汉化漫画 介紹頁", host: ["18manga.top", "mt91.top", "cn18h.top"], reg: /^https?:\/\/(18manga\.top|mt91\.top|cn18h\.top)\/cont\.php\?id=/, imgs: async () => { let max = fun.geT("#td-Act+#td-Series").match(/\d+/)[0]; let m = fun.ge(".article-content a").href.match(/^(.+\/)(\d+)(\.\w+)$/); let imgDir = m[1]; let ex = m[3]; return fun.arr(max).map((_, i) => imgDir + (i + 1) + ex); }, button: [4], insertImg: [ [".content", 0, ".article-content>a"], 2 ], go: 1, customTitle: () => fun.geT(".article-content>h3").split("|")[1], fancybox: { blacklist: 1 }, css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}.sidebar,.modown-ad{display:none!important;}.single .content{margin-right:0px!important;}", category: "hcomic" }, { name: "18H汉化漫画 閱讀頁", host: ["18manga.top", "mt91.top", "cn18h.top"], reg: /^https?:\/\/(18manga\.top|mt91\.top|cn18h\.top)\/imgs\.php\?id=/, imgs: async () => { let next = fun.ge("li.active+li"); if (next) { let last = fun.ge("//a[contains(text(),'最大頁') or contains(text(),'最大页')]"); let lastDoc = await fun.fetchDoc(last.href); let lastFn = fun.geT("//script[contains(text(),'decodeBinaryString')]", 1, lastDoc).match(/decodeBinaryString\('[^;]+/g)[0]; let html = fun.run(lastFn); let tempDoc = fun.doc(html); let lastA = [...fun.gae("a", tempDoc)].pop(); let max = lastA.href.match(/(\d+)\.\w+$/)[1]; let m = fun.ge("#imgs>a").href.match(/^(.+\/)(\d+)(\.\w+)$/); let imgDir = m[1]; let ex = m[3]; return fun.arr(max).map((_, i) => imgDir + (i + 1) + ex); } else { return [...fun.gae("#imgs>a")]; } }, button: [4], insertImg: ["#imgs", 2], customTitle: () => fun.geT(".article-content>h3"), fancybox: { blacklist: 1 }, css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}.sidebar,.modown-ad{display:none!important;}.single .content{margin-right:0px!important;}", category: "hcomic" }, { name: "hanime1", host: ["hanime1.biz", "h202326.xyz"], reg: /^https?:\/\/(hanime1\.biz|h202326\.xyz)\/book\/\d+$/, init: async () => { await fun.waitEle("//div[div[div[a[img[contains(@src,'合成')]]]]]"); fun.remove("//div[div[div[a[img[contains(@src,'合成')]]]]]"); await fun.delay(200); fun.ge(".blog").scrollIntoView({ block: "end" }); }, imgs: async () => { await fun.waitEle(".blog_section img[title]:not([src*=cover])"); thumbnailsSrcArray = [...fun.gae(".blog_section img[title]:not([src*=cover])")].map(e => e.src); return thumbnailsSrcArray.map(e => e.replace(/t(\d+\.\w+)$/, "$1")); }, button: [4], insertImg: [ [".m-1>.blog_section", 2], 2 ], go: 1, customTitle: () => fun.geT(".blog_section h1"), category: "hcomic" }, { name: "JavABC", host: ["javabc.club"], reg: /^https?:\/\/javabc\.club\/chapter\/\d+$/i, include: "#enc_img img", init: () => { fun.clearAllTimer(); fun.remove("//div[@class='comicpage']/a[img] | //div[@class='comicpage']/div[script] | //div[@id='cp_img']/a[img] | //div[@id='cp_img']/div[script]"); }, imgs: async () => { await fun.getNP("#enc_img>div,#enc_img>img", "//a[text()='下一页'][@href]", null, ".fanye,.view-bottom-bar"); return [...fun.gae("#enc_img img")]; }, button: [4], insertImg: ["#enc_img", 2], customTitle: () => fun.ge(".comic-name") ? fun.geT(".comic-name") : bookInfo.book_name, css: "img{opacity:1!important;}", category: "hcomic" }, { name: "桃心漫画", host: ["txcomic.com"], reg: /^https?:\/\/txcomic\.com\/chapter\/\d+$/i, include: "#enc_img img", init: () => fun.remove("//div[@class='comicpage']/a[img] | //div[@class='comicpage']/div[script] | //div[@id='cp_img']/a[img] | //div[@id='cp_img']/div[script]"), imgs: "#enc_img img", button: [4], insertImg: ["#enc_img", 2], autoDownload: [0], next: "//a[text()='下一章'][@href]", prev: "//a[text()='上一章'][@href]", customTitle: () => fun.ge(".title") ? fun.geT(".title") : bookInfo.book_name + " - " + bookInfo.chapter_name, css: "#pubcdnModal{display:none!important;}", category: "hcomic" }, { name: "嘿嘿漫画", host: ["www.topcomic.online"], reg: /^https?:\/\/www\.topcomic\.online\/chapter\/\d+$/i, include: "#enc_img img", init: () => fun.clearAllTimer(), imgs: "#enc_img img", button: [4], insertImg: ["#enc_img", 2], autoDownload: [0], next: "//a[text()='下一章'][@href]", prev: "//a[text()='上一章'][@href]", customTitle: () => fun.ge(".title") ? fun.geT(".title") : bookInfo.book_name + " - " + bookInfo.chapter_name, category: "hcomic" }, { name: "日本禁漫屋", host: ["javcomics.site"], reg: /^https?:\/\/javcomics\.site\/chapter\/\d+$/i, include: "#enc_img img", imgs: async () => { await fun.getNP("#enc_img>div,#enc_img>img", "//a[text()='下一页'][@href]", null, ".fanye,.view-bottom-bar"); return [...fun.gae("#enc_img img")]; }, button: [4], insertImg: ["#enc_img", 2], autoDownload: [0], next: "//a[text()='下一章'][@href]", prev: "//a[text()='上一章'][@href]", css: "img{opacity:1!important;}", category: "hcomic" }, { name: "漫天堂 下拉閱讀頁", host: ["mttang.club"], reg: /^https?:\/\/mttang\.club\/\?moeupup-\d+-\d+\.html$/i, imgs: ".panel-body img", button: [4], insertImg: [".panel-body", 2], customTitle: () => fun.title("-下拉观看").replace(/\s?\(\d+P\)/i, ""), category: "hcomic" }, { name: "有色漫画网", host: ["yousemanhua.com"], reg: /^https?:\/\/yousemanhua\.com\/index\.php\/chapter\/\d+$/i, imgs: "img[data-original]:not([data-original*='empty.png'])", button: [4], insertImg: [".rd-article-wr,.chapter_content", 2], autoDownload: [0], next: "//a[contains(@class,'j-rd-next')][@_href] | //a[div[span[contains(text(),'下一篇')]]]", prev: "//a[contains(@class,'j-rd-prev')][@_href] | //a[div[span[contains(text(),'上一篇')]]]", customTitle: async () => { if (fun.ge(".read__crumb")) { let arr = fun.geT(".read__crumb").split(" "); return arr[1] + " - " + arr[2]; } else { let doc = await fun.fetchDoc(fun.ge(".nav_left>a").href); return fun.title(" - 有色漫画", 0, doc) + " - " + fun.title(" - 有色漫画"); } }, category: "hcomic" }, { name: "污污漫畫", host: ["www.55comic.com"], reg: /^https?:\/\/www\.55comic\.com\/chapter\/\d+$/i, init: () => fun.remove("//div[div[@class='CarouselView center']]"), imgs: async () => { let arr = []; await fun.aotoScrollEles(".comiclist div[data-src]", async (ele) => { let canvas = fun.ge("canvas", ele); if (canvas) { arr.push(canvas.toDataURL("image/jpeg")); return true; } return false; }); window.scrollTo({ top: 0 }); return arr.map(e => fun.dataURLtoBlobURL(e)); }, button: [4], insertImg: [".comicpage", 1], autoDownload: [0], next: "//a[text()='下一章']", prev: "//a[text()='上一章']", customTitle: () => fun.geT(".title"), fetch: 1, category: "hcomic" }, { name: "400漫画网", host: ["400manhua.com"], reg: /^https?:\/\/400manhua\.com\/chapter_\d+\.html$/i, include: ".rd-article-wr", imgs: ".rd-article-wr img", button: [4], insertImg: [".rd-article-wr", 2], autoDownload: [0], next: () => { let next = fun.ge(".j-rd-next[_href$='html']"); return next ? location.origin + next.getAttribute("_href") : null; }, prev: ".j-rd-prev", customTitle: () => fun.geT(".j-comic-title") + " - " + fun.geT(".last-crumb"), category: "hcomic" }, { name: "400漫画网M", host: ["400manhua.com"], reg: /^https?:\/\/400manhua\.com\/chapter_\d+\.html$/i, imgs: ".comic-list img", button: [4], insertImg: [".comic-list", 2], autoDownload: [0], next: () => { let next = fun.ge(".next-chapter[_href$='html']"); return next ? location.origin + next.getAttribute("_href") : null; }, prev: "li.prev", customTitle: () => fun.geT("//p[@class='end-txt'][span[contains(text(),'阅读')]]").replace("您已阅读完:", "").replace("漫画", " - "), css: ".cnt-4,.comic-list~div[style],.cnt-4~div[style]{display:none!important;}", category: "hcomic" }, { name: "嗨皮漫畫閱讀", host: ["m.happymh.com"], enable: 0, reg: /m\.happymh\.com\/reads/, include: "#root", exclude: ".no-js", xhr: (lp = new URL(siteUrl).pathname) => { let lps = lp.split("/"); let mangaCode = lps[2]; let id = lps[3]; let api = `https://m.happymh.com/v2.0/apis/manga/read?code=${mangaCode}&cid=${id}`; return fetch(api).then(res => res.json()); }, init: async () => { let json = await siteData.xhr(); debug("\n此頁JSON資料\n", json); siteJson = json; fun.picPreload(json.data.scans.map(e => e.url), json.data.manga_name + " - " + json.data.chapter_name); if (await fun.waitEle("#page-area")) { new IntersectionObserver((entries, observer) => { if (entries[0].isIntersecting) { observer.unobserve(entries[0].target); let f = ge("footer>article"); let c1 = f.firstChild.cloneNode(true); c1.firstChild.href = "/latest"; c1.firstChild.firstChild.innerText = "更新"; f.appendChild(c1); let c2 = f.firstChild.cloneNode(true); c2.firstChild.href = "/bookcase"; c2.firstChild.firstChild.innerText = "收藏"; f.appendChild(c2); let p = gx("//a[span[text()='上一话' or text()='上一話'] and contains(@href,'reads')]"); if (p) { p.classList.add("MuiButton-containedPrimary"); } let n = gx("//a[span[text()='下一话' or text()='下一話'] and contains(@href,'readMore')]"); if (n) { n.classList.remove("MuiButton-containedPrimary"); n.firstChild.innerText = "^_^感谢您的阅读~已经没有下一话了哦~"; } } }).observe(ge('#page-area')); } }, imgs: () => siteJson.data.scans.map(e => e.url.replace(/\?q=\d+/, "")), referrerpolicy: "origin", button: [4], insertImg: ["//article[div[contains(@id,'imageLoader')]]", 3], go: 1, autoDownload: [0], next: "//a[span[text()='下一話' or text()='下一话']][contains(@href,'reads')]", prev: "//a[span[text()='上一話' or text()='上一话']]", customTitle: () => siteJson.data.manga_name + " - " + siteJson.data.chapter_name, preloadNext: async (nextDoc, obj) => { let json = await obj.xhr(new URL(nextLink).pathname); json.status == 0 ? fun.picPreload(json.data.scans.map(e => e.url), json.data.manga_name + " - " + json.data.chapter_name, "next") : debug("預讀下一頁失敗"); }, category: "comic" }, { name: "嗨皮漫畫更新頁,自動點擊載入更多,鏈接新分頁打開", host: ["m.happymh.com"], reg: /m\.happymh\.com\/latest/, enable: 0, icon: 0, key: 0, observerClick: ".more-div-btn", openInNewTab: ".manga-cover>a:not([target=_blank])", category: "comic" }, { name: "嗨皮漫畫展開目錄", reg: /m\.happymh\.com\/manga\//, enable: 0, icon: 0, key: 0, autoClick: "#expandButton", category: "comic" }, { name: "嗨皮漫畫,鏈接新分頁打開", reg: /m\.happymh\.com\//, enable: 0, icon: 0, key: 0, openInNewTab: ".home-banner a:not([target=_blank]),.manga-rank a:not([target=_blank]),.manga-cover a:not([target=_blank])", category: "comic" }, { name: "COLAMANHUA", //方向鍵上一章下一章、反反偵錯,下載需先手動觸發全部載入圖片,圖址如為blob函式會使用到canvas需要繪製過程會有點卡。 host: ["www.colamanga.com"], enable: 1, reg: /www\.(colamanga|colamanhua)\.com\/manga-.+\.html$/, init: () => fun.clearAllTimer(1), imgs: () => fun.ge(".mh_comicpic img[src^=blob]") ? fun.imgBlobArr(".mh_comicpic img[src^=blob]") : [...fun.gae(".mh_comicpic img[src]")], //scrollEle: [".mh_comicpic img", 600], scrollEle: () => { fun.aotoScrollEles(".mh_comicpic", (ele) => fun.ge("img[src]", ele)); }, next: "//a[text()='下一章']", prev: "//a[text()='上一章']", customTitle: () => fun.title(" COLAMANGA", 1), threading: 10, css: ".mh_wrap{width:100%!important;min-width:100%!important}", category: "comic" }, { name: "8Comic無限動漫", host: ["www.comicabc.com"], enable: 1, reg: /(a|www)\.(comicabc|twobili)\.com\/(ReadComic|online)/, init: () => { fun.remove("//div[@class='text-center'] | //p[@class='text-center']"); let x = fun.ge("#TheTable").parentNode; let e = fun.ge(".navtopbar2").cloneNode(true); x.parentNode.insertBefore(e, x.nextSibling); }, imgs: () => { let code = [...document.scripts].find(s => s.innerHTML.search(/ge\(e\)/) > -1).innerHTML; let cM = code.match(/ge\([^.]+\.src\s?=\s?([^;]+)/); let keyCode = cM[1]; let arr = []; for (let i = 1; i <= ps; i++) { let r = "(" + i + ")"; let src = location.protocol + fun.run(keyCode.replace(/\(pp?\)/g, r)); arr.push(src); } return arr; }, button: [4], insertImg: ["//td[img[@id='TheImg']]", 2], go: 1, autoDownload: [0], next: () => { let next = fun.ge("#nextvol:not([style])"); if (next) return /ReadComic/.test(siteUrl) ? location.origin + rp + ni + "/" + ni + (fz + fz).substr((3 * ni) % fz.length, 10) + ".html" : reurl("ch", ni); return null; }, prev: "#prevvol", customTitle: doc => fun.geT(".text-view-title", 1, doc) + " - 第" + fun.geT("#lastchapter", 1, doc) + "集", preloadNext: () => { const callback = (doc, fun) => { const code = ` let code = [...document.scripts].find(s => s.innerHTML.search(/ge\\(e\\)/) > -1).innerHTML; let cM = code.match(/ge\\([^.]+\\.src\\s?=\\s?([^;]+)/); let keyCode = cM[1]; let arr = []; for (let i = 1; i <= ps; i++) { let r = "(" + i + ")"; let src = location.protocol + new Function("return " + keyCode.replace(/\\(pp?\\)/g, r))(); arr.push(src); } window.parent.postMessage({ iframePicArr: arr, title: document.querySelector(".text-view-title").innerText + " - 第" + document.querySelector("#lastchapter").innerText + "集" }, "https://a.twobili.com"); `; fun.script(code, 0, 1, doc); }; fun.iframeDoc(nextLink, "#TheImg", 30000, callback); }, css: "td[style^=width],.view_gg_content{display:none!important}", category: "comic" }, { name: "8Comic無限動漫 手機版", host: ["m.comicabc.com"], enable: 1, reg: /8\.twobili\.com\/comic\/insurance/, init: () => { fun.ge("#pageindex").parentNode.appendChild(fun.ge("#prevvol").cloneNode(true)); fun.ge('#pageindex').parentNode.appendChild(fun.ge("#nextvol").cloneNode(true)); let ul = fun.ge("#TheTable>ul"); let v1 = fun.ge(".view_tmenu").cloneNode(true); let v2 = fun.gae(".view_menut")[1]; ul.appendChild(v2); ul.appendChild(v1); let b1 = fun.ge(".book_inc_title"); let b2 = fun.ge(".book_link_item"); ul.appendChild(b1); ul.appendChild(b2); }, button: [4], imgs: () => { let arr = []; for (let i = 1; i <= ps; i++) { let imgSrc = "https://img" + ss(c, 4, 2) + ".8comic.com/" + ss(c, 6, 1) + "/" + ti + "/" + ss(c, 0, 4) + "/" + nn([i]) + "_" + ss(c, mm([i]) + 10, 3, f) + ".jpg"; arr.push(imgSrc); } return arr; }, button: [4], insertImg: ["//li[img[@id='TheImg']]", 2], go: 1, autoDownload: [0], next: () => { let next = fun.ge("#nextvol:not([style])"); return next ? replaceurl("ch", ni) : null; }, prev: "#prevvol", customTitle: (doc = document) => { let t = doc.title.split(" ")[0]; let n = fun.geT("#chapter", 1, doc); return t + " - " + n; }, preloadNext: async (nextDoc, obj) => { const callback = (doc, fun) => { const code = ` let arr = []; for (let i = 1; i <= ps; i++) { let imgSrc = "https://img" + ss(c, 4, 2) + ".8comic.com/" + ss(c, 6, 1) + "/" + ti + "/" + ss(c, 0, 4) + "/" + nn([i]) + "_" + ss(c, mm([i]) + 10, 3, f) + ".jpg"; arr.push(imgSrc); } let text = document.createElement("p"); text.id = "FullPictureLoadReturn"; text.innerText = arr.join("|"); document.body.appendChild(text); `; fun.script(code, 0, 1, doc); }; let nextIframeDoc = await fun.iframeDoc(nextLink, "#TheImg", 30000, callback); let arr = fun.geT("#FullPictureLoadReturn", 1, nextIframeDoc).split("|"); fun.picPreload(arr, obj.customTitle(nextIframeDoc), "next"); }, css: ".pinch-zoom-container{height:auto !important;display:contents !important}.view_tmenu+div[style],#pagenum,[onclick^='j'],#pageindex,ico+a+.material-icons.right-logo{display:none !important}.view_menut a{width:33.3% !important;max-width:33.3% !important}", category: "comic" }, { name: "Mangabz", host: ["www.mangabz.com", "mangabz.com"], enable: 0, reg: /^https?:\/\/(www\.)?mangabz\.com\/m\d+/, include: ".container", init: () => { const toggleToolbar = e => { if (e.wheelDelta < 0 || e.detail > 0) { $(".top-bar").attr("style", "top: -74px;"); } else { $(".top-bar").removeAttr("style"); } }; document.addEventListener("wheel", toggleToolbar); document.addEventListener("DOMMouseScroll", toggleToolbar); const keyToggleToolbar = e => { let key = window.event ? e.keyCode : e.which; if (key == "34" || key == "32" || key == "40") { $(".top-bar").attr("style", "top: -74px;"); } else { $(".top-bar").removeAttr("style"); } }; document.addEventListener("keydown", keyToggleToolbar); }, imgs: (msg = 1) => { if (!mkey) var mkey = ""; let fetchNum = 0; if (msg == 1) fun.showMsg(displayLanguage.str_05, 0); let resArr = fun.arr(MANGABZ_IMAGE_COUNT).map((_, i) => { let apiUrl = location.origin + MANGABZ_CURL + "chapterimage.ashx" + `?cid=${MANGABZ_CID}&page=${(i + 1)}&key=${mkey}&_cid=${MANGABZ_CID}&_mid=${MANGABZ_MID}&_dt=${MANGABZ_VIEWSIGN_DT}&_sign=${MANGABZ_VIEWSIGN}`; return fetch(apiUrl).then(res => res.text()).then(res => { if (msg == 1) fun.showMsg(`${displayLanguage.str_06}(${fetchNum+=1}/${MANGABZ_IMAGE_COUNT})`, 0); return fun.run(res)[0]; }); }); return Promise.all(resArr).then(arr => { if (msg == 1) fun.hideMsg(); return arr; }); }, button: [4], insertImg: ["#cp_img", 2], go: 1, autoDownload: [0], next: "//a[img[contains(@src,'xiayizhang')]][starts-with(@href,'/m')]", prev: "//a[img[contains(@src,'shangyizhang')]][starts-with(@href,'/m')]", customTitle: doc => fun.title("_", 2, doc).replace("漫畫", ""), preloadNext: async (nextDoc, obj) => { let code = fun.geT("//script[contains(text(),'MANGABZ_IMAGE_COUNT')]", 1, nextDoc); fun.script(code, 0, 1); fun.picPreload(await obj.imgs(0), obj.customTitle(nextDoc), "next"); }, css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}a[href^='j']{display:none !important}body{overflow:unset!important}", category: "comic" }, { name: "Xmanhua", host: ["www.xmanhua.com", "xmanhua.com"], enable: 0, reg: /^https?:\/\/(www\.)?xmanhua\.com\/m\d+/, include: ".reader-bottom-page-list", init: () => { const clickToggleToolbar = () => { let t = fun.ge(".header.toolbar"); if (t) { $(".header").removeClass("toolbar"); $(".header").removeAttr("style"); } else { $(".header").addClass("toolbar"); $(".header").attr("style", "top: -64px;"); } let b = fun.ge(".reader-bottom.toolbar"); if (b) { $(".reader-bottom").removeClass("toolbar"); $(".reader-bottom").removeAttr("style"); } else { $(".reader-bottom").addClass("toolbar"); $(".reader-bottom").attr("style", "bottom: -50px;"); } }; document.addEventListener("click", clickToggleToolbar); const toggleToolbar = e => { if (e.wheelDelta < 0 || e.detail > 0) { $(".header").addClass("toolbar"); $(".header").attr("style", "top: -64px;"); $(".reader-bottom").addClass("toolbar"); $(".reader-bottom").attr("style", "bottom: -50px;"); } else { $(".header").removeClass("toolbar"); $(".header").removeAttr("style"); $(".reader-bottom").removeClass("toolbar"); $(".reader-bottom").removeAttr("style"); } }; document.addEventListener("wheel", toggleToolbar); document.addEventListener("DOMMouseScroll", toggleToolbar); const keyToggleToolbar = e => { let key = window.event ? e.keyCode : e.which; if (key == "34" || key == "32" || key == "40") { $(".header").addClass("toolbar"); $(".header").attr("style", "top: -64px;"); $(".reader-bottom").addClass("toolbar"); $(".reader-bottom").attr("style", "bottom: -50px;"); } else { $(".header").removeClass("toolbar"); $(".header").removeAttr("style"); $(".reader-bottom").removeClass("toolbar"); $(".reader-bottom").removeAttr("style"); } }; document.addEventListener("keydown", keyToggleToolbar); }, imgs: (msg = 1) => { if (!mkey) var mkey = ""; let fetchnUm = 0; if (msg == 1) fun.showMsg(displayLanguage.str_05, 0); let resArr = fun.arr(XMANHUA_IMAGE_COUNT).map((_, i) => { let apiUrl = location.origin + XMANHUA_CURL + "chapterimage.ashx" + `?cid=${XMANHUA_CID}&page=${(i + 1)}&key=${mkey}&_cid=${XMANHUA_CID}&_mid=${XMANHUA_MID}&_dt=${XMANHUA_VIEWSIGN_DT}&_sign=${XMANHUA_VIEWSIGN}`; return fetch(apiUrl).then(res => res.text()).then(res => { if (msg == 1) fun.showMsg(`${displayLanguage.str_06}(${fetchnUm+=1}/${XMANHUA_IMAGE_COUNT})`, 0); return fun.run(res)[0]; }); }); return Promise.all(resArr).then(arr => { if (msg == 1) fun.hideMsg(); return arr; }); }, button: [4], insertImg: ["#cp_img", 2], go: 1, autoDownload: [0], next: "//a[img[contains(@src,'reader-bottom-right-2')]][starts-with(@href,'/m')]", prev: "//a[img[contains(@src,'reader-bottom-right-1')]][starts-with(@href,'/m')]", customTitle: doc => fun.title('_', 2, doc).replace("漫畫", ""), preloadNext: async (nextDoc, obj) => { let code = fun.geT("//script[contains(text(),'XMANHUA_IMAGE_COUNT')]", 1, nextDoc); fun.script(code, 0, 1); fun.picPreload(await obj.imgs(0), obj.customTitle(nextDoc), "next"); }, css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}.relative>a{display:none!important}.reader-img-con{padding:64px 0 50px !important;}", category: "comic" }, { name: "DM5/極速 分頁模式", host: ["www.dm5.com", "m.dm5.com", "www.dm5.cn", "m.dm5.cn", "en.dm5.com", "cnc.dm5.com", "hk.dm5.com", "www.1kkk.com", "m.1kkk.com", "tel.1kkk.com", "en.1kkk.com", "cnc.1kkk.com", "hk.1kkk.com"], enable: 0, reg: /^https?:\/\/(www|tel|en|cnc|hk|m)?\.?(dm5|1kkk)\.(com|cn)\/(m|ch|vol|other)[-_0-9p]+\//, include: "#chapterpager", imgs: (msg = 1) => { if (!mkey) var mkey = ""; let fetchNum = 0; if (msg == 1) fun.showMsg(displayLanguage.str_05, 0); let resArr = fun.arr(DM5_IMAGE_COUNT).map((_, i) => { let apiUrl = location.origin + DM5_CURL + "chapterfun.ashx" + `?cid=${DM5_CID}&page=${(i + 1)}&key=${mkey}&language=1>k=6&_cid=${DM5_CID}&_mid=${DM5_MID}&_dt=${DM5_VIEWSIGN_DT}&_sign=${DM5_VIEWSIGN}`; return fetch(apiUrl).then(res => res.text()).then(res => { if (msg == 1) fun.showMsg(`${displayLanguage.str_06}(${fetchNum+=1}/${DM5_IMAGE_COUNT})`, 0); return fun.run(res)[0]; }); }); return Promise.all(resArr).then(arr => { if (msg == 1) fun.hideMsg(); return arr; }); }, button: [4], insertImg: ["#cp_img", 2], go: 1, autoDownload: [0], next: "//a[text()='下一章']", prev: "//a[text()='上一章']", customTitle: doc => fun.title("_", 2, doc), preloadNext: async (nextDoc, obj) => { let code = fun.geT("//script[contains(text(),'DM5_IMAGE_COUNT')]", 1, nextDoc); fun.script(code, 0, 1); fun.picPreload(await obj.imgs(0), obj.customTitle(nextDoc), "next"); }, topButton: true, css: "body{overflow:unset!important}", category: "comic" }, { name: "DM5/極速 條漫模式", host: ["www.dm5.com", "m.dm5.com", "www.dm5.cn", "m.dm5.cn", "en.dm5.com", "cnc.dm5.com", "hk.dm5.com", "www.1kkk.com", "m.1kkk.com", "tel.1kkk.com", "en.1kkk.com", "cnc.1kkk.com", "hk.1kkk.com"], enable: 0, reg: /^https?:\/\/(www|tel|en|cnc|hk|m)?\.?(dm5|1kkk)\.(com|cn)\/(m|ch|vol|other)[-_0-9]+\//, include: ["#barChapter"], imgs: "#barChapter>img", button: [4], insertImg: ["#barChapter", 2], go: 1, autoDownload: [0], next: "//a[text()='下一章']", prev: "//a[text()='上一章']", customTitle: doc => fun.title("_", 2, doc), preloadNext: (nextDoc, obj) => { let arr = fun.getImgSrcArr(obj.imgs, nextDoc); fun.picPreload(arr, obj.customTitle(nextDoc), "next"); }, css: "body{overflow:unset!important}", category: "comic" }, { name: "YYMANGA", host: ["www.yymanhua.com", "yymanhua.com"], enable: 0, reg: /(www\.)?yymanhua\.com\/m\d+/, include: ".reader-bottom-page-list", init: () => { const clickToggleToolbar = () => { let t = fun.ge(".header.toolbar"); if (t) { $(".header").removeClass("toolbar"); $(".header").removeAttr("style"); } else { $(".header").addClass("toolbar"); $(".header").attr("style", "top: -64px;") } let b = fun.ge(".reader-bottom.toolbar"); if (b) { $(".reader-bottom").removeClass("toolbar"); $(".reader-bottom").removeAttr("style"); } else { $(".reader-bottom").addClass("toolbar"); $(".reader-bottom").attr("style", "bottom: -50px;"); } }; document.addEventListener("click", clickToggleToolbar); const toggleToolbar = () => { var e = e || window.event; if (e.wheelDelta < 0 || e.detail > 0) { $(".header").addClass("toolbar"); $(".header").attr("style", "top: -64px;"); $(".reader-bottom").addClass("toolbar"); $(".reader-bottom").attr("style", "bottom: -50px;"); } else { $(".header").removeClass("toolbar"); $(".header").removeAttr("style"); $(".reader-bottom").removeClass("toolbar"); $(".reader-bottom").removeAttr("style"); } }; document.addEventListener("wheel", toggleToolbar); document.addEventListener("DOMMouseScroll", toggleToolbar); const keyToggleToolbar = (e) => { let key = window.event ? e.keyCode : e.which; if (key == "34" || key == "32" || key == "40") { $(".header").addClass("toolbar"); $(".header").attr("style", "top: -64px;"); $(".reader-bottom").addClass("toolbar"); $(".reader-bottom").attr("style", "bottom: -50px;"); } else { $(".header").removeClass("toolbar"); $(".header").removeAttr("style"); $(".reader-bottom").removeClass("toolbar"); $(".reader-bottom").removeAttr("style"); } }; document.addEventListener("keydown", keyToggleToolbar); }, imgs: (msg = 1) => { if (!mkey) var mkey = ""; let fetchnUm = 0; if (msg == 1) fun.showMsg(displayLanguage.str_05, 0); let resArr = fun.arr(YYMANHUA_IMAGE_COUNT).map((_, i) => { let apiUrl = location.origin + YYMANHUA_CURL + "chapterimage.ashx" + `?cid=${YYMANHUA_CID}&page=${(i + 1)}&key=${mkey}&_cid=${YYMANHUA_CID}&_mid=${YYMANHUA_MID}&_dt=${YYMANHUA_VIEWSIGN_DT}&_sign=${YYMANHUA_VIEWSIGN}`; return fetch(apiUrl).then(res => res.text()).then(res => { if (msg == 1) fun.showMsg(`${displayLanguage.str_06}(${fetchnUm+=1}/${YYMANHUA_IMAGE_COUNT})`, 0); return fun.run(res)[0]; }); }); return Promise.all(resArr).then(arr => { if (msg == 1) fun.hideMsg(); return arr; }); }, button: [4], insertImg: ["#cp_img", 2], go: 1, autoDownload: [0], next: "//a[img[contains(@src,'reader-bottom-right-2')]][starts-with(@href,'/m')]", prev: "//a[img[contains(@src,'reader-bottom-right-1')]][starts-with(@href,'/m')]", customTitle: doc => fun.title("_", 2, doc).replace("漫畫", ""), preloadNext: async (nextDoc, obj) => { let code = fun.geT("//script[contains(text(),'YYMANHUA_IMAGE_COUNT')]", 1, nextDoc); fun.script(code, 0, 1); fun.picPreload(await obj.imgs(0), obj.customTitle(nextDoc), "next"); }, css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}.relative>a{display:none!important}.reader-img-con{padding:64px 0 50px !important;}", category: "comic" }, { name: "DM5/極速/Mangabz/Xmanhua/yymanhua/漫画人/奇漫屋/漫画星球(PC)/6 漫画/漫本 手機版", host: ["www.dm5.com", "m.dm5.com", "www.dm5.cn", "m.dm5.cn", "en.dm5.com", "cnc.dm5.com", "hk.dm5.com", "www.1kkk.com", "m.1kkk.com", "tel.1kkk.com", "en.1kkk.com", "cnc.1kkk.com", "hk.1kkk.com", "www.mangabz.com", "mangabz.com", "www.xmanhua.com", "xmanhua.com", "www.yymanhua.com", "yymanhua.com", "www.qmanwu1.com", "m.qmanwu1.com", "www.mhxqiu4.com", "www.sixmanhua.com", "m.sixmanhua.com", "www.manben.com", "www.manhuaren.com"], enable: 0, reg: /(www|tel|en|cnc|hk|m)?\.?(dm5|1kkk|mangabz|xmanhua|yymanhua|manhuaren|qmanwu\d{1,2}|mhxqiu\d|sixmanhua|manben)\.(com|cn)\/(m|ch|vol|other)?[-_0-9]+\//, delay: 300, include: "//script[contains(text(),'newImgs')]", init: () => { if (fun.gae(".view-bottom-bar>li").length == 4) fun.css(".view-bottom-bar>li:nth-child(n+2):nth-child(-n+3){display:none!important}.view-bottom-bar li{width:50%!important}"); }, imgs: () => newImgs, button: [4], insertImg: ["#cp_img,.main_img,#comicContain,.comic-list", 2], go: 1, autoDownload: [0], next: () => { let next = fun.ge("//a[text()='下一章'] | //a[img[@alt='下一章']]"); if (next) return /pushHistory/.test(next.href) ? location.origin + next.href.split("'")[1] : next.href; return null; }, prev: "//a[text()='上一章'] | //a[img[@alt='上一章']]", customTitle: doc => { let host = location.hostname; if (/dm5|manhuaren|1kkk|mangabz|xmanhua|yymanhua/.test(host) && !/sixmanhua/.test(host)) { return fun.title("_", 2, doc); } else if (/qmanwu|mhxqiu|sixmanhua/.test(host)) { return fun.title("_", 3, doc); } else if (/manben/.test(host)) { if (fun.ge("#comicTitle")) { return fun.geT("#chapter", 1, doc) + " " + fun.geT(".title-comicHeading", 1, doc); } else { return fun.title(" ", 2, doc); } } }, preloadNext: async (nextDoc, obj) => { let code = fun.geT("//script[contains(text(),'newImgs')]", 1, nextDoc); fun.script(code, 0, 1); fun.picPreload(obj.imgs(), obj.customTitle(nextDoc), "next"); }, category: "comic" }, { name: "mh234", host: ["mh234.top"], enable: 0, reg: /^https?:\/\/mh234\.top\/m\d+\//, include: ".container", imgs: (msg = 1) => { if (!mkey) var mkey = ""; let fetchNum = 0; if (msg == 1) fun.showMsg(displayLanguage.str_05, 0); let resArr = fun.arr(MH234_IMAGE_COUNT).map((_, i) => { let apiUrl = location.origin + MH234_CURL + "chapterimage.ashx" + `?cid=${MH234_CID}&page=${(i + 1)}&key=${mkey}&_cid=${MH234_CID}&_mid=${MH234_MID}&_dt=${MH234_VIEWSIGN_DT}&_sign=${MH234_VIEWSIGN}`; return fetch(apiUrl).then(res => res.text()).then(res => { if (msg == 1) fun.showMsg(`${displayLanguage.str_06}(${fetchNum+=1}/${MH234_IMAGE_COUNT})`, 0); return fun.run(res)[0]; }); }); return Promise.all(resArr).then(arr => { if (msg == 1) fun.hideMsg(); return arr; }); }, button: [4], insertImg: ["#cp_img", 2], go: 1, autoDownload: [0], next: "//a[img[contains(@src,'xiayizhang')]][starts-with(@href,'/m')]", prev: "//a[img[contains(@src,'shangyizhang')]][starts-with(@href,'/m')]", customTitle: doc => fun.title("_", 2, doc).replace("漫畫", ""), preloadNext: async (nextDoc, obj) => { let code = fun.geT("//script[contains(text(),'MH234_IMAGE_COUNT')]", 1, nextDoc); fun.script(code, 0, 1); fun.picPreload(await obj.imgs(0), obj.customTitle(nextDoc), "next"); }, css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}a[href^='j']{display:none !important}body{overflow:unset!important}", category: "comic" }, { name: "动漫之家M", host: ["m.idmzj.com"], enable: 0, reg: /m\.i?dmzj\.com\/view\/\d+\/\d+\.html/, init: "$('body').unbind('keydown');", imgs: () => { let code = [...document.scripts].find(s => s.innerHTML.search(/initData/) > -1).innerHTML; let arr = fun.run(code.match(/page_url.+(\[.+\])/)[1]); return arr; }, button: [4, "24%", 3], insertImg: ["#commicBox", 2], go: 1, autoDownload: [0], next: ".afterChapter", prev: ".beforeChapter", customTitle: () => fun.title("-", 1), css: "#khdDown,.appTil,#m_r_bottom,#m_r_panelbox,.control_panel.alpha{display:none!important}", category: "comic" }, { name: "漫画星球M ", host: ["m.mhxqiu4.com"], enable: 0, reg: /m\.mhxqiu\d\.com\/\d+\/\d+\.html/, imgs: ".main_img img", autoDownload: [0], next: "//a[p[text()='下一篇']][contains(@href,'html')]", prev: "//a[p[text()='上一篇']][contains(@href,'html')]", customTitle: (doc = document) => { let s = doc.title.split("_"); return (s[1] + " - " + s[0]).replace(" - 漫画星球", ""); }, preloadNext: (nextDoc, obj) => { fun.iframeDoc(nextLink, ".main_img img", 30000).then(nextIframeDoc => { let arr = fun.getImgSrcArr(obj.imgs, nextIframeDoc); fun.picPreload(arr, obj.customTitle(nextIframeDoc), "next"); }); }, category: "comic" }, { name: "漫畫狗", host: ["dogemanga.com"], enable: 1, reg: /dogemanga\.com\/p\/[\w-]+/i, init: () => { fun.ge(".site-reader").setAttribute("class", "CustomPictureBox"); fun.addUrlHtml("https://dogemanga.com/", ".CustomPictureBox", 1, "首頁"); let url = siteData.next(); if (url) fun.addUrlHtml(url, ".CustomPictureBox", 1); }, imgs: doc => [...fun.gae(".site-reader__image", doc)].map(e => e.dataset.pageImageUrl), button: [4, "24%", 1], insertImg: [".CustomPictureBox", 2], go: 1, autoDownload: [0], next: () => { let next = fun.ge("//select[@data-kind='publication']/option[@selected]/preceding-sibling::option[1]"); return next ? next.value : null; }, prev: 1, customTitle: doc => fun.title(" - 漫畫狗", 0, doc), threading: 1, preloadNext: true, css: ".CustomPictureBox{height:auto!important}.fixed-bottom{display:none!important}", category: "comic" }, { name: "白绒Yuri", host: ["www.ponpomu.com"], enable: 1, delay: 1000, reg: /^https?:\/\/www\.ponpomu\.com\/topic\/\d+\/comic\//, imgs: () => fun.ge(".comic-page-container data") ? [...fun.gae(".comic-page-container data")].map(e => e.value) : [...fun.gae(".comic-page-container img")].map(e => e.dataset.srcset), autoDownload: [0], next: () => { let ele = fun.ge("//div[text()='已经到尽头了']"); if (!ele) { let s = siteUrl.split("/"); s[s.length - 1] = parseInt(s[s.length - 1], 10) + 1; return s.join("/"); } return null; }, prev: 1, customTitle: () => fun.geT(".comic-info").replace(/\n/, " ").replace("连载:", "-").replace("单行本: ", "").replace("完结: ", ""), category: "comic" }, { name: "明日方舟泰拉记事社", host: ["terra-historicus.hypergryph.com"], enable: 1, reg: /^https?:\/\/terra-historicus\.hypergryph\.com\/comic\/\d+\/episode\/\d+/, imgs: () => { let max = fun.geT(".HG_COMIC_READER_indicator>div:last-child"); let fetchNum = 0; let resArr = fun.arr(max).map((_, i) => { return fetch(`https://terra-historicus.hypergryph.com/api${location.pathname}/page?pageNum=${(i + 1)}`).then(res => res.json()).then(json => { fun.showMsg(`${displayLanguage.str_06}${fetchNum+=1}/${max}`, 0); return json.data.url; }); }); return Promise.all(resArr).then(data => { fun.hideMsg(); return data; }); }, autoDownload: [0], next: () => { let next = fun.ge("//a[text()='下一话']") || fun.ge("//a[text()='下一张']"); return next ? next.href : null; }, prev: 1, customTitle: async () => { await fun.waitEle(".HG_COMIC_READER_episodeTitle"); return fun.geT(".HG_COMIC_READER_comicTitle") + " - " + fun.geT(".HG_COMIC_READER_episodeTitle"); }, category: "comic" }, { name: "Manhuagui看漫画M", host: ["m.manhuagui.com"], enable: 0, reg: /m\.manhuagui\.com\/comic\/\d+\/\d+.html/, json: (doc = document) => { let code = [...doc.scripts].find(s => s.innerHTML.search(/x6c/) > -1).innerHTML.trim().slice(26); let json = JSON.parse(fun.run(code).slice(11, -12)); return json; }, init: () => { siteJson = siteData.json(); }, imgs: (json = siteJson) => json.images.map(e => `https://i.hamreus.com${e}?e=${json.sl.e}&m=${json.sl.m}`), button: [4], insertImg: ["#manga", 2], go: 1, autoDownload: [0], next: () => siteJson.nextId == 0 ? null : fun.ge("#mangaTitle a").href + siteJson.nextId + ".html", prev: "//a[text()='上一章']", customTitle: doc => fun.geT("#mangaTitle", 1, doc), preloadNext: (nextDoc, obj) => { let json = obj.json(nextDoc); let arr = obj.imgs(json); fun.picPreload(arr, obj.customTitle(nextDoc), "next"); }, threading: 3, css: ".action-list li{width:50% !important}#action>ul>li:nth-child(n+2):nth-child(-n+3),.manga-page,.clickforceads{display:none !important}", category: "comic" }, { name: "Manhuagui看漫画M 点击查看下20条记录", host: ["m.manhuagui.com"], enable: 0, reg: /m\.manhuagui\.com\/(update|list|rank|user)\//, icon: 0, key: 0, observerClick: "#more:not([style*=none])>.more-go", category: "comic" }, { name: "Manhuagui看漫画/COCOMANGA", host: ["www.manhuagui.com", "tw.manhuagui.com", "cocomanga.xyz"], enable: 0, reg: /(www|tw)\.manhuagui\.com\/comic\/\d+\/\d+.html|cocomanga\.xyz\/comic\/\d+\/\d+\.html/, init: "$(document).unbind('keydown');", imgs: (doc = document) => { let code = [...doc.scripts].find(s => s.innerHTML.search(/x6c/) > -1).innerHTML.slice(26, -1); let json = fun.run(fun.run(code).slice(11, -11)); let domain; /manhuagui/.test(location.host) ? domain = "https://i.hamreus.com" : domain = "https://i1.cocomanga.xyz"; return json.files.map(e => `${domain+json.path+e}?e=${json.sl.e}&m=${json.sl.m}`); }, button: [4], insertImg: ["#tbBox", 2], go: 1, autoDownload: [0], threading: 3, next: () => cInfo.nextId == 0 ? null : location.origin + "/comic/" + cInfo.bid + "/" + cInfo.nextId + ".html", prev: "//a[text()='上一章']", customTitle: doc => fun.geT("h1>a", 1, doc) + " - " + fun.geT("h2", 1, doc), preloadNext: true, css: ".tbCenter{max-width:1400px!important;width:auto!important;height:auto!important}", category: "comic" }, { name: "包子漫画 閱讀", host: ["cn.baozimh.com", "cn.webmota.com", "tw.baozimh.com", "tw.webmota.com", "www.baozimh.com", "www.webmota.com", "cn.kukuc.co", "tw.kukuc.co", "www.kukuc.co", "tw.czmanga.com", "cn.czmanga.com", "www.czmanga.com", "tw.dzmanga.com", "cn.dzmanga.com", "www.dzmanga.com", "tw.dociy.net", "cn.dociy.net", "www.dociy.net", "tw.twmanga.com", "cn.twmanga.com", "www.twmanga.com"], enable: 0, reg: /\/comic\/chapter\/[^/]+\/\w+\.html/i, include: "//title[contains(text(),'包子')]", init: async () => { fun.run("document['onkeydown']=null;"); await fun.getNP(".comic-contain>div:not(.mobadsq)", "//a[contains(text(),'下一頁') or contains(text(),'下一页')]", null, ".comic-chapter>.next_chapter,.bottom-bar-tool"); }, imgs: doc => [...new Set([...fun.gae(".comic-contain amp-img", doc)].map(e => e.dataset.src ?? e.getAttribute("src")))], button: [4], insertImg: [".comic-contain", 2], go: 1, autoDownload: [0], next: "//div[@class='next_chapter']/a[contains(text(),'下一話') or contains(text(),'下一话')]", prev: 1, customTitle: doc => fun.title(" - ", 3, doc), preloadNext: true, css: ".chapter-main.scroll-mode~*:not(.next_chapter):not(.bottom-bar){display:none!important}", category: "comic" }, { name: "包子漫画 展開目錄", enable: 0, icon: 0, key: 0, reg: /\/comic\/[-\w]+$/i, include: "//title[contains(text(),'包子')]", autoClick: "#button_show_all_chatper", category: "comic" }, { name: "包子漫画,鏈接新分頁打開", enable: 0, icon: 0, key: 0, reg: /(cn|tw|www)\.(baozimh|webmota|kukuc)\.(co|com)/, openInNewTab: ".comics-card a:not([target=_blank]),.bookshelf-items a:not(.remove-img):not([target=_blank])", category: "comic" }, { name: "Komiic", host: ["komiic.com"], enable: 1, reg: /komiic\.com\/comic\/\d+\/chapter\//, imgs: async (url = siteUrl) => { let chapterId = url.match(/chapter\/(\d+)\/images/)[1]; let body = { operationName: "imagesByChapterId", variables: { chapterId: `${chapterId}` }, query: "query imagesByChapterId($chapterId: ID!) {\n imagesByChapterId(chapterId: $chapterId) {\n id\n kid\n height\n width\n __typename\n }\n}\n" }; let json = await fetch("/api/query", { "headers": { "content-type": "application/json" }, "body": JSON.stringify(body), "method": "POST" }).then(res => res.json()); debug("\nimages JSON\n", json); return json.data.imagesByChapterId.map(e => "https://komiic.com/api/image/" + e.kid); }, autoDownload: [0], next: async () => { let mhId = siteUrl.match(/comic\/(\d+)/)[1]; let body = { operationName: "chapterByComicId", variables: { comicId: `${mhId}` }, query: "query chapterByComicId($comicId: ID!) {\n chaptersByComicId(comicId: $comicId) {\n id\n serial\n type\n dateCreated\n dateUpdated\n size\n __typename\n }\n}\n" }; let json = await fetch("/api/query", { "headers": { "content-type": "application/json" }, "body": JSON.stringify(body), "method": "POST" }).then(res => res.json()); debug("\nchapter JSON\n", json); let chapterId = siteUrl.match(/chapter\/(\d+)\/images/)[1]; let chapters = json.data.chaptersByComicId; let nextUrl; for (let i = 0; i < chapters.length; i++) { if (new RegExp(chapterId).test(chapters[i].id)) { try { let nextId = chapters[parseInt(i, 10) + 1].id; nextUrl = siteUrl.replace(new RegExp(`/${chapterId}/`), `/${nextId}/`).replace(/\?page=\d+/, ""); } catch (e) { nextUrl = null; } break; } } return nextUrl; }, prev: 1, customTitle: async () => { await fun.delay(2000, 0); return fun.title(" | Komiic漫畫"); }, threading: 2, category: "comic" }, { name: "LINE WEBTOON / 咚漫", host: ["www.webtoons.com", "www.dongmanmanhua.cn"], enable: 0, reg: /www\.(webtoons|dongmanmanhua)\.(com|cn)\/[^&]+&episode/, imgs: "._images[data-url]", insertImg: ["#_imageList", 2], go: 1, autoDownload: [0], next: "//div[@class='episode_cont']//li[a[starts-with(@class,'on')]]/following-sibling::li[1]/a", prev: "//div[@class='episode_cont']//li[a[starts-with(@class,'on')]]/preceding-sibling::li[1]/a", customTitle: () => fun.title("|", 3).replace(/ - \d+/, "").replace("|", " - "), category: "comic" }, { name: "LINE WEBTOON 目錄聚集所有章節", host: ["www.webtoons.com"], enable: 0, icon: 0, key: 0, reg: /www\.webtoons\.com\/.+\/list\?title_no=\d+/, init: "fun.getNP('._episodeItem',\"//div[@class='paginate']/a[span[@class='on']]/following-sibling::a[1]\",null,'.paginate',0,null,0);", category: "comic" }, { name: "動漫狂", host: ["www.cartoonmad.com", "cc.fun8.us"], enable: 0, reg: /^https?:\/\/www\.cartoonmad\.com\/comic\/\d+\.html|^https?:\/\/cc\.fun8\.us\/post\/\d+\.html/, exclude: "#info table[align]", init: () => { fun.run("document.onkeydown=null;"); fun.remove("//td[div[@id='sidebar-follow']] | //td[ins[@class='adsbygoogle']] | //tr[td[script]] | //select"); let ele = fun.ge("//tr[td[@bgcolor='#EAEAEA']]"); if (ele) ele.parentNode.appendChild(ele.cloneNode(true)); let eleM = fun.ge("//tr[td[table[@bgcolor='#CCCCCC']]]"); if (eleM) { let x = eleM.parentNode.lastElementChild.previousElementSibling; x.parentNode.insertBefore(eleM.cloneNode(true), x); } }, imgs: doc => { let imgDir = fun.ge("img[onload],img[oncontextmenu]", doc).src.match(/.+\//)[0]; let max = fun.ge(".onpage", doc).parentNode.lastElementChild.previousElementSibling.innerText; fun.remove("//tr[td[a[@class='onpage']]]"); return fun.arr(max).map((_, i) => imgDir + String((i + 1)).padStart(3, "0") + ".jpg"); }, button: [4], insertImg: ["//td[a[img[@oncontextmenu]]] | //td[a[img[@oncontextmenu]]]", 2], go: 1, autoDownload: [0], next: "//td[@width='150' and a[img[@src='/image/rad.gif']]]/a | //a[b]", prev: "//td[@width='150' and a[img[@src='/image/rad1.gif']]]/a", customTitle: async (doc = document) => { let src = fun.ge("img[onload],img[oncontextmenu]", doc).src; let comicId = new URL(src).pathname.split("/")[3]; let comicName = await fun.xhrDoc(`https://www.cartoonmad.com/comic/${comicId}.html`, "", PcUa).then(comicDoc => { return fun.ge("meta[name=Keywords]", comicDoc).content.split(",")[0]; }); return comicName + " - " + doc.title; }, preloadNext: true, category: "comic" }, { name: "動漫啦", host: ["www.dongman.la"], enable: 0, reg: /^https?:\/\/www\.dongman\.la\/manhua\/chapter\/\d+\/\d+\//, imgs: (link = siteUrl, msg = 1, request = 0) => { let links = [link.replace("all.html", "") + "all.html"]; return fun.getImgA(".imgListBox img", links, 0, [null, null], msg, request); }, button: [4], insertImg: [".imgListBox", 2], autoDownload: [0], next: "//a[label[text()='下一章']][contains(@href,'chapter')]", prev: "//a[label[text()='上一章']][contains(@href,'chapter')]", customTitle: doc => fun.attr("meta[name='description']", "content", doc), preloadNext: async (nextDoc, obj) => { fun.picPreload(await obj.imgs(nextLink, 0, 1), obj.customTitle(nextDoc), "next"); }, css: ".mdui-container .mdui-col-xs-4:nth-child(2){display:none!important;}.mdui-col-xs-4{width:50%!important}", category: "comic" }, { name: "動漫戲說", host: ["comic.acgn.cc"], enable: 0, reg: /comic\.acgn\.cc\/view/, imgs: doc => [...fun.gae(".pic[_src][id]", doc)].map(e => e.getAttribute("_src")), button: [4], insertImg: ["#pic_list", 2], go: 1, autoDownload: [0], next: ".display_right>a", prev: ".display_left>a", customTitle: doc => fun.geT(".hotrmtexth1>a", 1, doc), preloadNext: true, css: ".btn_wrap{display:none!important}", category: "comic" }, { name: "98漫畫網", host: ["www.98comic.com"], enable: 0, reg: /www\.98comic\.com\/comic\/\d+\/\w+\.html$/, imgs: () => cInfo.fs.map(e => "https://www.98comic.com/g.php?" + cInfo.cid + "/" + e), button: [4], insertImg: ["//td[img[@id='manga']]", 2], go: 1, autoDownload: [0], next: () => cInfo.ncid.length >= 2 ? location.origin + cInfo.burl + cInfo.ncid + ".html" : null, prev: ".prevC", customTitle: () => cInfo.btitle + " - " + cInfo.ctitle, preloadNext: async (nextDoc, obj) => { let code = fun.geT("//script[contains(text(),'cInfo')]", 1, nextDoc); fun.script(code, 0, 1); fun.picPreload(obj.imgs(), obj.customTitle(), "next"); }, css: ".bd_960_90{display:none!important}", category: "comic" }, { name: "57漫画网 / 国漫吧", host: ["www.wuqimh.net", "m.wuqimh.net", "www.guoman8.cc", "m.guoman8.cc"], enable: 0, reg: /((www|m)\.wuqimh\.net)|(www|m)\.guoman8\.cc\/\d+\/\d+\.html$/, imgs: () => cInfo.fs.map(e => /^http/.test(e) ? e : location.protocol + "//" + pageConfig.host.auto[0] + e), button: [4], insertImg: ["//td[img[@id='manga']]", 2], go: 1, autoDownload: [0], next: "a.nextC:not([href^=java])", prev: ".prevC", customTitle: () => cInfo.btitle + " - " + cInfo.ctitle, preloadNext: async (nextDoc, obj) => { let code = fun.geT("//script[contains(text(),'cInfo')]", 1, nextDoc); fun.script(code, 0, 1); fun.picPreload(obj.imgs(), obj.customTitle(), "next"); }, css: ".action-list li{width:50%!important}#action>ul>li:nth-child(n+2):nth-child(-n+3),.bd_960_90,body>section,#action~*:not(#pageNo),footer~*{display:none!important}", category: "comic" }, { name: "亲亲漫画", host: ["www.acgwd.com", "m.acgwd.com"], enable: 0, reg: /^https?:\/\/(www|m)\.acgwd\.com\/manhua\/\d+\/\d+\.html/, init: () => { fun.clearAllTimer(3); let div = document.createElement("div"); div.id = "imgBox"; let x = fun.ge("#images"); x.parentNode.insertBefore(div, x.nextSibling); }, imgs: () => chapterImages.map(e => SinConf.resHost[0].domain + "/" + chapterPath + e), button: [4], insertImg: ["#imgBox", 2], autoDownload: [0], next: () => nextChapterData.id && nextChapterData.id > 0 ? comicUrl + nextChapterData.id + ".html" : null, prev: "//a[contains(text(),'上一章')]", customTitle: doc => { let code = fun.geT("//script[contains(text(),'jmzz20191018')]", 1, doc); let arr = code.match(/jmzz20191018\(([^\)]+)\)/)[1].replaceAll('"', "").split(","); return arr[3] + " - " + arr[1]; }, preloadNext: async (nextDoc, obj) => { let code = fun.geT("//script[contains(text(),'chapterImages')]", 1, nextDoc); fun.script(code, 0, 1); jmzz20191018(); fun.picPreload(obj.imgs(), obj.customTitle(nextDoc), "next"); _0x5097 = null; }, css: "#images,.img_land_prev,.img_land_next,#action li:nth-child(2),#action li:nth-child(3),.control_bottom~*,.chapter-view~*:not([id^='pv-']):not([class^='pv-']):not(.pagetual_tipsWords):not(#comicRead):not(#fab):not(.FullPictureLoadMsg):not(.FullPictureLoadFixedBtn):not(#FullPictureLoadOptions):not(*[class^=fancybox]){display:none!important}#action li{width:50%!important}", category: "comic" }, { name: "古风漫画网", host: ["www.gufengmh.com", "m.gufengmh.com", "www.gufengmh9.com", "m.gufengmh9.com"], enable: 0, reg: /^https?:\/\/(www|m)\.gufengmh\d?\.com\/manhua\/\w+\/\d+\.html/, init: () => { fun.run("$(document).off();"); fun.remove("#skin"); }, imgs: () => chapterImages.map(e => SinConf.resHost[0].domain + "/" + chapterPath + e), button: [4], insertImg: ["#images", 2], autoDownload: [0], next: () => nextChapterData.id && nextChapterData.id > 0 ? comicUrl + nextChapterData.id + ".html" : null, prev: "//a[contains(text(),'上一章')]", customTitle: doc => { if (/^https?:\/\/www/.test(siteUrl)) { let arr = fun.geT(".title", 1, doc).split(" / "); return arr[0] + " - " + arr[1]; } else { let code = fun.geT("//script[contains(text(),'SinMH.initChapter')]", 1, doc); let arr = code.match(/SinMH.initChapter\(([^\)]+)\)/)[1].replaceAll('"', "").split(","); return arr[3] + " - " + arr[1]; } }, preloadNext: async (nextDoc, obj) => { let title; /^https?:\/\/www/.test(siteUrl) ? title = nextDoc.title.split("在线")[0] : title = obj.customTitle(nextDoc); let code = fun.geT("//script[contains(text(),'chapterImages')]", 1, nextDoc); fun.script(code, 0, 1); fun.picPreload(obj.imgs(), title, "next"); }, css: ".img_land_prev,.img_land_next,#action li:nth-child(2),#action li:nth-child(3),.control_bottom~*,.chapter-view~*:not([id^='pv-']):not([class^='pv-']):not(.pagetual_tipsWords):not(#comicRead):not(#fab):not(.FullPictureLoadMsg):not(.FullPictureLoadFixedBtn):not(#FullPictureLoadOptions):not(*[class^=fancybox]){display:none!important}#action li{width:50%!important}", category: "comic" }, { name: "漫画456", host: ["www.manhua456.com"], enable: 0, reg: /www\.manhua456\.com\/manhua\/\w+\/\d+\.html/, delay: 1000, init: "setTimeout(()=>{$(document).unbind('keyup');$(document).unbind('keydown')},4000)", imgs: async () => { await fun.waitEle("//script[contains(text(),'chapterImages')]"); return chapterImages.map(e => /^http/.test(e) ? e : SinConf.resHost1 + "/" + chapterPath + e); }, button: [4], insertImg: ["#images", 2], next: () => { if (nextChapterData.id && nextChapterData.id > 0) { let url = new URL(comicUrl + nextChapterData.id + ".html"); return url.protocol != location.protocol ? url.href.replace(url.protocol, location.protocol) : url; } return null; }, prev: "//a[text()='上一章']", customTitle: () => fun.title(" - ", 3), preloadNext: async (nextDoc, obj) => { const callback = (doc, fun) => { const code = ` window.parent.postMessage({ iframePicArr: chapterImages.map(e => /^http/.test(e) ? e : SinConf.resHost1 + "/" + chapterPath + e), title: document.title }, "https://www.manhua456.com"); `; fun.script(code, 0, 1, doc); }; fun.iframeDoc(nextLink, "//script[contains(text(),'chapterImages')]", 30000, callback); }, css: ".img_land_prev,.img_land_next{display:none!important}", category: "comic" }, { name: "漫画456M m.manhua456.com", host: ["m.manhua456.com"], enable: 0, reg: /m\.manhua456\.com\/manhua\/\w+\/\d+\.html/, delay: 300, init: async () => { await fun.waitEle("//script[contains(text(),'chapterImages')]"); fun.run("$('#images').unbind('click');"); }, imgs: async () => { await fun.waitEle("//script[contains(text(),'chapterImages')]"); return chapterImages.map(e => /^http/.test(e) ? e : SinConf.resHost1 + "/" + chapterPath + e); }, button: [4], insertImg: ["#images", 2], next: () => { if (nextChapterData.id && nextChapterData.id > 0) { let url = new URL(comicUrl + nextChapterData.id + ".html"); return url.protocol != location.protocol ? url.href.replace(url.protocol, location.protocol) : url; } return null; }, prev: "//a[text()='上一章']", customTitle: () => { let s = pageTitle.split(" - "); return s[1] + " - " + s[0]; }, preloadNext: async (nextDoc, obj) => { const callback = (doc, fun) => { const code = ` window.parent.postMessage({ iframePicArr: chapterImages.map(e => /^http/.test(e) ? e : SinConf.resHost1 + "/" + chapterPath + e), title: document.title }, "https://m.manhua456.com"); `; fun.script(code, 0, 1, doc); }; fun.iframeDoc(nextLink, "//script[contains(text(),'chapterImages')]", 30000, callback); }, css: ".img_land_prev,.img_land_next{display:none!important}", category: "comic" }, { name: "漫画1234", host: ["www.gmh1234.com", "m.gmh1234.com"], enable: 0, reg: /(www|m)\.\wmh1234\.com\/comic\/\d+\/\d+\.html/i, init: "$(document).unbind('keydown');$(document).unbind('keyup');$('#images').unbind('click');", imgs: async () => { let url = await siteData.next(); if (location.hostname == "www.gmh1234.com") { if (url) fun.addUrlHtml(url, "#images", 1); } return chapterImages.map(e => SinConf.resHost[0].domain + "/" + chapterPath + e); }, button: [4], insertImg: ["#images", 2], autoDownload: [0], next: () => nextChapterData.id > 0 ? nextChapterData.url : null, prev: 1, customTitle: () => { if (location.hostname == "m.gmh1234.com") { let s = pageTitle.split(" - "); return s[1] + " - " + s[0]; } else { let data = JSON.parse(localStorage.history)[0]; return data.comic_name + " - " + data.read_chapter; } }, preloadNext: async (nextDoc, obj) => { let code = fun.geT("//script[contains(text(),'chapterImages')]", 1, nextDoc); fun.script(code, 0, 1); fun.picPreload(await obj.imgs(), nextDoc.title, "next"); }, css: ".globalPadding{display:none!important;}", category: "comic" }, { name: "90漫画", host: ["www.90mh.com", "www.90mh.org"], enable: 0, reg: /www\.90mh\.(com|org)\/manhua\/\w+\/\d+\.html/i, imgs: () => chapterImages.map(e => SinConf.resHost[0].domain + "/" + chapterPath + e), button: [4], insertImg: ["#images", 2], autoDownload: [0], next: () => nextChapterData.id && nextChapterData.id > 0 ? comicUrl + nextChapterData.id + ".html" : null, prev: ".prevC", customTitle: doc => fun.title(" - ", 3, doc), preloadNext: async (nextDoc, obj) => { let code = fun.geT("//script[contains(text(),'chapterImages')]", 1, nextDoc); fun.script(code, 0, 1); fun.picPreload(obj.imgs(), obj.customTitle(nextDoc), "next"); }, category: "comic" }, { name: "90漫画M", host: ["wap.90mh.com", "m.90mh.org"], enable: 0, reg: /(wap|m)\.90mh\.(com|org)\/manhua\/\w+\/\d+\.html/i, init: () => { let url = siteData.next(); if (url) fun.addUrlHtml(url, "#chapter-image", 1); }, imgs: (url = siteUrl, doc, msg = 1, request = 0) => fun.getImg("#chapter-image img", fun.geT("#k_total", 1, doc), 5, [null, null], 20, url, msg, request), button: [4], insertImg: ["#chapter-image", 2], autoDownload: [0], next: () => { let next = fun.ge("//a[text()='下一章'][contains(@href,'html')]"); return next ? next.href : null; }, prev: 1, customTitle: doc => fun.title("在线", 1, doc), preloadNext: async (nextDoc, obj) => { fun.picPreload(await obj.imgs(nextLink, nextDoc, 0, 1), obj.customTitle(nextDoc), "next"); }, css: ".a-90mh{display:none!important}", category: "comic" }, { name: "优酷漫画", host: ["www.ykmh.com"], enable: 0, reg: /www\.ykmh\.com\/manhua\/\w+\/\d+\.html/i, init: "$(document).unbind('keydown');$(document).unbind('keyup');", imgs: () => chapterImages.map(e => SinConf.resHost[0].domain + e), button: [4], insertImg: ["#images", 2], autoDownload: [0], next: ".next>a", prev: ".pre>a", customTitle: doc => fun.title(" - ", 3, doc), preloadNext: (nextDoc, obj) => { let code = fun.geT("//script[contains(text(),'chapterImages')]", 1, nextDoc); fun.script(code, 0, 1); fun.picPreload(obj.imgs(), obj.customTitle(nextDoc), "next"); }, css: ".img_land_prev,.img_land_next{display:none!important}", category: "comic" }, { name: "优酷漫画M", host: ["h5.ykmh.com"], enable: 0, reg: /h5\.ykmh\.com\/manhua\/\w+\/\d+\.html/i, init: "$('#images').unbind('click');", imgs: () => chapterImages.map(e => SinConf.resHost[0].domain + e), button: [4], insertImg: ["#images", 2], go: 1, autoDownload: [0], next: () => nextChapterData.id && nextChapterData.id > 0 ? comicUrl + nextChapterData.id + ".html" : null, prev: "//a[text()='上一章']", customTitle: () => { let s = pageTitle.split(" - "); return s[1] + " - " + s[0]; }, preloadNext: (nextDoc, obj) => { let code = fun.geT("//script[contains(text(),'chapterImages')]", 1, nextDoc); fun.script(code, 0, 1); fun.picPreload(obj.imgs(), nextDoc.title, "next"); }, css: ".letchepter>div,.letchepter>section,#FullPictureLoad~*{display:none!important}", category: "comic" }, { name: "漫画芯M", host: ["m.mhxin.com"], enable: 0, reg: /(m|coco)\.mhxin\.com\/manhua\/\w+\/\d+\.html/i, imgs: (url = siteUrl, doc, msg = 1, request = 0) => { let max = fun.geT(".image-content p", 1, doc).match(/\/(\d+)/)[1]; return fun.getImg("#manga-image", max, 5, [null, null], 20, url, msg, request); }, button: [4], insertImg: ["#images", 2], go: 1, autoDownload: [0], next: () => { let code = [...document.scripts].find(s => s.innerHTML.search(/下一章/) > -1).innerHTML; let url = code.match(/<li><a href="(.+)">下一章/)[1]; return /html$/.test(url) ? url : null; }, prev: 1, customTitle: doc => fun.title("在线", 1, doc), preloadNext: async (nextDoc, obj) => { fun.picPreload(await obj.imgs(nextLink, nextDoc, 0, 1), obj.customTitle(nextDoc), "next"); }, css: ".action-list li{width:50% !important}div[style*='text-align: left;'],.UnderPage~*:not([id^='pv-']):not([class^='pv-']):not(.pagetual_tipsWords):not(#comicRead):not(#fab):not(.FullPictureLoadMsg):not(.FullPictureLoadFixedBtn):not(#FullPictureLoadOptions):not(*[class^=fancybox]),.action-list>ul>li:nth-child(n+2):nth-child(-n+3){display:none!important}body{padding:0!important}", category: "comic" }, { name: "最漫画M / 拼拼漫画M", host: ["m.zuimh.com", "m.pinmh.com"], enable: 0, reg: /(m\.zuimh\.com|m.pinmh.com)\/manhua\/\w+\/\d+\.html/i, imgs: (url = siteUrl, doc, msg = 1, request = 0) => { let max = fun.geT(".image-content p", 1, doc).match(/\/(\d+)/)[1]; return fun.getImg("#image", max, 5, [null, null], 20, url, msg, request); }, button: [4], insertImg: ["#images", 2], go: 1, autoDownload: [0], next: "//a[text()='下一章'][contains(@href,'html')] | //a[img[contains(@src,'icon_xz.png')]][contains(@href,'html')]", prev: "//a[text()='上一章'][contains(@href,'html')] | //a[img[contains(@src,'icon_sz.png')]][contains(@href,'html')]", customTitle: doc => fun.title("在线", 1, doc), preloadNext: async (nextDoc, obj) => { fun.picPreload(await obj.imgs(nextLink, nextDoc, 0, 1), obj.customTitle(nextDoc), "next"); }, css: "body{padding:0!important}div[style*='text-align']:not(#images),.UnderPage~*:not([id^='pv-']):not([class^='pv-']):not(.pagetual_tipsWords):not(#comicRead):not(#fab):not(.FullPictureLoadMsg):not(.FullPictureLoadFixedBtn):not(#FullPictureLoadOptions):not(*[class^=fancybox]){display:none!important}", category: "comic" }, { name: "零点漫画M", host: ["m.0dmh.com"], enable: 0, reg: /(m\.0dmh\.com)\/manhua\/\w+\/\d+\.html/i, imgs: (url = siteUrl, doc, msg = 1, request = 0) => { let max = Math.ceil(fun.geT("#images p", 1, doc).match(/\/(\d+)/)[1] / 3); return fun.getImg("#images img", max, 5, [null, null], 20, url, msg, request); }, button: [4], insertImg: ["#images", 2], go: 1, autoDownload: [0], next: "//a[text()='下一章'][contains(@href,'html')]", prev: "//a[text()='上一章'][contains(@href,'html')]", customTitle: doc => fun.title("-零点漫画", 0, doc).trim(), preloadNext: async (nextDoc, obj) => { fun.picPreload(await obj.imgs(nextLink, nextDoc, 0, 1), obj.customTitle(nextDoc), "next"); }, css: ".action-list li{width:50% !important}div[style*='text-align']:not(#images),.action-list>ul>li:nth-child(n+2):nth-child(-n+3){display:none!important}", category: "comic" }, { name: "漫画连M / 果果漫画M", host: ["m.100mhl.com", "m.guoguomh.com"], enable: 0, reg: /(m\.100mhl\.com|m\.guoguomh\.com)\/manhua\/\w+\/\d+\.html/i, imgs: (url = siteUrl, doc, msg = 1, request = 0) => { let num = fun.geT("#images p", 1, doc).match(/\/(\d+)/)[1]; let max = Math.ceil(num / 5); if (location.hostname == "m.100mhl.com") { return fun.getImg("#images img", max, 5, [null, null], 20, url, msg, request); } else { return fun.getImg("#images img", num, 5, [null, null], 20, url, msg, request); } }, button: [4], insertImg: ["#images", 2], go: 1, autoDownload: [0], next: () => { let next = fun.ge("//a[text()='下一章'][contains(@href,'html')]"); return next ? next.href : null; }, prev: 1, customTitle: () => { let comic_name; location.hostname == "m.100mhl.com" ? comic_name = document.title.split("漫画")[0] : comic_name = fun.attr("meta[name='keywords']", "content").split(" ")[0]; return comic_name + " - " + fun.geT(".BarTit").trim(); }, preloadNext: async (nextDoc, obj) => { fun.picPreload(await obj.imgs(nextLink, nextDoc, 0, 1), nextDoc.title, "next"); }, css: "#addMoney,#images~div[style*=blur],div[style*='text-align: left;']{display:none!important}", category: "comic" }, { name: "爱米推漫画M/下拉式漫画M/冰氪漫画M/狗狗漫画M/悠闲漫画M", host: ["m.imitui.com", "m.xlsmh.com", "m.icekr.com", "m.gougoumh.com", "m.yxtun.com"], enable: 0, reg: /(m\.imitui\.com|m\.xlsmh\.com|m\.icekr\.com|m\.gougoumh\.com|m\.yxtun\.com)\/manhua\/\w+\/\d+\.html/i, imgs: doc => { let imgs = fun.getImgSrcArr("#images img:not([src*=loading]),#scroll-image img", doc); fun.remove("#scroll-image"); return imgs; }, button: [4], insertImg: ["#images", 2], go: 1, autoDownload: [0], next: () => { try { return nextChapterData.id > 0 ? nextChapterData.url : null; } catch (e) { let next = fun.ge("//a[text()='下一章 > '][contains(@href,'html')]"); return next ? next.href : null; } }, prev: 1, customTitle: doc => /xlsmh|gougoumh|yxtun/.test(location.hostname) ? fun.geT("#panel-title span,.title3 span", 1, doc).replace(">", " - ") : fun.title("在线", 1, doc), preloadNext: async (nextDoc, obj) => { fun.picPreload(obj.imgs(nextDoc), obj.customTitle(nextDoc), "next"); }, css: "body{padding:0!important}.UnderPage~*:not([id^='pv-']):not([class^='pv-']):not(.pagetual_tipsWords):not(#comicRead):not(#fab):not(.FullPictureLoadMsg):not(.FullPictureLoadFixedBtn):not(#FullPictureLoadOptions):not(*[class^=fancybox]),.bottom~*:not([id^='pv-']):not([class^='pv-']):not(.pagetual_tipsWords):not(#comicRead):not(#fab):not(.FullPictureLoadMsg):not(.FullPictureLoadFixedBtn):not(#FullPictureLoadOptions):not(*[class^=fancybox]),div[style*='text-align: left;']{display:none!important}", category: "comic" }, { name: "前未漫画/漫画芯/最漫画/爱米推漫画/下拉式漫画/漫画连/拼拼漫画/零点漫画/雪儿漫画/狗狗漫画/悠闲漫画/漫画看/果果漫画", host: ["www.qianmh.com", "www.mhxin.com", "www.zuimh.com", "www.imitui.com", "imitui.com", "www.xlsmh.com", "www.100mhl.com", "www.pinmh.com", "www.0dmh.com", "www.xuermh.com", "www.gougoumh.com", "www.yxtun.com", "www.bukamh.com", "www.mhkan.com", "www.guoguomh.com"], enable: 0, reg: /www\.(mhxin|qianmh|zuimh|imitui|xlsmh|100mhl|pinmh|0dmh|xuermh|gougoumh|yxtun|mhkan|guoguomh)\.com\/manhua\/\w+\/\d+\.html/i, init: "try{$(document).unbind('keydown');$(document).unbind('keyup')}catch(e){}fun.remove(\"//div[@class='main'][h3]\");", imgs: () => chapterImages, button: [4], insertImg: [ ["#images,#imagesOld", 2, "#images,#imagesOld"], 2 ], go: 1, autoDownload: [0], next: () => { let next = fun.ge(".next>a,a.next,a.nextC"); if (next) { if (/SinTheme\.nextChapter/.test(next.href)) { return nextChapterData.id && nextChapterData.id > 0 ? comicUrl + nextChapterData.id + ".html" : null; } else { return next.href; } } return null; }, prev: ".pre>a,a.prev,a.prevC", autoClick: "#chapter-pagination:not(.active),#mode_pagination", customTitle: () => { let host = location.hostname; if (/mhxin|pinmh|guoguomh/.test(host)) { return fun.geT(".head_title").replace("-", " -"); } else if (/qianmh|xlsmh|100mhl|0dmh|xuermh|gougoumh/.test(host)) { //return fun.geT("h1").trim(); let data = JSON.parse(localStorage.history)[0]; return data.comic_name + " - " + data.read_chapter } else if (/zuimh|imitui|dmhua|yxtun|mhkan/.test(host)) { return fun.geT(".title h1") + " - " + fun.geT(".title h2"); } }, preloadNext: (nextDoc, obj) => { let code = fun.geT("//script[contains(text(),'chapterImages')]", 1, nextDoc); fun.script(code, 0, 1); fun.picPreload(obj.imgs(), nextDoc.title, "next"); }, css: "#qTcms_picID{display:none!important}", category: "comic" }, { name: "雪儿漫画M", host: ["m.xuermh.com"], enable: 0, reg: /m\.xuermh\.com\/manhua\/\w+\/\d+\.html/i, init: async () => { let a = fun.ge(".erPag a"); let img = fun.ge(".erPag a img:last-child"); a.outerHTML = img.outerHTML; await fun.getNP(".erPag mip-link img:not([style*=position])", "//mip-link[text()='下一页'][contains(@href,'-')] | //a[text()='下一页'][contains(@href,'-')]", null, "#action", 0, null, 0); }, imgs: () => [...fun.gae(".erPag mip-link img:not([style*=position])")], button: [4], insertImg: [".erPag", 2], go: 1, autoDownload: [0], next: "//a[text()='下一章']", prev: "//a[text()='上一章']", customTitle: () => fun.geT("h1").replace(">", " - ").trim(), css: "div[style*='text-align: left;'],#action li:nth-child(2),#action li:nth-child(3),span.right{display:none!important}#action li{width:50%!important}", category: "comic" }, { name: "来漫画", host: ["www.laimanhua8.com"], enable: 1, reg: /www\.laimanhua\d?\.(net|com)\/kanmanhua\/\w+\/\d+\.html/i, init: () => fun.clearAllTimer(), imgs: () => base64_decode(picTree).split("$qingtiandy$").map(e => getpicdamin() + e), button: [4], insertImg: ["#pic-list", 2], autoDownload: [0], next: () => nextUrlid == "" ? null : fun.ge("#cartoon_url").href + nextUrlid + ".html", prev: ".btn-prev", customTitle: doc => fun.title(",", 1, doc).replace("漫画", ""), preloadNext: (nextDoc, obj) => { let code = fun.geT("//script[contains(text(),'picTree')]", 1, nextDoc); fun.script(code, 0, 1); fun.picPreload(obj.imgs(), obj.customTitle(nextDoc), "next"); }, css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}#pre-loading,.img_info{display:none!important}", category: "comic" }, { name: "来漫画M", host: ["m.laimanhua8.com"], enable: 1, reg: /m\.laimanhua8\.com\/kanmanhua\/\w+\/\d+\.html/i, init: () => fun.clearAllTimer(), imgs: () => mhInfo.images.map(e => realurl + mhInfo.path + e), button: [4], insertImg: ["#manga", 2], autoDownload: [0], next: () => mhInfo.nextUrlid == "" ? null : fun.ge("#mangaTitle>a").href + mhInfo.nextUrlid + ".html", prev: "//a[text()='上一章']", customTitle: doc => fun.geT("#mangaTitle", 1, doc), preloadNext: (nextDoc, obj) => { let code = fun.geT("//script[contains(text(),'mhInfo')]", 1, nextDoc); fun.script(code, 0, 1); fun.picPreload(obj.imgs(), obj.customTitle(nextDoc), "next"); }, css: "#jusha1{display:none!important}", category: "comic" }, { name: "漫画看M", host: ["m.mhkan.com"], enable: 0, reg: /^https?:\/\/m\.mhkan\.com\/manhua\/\w+\/\d+\.html/i, imgs: () => chapterImages, button: [4], insertImg: [".chapter-content", 2], autoDownload: [0], next: () => nextChapterData.id && nextChapterData.id > 0 ? comicUrl + nextChapterData.id + ".html" : null, prev: "//a[text()='上一章']", customTitle: () => { let data = JSON.parse(localStorage.history)[0]; return data.comic_name + " - " + data.read_chapter }, preloadNext: (nextDoc, obj) => { let code = fun.geT("//script[contains(text(),'chapterImages')]", 1, nextDoc); fun.script(code, 0, 1); fun.picPreload(obj.imgs(), nextDoc.title, "next"); }, category: "comic" }, { name: "漫客栈", host: ["www.mkzhan.com"], enable: 0, reg: /www\.mkzhan\.com\/\d+\/\d+\.html/i, xhr: async (lp = new URL(siteUrl).pathname) => { let lps = lp.split("/"); let comic_id = lps[1]; let chapter_id = lps[2].match(/\d+/)[0]; let apiUrl = `https://comic.mkzcdn.com/chapter/content/v1/?chapter_id=${chapter_id}&comic_id=${comic_id}&format=1&quality=1&type=1`; return fetch(apiUrl).then(res => res.json()); }, init: async () => { let json = await siteData.xhr(); debug("\n此頁JSON資料\n", json); siteJson = json; }, imgs: (json = siteJson) => json.code == 302 ? [] : json.data.page.map(e => e.image), insertImg: ["#pages-tpl", 2], autoDownload: [0], next: ".rd-aside a.j-rd-next", prev: ".rd-aside a.j-rd-prev", autoClick: "//div[@class='rd-aside__item j-rd-mod'][span[text()='卷轴']]", customTitle: doc => fun.title(" - ", 1, doc), preloadNext: async (nextDoc, obj) => { let json = await obj.xhr(new URL(nextLink).pathname); fun.picPreload(obj.imgs(json), obj.customTitle(nextDoc), "next") }, category: "comic" }, { name: "漫画屋格式", host: ["www.mhua5.com", "www.mhw1.com", "www.cmh5.com", "www.360mh.cc", "www.manshiduo.net", "comics.veryim.com", "797mh.com", "www.biqug.org", "www.manhuabaiku.com", "mh.9xxsm.com", "www.cuiman.com"], enable: 0, reg: /(www\.mhua5\.com|www\.mhw\d?\.com|www\.cmh5\.com|www\.360mh\.cc|mh\.9xxsm\.com)\/index\.php\/chapter\/\d+|(www\.manshiduo\.net|797mh\.com)\/chapter_\d+\.html|comics\.veryim\.com\/\w+\/\d+\/\d+\.html|www\.biqug\.org\/index\.php\/chapter-\d+.html|www\.manhuabaiku\.com\/chapter\/\w+\.html|www\.cuiman\.com\/\d+-\d+\.html/i, include: ".rd-article-wr", init: "document.onkeydown=null;", imgs: doc => { if (/www\.manhuabaiku\.com/.test(location.host)) { return [...fun.gae("img[data-src]", doc)].map(e => atob(e.dataset.src)); } else { return fun.getImgSrcArr("img[data-original]:not([data-original*='/template/pc/default/']),.lazy-read:not([data-original*='/template/pc/default/']),img[data-src]", doc); } }, button: [4], insertImg: [".rd-article-wr", 2], autoDownload: [0], //next: ".btn--next-chapter,.rd-aside a.j-rd-next", next: () => { let next1 = fun.ge("a.j-rd-next[_href]:not([style])"); let next2 = fun.ge("a.j-rd-next[href]:not([href^=java])"); if (/797mh\.com|mh\.9xxsm\.com/.test(location.host)) { let next = fun.ge("a.j-rd-prev[_href]:not([style])"); return next ? location.origin + next.getAttribute("_href") : null; } else if (next1) { let href = fun.attr("a.j-rd-next[_href]", "_href"); return href == "" ? null : location.origin + href; } else if (next2) { return next2.href; } return null; }, prev: ".rd-aside a.j-rd-prev", autoClick: "//div[@class='rd-aside__item j-rd-mod'][span[text()='卷轴']]", customTitle: doc => { if (/www\.mhua5\.com|www\.mhw\d\.com/.test(location.host)) { return fun.title(" - 漫画屋", 0, doc).replace("-", " - "); } else if (/www\.cmh5\.com/.test(location.host)) { return fun.attr("meta[name=description]", "content", doc).split(" - 漫画屋")[0].replace("当前阅读的是", "").replace("的", " - "); } else if (/www\.360mh\.cc|797mh\.com|www\.biqug\.org|www\.manhuabaiku\.com|mh\.9xxsm\.com|www\.cuiman\.com/.test(location.host)) { return fun.geT(".j-comic-title", 1, doc) + " - " + fun.geT(".last-crumb", 1, doc); } else { return fun.title(/下拉|在线/, 1, doc).replace("-", " - ").replace(/漫画|\[\d+P\]/i, ""); } }, preloadNext: true, css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}", category: "comic" }, { name: "漫画屋M格式", host: ["m.mkzhan.com", "www.mhua5.com", "www.mhw1.com", "www.cmh5.com", "www.360mh.cc", "www.manshiduo.net", "797mh.com", "www.biqug.org", "mh.9xxsm.com", "m.cuiman.com"], enable: 0, reg: /m\.mkzhan\.com\/\d+\/\d+\.html|(www\.mhua5\.com|www\.mhw\d?\.com|www\.cmh5\.com|www\.360mh\.cc|mh\.9xxsm\.com)\/index\.php\/chapter\/\d+|(www\.manshiduo\.net|797mh\.com)\/chapter_\d+\.html|www\.biqug\.org\/index\.php\/chapter-\d+.html|m\.cuiman\.com\/\d+-\d+\.html/i, imgs: doc => fun.getImgSrcArr(".comic-page img,img[data-src],img[data-original]", doc), autoDownload: [0], next: async () => { if (/www\.mhua5\.com|www\.cmh5\.com|www\.360mh\.cc|www\.mhw\d\.com|www\.biqug\.org|mh\.9xxsm\.com|m\.cuiman\.com/.test(location.host)) { let next = fun.attr(".next-chapter", "_href"); return next !== "" ? location.origin + next : null; } else if (/m\.mkzhan\.com/.test(location.host)) { await fun.waitEle(".next-chapter[data-href]", 10) let next = fun.ge(".next-chapter").dataset.href; return next !== "" || next != 0 ? location.origin + next : null; } else if (/www\.manshiduo\.net|www..cmh5\.com/.test(location.host)) { let next = fun.attr(".next-chapter", "_href"); return next !== "" ? location.origin + next : null; } else if (/797mh\.com/.test(location.host)) { let next = fun.attr(".prev-chapter", "_href"); return next !== "" ? location.origin + next : null; } else { let next = fun.ge("//a[text()='下一章']"); return next ? next.href : null; } }, prev: 1, customTitle: doc => { if (/www\.mhua5\.com|www\.cmh5\.com/.test(location.host)) { return fun.title(" - 漫画屋", 0, doc).replace("-", " - "); } else if (/m\.mkzhan\.com/.test(location.host)) { return fun.title(" - 漫客栈", 0, doc).trim(); } else if (/www\.360mh\.cc|www\.mhw\d\.com|797mh\.com|www\.biqug\.org|mh\.9xxsm\.com|m\.cuiman\.com/.test(location.host)) { return shareArr[0].match(/《([^》]+)/)[1] + " - " + fun.geT(".comic-name", 1, doc); } else { return fun.title("下拉", 1, doc).trim().replace("-", " - "); } }, preloadNext: (nextDoc, obj) => { fun.iframeDoc(nextLink, ".comic-page img,img[data-src],img[data-original],canvas[data-src]", 30000).then(nextIframeDoc => { fun.picPreload(obj.imgs(nextIframeDoc), obj.customTitle(nextIframeDoc), "next"); }); }, css: "body>ins,#mainView>.read,.chapter-end .read,#chapter1,#chapter3,.cnt-4,.comic-list a,.chapter-end>a,div[style^=height]{display:none!important}", category: "comic" }, { name: "漫百库M", host: ["www.manhuabaiku.com"], enable: 0, reg: /www\.manhuabaiku\.com\/chapter\/\w+\.html/i, init: () => { $("body").on("click", ".FullPictureLoadImage", () => { if ($(".top-tool-bar").css("top") == "0px") { $(".top-tool-bar").animate({ top: "-100px" }, 500); $(".bottom-tool-bar").animate({ bottom: "-100px" }, 500); } else { $(".top-tool-bar").animate({ top: "0px" }, 500); $(".bottom-tool-bar").animate({ bottom: "0px" }, 500); } }); }, imgs: doc => [...fun.gae(".readForm canvas", doc)].map(e => atob(e.dataset.sc)), button: [4], insertImg: [".readForm", 2], autoDownload: [0], next: "//a[text()='下一章'][contains(@href,'html')]", prev: "//a[text()='上一章'][contains(@href,'html')]", customTitle: (doc = document) => doc.title.split("漫画章节")[0] + " - " + fun.geT(".comic-name", 1, doc), preloadNext: true, category: "comic" }, { name: "vomic漫画", host: ["www.vomicmh.com"], enable: 0, reg: /^http:\/\/www\.vomicmh\.com\/m_\w+\//i, imgs: "#showimage img", button: [4], insertImg: ["#showimage", 2], autoDownload: [0], next: "a#next_c[href]", prev: "a#last_c[href]", customTitle: doc => fun.title(" - ", 3, doc).trim(), preloadNext: (nextDoc, obj) => { fun.iframeSrcDoc(nextLink, "#showimage img", 30000).then(nextIframeDoc => { let arr = fun.getImgSrcArr(obj.imgs, nextIframeDoc); fun.picPreload(arr, obj.customTitle(nextIframeDoc), "next"); }); }, css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}", category: "comic" }, { name: "爱国漫", host: ["www.aiguoman.com"], enable: 1, reg: /www\.aiguoman\.com\/chapter\/.+\.html/i, imgs: ".main-item>img", button: [4, "24%", 1], insertImg: [".main-scroll_mode", 2], autoDownload: [0], next: "a.J_next_eposide_btn[href*=chapter]", prev: "a.J_prev_eposide_btn[href*=chapter]", customTitle: doc => fun.geT(".cartoon-title>a:first-child", 1, doc) + " - " + fun.geT(".cartoon-title>a:last-child", 1, doc), preloadNext: true, category: "comic" }, { name: "爱国漫M", host: ["m.aiguoman.com"], enable: 1, reg: /m\.aiguoman\.com\/chapter\/.+\.html/i, imgs: ".lazy-image[data-original]", autoDownload: [0], next: "//a[text()='下一章'][contains(@href,'html')]", prev: "//a[text()='上一章'][contains(@href,'html')]", customTitle: (doc = document) => doc.title.split("免费")[0].replace("漫画", ""), preloadNext: true, category: "comic" }, { name: "新新漫画", host: ["www.77mh.xyz", "m.77mh.xyz"], enable: 0, reg: /(www|m)\.77mh\.[a-z]{2,3}\/\d+\/\d+\.html/i, init: "try{$(document).unbind('keydown');$(document).unbind('keyup')}catch(e){}", imgs: () => msg.split("|").map(e => location.hostname.indexOf("m.77mh") != -1 ? ImgSvrList + e : img_qianz + e), button: [4], insertImg: ["#comicImg,.mg-co", 2, 1000], go: 1, autoDownload: [0], next: () => nextLink_b == "" ? null : location.origin + nextLink_b, prev: "//a[contains(text(),'上一章')]", customTitle: doc => fun.title(" - ", 3, doc), preloadNext: (nextDoc, obj) => { let code = fun.geT("//script[contains(text(),'eval')]", 1, nextDoc); fun.script(code, 0, 1); fun.picPreload(obj.imgs(), obj.customTitle(nextDoc), "next"); }, category: "comic" }, { name: "漫漫聚/KuKu动漫", host: ["www.manmanju.com", "manhua.kukudm.com"], enable: 1, reg: /(a|b|www|manhua)\.(manmanju|i?kukudm)\.com\/comiclist\/\d+\/\d+\/1\.htm/i, include: "td img", comicListUrl: () => { let comicId = siteUrl.split("/")[4]; return /(www|a|b)\.manmanju\.com/.test(location.origin) ? `http://www.manmanju.com/comiclist/${comicId}/index.htm` : `http://manhua.kukudm.com/comiclist/${comicId}/index.htm`; }, init: async () => { let cUrl = siteData.comicListUrl(); let url = await siteData.next(); if (url) { fun.addUrlHtml(url, "body", 2); fun.addUrlHtml(cUrl, "body", 2, "目錄"); } else { if (/manmanju/.test(location.origin)) { fun.addUrlHtml(cUrl, "body", 2, "目錄"); fun.addUrlHtml("http://www.manmanju.com/", "body", 2, "首頁"); } else { fun.addUrlHtml(cUrl, "body", 2, "目錄"); fun.addUrlHtml("https://manhua.kukudm.com/", "body", 2, "首頁"); } } }, imgs: () => fun.getKukudmSrc(), button: [4], insertImg: ["//td[input]", 2], go: 1, autoDownload: [0], next: () => { let chapterId = siteUrl.split("/")[5]; let host; if (/www\.manmanju\.com|manhua\.kukudm\.com/.test(location.origin)) { host = 1; } else if (/a\.manmanju\.com|a\.ikukudm\.com/.test(location.origin)) { host = 2; } else if (/b\.manmanju\.com|b\.ikukudm\.com/.test(location.origin)) { host = 3; } let nextXPath = `//dd[a[contains(@href,'${chapterId}')]]/following-sibling::dd[1]/a[${host}]`; return fun.fetchDoc(siteData.comicListUrl()).then(doc => { let next = fun.ge(nextXPath, doc); return next ? next.href : null; }) }, prev: 1, preloadNext: async (nextDoc, obj) => { let arr = await fun.getKukudmSrc(nextLink, nextDoc, 0); fun.picPreload(arr, nextDoc.title, "next"); }, css: "body{background-image:unset}body>table:nth-child(1),body>table:nth-child(3){display:none!important}body>table:nth-child(2),body>table:nth-child(2)>tbody>tr>td{width:100%!important;}body{scrollbar-width:none;-ms-overflow-style:none;overflow-x:hidden;overflow-y:auto}", category: "comic" }, { name: "漫漫聚M/KuKu动漫M", host: ["m.manmanju.com", "m.ikuku.cc", "s1.m.ikkdm.com", "s2.m.ikkdm.com", "1pc570gfrd9z.ihhmh.com", "s2.wap.ikukudm.com", "s3.wap.ikukudm.com", "mh123.dypro.xyz"], enable: 1, reg: /(m\.manmanju\.com|m\.ikuku\.cc|\w+\.ihhmh\.com|s\d\.m\.ikkdm\.com|s\d.wap.ikukudm.com|mh123\.dypro\.xyz)\/comiclist\/\d+\/\d+\/1\.htm/i, include: ".classBox img,.imgBox", init: async () => { fun.remove("//center[iframe]"); let url = await siteData.next(); if (url) fun.addUrlHtml(url, ".bottom .subNav", 1); let nav = fun.ge("ul.subNav").cloneNode(true); let tE = fun.ge("div.bottom"); tE.parentNode.insertBefore(nav, tE); fun.remove("meta[name=viewport]"); $("head").append('<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=2.0,user-scalable=no"/>'); setTimeout(() => { let nextDivEle = fun.ge(".bottom div"); let bottomEle = fun.ge(".bottom"); nextDivEle ? bottomEle.innerHTML = fun.ge("div", bottomEle).outerHTML + fun.ge("p", bottomEle).outerHTML : bottomEle.innerHTML = fun.ge("p", bottomEle).outerHTML; }, 500); }, imgs: () => { fun.remove("//a[img] | //ul[center[li]]"); fun.remove(".bottom .subNav~div[style*=height],.bottom .pageLine,.bottom .subNav"); return fun.getKukudmSrc(); }, button: [4], insertImg: [".imgBox", 2], go: 1, autoDownload: [0], next: () => { let comicListUrl = fun.ge(".subNav a").href; let chapterId = siteUrl.split("/")[5]; let nextXPath = `//li[a[contains(@href,'${chapterId}')]]/preceding-sibling::li[1]/a`; return fun.fetchDoc(comicListUrl).then(doc => { let next = fun.ge(nextXPath, doc); return next ? next.href : null; }) }, prev: 1, customTitle: () => fun.title("在线", 1), preloadNext: async (nextDoc, obj) => { let arr = await fun.getKukudmSrc(nextLink, nextDoc, 0); fun.picPreload(arr, nextDoc.title.split("在线")[0], "next"); }, css: ".imgBox{margin-bottom:0px!important}.subNav{border-top:1px solid #dcdcde}body{scrollbar-width:none;overflow-x:hidden;overflow-y:auto}", category: "comic" }, { name: "仙漫网", host: ["www.gaonaojin.com"], enable: 0, reg: /www\.gaonaojin\.com\/\w+\/\d+\.html/i, imgs: () => picdata.map(e => imgDomain + e), button: [4], insertImg: [".comicpage", 2], autoDownload: [0], next: "//li[a[@class='active']]/preceding-sibling::li[1]/a", prev: "//li[a[@class='active']]/following-sibling::li[1]/a", customTitle: () => fun.geT("h1.title").replace(/\(\d+\/\d+\)/, "").trim(), category: "comic" }, { name: "仙漫网M m.gaonaojin.com", host: ["m.gaonaojin.com"], enable: 0, reg: /m\.gaonaojin\.com\/\w+\/\d+\.html/i, imgs: (doc = document) => { let code = [...doc.scripts].find(s => s.innerHTML.search(/eval/) > -1).innerHTML.match(/eval.+\)\)/)[0].slice(4); let imgData = fun.run(fun.run(code).match(/picdata[^;]+/)[0]); return imgData.map(e => "https://res.xiaoqinre.com/" + e); }, button: [4], insertImg: ["#cp_img", 2], autoDownload: [0], next: "a.btn.next", prev: "a.btn.prev", customTitle: doc => fun.title("免费", 1, doc), preloadNext: true, category: "comic" }, { name: "漫画牛 / 漫画台 / 爱我漫画 / 漫画吧", host: ["manhua666.cc", "www.manhua666.cc", "manhuatai.org", "www.manhuatai.org", "25mh.cc", "www.25mh.cc", "manhuab.com", "www.manhuab.com"], enable: 0, reg: /manhua666\.\w+\/\w+\/\d+\.html|manhuatai\.org\/manhua\/\d+\/\d+\.html|25mh.cc\/manhua\/\d+\/\d+\/\d+\.html|manhuab\.com\/manhua\/\d+\/\d+\.html/i, imgs: () => [...fun.doc(imgs.join("")).images], button: [4], insertImg: ["#content", 2], go: 1, autoDownload: [0], next: "a[rel=next][href$=html],#next_url", prev: "a[rel=prev][href$=html],#prev_url", customTitle: doc => { let s = fun.geT(".info-title,.con_top", 1, doc).split(/\s?>/); return (s[2] + s[3]).trim(); }, preloadNext: async (nextDoc, obj) => { let code = fun.geT("//script[contains(text(),'imgs')]", 1, nextDoc); fun.script(code, 0, 1); let arr = [...fun.doc(imgs.join("")).images].map(e => e.src) fun.picPreload(arr, obj.customTitle(nextDoc), "next"); }, category: "comic" }, { name: "漫画哥", host: ["www.manhuag.cc", "m.manhuag.cc"], enable: 0, reg: /^https?:\/\/(www|m)\.manhuag\.cc\/\d+\/\d+\/\d+\.html/i, imgs: (url = siteUrl, doc, msg = 1, request = 0) => { let max = fun.geT("//a[text()='下一页']", 2, doc) || 1; if (/www\.manhuag\.cc/.test(location.host)) { return fun.getImg(".img img", max, 9, [null, null], 20, url, msg, request); } else { return fun.getImg(".img img", max, 5, [null, null], 20, url, msg, request); } }, button: [4], insertImg: ["//div[div[@id='nr'][p[@class='img']]] | //div[@id][p[@class='img']][not(@style)]", 2], go: 1, autoDownload: [0], next: "//a[text()='下一章']", prev: "//a[text()='上一章']", customTitle: (doc = document) => { if (/www\.manhuag\.cc/.test(location.host)) { let s = doc.title.split("|"); let comic_name = s[1]; let comic_chapter = s[0]; return comic_name + " - " + comic_chapter; } else { return fun.geT(".nav_name>h1", 1, doc) + " - " + fun.geT("h3", 1, doc); } }, preloadNext: async (nextDoc, obj) => { fun.picPreload(await obj.imgs(nextLink, nextDoc, 0, 1), obj.customTitle(nextDoc), "next"); }, category: "comic" }, { name: "大树漫画", host: ["www.dashumanhua.com"], enable: 0, reg: /www\.dashumanhua\.com\/comic\/\w+\/.+\.html/i, imgs: (doc = document) => { let code = [...doc.scripts].find(s => s.innerHTML.search(/picTree/) > -1).innerHTML; let m = code.match(/eval.+\)\)/)[0].slice(4); return fun.run(fun.run(m).slice(12, -1)); }, button: [4], insertImg: ["#pic-list", 2], go: 1, autoDownload: [0], next: "//a[text()='下一话' and not(contains(@href,'--1'))]", prev: "//a[text()='上一话' and not(contains(@href,'--1'))]", customTitle: doc => fun.title(/\(/, 1, doc), preloadNext: true, category: "comic" }, { name: "GODA漫画", host: ["cocomanga.org", "godamanga.art"], enable: 0, reg: /^https?:\/\/(cocomanga\.org|godamanga\.art)\/manga\/[a-z0-9-_]+\/[a-z0-9-_]+(\/|\.html)$/i, delay: 300, imgs: "//img[@decoding and @layout] | //img[@decoding and contains(@class,'img_content_jpg')]", button: [4], insertImg: ["//div[div[div[div[div[img[@decoding and @layout]]]]]] | //div[div[div[div[div[img[@decoding and contains(@class,'img_content_jpg')]]]]]]", 2], autoDownload: [0], next: "//a[span[text()='下一话']] | //a[span[text()='NEXT']]", prev: "//a[span[text()='上一话']] | //a[span[text()='PREV']]", customTitle: doc => fun.geT("h1", 1, doc), preloadNext: (nextDoc, obj) => { fun.iframeDoc(nextLink, obj.imgs, 30000).then(nextIframeDoc => { let arr = fun.getImgSrcArr(obj.imgs, nextIframeDoc); fun.picPreload(arr, obj.customTitle(nextIframeDoc), "next"); }); }, category: "comic" }, { name: "GODA漫畫 / 包子漫畫", host: ["godamanga.com", "cn.godamanga.site", "gd.godamanga.art", "cn.godamanga.art", "cn.godamanga.com", "baozimh.org", "bz.godamanga.art", "cn.baozimh.org"], enable: 0, reg: /^https?:\/\/((www|gd|bz|cn)\.)(baozimh|godamanga)\.(art|com|org)\/manga\/[a-z0-9-_]+\/[a-z0-9-_]+/i, init: async () => { /* try { let script = "//script[contains(text(),'currentManga')]"; await fun.waitEle(script); let code = fun.geT(script); let id = code.match(/\\"id\\":(\d+)/)[1]; let api = `https://papi.mgsearcher.com/api/chapters/${id}?fields[0]=chapter_img&encodeValuesOnly=true`; siteJson = await fetch(api, { "headers": { "Authorization": "Bearer b69efef9280150ba3c29ebd02f1dd08b78d9d76a646fea85442c8f806f0037512d3bfab40a27528769b52373f9857edae1b8d74a3198c60f583f223bcccd8fde586cbc8420570a34570b62d2bef66c6aa82da8a3fd0c3dd2dedb18b8ea276f55d56151fe72317f2f38c9f888475f7433e24edebd7775c4aafa98ec9694789da9" } }).then(res => res.json()); debug("\n此頁JSON資料\n", siteJson); } catch (e) {} */ await fun.waitEle("//script[contains(text(),'currentManga')]"); fun.remove("//div[ins[@class='adsbygoogle']]"); }, imgs: async doc => { await fun.waitEle(".touch-manipulation"); /* try { return siteJson.data == null ? [] : siteJson.data.attributes.chapter_img.map(e => e.url); } catch (e) { return [...fun.gae(".touch-manipulation img")]; } */ return fun.getImgSrcArr(".touch-manipulation img", doc); }, button: [4], insertImg: [".touch-manipulation", 2], autoDownload: [0], next: () => { let next = fun.ge("//a[button[text()='下一話' or text()='下一话']]"); return next ? next.href : null; }, prev: 1, customTitle: doc => fun.geT("ol.inline-flex>li:nth-child(2) a", 1, doc) + " - " + fun.geT("ol.inline-flex>li:nth-child(3) a", 1, doc), preloadNext: (nextDoc, obj) => { fun.iframeDoc(nextLink, ".touch-manipulation img", 30000).then(async nextIframeDoc => { fun.picPreload(await obj.imgs(nextIframeDoc), obj.customTitle(nextIframeDoc), "next"); }); }, category: "comic" }, { name: "漫畫屋", host: ["mh5.tw"], enable: 0, reg: /mh5\.tw\/(series|seriesvip)-\w+-\d+-\d+/i, imgs: () => { let max; /seriesvip/.test(siteUrl) ? max = fun.geT("a.cur~a:last-child") - 2 : max = fun.geT("a.cur~a:last-child") - 1; return fun.getImgIframe(".ptview>img[alt]:not([style])", max, 13, [null, null], ".setnmh-pagedos", 1000, 0); }, insertImg: [".ptview", 1, 0], autoDownload: [0], next: "//a[text()='下一話']", prev: "//a[text()='上一話']", customTitle: () => { let ele = fun.ge("h2"); return ele ? fun.geT("h1") + " - " + fun.geT("h2") : fun.geT(".setnmh-bookname>a:nth-child(5)") + " - " + fun.geT(".setnmh-bookname>a:nth-child(7)"); }, css: ".ptview>img{width:100%!important;height:auto!important;max-width:1000px!important;border:none!important;box-shadow:none!important;padding:0!important;margin:0 auto!important}", category: "comic" }, { name: "山立漫畫/TVBS漫畫", host: ["www.setnmh.com", "www.tvbsmh.com"], enable: 0, reg: /^https?:\/\/(www\.setnmh\.com|www\.tvbsmh\.com)\/(series|seriesvip)-\w+-\d+-\d+-.+$/i, imgs: () => { let max; /seriesvip/.test(siteUrl) ? max = fun.geT("a.cur~a:last-child") - 2 : max = fun.geT("a.cur~a:last-child") - 1; return fun.getImgIframe(".ptview>img[alt]:not([style])", max, 13, [null, null], ".setnmh-pagedos,.pagedosw", 1000, 0); }, insertImg: [".ptview", 1, 0], autoDownload: [0], next: "//a[text()='下一話']", prev: "//a[text()='上一話']", customTitle: () => document.title.split(" - ")[0].replace(/正在觀看|(\d+P)/ig, "").replace(">", " - "), css: ".ptview>img{width:100%!important;height:auto!important;max-width:1000px!important;border:none!important;box-shadow:none!important;padding:0!important;margin:0 auto!important}", category: "comic" }, { name: "1359漫画网", host: ["www.golden-koi.net"], enable: 0, reg: /^https?:\/\/www\.golden-koi\.net\/chapter\/\d+\.html/i, init: () => { let next = fun.ge(siteData.next); if (next) fun.addUrlHtml(next.href, "#content", 1); }, imgs: () => __cr.data.chapter_list_all, button: [4], insertImg: [".comicpage", 2], autoDownload: [0], next: "a.mh_nextbook[href*=chapter]", prev: "a.mh_prevbook[href*=chapter]", customTitle: () => __cr.data.comic_name + " - " + __cr.data.chapter_name, preloadNext: (nextDoc, obj) => { let code = fun.geT("//script[contains(text(),'chapter_list_all')]", 1, nextDoc); let arr = fun.run(code.match(/chapter_list_all:([^\n]+)/)[1]); fun.picPreload(arr, nextDoc.title, "next"); }, css: ".footpage{display:none!important;}", category: "comic" }, { name: "土豪漫畫網", host: ["www.tuhao456.com", "tuhao456.com"], enable: 0, reg: /^https?:\/\/(www\.)?tuhao456\.com\/chapter\/\d+\.html/i, imgs: () => picArry, button: [4], insertImg: [".comic_wraCon", 2], autoDownload: [0], next: "a.btm_chapter_btn.fr[href*=chapter]", prev: "a.btm_chapter_btn.fl[href*=chapter]", customTitle: () => comic_name + " - " + info.chapter_name.replace(comic_name, "").trim(), preloadNext: async (nextDoc, obj) => { const callback = (doc, fun) => { const code = ` window.parent.postMessage({ iframePicArr: picArry, title: document.title }, "*"); `; fun.script(code, 0, 1, doc); }; fun.iframeDoc(nextLink, ".comic_wraCon img[src*=apiimgs]", 30000, callback); }, category: "comic" }, { name: "1359漫画网M/土豪漫畫網M", host: ["m.golden-koi.net", "m.tuhao456.com"], enable: 0, reg: /^https?:\/\/(m\.golden-koi\.net|m\.tuhao456\.com)\/chapter\/\d+\.html/i, init: () => { fun.remove("#readModeMenu,#pagePrev,#pageNext"); [...fun.gae("#prevBook,#nextBook")].forEach(e => { e.removeAttribute("style"); e.classList.remove("hide"); }); let tools = fun.ge("#tools").cloneNode(true); let x = fun.ge("#content"); x.parentNode.insertBefore(tools, x.nextSibling); }, imgs: () => __cr.data.chapter_list_all, button: [4], insertImg: [".comicpage", 2], autoDownload: [0], next: "a[title='下章'][href*=chapter]", prev: "a[title='上一话'][href*=chapter]", customTitle: () => __cr.data.comic_name + " - " + __cr.data.chapter_name, preloadNext: (nextDoc, obj) => { let code = fun.geT("//script[contains(text(),'chapter_list_all')]", 1, nextDoc); let arr = fun.run(code.match(/chapter_list_all:([^\n]+)/)[1]); fun.picPreload(arr, nextDoc.title, "next"); }, css: ".comiclist{padding-bottom:0px!important}", category: "comic" }, { name: "ACG456", host: ["www.acg456.com"], enable: 0, reg: /^http:\/\/www\.acg456\.com\/HTML\/\w+\/\d+\//i, init: () => { fun.ge("body>table").width = "1400"; fun.run("document.onkeydown=null;"); }, imgs: () => picAy, button: [4], insertImg: ["body>table", 2], autoDownload: [0], next: () => nextChap == "" ? null : location.origin + nextChap, prev: "//a[text()='上一回']", customTitle: doc => { let s = fun.geT(".Reduction_left", 1, doc).split(" > "); let comic_name = s[2]; let comic_chapter = s[3]; return comic_name + " - " + comic_chapter.replace(/(\d+P)/i, ""); }, preloadNext: async (nextDoc, obj) => { const callback = (doc, fun) => { const code = ` window.parent.postMessage({ iframePicArr: picAy, title: document.title }, "http://www.acg456.com/"); `; fun.script(code, 0, 1, doc); }; fun.iframeDoc(nextLink, "#curPic", 30000, callback); }, category: "comic" }, { name: "ACG456M", host: ["m.acg456.com"], enable: 0, reg: /^http:\/\/m\.acg456\.com\/b\/\w+\/\w+\/\w+\//i, imgs: () => picAy, button: [4], insertImg: ["#PicArea", 2], autoDownload: [0], next: "//a[contains(text(),'下一话')]", prev: "//a[contains(text(),'上一话')]", customTitle: () => fun.geT(".menu_top_list>li:last-child"), preloadNext: async (nextDoc, obj) => { const callback = (doc, fun) => { const code = ` window.parent.postMessage({ iframePicArr: picAy, title: document.title }, "http://m.acg456.com/"); `; fun.script(code, 0, 1, doc); }; fun.iframeDoc(nextLink, "#PicArea img", 3000, callback); }, category: "comic" }, { name: "七夕漫画", host: ["www.qiximh4.com"], enable: 0, reg: /www\.qiximh\d+\.com\/\d+\/\d+\.html/i, imgs: ".main_img img", button: [4, "24%", 4], insertImg: [".main_img", 2], autoDownload: [0], next: "//a[img[@alt='下一章'] and contains(@href,'html')]", prev: "//a[img[@alt='上一章'] and contains(@href,'html')]", customTitle: doc => fun.title("_", 3, doc), preloadNext: (nextDoc, obj) => { fun.iframeDoc(nextLink, obj.imgs, 30000).then(nextIframeDoc => { let arr = fun.getImgSrcArr(obj.imgs, nextIframeDoc); fun.picPreload(arr, obj.customTitle(nextIframeDoc), "next"); }); }, category: "comic" }, { name: "七夕漫画M", host: ["m.qiximh4.com"], enable: 0, reg: /m\.qiximh\d+\.com\/\d+\/\d+\.html/i, imgs: ".main_img img", button: [4, "24%", 3], insertImg: [".main_img", 2], autoDownload: [0], next: "//a[p[text()='下一篇'] and contains(@href,'html')]", prev: "//a[p[text()='上一篇'] and contains(@href,'html')]", customTitle: (doc = document) => { let s = doc.title.replace(" - 七夕漫画", "").split("_"); return s[1] + " - " + s[0]; }, preloadNext: (nextDoc, obj) => { fun.iframeDoc(nextLink, obj.imgs, 30000).then(nextIframeDoc => { let arr = fun.getImgSrcArr(obj.imgs, nextIframeDoc); fun.picPreload(arr, obj.customTitle(nextIframeDoc), "next"); }); }, css: ".ad_js{display:none!important}", category: "comic" }, { name: "漫画160", host: ["www.mh160.cc"], enable: 1, reg: /www\.mh160\.cc\/kanmanhua\/\w+\/\d+\.html/i, init: "document.onkeydown=null", imgs: () => base64_decode(qTcms_S_m_murl_e).split("$qingtiandy$").map(e => f_qTcms_Pic_curUrl_realpic(e)), button: [4], insertImg: ["//td[//img[@onclick]]", 2], go: 1, autoDownload: [0], next: "#k_Pic_nextArr", prev: "#k_Pic_backArr", customTitle: () => qTcms_S_m_name + " - " + qTcms_S_m_playm, preloadNext: (nextDoc, obj) => { let code = fun.geT("//script[contains(text(),'qTcms_S_m_murl_e')]", 1, nextDoc); fun.script(code, 0, 1); fun.picPreload(obj.imgs(), obj.customTitle(), "next"); }, category: "comic" }, { name: "漫画160M", host: ["m.mh160.cc"], enable: 1, reg: /m\.mh160\.cc\/kanmanhua\/\w+\/\d+\.html/i, imgs: () => base64_decode(qTcms_S_m_murl_e).split("$qingtiandy$").map(e => f_qTcms_Pic_curUrl_realpic(e)), button: [4], insertImg: [".UnderPage", 2], go: 1, autoDownload: [0], next: "#k_Pic_nextArr", prev: "#k_Pic_backArr", customTitle: () => qTcms_S_m_name + " - " + qTcms_S_m_playm, preloadNext: (nextDoc, obj) => { let code = fun.geT("//script[contains(text(),'qTcms_S_m_murl_e')]", 1, nextDoc); fun.script(code, 0, 1); fun.picPreload(obj.imgs(), obj.customTitle(), "next"); }, category: "comic" }, { name: "漫画库", host: ["www.mhko.net"], enable: 0, reg: /www\.mhko\.net\/comic\/\d+\/\d+\.html/i, init: () => { fun.run("document.onkeydown=null;"); let url = siteData.next(); if (url) fun.addUrlHtml(url, ".tbCenter", 1); }, imgs: () => { try { return base64_decode(qTcms_S_m_murl_e).split("$qingtiandy$"); } catch (e) { return window.atob(qTcms_S_m_murl_e).split("$qingtiandy$"); } }, button: [4], insertImg: ["//td[img[@id='qTcms_pic']]", 2], go: 1, autoDownload: [0], next: () => (!/^java/.test(qTcms_Pic_nextArr) && qTcms_Pic_nextArr !== "") ? location.origin + qTcms_Pic_nextArr : null, prev: 1, customTitle: () => qTcms_S_m_name + " - " + qTcms_S_m_playm, preloadNext: (nextDoc, obj) => { let code = fun.geT("//script[contains(text(),'qTcms_S_m_murl_e')]", 1, nextDoc); fun.script(code, 0, 1); fun.picPreload(obj.imgs(), obj.customTitle(), "next"); }, css: ".iFloat,#mypic_k0{display:none!important}", category: "comic" }, { name: "笨狗漫画", host: ["www.bengou.co", "m.bengou.co"], enable: 0, reg: /(www|m)\.bengou\.co\/\w+\/\w+\/\d+\.html/i, init: "document.onkeydown=null;", imgs: () => base64_decode(qTcms_S_m_murl_e).split("$qingtiandy$").map(e => f_qTcms_Pic_curUrl_realpic(e)), insertImg: ["//td[img[@id='qTcms_pic']]", 2], go: 1, autoDownload: [0], next: () => (!/^java/.test(qTcms_Pic_nextArr) && qTcms_Pic_nextArr !== "") ? location.origin + qTcms_Pic_nextArr : null, prev: 1, customTitle: () => qTcms_S_m_name + " - " + qTcms_S_m_playm, preloadNext: (nextDoc, obj) => { let code = fun.geT("//script[contains(text(),'qTcms_S_m_murl_e')]", 1, nextDoc); fun.script(code, 0, 1); fun.picPreload(obj.imgs(), obj.customTitle(), "next"); }, css: ".action-list li{width:50% !important}#mypic_k0,.action-list>ul>li:nth-child(n+2):nth-child(-n+3){display:none!important}", category: "comic" }, { name: "星辰漫画网", host: ["www.xcmh.com", "m.xcmh.com"], enable: 1, reg: /(www|m)\.xcmh\.com\/\w+\/\w+\/\d+\.html/i, init: "document.onkeydown=null;", imgs: () => base64_decode(qTcms_S_m_murl_e).split("$qingtiandy$").map(e => location.origin + f_qTcms_Pic_curUrl_realpic(e)), button: [4], insertImg: ["//td[img[@id='qTcms_pic']]", 2], go: 1, autoDownload: [0], next: () => (!/^java/.test(qTcms_Pic_nextArr) && qTcms_Pic_nextArr !== "") ? location.origin + qTcms_Pic_nextArr : null, prev: 1, customTitle: () => qTcms_S_m_name + " - " + qTcms_S_m_playm, preloadNext: (nextDoc, obj) => { let code = fun.geT("//script[contains(text(),'qTcms_S_m_murl_e')]", 1, nextDoc); fun.script(code, 0, 1); fun.picPreload(obj.imgs(), obj.customTitle(), "next"); }, css: "#mypic_k0{display:none!important}", category: "comic" }, { name: "木马漫画", host: ["www.omyschool.com"], enable: 0, reg: /www\.omyschool\.com\/article_detail\/\d+\/\d+\/.+\/.+\//i, imgs: "#imgs amp-img", button: [4], insertImg: ["#imgs", 2], go: 1, autoDownload: [0], next: ".nav_button.next", prev: ".nav_button.prev", customTitle: doc => fun.geT("//a/span[@property and not(i)]", 1, doc) + " - " + fun.geT("//li/span[@property and not(i)]", 1, doc), preloadNext: true, category: "comic" }, { name: "砂之船动漫家", host: ["www.szcdmj.com"], enable: 0, reg: /www\.szcdmj\.com\/szcchapter\/\d+/i, include: ".comiclist", imgs: async () => { await fun.getNP(".comicpage>div", "//a[@href and text()='下一页']", null, ".fanye"); return [...fun.gae("img.lazy")]; }, button: [4], insertImg: [".comiclist", 2], go: 1, autoDownload: [0], next: "//a[text()='下一话']", prev: "//a[text()='上一话']", customTitle: () => fun.geT("h1.title"), category: "comic" }, { name: "砂之船动漫家M", host: ["www.szcdmj.com"], enable: 0, reg: /www\.szcdmj\.com\/szcchapter\/\d+/i, include: "#cp_img", imgs: async () => { await fun.getNP("#cp_img>img[data-original]", "//a[@href and text()='下一页']", null, ".view-bottom-bar"); return [...fun.gae("#cp_img>img[data-original]")]; }, insertImg: ["#cp_img", 2], go: 1, autoDownload: [0], next: "//a[text()='下一话']", prev: "//a[text()='上一话']", customTitle: () => bookInfo.book_name + " - " + bookInfo.chapter_name, category: "comic" }, { name: "雪人漫画/艾米漫画/聚合漫画屋/酷看漫画", host: ["www.xuerenmanhua.com", "www.aimimh.com", "www.52hah.com", "www.kukanmanhua.com"], enable: 0, reg: /www\.xuerenmanhua\.com\/chapter\/\d+|www\.aimimh\.com\/chapter\/[\d-]+|www\.52hah\.com\/chapter\/\d+|www\.kukanmanhua\.com\/chapter\/\d+/i, include: ".comiclist", imgs: ".comiclist img", button: [4], insertImg: [".comicpage", 2], autoDownload: [0], next: "//a[text()='下一章']", prev: "//a[text()='上一章']", customTitle: doc => fun.geT("h1.title", 1, doc), preloadNext: (nextDoc, obj) => { fun.iframeDoc(nextLink, ".comiclist img:not([src*=loading])", 30000).then(nextIframeDoc => { let arr = fun.getImgSrcArr(obj.imgs, nextIframeDoc); fun.picPreload(arr, obj.customTitle(nextIframeDoc), "next"); }); }, category: "comic" }, { name: "雪人漫画M/艾米漫画M/聚合漫画屋M/酷看漫画M", host: ["www.xuerenmanhua.com", "www.aimimh.com", "www.52hah.com", "www.kukanmanhua.com"], enable: 0, reg: /www\.xuerenmanhua\.com\/chapter\/\d+|www\.aimimh\.com\/chapter\/[\d-]+|www\.52hah\.com\/chapter\/\d+|www\.kukanmanhua\.com\/chapter\/\d+/i, imgs: "#cp_img>img[data-original]", button: [4], insertImg: ["#cp_img", 2], autoDownload: [0], next: "//a[text()='下一章']", prev: "//a[text()='上一章']", customTitle: () => { if (/www\.xuerenmanhua\.com|www\.52hah\.com|www\.kukanmanhua\.com/.test(location.host)) { return bookInfo.book_name.replace(/_\d+$/, "") + " - " + bookInfo.chapter_name; } else { return fun.title("在线阅读-艾米漫画"); } }, preloadNext: (nextDoc, obj) => { fun.iframeDoc(nextLink, "#cp_img>img[data-original]:not([src*=loading])", 30000).then(nextIframeDoc => { let arr = fun.getImgSrcArr(obj.imgs, nextIframeDoc); fun.picPreload(arr, nextIframeDoc.title, "next"); }); }, category: "comic" }, { name: "拷貝漫畫", host: ["www.copymanga.site", "copymanga.site", "www.copymanga.tv", "copymanga.tv", "www.mangacopy.com", "mangacopy.com"], enable: 1, reg: /(www\.)?(copymanga\.site|copymanga\.tv|mangacopy\.com)\/comic\/\w+\/chapter\/.+/, delay: 300, init: async () => { fun.run("$(document).unbind();document[_0x1f93('0x1b')][_0x1f93('0x27')]=null;"); const toggleToolbar = () => { var e = e || window.event; if (e.wheelDelta < 0 || e.detail > 0) { $("h4.header").attr("style", "top: -30px;"); $("div.footer").attr("style", "bottom: -41px;"); } else { $("h4.header").removeAttr("style"); $("div.footer").removeAttr("style"); } }; document.addEventListener("wheel", toggleToolbar); document.addEventListener("DOMMouseScroll", toggleToolbar); const keyToggleToolbar = (e) => { let key = window.event ? e.keyCode : e.which; if (key == "34" || key == "32" || key == "40") { $("h4.header").attr("style", "top: -30px;"); $("div.footer").attr("style", "bottom: -41px;"); } else { $("h4.header").removeAttr("style"); $("div.footer").removeAttr("style"); } }; document.addEventListener("keydown", keyToggleToolbar); let host = location.host.replace("www.", ""); let api = siteUrl.replace(/.*?(?=\/comic\/)/, `https://api.${host}/api/v3`); let json = await fetch(api).then(res => res.json()); siteJson = json; debug("\n此頁JSON資料\n", json); }, imgs: () => siteJson.results.chapter.contents.map(e => e.url), button: [4], insertImg: [".comicContent-list", 2], go: 1, autoDownload: [0], next: "//a[text()='下一話'][starts-with(@href,'/comic/')]", prev: "//a[text()='上一話'][starts-with(@href,'/comic/')]", customTitle: () => siteJson.results.comic.name + " - " + siteJson.results.chapter.name, preloadNext: () => { let host = location.host.replace("www.", ""); let api = nextLink.replace(/.*?(?=\/comic\/)/, `https://api.${host}/api/v3`); fetch(api).then(res => res.json()).then(json => { let arr = json.results.chapter.contents.map(e => e.url); let title = json.results.comic.name + " - " + json.results.chapter.name; fun.picPreload(arr, title, "next"); }); }, topButton: true, css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}.header+div[style],.comicContainerAds{display:none!important}", category: "comic" }, { name: "拷貝漫畫M", host: ["www.copymanga.site", "copymanga.site", "www.copymanga.tv", "copymanga.tv", "www.mangacopy.com", "mangacopy.com"], enable: 1, reg: /(www\.)?(copymanga\.site|copymanga\.tv|mangacopy\.com)\/h5\/comicContent\/\w+\/.+/, xhr: (url = siteUrl) => { let s = url.split("/").slice(-2); let host = location.host.replace("www.", ""); let api = `https://api.${host}/api/v3/comic/${s[0]}/chapter/${s[1]}`; return new Promise(resolve => { _GM_xmlhttpRequest({ method: "GET", url: api, responseType: "json", headers: { "Referer": `https://${location.hostname}/comic/${s[0]}/chapter/${s[1]}`, "User-Agent": PcUa }, onload: data => { resolve(data.response); } }); }); }, init: async () => { if (typeof aboutBlank === "function") fun.run("aboutBlank=()=>{};"); fun.clearAllTimer(); siteJson = await siteData.xhr(); debug("\n此頁JSON資料\n", siteJson); const addHtml = (url, text) => { let str = `<div style="padding: 10px 0; text-align: center;"><a href="${url}"style="width: 100%;font-size: 26px;line-height: 50px;height: 50px;text-align: center;">${text}</a></div>`; fun.ge(".comicContentPopupImageList").insertAdjacentHTML("afterend", str); }; let s = siteUrl.split("/").slice(-2); let url = `https://${location.hostname}/h5/details/comic/${s[0]}`; addHtml(`https://${location.hostname}/h5/index`, "首頁"); addHtml(url, "目錄"); let nUrl = siteData.next(); if (nUrl) addHtml(nUrl, "點選進入下一話"); }, imgs: () => siteJson.results.chapter.contents.map(e => e.url), button: [4], insertImg: [".comicContentPopupImageList", 2], go: 1, next: () => { let next = siteJson.results.chapter.next; return next ? siteUrl.replace(/[\w-]+$/, "") + next : null; }, customTitle: () => siteJson.results.comic.name + " - " + siteJson.results.chapter.name, preloadNext: (nextDoc, obj) => { obj.xhr(nextLink).then(json => { let arr = json.results.chapter.contents.map(e => e.url); let title = json.results.comic.name + " - " + json.results.chapter.name; fun.picPreload(arr, title, "next"); }); }, css: ".comicFixed{display:none!important}", fancybox: { blacklist: 1 }, category: "comic" }, { name: "二次元動漫/看漫畫", host: ["www.2animx.com", "www.k886.net"], enable: 0, reg: /(www\.2animx\.com|www\.k886\.net)\/index-look-name-.+/, init: "$(document).unbind('click');", imgs: (url = siteUrl, doc, msg = 1, request = 0) => { let max = fun.ge("#total", doc).value; let links = fun.arr(max).map((_, i) => fun.getModeUrl(url, 20, (i + 1))); return fun.getImgA("#ComicPic", links, 100, [null, null], msg, request); }, button: [4], insertImg: ["//div[img[@id='ComicPic']]", 2], autoDownload: [0], next: ".n.zhangjie", prev: ".p.zhangjie", customTitle: doc => { let s = fun.geT(".b", 1, doc).split(" - "); let comic_name = s[2]; let comic_chapter = s[3]; return comic_name + " - " + comic_chapter.replace(/(\d+P)/i, ""); }, preloadNext: async (nextDoc, obj) => { fun.picPreload(await obj.imgs(nextLink, nextDoc, 0, 1), obj.customTitle(nextDoc), "next"); }, css: ".c>*:not(.n.zhangjie):not(.p.zhangjie){display:none!important;}#ComicPic{display:block!important;margin: 0 auto !important;}", category: "comic" }, { name: "奴奴漫畫", host: ["www.2nunu.com"], enable: 0, reg: /^https?:\/\/www\.2nunu\.com\/look-.+\.html/, init: "$(document).unbind();document.onkeydown=null;", imgs: (url = siteUrl, doc, msg = 1, request = 0) => { let max = fun.ge("#total", doc).value; let links = fun.arr(max).map((_, i) => url.replace(/\d+\.html$/, "") + (i + 1) + ".html"); return fun.getImgA("#cpimg", links, 100, [null, null], msg, request); }, button: [4], insertImg: ["#showimage", 2], autoDownload: [0], next: "//a[text()='下一章']", prev: "//a[text()='上一章']", customTitle: (doc = document) => doc.title.replace(/(\d+P).+/i, "").replace("第", " - 第"), preloadNext: async (nextDoc, obj) => { fun.picPreload(await obj.imgs(nextLink, nextDoc, 0, 1), obj.customTitle(nextDoc), "next"); }, category: "comic" }, { name: "酷漫屋", host: ["www.kumwu1.com", "m.kumwu1.com"], enable: 0, reg: /(www|m)\.kumwu?\d\.com\/\d+\/\d+\.html/, imgs: ".main_img img", button: [4], insertImg: [".main_img", 2], go: 1, autoDownload: [0], next: "//a[img[@alt='下一章']] | //a[i[@class='i-rd-next'] and contains(@href,'html')]", prev: "//a[img[@alt='上一章']] | //a[i[@class='i-rd-prev'] and contains(@href,'html')]", customTitle: () => { try { return fun.geT(".chaptitle").replace(">", "-"); } catch (e) { let s = document.title.replace(" - 酷漫屋", "").split("_"); return s[1] + " - " + s[0]; } }, preloadNext: (nextDoc, obj) => { fun.iframeDoc(nextLink, obj.imgs, 30000).then(nextIframeDoc => { let arr = fun.getImgSrcArr(obj.imgs, nextIframeDoc); fun.picPreload(arr, nextIframeDoc.title, "next"); }); }, category: "comic" }, { name: "速漫库", host: ["qumanku.com", "www.sumanku.com"], enable: 0, reg: /^https?:\/\/(www.)?\w+manku\.com\/\w+\/\w+\.html/i, imgs: ".main_img img", button: [4], insertImg: [".main_img", 2], go: 1, autoDownload: [0], next: "//a[span[text()='下一章']]", prev: "//a[span[text()='上一章']]", customTitle: doc => fun.attr("meta[itemprop=mhname]", "content", doc) + " - " + fun.geT(".chaptitle", 1, doc), preloadNext: async (nextDoc, obj) => { let nextIframeDoc = await fun.iframeDoc(nextLink, ".main_img img"); let arr = fun.getImgSrcArr(obj.imgs, nextIframeDoc); fun.picPreload(arr, obj.customTitle(nextIframeDoc), "next"); }, category: "comic" }, { name: "漫画DB", host: ["www.manhuadb.com"], enable: 0, reg: /www\.manhuadb\.com\/manhua\/\d+\/\w+\.html$/, imgs: () => img_data_arr.map(e => is_webp && e.img_webp ? img_host + img_pre + e.img_webp : img_host + img_pre + e.img), button: [4], insertImg: ["#all", 2], autoDownload: [0], next: async () => { return fetch("https://www.manhuadb.com/book/goNumPage", { "headers": { "content-type": "application/x-www-form-urlencoded; charset=UTF-8" }, "body": `ccid=${p_ccid}&id=${p_id}&num=${parseInt(vg_r_data.data("num"), 10) + 1}&d=${p_d}&type=next`, "method": "POST" }).then(res => res.json()).then(json => json.state == 0 ? null : location.origin + json.url); }, prev: "//a[text()='上集']", customTitle: () => fun.title("-漫画DB"), preloadNext: async (nextDoc, obj) => { const callback = (doc, fun) => { const code = ` window.parent.postMessage({ iframePicArr: img_data_arr.map(e => is_webp && e.img_webp ? img_host + img_pre + e.img_webp : img_host + img_pre + e.img), title: document.title.replace("-漫画DB", "") }, "https://www.manhuadb.com"); `; fun.script(code, 0, 1, doc); }; fun.iframeDoc(nextLink, ".show-pic", 30000, callback); }, category: "comic" }, { name: "快岸漫画", host: ["kanbook.net"], enable: 0, reg: /kanbook\.net\/comic\/\d+\/\d+/, delay: 1000, init: "$(document).unbind('keydown');$(document).unbind('keyup');", imgs: () => is_refresh == 0 ? x_tokens.map(e => Gm.getImgUrl(comic_id + "/" + version_id + "/" + part_id + "/" + my_sha2(e))) : data.url.map(e => Gm.getImgUrl(e)), button: [4], insertImg: ["#all", 2], go: 1, autoDownload: [0], next: "//a[text()='下一章' and not(starts-with(@href,'javascript'))]", prev: "//a[text()='上一章' and not(starts-with(@href,'javascript'))]", customTitle: () => fun.geT("h2.h2>a") + " - " + fun.geT("span.h4:nth-child(5)"), //threading: 4, css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}", category: "comic" }, { name: "樱花漫画", host: ["www.yinghuamh.net"], enable: 1, reg: /^https?:\/\/www\.yinghuamh\.net\/comic\/\w+\/\d+\/\d+/i, delay: 1000, init: () => { fun.run("$(document).unbind();"); const toggleToolbar = () => { var e = e || window.event; if (e.wheelDelta < 0 || e.detail > 0) { fun.ge(".view-title").style.top = "-60px"; } else { fun.ge(".view-title").style.top = "0px"; } }; document.addEventListener("wheel", toggleToolbar); document.addEventListener("DOMMouseScroll", toggleToolbar); const keyToggleToolbar = (e) => { let key = window.event ? e.keyCode : e.which; if (key == "34" || key == "32" || key == "40") { fun.ge(".view-title").style.top = "-60px"; } else { fun.ge(".view-title").style.top = "0px"; } }; document.addEventListener("keydown", keyToggleToolbar); if (("ontouchstart" in window) || (navigator.maxTouchPoints > 0) || (navigator.msMaxTouchPoints > 0)) { let startY, moveY, Y; $("body").on("touchstart", (e) => { startY = e.originalEvent.changedTouches[0].pageY; }); $("body").on("touchmove", (e) => { moveY = e.originalEvent.changedTouches[0].pageY; Y = moveY - startY; if (Y < 0) { fun.ge(".view-title").style.top = "-60px"; } else if (Y > 0) { fun.ge(".view-title").style.top = "0px"; } }); } }, imgs: () => x_tokens.map(e => Gm.getImgUrl(Gm.fitImgUrl(e))), button: [4], insertImg: ["#all", 2], autoDownload: [0], next: "a.next_part:not([href^=java])", prev: ".paginationContent>a:first-child:not([href^=java])", customTitle: () => comic_name + " - " + part_name, preloadNext: async (nextDoc, obj) => { const callback = (doc, fun) => { const code = ` let text = document.createElement("p"); text.id = "FullPictureLoadReturn"; text.innerText = x_tokens.map(e => Gm.getImgUrl(Gm.fitImgUrl(e))).join("|"); document.body.appendChild(text); `; fun.script(code, 0, 1, doc); }; let nextIframeDoc = await fun.iframeDoc(nextLink, ".img-fluid:not([src^=data])", 30000, callback); let arr = fun.geT("#FullPictureLoadReturn", 1, nextIframeDoc).split("|"); fun.picPreload(arr, nextIframeDoc.title, "next"); }, threading: 4, css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}", category: "comic" }, { name: "快看漫画", host: ["www.kuaikanmanhua.com"], enable: 0, reg: /www\.kuaikanmanhua\.com\/web\/comic\/\d+\//, imgs: ".imgList img[data-src]", insertImg: [".imgList", 2], autoDownload: [0], next: "//a[text()='下一话']", prev: "//a[text()='上一话']", customTitle: () => fun.geT("h3.title"), category: "comic" }, { name: "腾讯漫画", host: ["ac.qq.com"], enable: 0, reg: /ac\.qq\.com\/ComicView\/index\/id\/\d+\/cid\/\d+/, imgs: () => { let nonce = [...document.scripts].find(s => s.innerHTML.search(/^\s+window\[/) > -1).innerHTML.match(/\s*window.*?=(.*?)?;/)[1]; nonce = fun.run(nonce); const data = DATA.split(""); nonce = nonce.match(/\d+[a-z]+/gi); let n = nonce.length; let locate = null; let str = ""; while (n--) { locate = parseInt(nonce[n]) & 255; str = nonce[n].replace(/\d+/g, ""); data.splice(locate, str.length); } const base64 = data.join(""); const json = JSON.parse(window.atob(base64)); return json.picture.map(e => e.url); }, autoDownload: [0], next: "#nextChapter", prev: "#prevChapter", customTitle: () => fun.geT("#chapter") + " - " + fun.geT(".title-comicHeading"), category: "comic" }, { name: "哔哩哔哩漫画", host: ["manga.bilibili.com"], enable: 1, reg: /manga\.bilibili\.com\/mc\d+\/\d+\?from=manga_detail/, init: () => { setTimeout(() => { fun.ge(".load-next-btn").addEventListener("click", () => { setTimeout(() => { location.reload(); }, 500) }) }, 1000) }, imgs: async () => { let ep_id = siteUrl.split("/").pop().match(/\d+/)[0]; let headers = { "content-type": "application/json;charset=UTF-8" }; let imgsRes = await fetch("/twirp/comic.v1.Comic/GetImageIndex?device=pc&platform=web", { "headers": headers, "body": JSON.stringify({ ep_id: `${ep_id}` }), "method": "POST" }).then(res => res.json()).then(json => json.data.images.map(e => e.path)); return fetch("/twirp/comic.v1.Comic/ImageToken?device=pc&platform=web", { "headers": headers, "body": JSON.stringify({ urls: JSON.stringify(imgsRes) }), "method": "POST" }).then(res => res.json()).then(json => json.data.map(e => `${e.url}?token=${e.token}`)); }, insertImg: [".image-list", 2], next: ".load-next-btn", prev: 1, customTitle: async () => { await fun.delay(1500, 0); return fun.geT(".manga-title") + " - " + fun.geT(".episode"); }, css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}", category: "comic" }, { name: "看漫画", host: ["www.kanman.com"], enable: 0, reg: /www\.kanman\.com\/\d+\/[\w-]+\.html/, imgs: () => { let s = location.pathname.split("/"); let comic_id = s[1]; let chapter_newid = s[2].replace(".html", ""); let api = `/api/getchapterinfov2?product_id=1&productname=kmh&platformname=pc&comic_id=${comic_id}&chapter_newid=${chapter_newid}&isWebp=1&quality=middle`; return fetch(api).then(res => res.json()).then(json => json.data.current_chapter.chapter_img_list); }, customTitle: async () => { await fun.delay(1500, 0); return fun.geT('#crumbComicLink') + " - " + fun.geT('.chapter-title').trim(); }, category: "comic" }, { name: "漫蛙", //方向鍵上一章下一章、清除擋廣告警告、向下滾動隱藏工具列、反反偵錯,,下載需先手動觸發全部載入圖片,函式使用到canvas需要繪製過程會有點卡。 host: ["manwa.me"], enable: 1, reg: /manwa\.me\/chapter\/\d+(\?img_host=\d)?$/, init: async () => { Function.prototype.constructor = () => {}; //await fun.scrollEles(".img-content img", 200); fun.css(".ad-area{opacity:0!important;}#cp_img>.two-ad-area:nth-child(1)>.ad-area,#cp_img>.two-ad-area:nth-child(2){display:none!important}"); fun.remove(".ad-area,body>div[id]:not([id^='pv-']):not([class^='pv-']):not(.pagetual_tipsWords):not(#comicRead):not(#fab):not(.FullPictureLoadMsg):not(.FullPictureLoadFixedBtn):not(#FullPictureLoadOptions):not(a):not(*[class^=fancybox])", 5000); const toggleToolbar = e => { if (e.wheelDelta < 0 || e.detail > 0) { $(".view-fix-top-bar").attr("style", "top: -60px;"); $(".view-fix-bottom-bar").attr("style", "bottom: -60px;"); $(".detail-comment-fix-bottom").hide("fast"); } else { $(".view-fix-top-bar").attr("style", "top: 0px;"); $(".view-fix-bottom-bar").attr("style", "bottom: 0px;"); $(".detail-comment-fix-bottom").show("fast"); } }; document.addEventListener("wheel", toggleToolbar); document.addEventListener("DOMMouseScroll", toggleToolbar); const keyToggleToolbar = e => { let key = window.event ? e.keyCode : e.which; if (key == "34" || key == "32" || key == "40") { $(".view-fix-top-bar").attr("style", "top: -60px;"); $(".view-fix-bottom-bar").attr("style", "bottom: -60px;"); $(".detail-comment-fix-bottom").hide("fast"); } else { $(".view-fix-top-bar").attr("style", "top: 0px;"); $(".view-fix-bottom-bar").attr("style", "bottom: 0px;"); $(".detail-comment-fix-bottom").show("fast"); } }; document.addEventListener("keydown", keyToggleToolbar); if (("ontouchstart" in window) || (navigator.maxTouchPoints > 0) || (navigator.msMaxTouchPoints > 0)) { let startY, moveY, Y; $("body").on("touchstart", (e) => { startY = e.originalEvent.changedTouches[0].pageY; }); $("body").on("touchmove", (e) => { moveY = e.originalEvent.changedTouches[0].pageY; Y = moveY - startY; if (Y < 0) { $(".view-fix-top-bar").attr("style", "top: -60px;"); $(".view-fix-bottom-bar").attr("style", "bottom: -60px;"); $(".detail-comment-fix-bottom").hide("fast"); } else if (Y > 0) { $(".view-fix-top-bar").attr("style", "top: 0px;"); $(".view-fix-bottom-bar").attr("style", "bottom: 0px;"); $(".detail-comment-fix-bottom").show("fast"); } }); } await fun.waitEle(".content-img.lazy_img[src^=blob]"); }, imgs: () => fun.imgBlobArr(".content-img[src^=blob]"), scrollEle: () => { fun.aotoScrollEles(".img-content .content-img", (img) => /^blob/.test(img.src)); }, next: ".view-fix-bottom-bar-item-menu-next", prev: ".view-fix-bottom-bar-item-menu-prev", customTitle: () => fun.title("在线阅读", 1), css: "body{padding-bottom:0px!important}", category: "comic" }, { name: "漫蛙選目錄展開全部章節", host: ["manwa.me"], enable: 1, icon: 0, key: 0, reg: /manwa\.me\/book\/\d+$/, init: "Function.prototype.constructor=()=>{};titleSelect(this,'#chapter_indexes');charpterMore(this);", category: "comic" }, { name: "漫蛙自動載入更多", host: ["manwa.me"], enable: 1, icon: 0, key: 0, reg: /manwa\.me\/update$/, init: "Function.prototype.constructor=()=>{};", observerClick: "#loadMore", category: "comic" }, { name: "開車漫画", host: ["18p.fun"], enable: 1, reg: /^https?:\/\/(www\.)?(18p|gohaveababy|imynest|healthway|beforeout)\.[a-z]{2,5}\/(ForInject\/|Article\/|content\/)/, imgs: async () => { await fun.waitEle("//script[contains(text(),'_curChap')]"); if (location.hostname != "18p.fun") { location.replace("https://18p.fun/ForInject/Chapter/?id=" + $_curChap.id); await fun.delay(3000, 0); } await fun.getNP("img[data-src].lazy:not(.demo-lazy)", "//a[@data-url and contains(text(),'下一頁')] | //a[@data-url and contains(text(),'下一章')]", null, "div[class^=picnext]"); return [...fun.gae("img[data-src].lazy:not(.demo-lazy)")]; }, insertImg: ["div[class^=pictures]", 3], fetch: 1, css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}", category: "comic" }, { name: "開車漫画", host: ["18p.fun"], enable: 0, icon: 0, key: 0, reg: /^https?:\/\/18p\.fun\//, include: ".loadmore>button", init: () => { const setImgSrc = () => [...gae("img.lazy[src$=svg]")].forEach(img => img.src = img.dataset.src); setImgSrc(); new MutationObserver(() => setImgSrc()).observe(document.body, MutationObserverConfig); }, observerClick: ".loadmore>button", openInNewTab: "#itemlist li>a:not([target=_blank])", css: ".page{display:none!important}.loadmore{display:block!important}", category: "comic" }, { name: "风之动漫", host: ["www.fffdm.com"], enable: 1, reg: /(www\.fffdm\.com|manhua\.fffdm\.com)\/(manhua\/)?\d+\/[^/]+\/$/i, xhr: (lp = new URL(siteUrl).pathname) => { let s = lp.split("/").slice(-3); let mhId = s[0]; let mhcId = s[1]; let api = `https://${location.hostname}/api/manhua/${mhId}/${mhcId}`; return fetch(api).then(res => res.json()); }, init: async () => { let json = await siteData.xhr(); debug("\n此頁JSON資料\n", json); siteJson = json; let url = await siteData.next(); if (url) { let text = `<div style="padding: 36px 0; text-align: center;"><a href="${url}"style="font-size: 26px;line-height: 50px;height: 50px;text-align: center;">點選進入下一話</a></div>`; fun.ge("#mh").insertAdjacentHTML("afterend", text); fun.ge("#mh+div").addEventListener("click", () => { setTimeout(() => { location.reload(); }, 200) }); } }, imgs: async (json = siteJson, msg = null) => { let hostArr = ["https://p5.fffdm.live/", "https://p6.fffdm.live/", "https://p1.fffdm.live/"]; let firstPic = json.cont[0]; let testArr = hostArr.map(e => e + firstPic); let ok = false; let host; for (let i = 0; i < testArr.length; i++) { let obj = await fun.checkImgStatus(testArr[i], msg); console.log(`確認圖片[${i}]`, obj); if (obj.ok) { ok = true; host = hostArr[i]; break; } } return ok ? siteJson.cont.map(e => host + e) : []; }, insertImg: ["#mh", 2], go: 1, next: () => { let comicListUrl = siteUrl.replace(/[\w-]+\/$/i, ""); let chapter = siteUrl.match(/[\w-]+\/$/)[0]; let nextXPath = `//div[@id='content']/li[a[@href='${chapter}']]/preceding-sibling::li[1]/a`; return fun.fetchDoc(comicListUrl).then(doc => { let next = fun.ge(nextXPath, doc); return next ? comicListUrl + next.getAttribute("href") : null; }); }, prev: 1, customTitle: doc => fun.title("第1页", 1, doc), preloadNext: async (nextDoc, obj) => { let json = await obj.xhr(new URL(nextLink).pathname); fun.picPreload(await obj.imgs(json, 0), obj.customTitle(nextDoc), "next"); }, category: "comic" }, { name: "漫画皮", host: ["www.iimanhuapi.com", "m.iimanhuapi.com"], enable: 1, reg: /^https?:\/\/(www|m)\.iimanhuapi\.com\/chapter\/\d+\.html$/i, init: "document.onkeydown=null;$('body').unbind();", imgs: doc => [...fun.gae("option[jhc-data]", doc)].map(e => e.getAttribute("jhc-data").replace("-mht.middle.webp", "")).map(e => e.replace(new URL(e).protocol, location.protocol)), button: [4], insertImg: [".mh_list,#content", 2], autoDownload: [0], next: "//a[text()='下一章'][contains(@href,'chapter')]", prev: "//a[text()='上一章'][contains(@href,'chapter')]", customTitle: doc => fun.attr("meta[name='keywords']", "content", doc).replace(",", " - "), preloadNext: true, css: "#prePage,#nextPage,select,.jump-list,.apjg,a[href*=taobao]{display:none!important;}", category: "comic" }, { name: "大古漫画", host: ["www.dgmanhua.com"], enable: 1, reg: /www\.(dgmanhua|dagumanhua)\.\w+\/manhua\/\d+\/\d+\.html$/i, init: async () => { document.onkeydown = null; document.onkeyup = null; let url = await siteData.next(); if (url) fun.addUrlHtml(url, ".mh_list", 1); }, //imgs: () => fun.getImg(".mh_list img", fun.geT("//script[contains(text(),'totalpage')]").match(/totalpage\s?=\s?(\d+)/)[1], 9), imgs: doc => { let firstSrc = fun.ge(".mh_list img", doc).src; let max = fun.geT("//script[contains(text(),'totalpage')]", 1, doc).match(/totalpage\s?=\s?(\d+)/)[1]; return fun.arr(max).map((_, i) => decodeURI(firstSrc.replace(/(.+\/)(\d+)(.+)/, `$1${(i + 1)}$3`).replace("-mht.middle.webp", ""))); }, button: [4], insertImg: [".mh_list", 2], go: 1, autoDownload: [0], next: () => { let comicListUrl = siteUrl.replace(/\d+\.html$/, ""); let chapter = location.pathname; let nextXPath = `//li[a[@href='${chapter}']]/preceding-sibling::li[1]/a`; return fun.fetchDoc(comicListUrl).then(doc => { let next = fun.ge(nextXPath, doc); return next ? location.origin + next.getAttribute("href") : null; }) }, prev: 1, customTitle: doc => fun.geT(".mh_cont>h1", 1, doc), preloadNext: true, category: "comic" }, { name: "大古漫画M", host: ["m.dgmanhua.com"], enable: 1, reg: /m\.(dgmanhua|dagumanhua)\.\w+\/manhua\/\d+\/\d+\.html$/i, init: async () => { let content = fun.ge("#content,.content"); if (content) content.innerHTML = fun.ge("img", content).outerHTML; let url = await siteData.next(); if (url) fun.addUrlHtml(url, "#content,.content", 1); }, imgs: async (url = siteUrl, doc) => { url = url.replace("m.dgmanhua.com", "www.dgmanhua.com"); let max = await fun.xhrDoc(url).then(doc => { return fun.ge("//script[contains(text(),'totalpage')]", doc).innerText.match(/totalpage\s?=\s?(\d+)/)[1]; }); let firstSrc = fun.ge("#content img", doc).src; return fun.arr(max).map((_, i) => decodeURI(firstSrc.replace(/(.+\/)(\d+)(.+)/, `$1${(i + 1)}$3`).replace("-mht.middle.webp", ""))); }, button: [4], insertImg: ["#content,.content", 2], autoDownload: [0], next: () => { let comicListUrl = siteUrl.replace(/\d+\.html$/, ""); let chapter = location.pathname; let nextXPath = `//li[a[@href='${chapter}']]/preceding-sibling::li[1]/a`; return fun.fetchDoc(comicListUrl).then(doc => { let next = fun.ge(nextXPath, doc); return next ? location.origin + next.getAttribute("href") : null; }) }, //next: "//a[@href and text()='下一章']", prev: "//a[@href and text()='上一章']", customTitle: doc => fun.geT("#bookname", 1, doc) + " - " + fun.geT(".headline", 1, doc), preloadNext: async (nextDoc, obj) => { fun.picPreload(await obj.imgs(nextLink, nextDoc), obj.customTitle(nextDoc), "next"); }, css: "#content~a,.content~a,.apjg,.pager a:nth-child(n+2):nth-child(-n+3){display:none!important}.pager a{width:44%!important}#content,.content{width:100%}", category: "comic" }, { name: "大古漫画M loadMore", host: ["m.dgmanhua.com"], enable: 1, icon: 0, key: 0, reg: /m\.(dgmanhua|dagumanhua)\.\w+\/manhua\//i, include: "//div[text()='点击加载更多']", observerClick: "//div[text()='点击加载更多']", category: "comic" }, { name: "哈哈漫画", host: ["www.hahacomic.com"], enable: 1, reg: /^https?:\/\/www\.hahacomic\.com\/manhua\/\d+\/\d+\.html/, imgs: "img[data-original]", button: [4], insertImg: [".chapter-images", 2], go: 1, autoDownload: [0], next: "//a[label[text()='下一章'] and not(starts-with(@href,'java'))]", prev: "//a[label[text()='上一章'] and not(starts-with(@href,'java'))]", preloadNext: async (nextDoc, obj) => { let arr = fun.getImgSrcArr(obj.imgs, nextDoc); fun.picPreload(arr, nextDoc.title, "next"); }, category: "comic" }, { name: "哈哈漫画 - 分類自動翻頁", host: ["www.hahacomic.com"], enable: 1, reg: /^https?:\/\/www\.hahacomic\.com\/manhua\/list\.html/, autoPager: { ele: ".mdui-col-lg-2", observer: ".mdui-col-lg-2", next: doc => fun.ge("span.current+a", doc) ? siteUrl.replace(/\?page=\d+/, "") + "?page=" + fun.ge("span.current+a", doc).getAttribute("href").match(/\d+/)[0] : null, re: ".pages", history: 1 }, openInNewTab: ".mdui-col-lg-2>a", category: "autoPager" }, { name: "爱看漫画", host: ["www.qt1588.com", "m.qt1588.com"], enable: 0, reg: /^https?:\/\/(www|m)\.qt1588\.com\/comic\/[0-9_]+\.html/, imgs: ".chapter-content img,.hide-scrollbars img", button: [4], insertImg: [".chapter-content,.hide-scrollbars", 2], go: 1, autoDownload: [0], next: "//span[starts-with(@class,'next-chapter')]/a[contains(@href,'html')] | //a[p[text()='下一话'] and contains(@href,'html')]", prev: "//span[starts-with(@class,'prev-chapter')]/a[contains(@href,'html')] | //a[p[text()='上一话'] and contains(@href,'html')]", customTitle: doc => fun.title("-在线", 1, doc), preloadNext: true, category: "comic" }, { name: "野蛮漫画/次元漫画/漫神", host: ["yemancomic.com", "2cycomic.com", "m.mhkami.com"], enable: 0, reg: /^https?:\/\/(yemancomic\.com|2cycomic.com)\/chapter\/\d+\/\d+\.html|m\.mhkami\.com\/chapter\/\d+\/\d+\.html/, include: "#img-box", imgs: async () => { if (fun.ge("//a[div[text()='下一页']]")) { await fun.getNP("#img-box>div", "//a[div[text()='下一页']]", null, ".chapter-page-nav"); return [...fun.gae("#img-box img")]; } else { return [...fun.gae("#img-box img")]; } }, button: [4], insertImg: ["#img-box", 2], autoDownload: [0], next: "//a[div[contains(text(),'下一章')]]", prev: "//a[div[contains(text(),'上一章')]]", customTitle: () => read.articlename + " - " + read.chaptername, fancybox: { blacklist: 1 }, category: "comic" }, { name: "野蛮漫画M/次元漫画M/波洞M/漫神M", host: ["yemancomic.com", "2cycomic.com", "ymcdnyfqdapp.ikmmh.com", "m.mhkami.com"], enable: 0, reg: /^https?:\/\/(yemancomic\.com|2cycomic.com|ymcdnyfqdapp\.ikmmh\.com)\/chapter\/\d+\/\d+\.html|m\.mhkami\.com\/chapter\/\d+\/\d+\.html/, include: ".center-title", init: () => fun.remove("//body/div[a[img]]"), imgs: async () => { if (fun.ge("//a[text()='下一页']")) { await fun.getNP("#imgsec>figure", "//a[text()='下一页']", null, ".action,.tooltip-bar__row"); return [...fun.gae("#reader-scroll img")]; } else { return [...fun.gae("#reader-scroll img")]; } }, button: [4], insertImg: ["#reader-scroll", 2], autoDownload: [0], next: "a#next", prev: "a#prev", customTitle: () => read.articlename + " - " + fun.geT(".center-title"), fancybox: { blacklist: 1 }, css: "body>div[style^=width],.pull-right,.down-app,div.z-index-99>.down-app+div{display:none!important;}.episode-detail{padding-top:0px!important;}", category: "comic" }, { name: "风车漫画", host: ["www.qyy158.com", "m.qyy158.com"], enable: 1, reg: /^https?:\/\/(www|m)\.qyy158\.com\/info\/\d+\/\d+\.html/, imgs: ".chapter-content img,.hide-scrollbars img", button: [4], insertImg: [".chapter-content,.hide-scrollbars", 2], autoDownload: [0], next: "//a[span[text()='下一话']] | //a[p[text()='下一话']]", prev: "//a[span[text()='上一话']] | //a[p[text()='上一话']]", customTitle: () => { if (location.hostname == "www.qyy158.com") { let s = fun.geT(".header-center").split(" > "); return s[1] + " - " + s[2]; } else { let data = JSON.parse(localStorage[localStorage.read_book]); return data.articlename + " - " + data.chaptername_read; } }, preloadNext: (nextDoc, obj) => { let arr = fun.getImgSrcArr(obj.imgs, nextDoc); fun.picPreload(arr, nextDoc.title, "next"); }, category: "comic" }, { name: "轻之国度", host: ["www.lightnovel.us"], enable: 1, reg: /^https?:\/\/www\.lightnovel\.us\/\w+\/detail\/\d+/, imgs: ".article-content img", button: [4], insertImg: [".article-content", 3], customTitle: () => fun.geT(".article-title"), category: "comic" }, { name: "idoitmyself.xyz", host: ["idoitmyself.xyz"], enable: 1, reg: /^https?:\/\/idoitmyself\.xyz\/embed\//, imgs: () => HTMLImageElementSrcs, button: [4], insertImg: ["#viewer", 3], category: "comic" }, { name: "微信公众号", host: ["mp.weixin.qq.com"], enable: 1, reg: /^https?:\/\/mp\.weixin\.qq\.com\/[^&]+&mid=\d+/, imgs: "img.js_insertlocalimg", category: "comic" }, { name: "虎扑社区", host: ["bbs.hupu.com"], enable: 1, reg: /^https?:\/\/bbs\.hupu\.com\/\d+\.html/, init: () => { siteJson = JSON.parse(fun.attr("#bbs-admin-main-post-container", "data-admininfo")); }, imgs: () => { let data = JSON.parse(siteJson.format); if (data.imgList) { return data.imgList.map(e => e.remoteUrl); } else if (data.jsonV3) { return data.jsonV3.content.filter(item => item.type == "image").map(e => e.attrs.src); } else { return []; } }, customTitle: () => siteJson.postTitle, category: "comic" }, { name: "漫畫類 自動展開目錄", enable: 1, icon: 0, key: 0, reg: /((mangabz|xmanhua|dm5|1kkk|qiman\d+|mhxqiu\d|6mh\d+|manben|mkzhan|xianmanwang|qiximh\d|kumw\d|sumanku)\.com\/[\w-]+\/$)|(m\.dmzj\.com|m\.ymh1234\.com)\/(info|comic)\/\d+\.html$|(dgmanhua|acgud|acgwd|manhua456|mhxin|zuimh|imitui|xlsmh|pinmh|dashumanhua|kukuwumh|mh160|szcdmj|haoman6)\.(com|cc)\/(comic|manhua|manga|kanmanhua|szcbook)\/[\w-]+\/?$|www\.mhua5\.com\/[\w-]+\.html|m\.aiguoman\.com\/comic\/\w+|(www|m)\.77mh\.\w+\/colist_\d+\.html|www\.manhw\.com\/index\.php\/comic\/\w+$/, init: async () => { if (location.hostname == "m.acgud.com" || location.hostname == "m.acgwd.com") fun.css(".Introduct_Sub{background:url(https://m.idmzj.com/images/int_bg.png)!important;background-size:100% 100%!important}"); if (location.hostname == "m.mhxqiu2.com") await fun.delay(600, 0); }, autoClick: "span.more,a.detail-list-form-more,a.detail-list-more,.deatil-list-more>a,.detail-more,.moreChapter,.show-more,a#zhankai,.gengduo_dt1>button,.morechapter>button,.gengduo_dt1>a,.chapterList+.more,li.add,a.extend,a.action-collapse:not(.on),.chapter__more .down,.listmore,.more.chapLiList-cont>a,.m-load-more-sm>a,.more>a,.allmulu,.show-more>a,.morechp,.nnmore>a", css: ".comic-info-box+a,.cartoon-introduction.cmg,.cartoon-introduction+a,.msloga,.comic_intro>a,.Introduct+a,[class^='ad']{display:none!important}", category: "comic" }, { name: "94i.in 自動簽到", host: ["94i.in"], reg: /^https?:\/\/94i\.in\//, autoClick: "#pper_a:not([style='display: none;'])", category: "none" }, { name: "Supjav 立即顯示影片縮圖", host: ["supjav.com"], delay: 300, reg: /^https?:\/\/supjav\.com\/(zh\/|ja\/)?\d+\.html/, init: async () => { let t = fun.ge("title"); t.innerText = t.innerText.replace(/-\sSupjav.com.+/, "").trim(); let ele = "#vserver.play-button"; if (await fun.waitEle(ele)) fun.ge(ele).click(); }, category: "none" }, { name: "ouo.io 自動跳轉", host: ["ouo.io"], reg: /^https?:\/\/ouo\./, init: async () => { let ele = "#btn-main:not(.disabled)"; if (await fun.waitEle(ele)) fun.ge(ele).click(); }, category: "none" }, { name: "cuty.io 自動跳轉", host: ["cuty.io"], reg: /^https?:\/\/cutt?y\.(io|app)\/\w+/i, init: async () => { let ele = "//button[@id='submit-button' and text()= 'Continue' or text()= 'I am not a robot' or text()= 'Go ->']"; if (await fun.waitEle(ele)) fun.ge(ele).click(); }, category: "none" }, { name: "m.4khd.com 自動跳轉", host: ["m.4khd.com"], reg: /^https?:\/\/m\.4khd\.com\//, init: () => { location.href = fun.ge("//a[text()='GET LINK']").href; }, category: "none" }, { name: "4kup.net 自動跳轉", host: ["4kup.net"], reg: /^https?:\/\/4kup\.net\/getlink\/$/, init: async () => { let eleArr = ["#output:not([style*=none]) button", "#gotolink:not([disabled])"]; for (let i in eleArr) { await fun.waitEle(eleArr[i]); fun.ge(eleArr[i]).click(); await fun.delay(200); } }, category: "none" }, { name: "Imgasd 自動跳轉", reg: /\/blog\/post\d?\?slid=\w+/i, init: async () => { let ele = "//span[text()='Click here to continue'] | //span[text()='Click here to continue ']"; setInterval(async () => { if (await fun.waitEle(ele)) fun.ge(ele).click(); }, 1000); }, category: "none" }, { name: "terabox.fun 自動跳轉", host: ["terabox.fun"], reg: /^https?:\/\/terabox\.fun\/slmiddlepage\//, init: async () => { let ele = ".btn.active"; setInterval(async () => { if (await fun.waitEle(ele)) fun.ge(ele).click(); }, 1000); }, category: "none" }, { name: "MediaFire 自動下載", host: ["www.mediafire.com"], reg: /^https?:\/\/www\.mediafire\.com\//, autoClick: ".download_link:not(.started) #downloadButton", category: "none" }, { name: "anonfiles 自動下載", host: ["anonfiles.com"], reg: /^https?:\/\/anonfiles\.com\//, autoClick: ["#download-url"], category: "none" }, { name: "letsupload 自動下載", host: ["letsupload.cc"], reg: /^https?:\/\/letsupload\.cc\//, autoClick: ["#download-url"], category: "none" }, { name: "stfly.me 半自動跳轉", host: ["stfly.me"], reg: /^http/, include: "img[src^='https://stfly.me/']", init: async () => { if (await fun.waitEle(".btn-captcha:not(.disable)")) { setInterval(() => { fun.ge(".btn-captcha:not(.disable)").click(); }, 3000); } }, category: "none" }, { name: "link1s 自動跳轉", host: ["link1s.com"], reg: /^http/, include: "a.site-logo[href='https://link1s.com/'],a.logo-image[href='https://link1s.com/']", init: async () => { if (await fun.waitEle("//button[@onclick='link1sgo()'] | //button[@id='link' and contains(@style,'none')] | //a[text()='Get Link']")) fun.ge("//button[@onclick='link1sgo()'] | //a[@id='link1s'] | //a[text()='Get Link']").click(); }, category: "none" }, { name: "Binto.click 自動跳轉", host: ["binto.click"], reg: /^https?:\/\/binto\.click\/\w+$/i, include: "#go-link", init: async () => { if (await fun.waitEle("//a[text()='Get Link']")) location.href = fun.ge("//a[text()='Get Link']").href; }, category: "none" }, { name: "網址清單新分頁開啟", host: ["github.com"], delay: 1000, reg: /github\.com\/skofkyo\/AutoPager\/tree\/main\/CustomPictureDownload/, openInNewTab: ".entry-content a[href]:not([target=_blank]):not([id])", category: "none" }, { name: "google search loadmore", enable: 1, reg: /^https?:\/\/(?:www\.)?google\..*\/search/, include: "a[aria-label='更多搜尋結果']", observerClick: "//a[@aria-label='更多搜尋結果' and div[not(@style='display: none;')]]", openInNewTab: "#center_col a[ping][data-ctpacw]", category: "none" }, { name: "測試 test", host: ["www.hathitrust.org"], link: "https://babel.hathitrust.org/cgi/pt?id=mdp.39015096528875&seq=1", enable: 0, reg: /^https?:\/\/\w+\.hathitrust\.org\/cgi\/pt\?id=/, imgs: () => { return fun.imgBlobArr(".image>img"); //return fun.imgBlobArr(".image>img", 2); //return fun.imgBlobArr(".image>img", 2, "image/png"); }, category: "test" }, { name: "Civitai models", host: ["civitai.com"], reg: /^https?:\/\/civitai\.com\/models\/\d+/, delay: 2000, init: async () => { await fun.waitEle(".mantine-u0eh0m"); let div = document.createElement("div"); div.className = "imgBox"; let x = fun.ge(".mantine-u0eh0m"); x.parentNode.insertBefore(div, x.nextSibling); fun.CivitAiAutoShowNSFW(); }, imgs: () => { videosSrcArray = [...fun.gae(".mantine-7aj0so[src$='.mp4']")].map(e => e.src); thumbnailsSrcArray = [...fun.gae(".mantine-7aj0so[src*='image.civitai.com']:not([src$='.mp4'])")].map(e => e.src); return thumbnailsSrcArray.map(e => e.replace(/\/width=\d+\//, "/")); }, repeat: 1, button: [4], insertImg: [".imgBox", 3], go: 1, customTitle: () => fun.geT(".mantine-Title-root").replace(/\|\s/, "").replace(/\//g, "-") + " - " + fun.geT(".mantine-z8ikjj"), observerTitle: true, fetch: 1, downloadVideo: true, openInNewTab: "a[href]:not([target=_blank])", category: "AI" }, { name: "Civitai posts", host: ["civitai.com"], reg: /^https?:\/\/civitai\.com\/posts\/\d+/, delay: 2000, init: () => fun.CivitAiAutoShowNSFW(), imgs: async () => { await fun.waitEle("a[href^='/images/'] img,video[src]"); await fun.delay(200, 0); videosSrcArray = [...fun.gae("video[src]")].map(e => e.src); return [...fun.gae("a[href^='/images/'] img")].map(e => e.src.replace(/\/width=\d+\//, "/")); }, repeat: 1, button: [4], insertImg: [ [".mantine-Stack-root", 0], 2 ], go: 1, fetch: 1, openInNewTab: "a[href]:not([target=_blank])", category: "AI" }, { name: "CivitAi Auto Show NSFW civitai.com", host: ["civitai.com"], reg: /^https?:\/\/civitai\.com\//, delay: 2000, icon: 0, key: 0, init: () => fun.CivitAiAutoShowNSFW(), openInNewTab: "a[href]:not([target=_blank])", category: "AI" }]; const debug = (str, obj = "", title = "debug") => { console.log(`%c[Full Picture Load] ${title}:`, "background-color: #C9FFC9;", str, obj); }; const hasTouchEvents = () => ("ontouchstart" in window) || (navigator.maxTouchPoints > 0) || (navigator.msMaxTouchPoints > 0) ? true : false; const addLibrarysV3 = async () => { try { const jsdelivrLibrarys = [ "https://cdn.jsdelivr.net/npm/[email protected]/dist/jszip.min.js", "https://cdn.jsdelivr.net/npm/[email protected]/dist/jquery.min.js", "https://cdn.jsdelivr.net/npm/@fancyapps/[email protected]/dist/jquery.fancybox.min.js", "https://cdn.jsdelivr.net/npm/@fancyapps/[email protected]/dist/jquery.fancybox.min.css" ]; const bootcdnLibrarys = [ "https://cdn.bootcdn.net/ajax/libs/jszip/3.9.1/jszip.min.js", "https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.min.js", "https://cdn.bootcdn.net/ajax/libs/fancybox/3.5.7/jquery.fancybox.min.js", "https://cdn.bootcdn.net/ajax/libs/fancybox/3.5.7/jquery.fancybox.min.css" ]; let librarysArr; try { const check = await fetch(jsdelivrLibrarys[0]).then(res => res.status); check == 200 ? librarysArr = jsdelivrLibrarys : librarysArr = bootcdnLibrarys; } catch (error) { console.error("\ncdn.jsdelivr.netV3 函式庫取得失敗", error); librarysArr = bootcdnLibrarys; } for (let i in librarysArr) { if (/\.js$/.test(librarysArr[i])) { if (siteData.fancybox && siteData.fancybox.js === false) continue; const script = document.createElement("script"); const code = await fetch(librarysArr[i]).then(res => res.text()); script.type = "text/javascript"; script.innerHTML = code; document.body.appendChild(script); } else if (/\.css$/.test(librarysArr[i])) { if (siteData.fancybox && siteData.fancybox.css !== false) { const css = await fetch(librarysArr[i]).then(res => res.text()); fun.css(css); } } } } catch (error) { console.error("\naddLibrarysV3() 注入函式庫失敗", error); } }; const addLibrarysV5 = async () => { try { const jsdelivrLibrarys = [ "https://cdn.jsdelivr.net/npm/[email protected]/dist/jszip.min.js", "https://cdn.jsdelivr.net/npm/[email protected]/dist/jquery.min.js", "https://cdn.jsdelivr.net/npm/@fancyapps/[email protected]/dist/fancybox/fancybox.umd.js", "https://cdn.jsdelivr.net/npm/@fancyapps/[email protected]/dist/fancybox/fancybox.css" ]; const bootcdnLibrarys = [ "https://cdn.bootcdn.net/ajax/libs/jszip/3.9.1/jszip.min.js", "https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.min.js", "https://cdn.bootcdn.net/ajax/libs/fancyapps-ui/5.0.22/fancybox/fancybox.umd.js", "https://cdn.bootcdn.net/ajax/libs/fancyapps-ui/5.0.22/fancybox/fancybox.css" ]; let librarysArr; try { const check = await fetch(jsdelivrLibrarys[0]).then(res => res.status); check == 200 ? librarysArr = jsdelivrLibrarys : librarysArr = bootcdnLibrarys; } catch (error) { console.error("\ncdn.jsdelivr.netV5 函式庫取得失敗", error); librarysArr = bootcdnLibrarys; } for (let i in librarysArr) { if (/\.js$/.test(librarysArr[i])) { const script = document.createElement("script"); const code = await fetch(librarysArr[i]).then(res => res.text()); script.type = "text/javascript"; script.innerHTML = code; document.body.appendChild(script); } else if (/\.css$/.test(librarysArr[i])) { const css = await fetch(librarysArr[i]).then(res => res.text()); fun.css(css); } } } catch (error) { console.error("\naddLibrarysV5() 注入函式庫失敗", error); } }; let FancyboxOptions; let slideIndex = null; if (hasTouchEvents()) { FancyboxOptions = { idle: false, Images: { Panzoom: { maxScale: 2 } }, Thumbs: { showOnStart: false }, Toolbar: { display: { left: ["infobar"], middle: ["flipX", "flipY"], right: [ /*"downloa", */ "iterateZoom", "slideshow", "thumbs", "close"] } }, on: { done: (fancybox, slide) => { if (fancybox.isCurrentSlide(slide)) { slideIndex = slide.index; fun.scrollEvent(slideIndex); } else { fun.scrollEvent(fancybox.getSlide().index); } }, close: (fancybox, slide) => { document.body.classList.remove("imgbox-show"); slideIndex = fancybox.getSlide().index; fun.scrollEvent(slideIndex); } } }; } else { FancyboxOptions = { idle: false, wheel: "slide", Images: { Panzoom: { maxScale: 2 } }, Thumbs: { showOnStart: false }, Toolbar: { display: { left: ["infobar"], middle: ["iterateZoom", "toggle1to1", "rotateCCW", "rotateCW", "flipX", "flipY", "fitX", "fitY", "reset"], right: [ /*"downloa", */ "slideshow", "fullscreen", "thumbs", "close"] } }, on: { done: (fancybox, slide) => { if (fancybox.isCurrentSlide(slide)) { slideIndex = slide.index; fun.scrollEvent(slideIndex); } else { fun.scrollEvent(fancybox.getSlide().index); } }, close: (fancybox, slide) => { document.body.classList.remove("imgbox-show"); slideIndex = fancybox.getSlide().index; fun.scrollEvent(slideIndex); } } }; } const fancyboxBlackList = () => siteData.fancybox && siteData.fancybox.blacklist === 1 ? true : false; switch (language) { case "zh-TW": displayLanguage = { str_01: "獲取圖片元素中...", str_02: "獲取圖片中 ", str_03: "獲取圖片逾時", str_04: "等待關鍵元素中...", str_05: "獲取資料中...", str_06: "獲取資料中 ", str_07: "確認登錄狀態中...", str_08: "獲取預覽圖中...", str_09: "獲取最後一張圖...", str_10: "是否複製鏈接至剪貼簿?", str_11: "已複製鏈接至剪貼簿", str_12: "只有複製鏈接功能", str_13: "請輸入圖片抓取最大次數", str_14: "獲取下一頁中...", str_15: "獲取下一頁結束", str_16: "獲取元素中...", str_17: "獲取元素中 ", str_18: "已聚集所有圖片", str_19: "用來定位插入的元素不存在", str_20: "沒有能插入的圖片", str_21: "延遲", str_22: "毫秒", str_23: "第", str_24: "張下載", str_25: "完成", str_26: "錯誤", str_27: "下載失敗了", str_28: "張", str_29: "\n是否只保存目前下載成功的圖片?\n只要圖片不是100%掛掉,可以F5重新載入後重新下載試試看。", str_30: "圖片extension錯誤", str_31: "壓縮進度: ", str_32: "自動下載倒數", str_33: "秒", str_34: "nextJS前往下一頁", str_35: "已點擊下一頁", str_36: "自動下載完畢", str_37: "沒有下一頁元素", str_38: "返回上一頁", str_39: "已點擊上一頁", str_40: "沒有上一頁元素", str_41: "已取消", str_42: "字數小於3已取消", str_43: "下載失敗數據為空...", str_44: "沒有任何圖片元素...", str_45: "網址已複製", str_46: "即將進行捲動...", str_47: "左鍵:進行下載打包壓縮\n中鍵:匯出網址URLs.txt文件\n右鍵:複製圖片網址和標題或聚集所有圖片", str_48: "下載&壓縮中請稍後再操作!", str_49: "獲取圖片中請稍後再操作!", str_50: "請輸入自訂CSS/Xpath選擇器:\n範例:img#TheImg OR //img[@id='TheImg']\n也能使用JS代碼自己生成的IMG元素陣列\n範例:js;return [...document.images];", str_51: "請輸入自訂壓縮檔資料夾名稱", str_52: "聚圖數量", str_53: "圖片繪製中...", str_54: "403,未登錄網站?", str_55: "下載載入中...", str_56: "確認圖片狀態中...", str_57: "自動翻頁載入中...", str_58: "已到達最後一頁", str_59: "沒有任何主體元素", str_60: "圖片縮放", str_61: "取消縮放", str_62: "前往第一張圖", str_63: "左鍵:前往最後一張圖\n右鍵:匯出網址URLs.txt文件", str_64: "即將開始自動下載!!!", str_65: "已停止自動下載!!!", str_66: "💬 反饋", str_67: "設定", str_68: "當前網站 Full Picture Load 選項", str_69: "顯示左下圖示按鈕", str_70: "最大下載線程數 ( 1 ~ 32 ):", str_71: "下載後壓縮打包", str_72: "壓縮檔副檔名 ( zip 或 cbz ):", str_73: "自動下載", str_74: " ( 快捷鍵 [ ctrl + . ] 開始或取消 )", str_75: "自動下載倒數秒數:", str_76: "啟用當前漫畫站點規則", str_77: "移動裝置雙擊前往下一頁", str_78: "Fancybox燈箱功能", str_79: "圖片縮放比例 ( 0 ~ 10 ):", str_80: "圖片並排數量 ( 2 ~ 6 ):", str_81: "comic類固定為2,comic類並排後為右至左的漫讀模式,hcomic類也設定為2將套用。", str_82: "取消 (Esc)", str_83: "重置設定", str_84: "保存設定", str_85: "腳本選項(*)", str_86: "切換模式(5)", str_87: "比例縮放(-)", str_88: "取消縮放(+)", str_89: "暫停自動翻頁", str_90: "啟用自動翻頁", str_91: "初始化設定", str_92: "原始模式", str_93: "並排模式", str_94: "返回開頭了", str_95: "前往下一集", str_96: "已是最後下一集", str_97: "共", str_98: "頁獲取出錯,建議反饋", str_99: "重試第", str_100: "次", str_101: "網址.txt已匯出" }; break; case "zh-CN": displayLanguage = { str_01: "获取图片元素中...", str_02: "获取图片中 ", str_03: "获取图片逾时", str_04: "等待关键元素中...", str_05: "获取数据中...", str_06: "获取数据中 ", str_07: "确认登录状态中...", str_08: "获取预览图中...", str_09: "获取最后一张图...", str_10: "是否拷贝链接至剪贴板?", str_11: "已拷贝链接至剪贴板", str_12: "只有拷贝链接功能", str_13: "请输入图片抓取最大次数", str_14: "获取下一页中...", str_15: "获取下一页结束", str_16: "获取元素中...", str_17: "获取元素中 ", str_18: "已聚集所有图片", str_19: "用来定位插入的元素不存在", str_20: "没有能插入的图片", str_21: "延迟", str_22: "毫秒", str_23: "第", str_24: "张下载", str_25: "完成", str_26: "错误", str_27: "下载失败了", str_28: "张", str_29: "\n是否只保存目前下载成功的图片?\n只要图片不是100%挂掉,可以F5重新加载后重新下载试试看。", str_30: "图片extension错误", str_31: "压缩进度: ", str_32: "自动下载倒数", str_33: "秒", str_34: "nextJS前往下一页", str_35: "已点击下一页", str_36: "自动下载完毕", str_37: "没有下一页元素", str_38: "返回上一页", str_39: "已点击上一页", str_40: "没有上一页元素", str_41: "已取消", str_42: "字数小于3已取消", str_43: "下载失败数据为空...", str_44: "没有任何图片元素...", str_45: "网址已拷贝", str_46: "即将进行卷动...", str_47: "左键:进行下载打包压缩\n中键:导出网址URLs.txt文档\n右键:拷贝图片网址和标题或聚集所有图片", str_48: "下载&压缩中请稍后再操作!", str_49: "获取图片中请稍后再操作!", str_50: "请输入自定义CSS/Xpath选择器:\n范例:img#TheImg OR //img[@id='TheImg']\n也能使用JS代码自己生成的IMG元素数组\n范例:js;return [...document.images];", str_51: "请输入自定义压缩档文件夹名称", str_52: "聚图数量", str_53: "图片绘制中...", str_54: "403,未登录网站?", str_55: "下载加载中...", str_56: "确认图片状态中...", str_57: "自动翻页加载中...", str_58: "已到达最后一页", str_59: "没有任何主体元素", str_60: "图片缩放", str_61: "取消缩放", str_62: "前往第一张图", str_63: "左键:前往最后一张图\n右键:导出网址URLs.txt文档", str_64: "即将开始自动下载!!!", str_65: "已停止自动下载!!!", str_66: "💬 反馈", str_67: "设置", str_68: "当前网站 Full Picture Load 选项", str_69: "显示左下图标按钮", str_70: "下载后最大下载线程数 ( 1 ~ 32 ):", str_71: "压缩打包", str_72: "压缩档文件扩展名 ( zip 或 cbz ):", str_73: "自动下载", str_74: " ( 快捷键 [ ctrl + . ] 开始或取消 )", str_75: "自动下载倒数秒数:", str_76: "启用当前漫画站点规则", str_77: "移动设备双击前往下一页", str_78: "Fancybox灯箱功能", str_79: "图片缩放比例 ( 0 ~ 10 ):", str_80: "图片并排数量 ( 2 ~ 6 ):", str_81: "comic类固定为2,comic类并排后为右至左的漫读模式,hcomic类也设置为2将套用。", str_82: "取消 (Esc)", str_83: "重置设置", str_84: "保存设置", str_85: "脚本选项(*)", str_86: "切换模式(5)", str_87: "比例缩放(-)", str_88: "取消缩放(+)", str_89: "暂停自动翻页", str_90: "启用自动翻页", str_91: "初始化设置", str_92: "原始模式", str_93: "并排模式", str_94: "返回开头了", str_95: "前往下一集", str_96: "已是最后下一集", str_97: "共", str_98: "页获取出错,建议反馈", str_99: "重试第", str_100: "次", str_101: "网址.txt已导出" }; break; default: displayLanguage = { str_01: "Get Element...", str_02: "Get Element ", str_03: "Get timed out", str_04: "Wait Element...", str_05: "Get Data...", str_06: "Get Data ", str_07: "Confirm Login Status", str_08: "Get Preview Thumbnail", str_09: "Get Element...", str_10: "Whether To Copy Link To Clipboard?", str_11: "Copied", str_12: "Only Link Can Be Copied", str_13: "Please Enter The Number Of Pictures", str_14: "Get Next Page...", str_15: "Get Next Page End", str_16: "Get Element...", str_17: "Get Element ", str_18: "All Pictures Gathered", str_19: "Element Does Not Exist", str_20: "No Pictures", str_21: "Delay", str_22: "ms", str_23: "No. ", str_24: " Download ", str_25: "Completed", str_26: "Error", str_27: "Download Failed", str_28: "P", str_29: "\nDo you want to save only the pictures that have been successfully downloaded so far?\nAs long as the image is not 100% dead, you can reload it with F5 and try downloading it again.", str_30: "Image Extension Error", str_31: "Compression Progress: ", str_32: "Countdown ", str_33: " sec", str_34: "JS Go To Next Page", str_35: "Next Page Clicked", str_36: "AutoDownload Completed", str_37: "No Next Page Element", str_38: "Return To Previous Page", str_39: "Previous Page Clicked", str_40: "No Previous Page Element", str_41: "Cancelled", str_42: "Cancelled", str_43: "Download Failed Data Is Empty", str_44: "No Picture Element", str_45: "URLs Copied ", str_46: "About To Scroll...", str_47: "Left Click:Download And Compress\nMiddle Click:Export URLs.txt\nLeft Click:Copy Image URL And Title Or Aggregate Images", str_48: "Downloading & Compressing, Please Try Again Later!", str_49: "Get Pictureing Please Try Again Later!", str_50: "Please Enter Selector:\nExample:img#TheImg or //img[@id='TheImg']", str_51: "Please Enter A Custom zip File Folder Name", str_52: "Number Of Pictures", str_53: "Picture Drawing...", str_54: "403,Not Logged In To Website?", str_55: "Download Loading...", str_56: "Check Picture Statusing...", str_57: "AutoPager Loading...", str_58: "Reached The Last Page", str_59: "No Main Element", str_60: "Image Zoom", str_61: "Cancel Eoom", str_62: "Go To First Image", str_63: "Left Click:Go To Last Image\nLeft Click:Export URLs.txt", str_64: "Start AutoDownload!!!", str_65: "Stop AutoDownload!!!", str_66: "💬 Feedback", str_67: "Settings", str_68: "Current Website Full Picture Load Options", str_69: "Show Lower Left Icon Button", str_70: "Max Download Thread ( 1 ~ 32 ):", str_71: "Compressed Packaging", str_72: "Compressed File Extension(zip or cbz):", str_73: "AutoDownload", str_74: " ( [ ctrl + . ] Start or Cancel)", str_75: "AutoDownload Countdown Sec:", str_76: "Comic Site Rules Switch", str_77: "Double Click Go To Next Page", str_78: "Fancybox Plugin", str_79: "Image Zoom Ratio ( 0 ~ 10 ):", str_80: "Number Of Pictures Side By Side ( 2 ~ 6 ):", str_81: "Comic Category Fixed To 2", str_82: "Cancel (Esc)", str_83: "Reset", str_84: "Save", str_85: "Settings(*)", str_86: "Toggle(5)", str_87: "Zoom(-)", str_88: "Cancel(+)", str_89: "Pause Automatic Page Turning", str_90: "Enable Automatic Page Turning", str_91: "Initialization Settings", str_92: "Original Mode", str_93: "Side-By-Side Mode", str_94: "Back To The Beginning", str_95: "Go To Next Episode", str_96: "It’s The Last Episode", str_97: "Have", str_98: "Page Fetch Error Please Feedback", str_99: "Retry No.", str_100: "Bout", str_101: "MediaURLs.txt Exported" }; break; } const _GM_xmlhttpRequest = (() => typeof GM_xmlhttpRequest != "undefined" ? GM_xmlhttpRequest : GM.xmlHttpRequest)(); const _GM_openInTab = (() => typeof GM_openInTab != "undefined" ? GM_openInTab : GM.openInTab)(); const _GM_registerMenuCommand = (() => typeof GM_registerMenuCommand != "undefined" ? GM_registerMenuCommand : GM.registerMenuCommand)(); const fun = { getModeUrl: (url, mode, i) => { //【.html ==> .html?page=2】第一頁 ==> 第二頁 //【 ==> ?page=2】第一頁 ==> 第二頁 if (mode === 1) return url.replace(/\?page=\d+$/, "") + "?page=" + i; //【.html ==> /2.html】 第一頁 ==> 第二頁 if (mode === 2) return url.slice(0, -5) + "/" + i + ".html"; //【.html ==> _1.html】 第一頁 ==> 第二頁 //return siteUrl.replace(/(_\d+)?\.html$/, "") + "_" + (i - 1) + ".html"; if (mode === 3) return url.replace(/\.html$/, "") + "_" + (i - 1) + ".html"; //【/ ==> /2/】 第一頁 ==> 第二頁 if (mode === 4) return url.slice(0, -1) + "/" + i + "/"; //【 ==> /2】 第一頁 ==> 第二頁 if (mode === "4") return url + "/" + i; //【.html ==> -2.html】 第一頁 ==> 第二頁 if (mode === 5) return url.replace(/\.html$/, "") + "-" + i + ".html"; //【-1.html ==> -2.html】 第一頁 ==> 第二頁 if (mode === "5") return url.replace(/(-\d+)?\.html$/, "") + "-" + i + ".html"; //【?p=1 ==> ?p=2】 第一頁 ==> 第二頁 if (mode === 6) return url.replace(/\?p=\d+$/, "") + "?p=" + i; //【/1 ==> /2】 第一頁 ==> 第二頁 //【.html ==> .html/2】 第一頁 ==> 第二頁 if (mode === 7) return url.replace(/\/\d+$/, "") + "/" + i; //【 ==> &page=1】 第一頁 ==> 第二頁 if (mode === 8) return url.replace(/&page=\d+$/, "") + "&page=" + (i - 1); //【 ==> &page=2】 第一頁 ==> 第二頁 if (mode === "8") return url.replace(/&page=\d+$/, "") + "&page=" + i; //【.html ==> _2.html】 第一頁 ==> 第二頁 if (mode === 9) return url.replace(/(_\d+)?\.html$/, "") + "_" + i + ".html"; //【.html ==> .html/2】 第一頁 ==> 第二頁 if (mode === 10) return url.replace(/\.html(\/\d+)?$/, "") + ".html/" + i; //【/ ==> /2.html】 第一頁 ==> 第二頁 //【/1.html ==> /2.html】 第一頁 ==> 第二頁 if (mode === 11) return url.replace(/\/(\d+\.html)?$/, "") + "/" + i + ".html"; //【/ ==> /2.htm】 第一頁 ==> 第二頁 //【/1.htm ==> /2.htm】 第一頁 ==> 第二頁 if (mode === 12) return url.replace(/\/(\d+\.htm)?$/, "") + "/" + i + ".htm"; //【-1-* ==> -2-*】 第一頁 ==> 第二頁 if (mode === 13) return url.replace(/-\d+-[^-]+$/, "") + "-" + i; //【/1/ ==> /2/】 第一頁 ==> 第二頁 if (mode === 14) return url.replace(/\/\d+\/$/, "") + "/" + i + "/"; //【/index.html ==> /index_2.html】 第一頁 ==> 第二頁 if (mode === 15) return url.replace(/\/(index(_\d+)?\.html)?$/, "") + "/index_" + i + ".html"; //【 ==> /2#list】 第一頁 ==> 第二頁 if (mode === 16) return url.replace(/\/(index(_\d+)?\.html)?$/, "") + "/" + i + "#list"; //【.htm ==> _2.htm】 第一頁 ==> 第二頁 if (mode === 17) return url.replace(/#$/, "").replace(/(_\d+)?\.htm$/, "") + "_" + i + ".htm"; //【/ ==> /page/2/】 第一頁 ==> 第二頁 if (mode === 18) return url.replace(/\/(page\/\d+\/)?$/, "") + "/page/" + i + "/"; //【-1 ==> -2】 第一頁 ==> 第二頁 if (mode === 19) return url.replace(/-\d+$/, "") + "-" + i; //【 ==> -p-2】 第一頁 ==> 第二頁 if (mode === 20) return url.replace(/-p-\d+$/, "") + "-p-" + i; }, retryUrl: async (url, res, fn, retryCount = 10) => { debug(`\n${fn}連線錯誤碼:${res.status}\n`, url); let retryNum = 1; let obj = { fn: fn, url: url, status: res.status }; debug(`\n${fn}連線錯誤碼:${res.status}重試第${retryNum}次\n`, url); let retry = await new Promise(async resolve => { for (let check = 1; check <= retryCount; check++) { let checkRes = await fetch(url); if (checkRes.status == 304 || checkRes.status == 200) { let buffer = await checkRes.arrayBuffer(); resolve({ ok: true, buffer: buffer }); break; } else { debug(`\n${fn}連線錯誤碼:${checkRes.status}重試第${retryNum += 1}次\n`, url); await fun.delay(3000, 0); } if (check >= retryCount) { resolve({ ok: false }); } } }); if (retry.ok) { return retry.buffer; } else { fetchErrorArray.push(obj); return null; } }, fetchErrorMsg: () => { if (fetchErrorArray.length > 0) { debug(`\nfetchErrorArray\n`, fetchErrorArray); setTimeout(() => fun.showMsg(`${displayLanguage.str_97}${fetchErrorArray.length}${displayLanguage.str_98}`, 10000), 1500); } }, getImg: async (img, maxPage = 1, mode = 1, rText = [null, null], time = 50, url = siteUrl, msg = 1, request = 0) => { if (fun.ge(".FullPictureLoadImage") && request == 0) return [...fun.gae(".FullPictureLoadImage:not(.small)")]; fetching = true; getImgFn += " > fun.getImg()"; if (msg == 1) fun.showMsg(displayLanguage.str_01, 0); let imgsArray = []; let fetchNum = 0; const html = _url => fetch(_url).then(async res => { debug(`\nfun.getImg() URL`, _url); if (res.status >= 400) { let resData = await fun.retryUrl(_url, res, "fun.getImg()"); if (resData !== null) return resData; } return res.arrayBuffer(); }).then(buffer => { const decoder = new TextDecoder(document.characterSet || document.charset || document.inputEncoding); const htmlText = decoder.decode(buffer); if (msg == 1) fun.showMsg(`${displayLanguage.str_02}${fetchNum+=1}/${maxPage}`, 0); return htmlText; }).catch(error => { console.error(`\nfun.getImg() > fetch()出錯:\n${decodeURI(_url)}`, error); }); const resArr = []; resArr.push(html(url)); if (parseInt(maxPage, 10) > 1) { for (let i = 2; i <= parseInt(maxPage, 10); i++) { resArr.push(html(fun.getModeUrl(url, mode, i))); await fun.delay(time, 0); } } await Promise.all(resArr).then(htmls => { fetching = false; if (msg == 1) fun.hideMsg(); for (let i = 0; i < htmls.length; i++) { let doc = fun.doc(htmls[i]); let imgs = [...fun.gae(img, doc)]; debug(`\nfun.getImg() DOM${i}`, doc); for (let p = 0; p < imgs.length; p++) { let check = fun.checkImgSrc(imgs[p], rText); check.ok ? imgsArray.push(decodeURI(check.src)) : debug(`\nfun.getImg() imgs[${p}]錯誤`, imgs[p]); } } }); fun.fetchErrorMsg(); return imgsArray; }, getImgO: async (img, maxPage = 1, mode = 1, rText = [null, null], time = 200, replaceElement = null, url = siteUrl, msg = 1, request = 0) => { if (fun.ge(".FullPictureLoadImage") && request == 0) return [...fun.gae(".FullPictureLoadImage:not(.small)")]; fetching = true; getImgFn += " > fun.getImgO()"; if (msg == 1) fun.showMsg(displayLanguage.str_01, 0); let imgsArray = []; let fetchNum = 0; const html = async (_url, id = 1) => { await fun.delay(time, 0); return fetch(_url).then(async res => { debug(`\nfun.getImgO() URL`, _url); if (res.status >= 400) { let resData = await fun.retryUrl(_url, res, "fun.getImgO()"); if (resData !== null) return resData; } return res.arrayBuffer(); }).then(buffer => { const decoder = new TextDecoder(document.characterSet || document.charset || document.inputEncoding); const htmlText = decoder.decode(buffer); let doc = fun.doc(htmlText); [...fun.gae(img, doc)].forEach(ele => { let check = fun.checkImgSrc(ele); if (ele.tagName == "IMG" && check.ok) ele.src = check.src; if (id == 1) { let targetEle = [...fun.gae(img)].pop(); targetEle.parentNode.insertBefore(ele.cloneNode(true), targetEle.nextSibling); } }); if (typeof replaceElement == "string") { [...fun.gae(".invisible", doc)].forEach(ele => ele.classList.remove("invisible")); let currentPageEles = [...fun.gae(replaceElement)]; let nextPageEles = [...fun.gae(replaceElement, doc)]; if (currentPageEles.length === nextPageEles.length) { for (let i in currentPageEles) { currentPageEles[i].outerHTML = nextPageEles[i].outerHTML; } } } if (msg == 1) fun.showMsg(`${displayLanguage.str_02}${fetchNum+=1}/${maxPage}`, 0); return htmlText; }).catch(error => { console.error(`\nfun.getImgO() > fetch()出錯:\n${decodeURI(_url)}`, error); }); }; const resArr = []; resArr.push(html(url, 0)); if (parseInt(maxPage, 10) > 1) { for (let i = 2; i <= parseInt(maxPage, 10); i++) { resArr.push(await html(fun.getModeUrl(url, mode, i))); } } await Promise.all(resArr).then(htmls => { fetching = false; fun.hideMsg(); for (let i = 0; i < htmls.length; i++) { let doc = fun.doc(htmls[i]); let imgs = [...fun.gae(img, doc)]; debug(`\nfun.getImgO() DOM${i}`, doc); for (let p = 0; p < imgs.length; p++) { let check = fun.checkImgSrc(imgs[p], rText); check.ok ? imgsArray.push(decodeURI(check.src)) : debug(`\nfun.getImgO() imgs[${p}]錯誤`, imgs[p]); } } }); fun.fetchErrorMsg(); return imgsArray; }, getImgIframe: async (img, maxPage = 1, mode = 1, rText = [null, null], rEle = null, time = 500, showMsg = 1) => { if (fun.ge(".FullPictureLoadImage")) return [...fun.gae(".FullPictureLoadImage:not(.small)")]; fetching = true; getImgFn += " > fun.getImgIframe()"; if (showMsg == 1) fun.showMsg(displayLanguage.str_01, 0); let imgsArray = []; let fetchNum = 1; await fun.waitEle(img); [...fun.gae(img)].forEach(ele => imgsArray.push(ele)); const html = async (url, index = 0) => { let targetEle = [...fun.gae(img)].pop(); let load = document.createElement("p"); load.className = "FullPictureLoadLoading"; load.innerText = "Loading..."; targetEle.parentNode.insertBefore(load, targetEle.nextSibling); await fun.delay(time, 0); let doc; for (let i = 1; i < 20; i++) { doc = await fun.iframeSrcDoc(url, img); if (doc !== null) { break; } else { fun.remove("#FullPictureLoadIframe"); } } if (doc) { debug("iframeDoc" + index, doc); [...fun.gae(img, doc)].forEach(ele => { imgsArray.push(ele); targetEle.parentNode.insertBefore(ele.cloneNode(true), targetEle.nextSibling); }); if (rEle) { let ces = [...fun.gae(rEle)]; let nes = [...fun.gae(rEle, doc)]; if (ces.length === nes.length) { for (let i in ces) { ces[i].outerHTML = nes[i].outerHTML; } } } load.remove(); if (showMsg == 1) fun.showMsg(`${displayLanguage.str_02}${fetchNum+=1}/${maxPage}`, 0); } else { fetchNum += 1; load.remove(); let obj = { fn: "fun.getImgIframe()", url: url }; fetchErrorArray.push(obj); fun.showMsg(displayLanguage.str_03, 3000); return; } } if (parseInt(maxPage, 10) > 1) { for (let i = 2; i <= parseInt(maxPage, 10); i++) { await html(fun.getModeUrl(siteUrl, mode, i), i); } } debug("\nfun.getImgiframe() 聚集的所有IMG", imgsArray); fetching = false; fun.hideMsg(); fun.fetchErrorMsg(); return imgsArray; }, getImgA: async (img, link, mode = 0, rText = [null, null], showMsg = 1, request = 0) => { //從指定的所有鏈接抓圖片 if (fun.ge(".FullPictureLoadImage") && request == 0) return [...fun.gae(".FullPictureLoadImage:not(.small)")]; fetching = true; getImgFn += " > fun.getImgA()"; if (showMsg == 1) fun.showMsg(displayLanguage.str_01, 0); let links, linkEles, linksNum; if (typeof link == "function") { links = await link(); linksNum = links.length; } else if (typeof link == "object") { links = link; linksNum = links.length; } else if (typeof link == "string") { linkEles = [...fun.gae(link)]; links = [...new Set([...fun.gae(link)].map(a => a.href))]; linksNum = parseInt(links.length, 10) + 1; } else { console.error("\nfun.getImgA() link參數錯誤"); return; } debug("\nfun.getImgA() links", links); let imgsArray = []; let fetchNum = 0; const html = url => fetch(url).then(async res => { debug(`\nfun.getImgA() URL`, url); if (res.status >= 400) { let resData = await fun.retryUrl(url, res, "fun.getImgA()"); if (resData !== null) return resData; } return res.arrayBuffer(); }).then(buffer => { if (showMsg == 1) fun.showMsg(`${displayLanguage.str_02}${fetchNum+=1}/${linksNum}`, 0); const decoder = new TextDecoder(document.characterSet || document.charset || document.inputEncoding); const htmlText = decoder.decode(buffer); return htmlText; }).catch(error => { console.error(`\nfun.getImgA fetch()出錯:\n${decodeURI(url)}`, error); }); const resArr = []; if (typeof link != "object") resArr.push(html(siteUrl)); for (let i = 0; i < links.length; i++) { if (mode == 0) { resArr.push(html(links[i])); } else if (mode >= 100) { await fun.delay(mode, 0); resArr.push(html(links[i])); } else if (mode == 1) { let res = await html(links[i]); resArr.push(res); let doc = fun.doc(res); debug(`\nfun.getImgA()單線程模式 DOM\n${links[i].href}`, doc); let imgs = [...fun.gae(img, doc)]; let imgHtml = ""; for (let p = 0; p < imgs.length; p++) { let imgSrc; let check = fun.checkImgSrc(imgs[p], rText); if (check.ok) { imgSrc = check.src; //let blob = await GM_XHR_GetData(imgSrc); //let objectURL = await URL.createObjectURL(blob.blob); //imgSrc = objectURL; debug("\nfun.getImgA() 單線程模式imgSrc", imgSrc); } else { console.error("\nfun.getImgA() 單線程模式出錯", imgs[p]); continue; } imgHtml += `<img class="FullPictureLoadImage" src="${imgSrc}">`; } linkEles[i].outerHTML = imgHtml; } } await Promise.all(resArr).then(htmls => { fetching = false; fun.hideMsg(); for (let i = 0; i < htmls.length; i++) { let doc = fun.doc(htmls[i]); if (mode != 1) debug(`\nfun.getImgA() DOM${i}`, doc); let imgs = [...fun.gae(img, doc)]; for (let p = 0; p < imgs.length; p++) { let check = fun.checkImgSrc(imgs[p], rText); check.ok ? imgsArray.push(check.src) : console.error("\nfun.getImgA() PromiseAll出錯", imgs[p]); } } }); fun.fetchErrorMsg(); return imgsArray; }, getImgCorsA: (img, a, time = 100) => { fetching = true; fun.showMsg(displayLanguage.str_01, 0); let xhrNum = 0; let links; typeof a === "string" ? links = [...fun.gae(a)].map(a => a.href) : links = a; let resArr = links.map(async (url, i, arr) => { await fun.delay(time * i, 0); return fun.xhrDoc(url).then(doc => { fun.showMsg(`${displayLanguage.str_02}${xhrNum+=1}/${arr.length}`, 0); return [...fun.gae(img, doc)]; }); }); return Promise.all(resArr).then(arr => { fetching = false; fun.hideMsg(); return fun.getImgSrcArr(arr.flat()); }); }, checkImgSrc: (ele, rText = [null, null]) => { let imgSrc; let check = fun.checkDataset(ele); if (ele.tagName == "IMG" && check.ok || ele.tagName == "DIV" && check.ok || ele.tagName == "A" && check.ok || ele.tagName == "SPAN" && check.ok) { imgSrc = check.src; if (/^\/\//.test(imgSrc)) imgSrc = location.protocol + imgSrc; if (/^\/\w+/.test(imgSrc)) imgSrc = location.origin + imgSrc; if (!/^(http|blob)/.test(imgSrc) && /^\w+/.test(imgSrc)) imgSrc = location.origin + "/" + imgSrc; if (rText[0]) imgSrc = imgSrc.replace(rText[0], rText[1]); return { ok: true, src: imgSrc }; } else if (ele.tagName == "IMG" || ele.tagName == "AMP-IMG") { if (ele.tagName == "IMG") imgSrc = ele.src; if (ele.tagName == "AMP-IMG") imgSrc = ele.getAttribute('src'); if (/^\/\//.test(imgSrc)) imgSrc = location.protocol + imgSrc; if (rText[0]) imgSrc = imgSrc.replace(rText[0], rText[1]); return { ok: true, src: imgSrc }; } else if (ele.tagName == "A") { imgSrc = ele.href; if (rText[0]) imgSrc = imgSrc.replace(rText[0], rText[1]); return { ok: true, src: imgSrc }; } else if (/^(http|blob|\/\/)/.test(ele)) { imgSrc = ele; if (/^\/\//.test(ele)) imgSrc = location.protocol + imgSrc; if (rText[0]) imgSrc = imgSrc.replace(rText[0], rText[1]); return { ok: true, src: imgSrc }; } return { ok: false }; }, checkDataset: ele => { if (ele.tagName == "IMG" || ele.tagName == "DIV" || ele.tagName == "A" || ele.tagName == "SPAN") { const setArr = ["data-src", "data-original", "data-url", "data-thumb", "data-echo", "data-ecp", "data-lazyload-src", "data-lazy-src", "data-lazy", "lazysrc", "data-lazyload", "file", "zoomfile", "data-lbwps-srcsmall", "original", "mydatasrc", "ess-data", "data-cfsrc", "data-pin-media", "data-mfp-src"]; for (let i = 0; i < setArr.length; i++) { let imgSrc = ele.getAttribute(setArr[i]); if (imgSrc) { return { ok: true, src: imgSrc.trim() }; } } } return { ok: false }; }, getImgSrcArr: (img, doc = document) => { let imgs; typeof img === "string" ? imgs = [...fun.gae(img, doc)] : imgs = img; return imgs.map(ele => { let check = fun.checkImgSrc(ele); return check.ok ? check.src : null; }).filter(item => item); }, getNP: async (pageEle, nextLinkEle, lastEle = null, replaceElement = null, time = 0, dataset = null, mag = 1, retry = 10) => { //翻頁模式聚集所有圖片或是預覽縮圖然後fun.getImgA() //用在規則init,fun.getNP(picsEle, nextLinkEle, lastEle, replaceElement, time); if (fun.ge(".FullPictureLoadImage")) return; fetching = true; getImgFn += " > fun.getNP()"; let nextlink = null; let page = 1; if (mag == 1) fun.showMsg(displayLanguage.str_14, 0); const getNextLink = async (url = "", doc = document) => { if (typeof nextLinkEle === "function") { nextlink = await nextLinkEle(); } else if (typeof nextLinkEle === "string") { let ele = fun.ge(nextLinkEle, doc); if (ele) { if (ele.dataset.url) { if (!/^http/.test(ele.dataset.url)) return null; nextlink = ele.dataset.url; } else if (ele.tagName === "A") { nextlink = ele.href; let nh = ele.host; let lh = location.host; if (nh != lh) nextlink = nextlink.replace(nh, lh); } else { try { ele.getAttribute("href") ? nextlink = ele.getAttribute("href") : nextlink = ele.getAttribute("_href"); } catch (e) { nextlink = null; } } } else { nextlink = null; } } else { nextlink = null; } if (typeof url === "string" && typeof nextlink === "string" && (url === nextlink)) { if (mag == 1) fun.showMsg(displayLanguage.str_15); nextlink = null; } return nextlink; }; const getNextPageEles = async url => { if (mag == 1) fun.showMsg(`${displayLanguage.str_14} (Page${page += 1})`, 0); await fetch(url).then(async res => { if (res.status >= 400) { let resData = await fun.retryUrl(url, res, "fun.getNP()"); if (resData !== null) return resData; } return res.arrayBuffer(); }).then(buffer => { const decoder = new TextDecoder(document.characterSet || document.charset || document.inputEncoding); const htmlText = decoder.decode(buffer); return htmlText; }).then(async htmlText => { let doc = fun.doc(htmlText); if (!fun.ge(pageEle, doc)) { for (let i = 1; i <= retry; i++) { doc = await fun.iframeSrcDoc(url, pageEle); if (doc != null) { break; } else { fun.remove("#FullPictureLoadIframe"); } } } if (!doc) doc = fun.doc(htmlText); if (dataset) { [...fun.gae(`img[${dataset}],a[${dataset}],div[${dataset}]`, doc)].forEach(e => { if (e.tagName == "IMG") { e.src = e.getAttribute(dataset); } else if (e.tagName == "A" || e.tagName == "DIV") { let url = e.getAttribute(dataset); e.style.backgroundImage = `url(${url})`; } }); } debug(`\nfun.getNP() > getNextPageEles() DOM\n${decodeURI(url)}`, doc); let eles = [...fun.gae(pageEle, doc)]; let lastPage = null; if (typeof lastEle === "string") { lastPage = fun.ge(lastEle, doc); } else if (typeof lastEle === "function") { try { lastPage = await lastEle(doc); } catch (error) { debug("fun.getNP() lastEle() 函式錯誤", error); lastPage = null; } } let fragment = new DocumentFragment(); eles.forEach(ele => fragment.appendChild(ele.cloneNode(true))); let targetEle = [...fun.gae(pageEle)].pop(); targetEle.parentNode.insertBefore(fragment, targetEle.nextSibling); if (replaceElement) { let currentPageEles = [...fun.gae(replaceElement)]; let nextPageEles = [...fun.gae(replaceElement, doc)]; if (currentPageEles.length === nextPageEles.length) { for (let i in currentPageEles) { //debug("paginationEle", ele); try { currentPageEles[i].outerHTML = nextPageEles[i].outerHTML; } catch (error) { console.error("\nfun.getNP() 替換元素錯誤\n", error); } } } } if (lastPage) { fetching = false; if (mag == 1) fun.showMsg(displayLanguage.str_15); return; } nextlink = await getNextLink(url, doc); if (nextlink) { await fun.delay(time, 0); await getNextPageEles(nextlink); } else { fetching = false; if (mag == 1) fun.showMsg(displayLanguage.str_15); return; } }); }; nextlink = await getNextLink(); if (nextlink) { await fun.delay(time, 0); await getNextPageEles(nextlink); } else { fetching = false; if (mag == 1) fun.showMsg(displayLanguage.str_15); return; } }, toggleAutoPager: () => { if (autoPager === true) { autoPager = false; fun.showMsg(displayLanguage.str_89); [...fun.gae(".autoPagerTitle")].forEach(e => e.classList.add("off")); } else { autoPager = true; fun.showMsg(displayLanguage.str_90); [...fun.gae(".autoPagerTitle")].forEach(e => e.classList.remove("off")); } }, autoPager: async doc => { let url = await fun.getNextLink(doc); if (!url) { autoPager = false; fun.showMsg(displayLanguage.str_58, 3000); return; } fun.addLoading(); if (siteData.autoPager.mode == 1) { doc = await fun.iframeSrcDoc(url, (siteData.autoPager.waitEle || siteData.autoPager.ele), 30000); } else { try { doc = await fun.fetchDoc(url, 0); } catch (e) { doc = await fun.xhrDoc(url); } } debug(`\nfun.autoPager()\n${url}\n`, doc); if (siteData.autoPager.stop) { let check; try { check = await siteData.autoPager.stop(doc); } catch (error) { console.error("\nsiteData.autoPager.stop() 函式錯誤\n", error); check = false; } if (check) { autoPager = false; fun.removeLoading(); fun.showMsg(displayLanguage.str_58, 3000); return; } } if (siteData.autoPager.script) { let scripts = [...fun.gae(siteData.autoPager.script, doc)]; for (let i = 0; i < scripts.length; i++) { if (scripts[i].src) { await fun.script(scripts[i].src, 1, 1); } else { let code = scripts[i].innerText; await fun.script(code, 0, 1); } } } if (siteData.autoPager.lazySrc) { let eles = [...fun.gae(siteData.autoPager.lazySrc, doc)]; for (let i = 0; i < eles.length; i++) { let check = fun.checkDataset(eles[i]); if (check.ok) { if (eles[i].tagName === "IMG") { eles[i].src = check.src; } else if (eles[i].tagName === "DIV" || eles[i].tagName === "A") { eles[i].style.backgroundImage = `url('${check.src}')`; } } } } if (typeof siteData.autoPager.bF === "function") await siteData.autoPager.bF(doc); if (siteData.autoPager.re) { let currentPageEles = [...fun.gae(siteData.autoPager.re)]; let nextPageEles = [...fun.gae(siteData.autoPager.re, doc)]; if (currentPageEles.length === nextPageEles.length) { for (let i in currentPageEles) { currentPageEles[i].outerHTML = nextPageEles[i].outerHTML; } } } let newEle, tE; if (typeof siteData.autoPager.ele === "function" && siteData.autoPager.pos || typeof siteData.autoPager.ele === "string") { if (typeof siteData.autoPager.ele === "function") newEle = await siteData.autoPager.ele(doc); if (typeof siteData.autoPager.ele === "string") { let nextEle = fun.ge(siteData.autoPager.ele, doc); if (!nextEle) { fun.removeLoading(); fun.showMsg(displayLanguage.str_59, 3000); return; } tE = [...fun.gae(siteData.autoPager.ele)].pop(); newEle = [...fun.gae(siteData.autoPager.ele, doc)]; } let fragment = new DocumentFragment(); if (siteData.autoPager.showTitle !== 0) { let add = true; let titleText = null; if (typeof siteData.autoPager.title === "function") { try { titleText = await siteData.autoPager.title(doc); if (typeof titleText === "object") { if (titleText.ok) { titleText = titleText.text; } else { add = false; } } } catch (error) { console.error("\nsiteData.autoPager.title() 函式錯誤\n", error); } } if (add) fragment.appendChild(await fun.titleUrlEle(url, (titleText || doc.title))); } newEle.forEach(e => fragment.appendChild(e.cloneNode(true))); newEle = null; if (siteData.autoPager.pos) { if (siteData.autoPager.pos[1] === 0) { //元素裡面 tE = fun.ga(siteData.autoPager.pos[0], doc); tE.appendChild(fragment); } else if (siteData.autoPager.pos[1] === 1) { //元素之前 tE = fun.ga(siteData.autoPager.pos[0], doc); tE.parentNode.insertBefore(fragment, tE); } else if (siteData.autoPager.pos[1] === 2) { //元素之後 tE.parentNode.insertBefore(fragment, tE.nextSibling); } } else { tE.parentNode.insertBefore(fragment, tE.nextSibling); } } else if (typeof siteData.autoPager.ele === "function") { await siteData.autoPager.ele(doc); } if (typeof siteData.autoPager.aF === "function") await siteData.autoPager.aF(doc); fun.removeLoading(); if (siteData.autoPager.history == 1) fun.addHistory(doc.title, url); if (siteData.autoPager.observer) { await fun.delay(siteData.autoPager.sleep || 1000, 0); let ele = [...fun.gae(siteData.autoPager.observer)].pop(); fun.autoPagerNextObserver.observe(ele); } }, iframeDoc: (url, ele, time = 5000, callback) => { return new Promise(async resolve => { let tid; const iframe = document.createElement("iframe"); iframe.name = "FullPictureLoad-iframe"; iframe.id = "FullPictureLoadIframe"; iframe.src = url; iframe.sandbox = "allow-same-origin allow-scripts allow-popups allow-forms"; //iframe.style.display = "none"; iframe.style.cssText = 'display: block; visibility: visible; float: none; clear: both; width: 100%; height: 0; background: initial; border: 0px; border-radius: 0px; margin: 0px; padding: 0px; z-index: 2147483645;content-visibility: auto;contain-intrinsic-size: auto 300px;'; document.body.appendChild(iframe); tid = setTimeout(() => resolve(null), time); const call = async () => { clearTimeout(tid); let doc = iframe.contentDocument || iframe.contentWindow.document; if (!doc) resolve(fun.doc("none")); doc.body.scrollTop = 9999999; doc.documentElement.scrollTop = 9999999; try { await fun.delay(siteData.autoPager.loadTime || 200, 0); } catch (e) { await fun.delay(200, 0); } if (typeof ele === "string") await fun.waitEle(ele, 600, doc); if (typeof callback === "function") { await fun.delay(200, 0); await callback(doc, fun); await fun.delay(200, 0); } resolve(doc); iframe.remove(); }; if (iframe.attachEvent) { iframe.attachEvent("onload", () => call()); } else { iframe.onload = () => call(); } }); }, iframeSrcDoc: (url, ele, time = 5000, callback) => { return new Promise(async resolve => { let tid; let resText = await fetch(url).then(async res => { debug(`\nfun.iframeSrcDoc() URL`, url); if (res.status >= 400) { let resData = await fun.retryUrl(url, res, "fun.iframeSrcDoc()"); if (resData !== null) return resData; } return res.arrayBuffer() }).then(buffer => { const decoder = new TextDecoder(document.characterSet || document.charset || document.inputEncoding); const htmlText = decoder.decode(buffer); return htmlText; }); const iframe = document.createElement("iframe"); iframe.name = "FullPictureLoad-iframe"; iframe.id = "FullPictureLoadIframe"; iframe.srcdoc = resText; iframe.sandbox = "allow-same-origin allow-scripts allow-popups allow-forms"; //iframe.style.display = "none"; iframe.style.cssText = 'display: block; visibility: visible; float: none; clear: both; width: 100%; height: 0; background: initial; border: 0px; border-radius: 0px; margin: 0px; padding: 0px; z-index: 2147483645;content-visibility: auto;contain-intrinsic-size: auto 300px;'; document.body.appendChild(iframe); tid = setTimeout(() => resolve(null), time); const call = async () => { clearTimeout(tid); let doc = iframe.contentDocument || iframe.contentWindow.document; if (!doc) resolve(fun.doc("none")); doc.body.scrollTop = 9999999; doc.documentElement.scrollTop = 9999999; try { await fun.delay(siteData.autoPager.loadTime || 200, 0); } catch (e) { await fun.delay(200, 0); } if (typeof ele === "string") await fun.waitEle(ele, 600, doc); if (typeof callback === "function") { await fun.delay(200, 0); await callback(doc, fun); await fun.delay(200, 0); } resolve(doc); iframe.remove(); }; if (iframe.attachEvent) { iframe.attachEvent("onload", () => call()); } else { iframe.onload = () => call(); } }); }, autoPagerNextObserver: new IntersectionObserver((entries, observer) => { entries.forEach(entry => { if (entry.isIntersecting && autoPager) { observer.unobserve(entry.target); fun.autoPager(); } }); }), getNextLink: async doc => { if (typeof siteData.autoPager.next === "function") { let nextCode = await siteData.autoPager.next(doc); if (nextLink === nextCode) return null; nextLink = nextCode; } else if (typeof siteData.autoPager.next === "string") { let nextEle = fun.ge(siteData.autoPager.next, doc); try { if (!nextEle || (nextEle && (nextLink === nextEle.href))) return null; } catch (error) { console.error("\nfun.getNextLink() ERROR\n", error); return null; } nextLink = nextEle.href; const nh = nextEle.host; const lh = location.host; if (nh !== lh) nextLink = nextLink.replace(nh, lh); } else { return null; } if (!nextLink) return null; if (siteData.autoPager.http) siteData.autoPager.http == "https" ? nextLink = nextLink.replace("http:", "https:") : nextLink = nextLink.replace("https:", "http:"); return nextLink; }, titleUrlEle: (url, title) => { let div = document.createElement("div"); div.className = "autoPagerTitle"; let a = document.createElement("a"); a.href = url; a.innerText = title; div.appendChild(a); div.addEventListener("click", event => { fun.toggleAutoPager(); }); return div; }, addLoading: () => { if (siteData.autoPager.loading === "msg") { fun.showMsg(displayLanguage.str_57, 0); } else { try { let img = new Image(); img.className = "autoPagerLoading"; img.src = autoPagerLoading; let tE; if (siteData.autoPager.pos) { if (siteData.autoPager.pos[1] === 0) { //元素裡面 tE = fun.ga(siteData.autoPager.pos[0], doc); tE.appendChild(img); } else if (siteData.autoPager.pos[1] === 1) { //元素之前 tE = fun.ga(siteData.autoPager.pos[0], doc); tE.parentNode.insertBefore(img, tE); } else if (siteData.autoPager.pos[1] === 2) { //元素之後 tE.parentNode.insertBefore(img, tE.nextSibling); } } else { tE = [...fun.gae(siteData.autoPager.ele)].pop(); tE.parentNode.insertBefore(img, tE.nextSibling); } } catch (e) { fun.showMsg(displayLanguage.str_57, 0); } } }, removeLoading: () => { if (siteData.autoPager.loading === "msg") { fun.hideMsg(); } else { try { fun.ge(".autoPagerLoading").remove(); } catch (e) { fun.hideMsg(); } } }, addHistory: (title, url) => { history.pushState(null, title, url); document.title = title; }, getEle: async (links, elements, targetEle, removeEles = null, time = 100) => { if (fun.ge(".FullPictureLoadImage")) return; fetching = true; getImgFn += " > fun.getEle() > [...fun.gae()]"; let resArr = []; let xhrNum = 0; fun.showMsg(displayLanguage.str_16, 0); for (let i = 0; i < links.length; i++) { let res = fun.xhrDoc(links[i]).then(doc => { debug(`\nfun.getEle() URL`, links[i]); fun.showMsg(`${displayLanguage.str_17}${xhrNum+=1}/${links.length}`, 0); debug(`fun.getEle()\n${decodeURI(links[i])}\n`, doc); return [...fun.gae(elements, doc)]; }); resArr.push(res); await fun.delay(time, 0); } await Promise.all(resArr).then(arr => arr.flat()).then(eles => { fetching = false; fun.hideMsg(); let ele; let fragment = new DocumentFragment(); eles.forEach(e => fragment.appendChild(e.cloneNode(true))); if (typeof targetEle == "object") { ele = fun.ge(targetEle[0]); if (targetEle[1] == 0) ele.appendChild(fragment); else if (targetEle[1] == 1) ele.parentNode.insertBefore(fragment, ele); else if (targetEle[1] == 2) ele.parentNode.insertBefore(fragment, ele.nextSibling); } else if (typeof targetEle == "string") { ele = fun.ge(targetEle); ele.innerHTML = ""; ele.appendChild(fragment); } if (removeEles) fun.remove(removeEles); fun.fetchErrorMsg(); }); }, picPreload: async (arr, title = (customTitle || document.title), page = "current") => { const loadImg = async (src, index) => { await new Promise(resolve => { let temp = new Image(); temp.src = src; temp.onload = () => { resolve(); temp = null; }; temp.onerror = error => { if (errorNum > 100) return; if (!/e-hentai\.org|exhentai\.org/.test(location.host)) errorNum += 1; if (/e-hentai\.org|exhentai\.org/.test(location.host)) resolve(); resolve(); setTimeout(() => { if (/www\.yinghuamh\.net/.test(location.host)) { debug(`\n圖片全載Lazyloading預讀出錯 樱花漫画 重新載入另一個圖片伺服器的圖片網址:\n${src}\nto\n${src.replace(Gm.getMediaHost(media), media)}\n`, loadImg(src.replace(Gm.getMediaHost(media), media), index)); } else { debug(`\n圖片全載Lazyloading預讀重新載入出錯的圖片:\n${src}\n`, loadImg(src, index)); } }, 1000); temp = null; }; }); }; page == "next" ? debug(`\n${title}\n圖片全載開始預讀下一頁`, arr) : debug(`\n${title}\n圖片全載Lazyloading開始預讀`); for (let i = 0; i < arr.length; i++) { if (/youtube|\.mp4|\.m3u8$|\.webm$/.test(arr[i])) continue; await loadImg(arr[i], i); } page == "next" ? debug(`\n${title}\n圖片全載下一頁預讀結束`) : debug(`\n${title}\n圖片全載Lazyloading預讀結束`); }, MutationObserver_aff: () => { //观察者 MutationObserver事件 const openEvent = () => { if (fun.ge("span[data-fancybox-current-index]") !== null) { slideIndex = parseInt(fun.geT("span[data-fancybox-current-index]"), 10) - 1; } else if (fun.ge("span[data-fancybox-index]") !== null) { slideIndex = parseInt(fun.geT("span[data-fancybox-index]"), 10) - 1; } else if (fun.ge("badge.b-black.counter") !== null) { slideIndex = parseInt(fun.geT("badge.b-black.counter").match(/\d+/)[0], 10) - 1; } if (typeof slideIndex === "number") { console.log("open - # " + slideIndex + " slide is open!"); } }; const ContentContainer = document.body; const configObserver = { childList: true, subtree: true, attributeFilter: ["class"] }; //当观察到突变时执行的回调函数 const Callbacks = mutationsList => { mutationsList.forEach((item, index) => { //console.log("index: ", index, " - \n", item); if (item.type === "attributes") { //console.log(item); if (item.target.className === "fancybox-slide fancybox-slide--image fancybox-slide--current fancybox-slide--complete" || item.target.className === "fancybox__slide has-image can-zoom_in is-selected" || item.target.className === "swiper-slide swiper-slide-active") { console.log(" # ", item); openEvent(); fun.scrollEvent(slideIndex); } } else if (item.type === "childList") { //console.log(item); if (item.removedNodes.length > 1 && /fancybox|swiper/.test(item.removedNodes[1].className)) { console.log(" # ", item); console.log("close - # " + slideIndex + " slide is closed!"); //setTimeout(closeEvent, 1000); fun.scrollEvent(slideIndex); } } }); }; //创建一个链接到回调函数的观察者实例 const Observer = new MutationObserver(Callbacks); ContentContainer && Observer.observe(ContentContainer, configObserver); }, insertImg: (imgsArray, ele, mode = 1) => { let srcArr = []; for (let i = 0; i < imgsArray.length; i++) { let check = fun.checkImgSrc(imgsArray[i]); check.ok ? srcArr.push(check.src) : console.error("\nfun.insertImg(imgsArray) 格式錯誤!", imgsArray[i]); } srcArr = [...new Set(srcArr)]; let fragment = new DocumentFragment(); if (siteData.button) { let buttonDiv = document.createElement("div"); buttonDiv.style.width = "100%"; buttonDiv.style.height = "42px"; buttonDiv.style.display = "inline-block"; if (typeof siteData.button[2] === "number") { for (let i = 0; i < siteData.button[2]; i++) { let br = document.createElement("br"); fragment.appendChild(br); } } let width = "24%"; if (typeof siteData.button[1] === "string") width = siteData.button[1]; const buttonObj = [{ id: "FullPictureLoadOptionsBtn", text: displayLanguage.str_85, fn: event => { event.preventDefault(); fun.ge("#FullPictureLoadOptions").removeAttribute("style"); } }, { id: "FullPictureLoadToggleImgModeBtn", text: displayLanguage.str_86, fn: event => { event.preventDefault(); toggleImgMode(); } }, { id: "FullPictureLoadToggleZoomeBtn", text: displayLanguage.str_87, fn: event => { event.preventDefault(); fun.clearAllTimer(2); toggleZoom(); } }, { id: "FullPictureLoadCancelZoomBtn", text: displayLanguage.str_88, fn: event => { event.preventDefault(); fun.clearAllTimer(2); cancelZoom(); } }]; const createButton = obj => { let button = document.createElement("button"); button.id = obj.id; button.style.width = width; button.style.height = "24px"; button.innerText = obj.text; button.addEventListener("click", obj.fn); buttonDiv.appendChild(button); }; [...buttonObj].forEach(obj => createButton(obj)); fragment.appendChild(buttonDiv); } let noVideoNum = [...srcArr].filter(src => !/youtube|\.mp4$|\.webm$/.test(src)).length; let blackList = fancyboxBlackList(); if (options.fancybox == 1 && thumbnailsSrcArray.length > 0) { if (!/www\.24cos\.org|www\.lovecos\.net|luohuaxiu\.com|kemono\.su|coomer\.su/.test(location.host) || !/^data/.test(thumbnailsSrcArray[0])) { thumbnailsSrcArray = [...new Set(thumbnailsSrcArray)]; } //if (!/^data/.test(thumbnailsSrcArray[0])) { // let thumbnailsFragment = new DocumentFragment(); // for (let i in thumbnailsSrcArray) { // let img = new Image(); // img.src = thumbnailsSrcArray[i]; // thumbnailsFragment.appendChild(img); // } // debug("\n背景預讀所有預覽縮圖\n", thumbnailsFragment); //} } debug("\nfun.insertImg()插入圖片最後確認 thumbnailsSrcArray", thumbnailsSrcArray); debug("\nfun.insertImg()插入圖片最後確認 srcArr", srcArr); let padStart = String(srcArr.length).length; for (let i = 0; i < srcArr.length; i++) { let a = document.createElement("a"); if (options.fancybox == 1 && !blackList) { a.id = "imgLocationOriginal_" + i; a.dataset.fancybox = "FullPictureLoadImageOriginal"; thumbnailsSrcArray.length > 0 && thumbnailsSrcArray.length == noVideoNum ? a.dataset.thumb = thumbnailsSrcArray[i] : a.dataset.thumb = srcArr[i]; a.href = srcArr[i]; //a.dataset.downloadSrc = srcArr[i]; //a.dataset.downloadFilename = (customTitle || document.title) + `-${String(parseInt(i, 10) + 1).padStart(padStart, "0")}P`; } let img = new Image(); img.alt = `no.${parseInt(i, 10) + 1}`; img.dataset.index = i; img.className = "FullPictureLoadImage"; if (siteData.referrerpolicy) img.referrerPolicy = siteData.referrerpolicy; //if (/vipr\.im/.test(srcArr[i])) img.referrerPolicy = "no-referrer"; if (options.zoom <= 10 && options.zoom > 0) { img.style.width = `${options.zoom * 10}%`; img.style.height = "auto"; } if (mode == 2 || mode == 3) { img.src = loading_bak; img.dataset.src = srcArr[i]; fun.imagesObserver.observe(img); } else { img.src = srcArr[i]; img.decoding = "async"; img.onload = () => { img.classList.remove("error"); }; img.onerror = error => { if (errorNum > 100) return; errorNum += 1; error.target.classList.add("error"); setTimeout(() => { debug(`\nfun.insertImg()重新載入出錯的圖片:\n${error.target.src}`); error.target.src = error.target.src; }, 1000); }; } if (options.fancybox == 1 && !blackList) { a.appendChild(img); fragment.appendChild(a); } else { fragment.appendChild(img); } } if (videosSrcArray.length > 0) { debug("\nfun.insertImg()插入圖片最後確認 videosSrcArray", videosSrcArray); for (let i = 0; i < videosSrcArray.length; i++) { let video = document.createElement("video"); video.className = "FullPictureLoadVideo"; video.controls = true; video.loop = false; video.autoplay = false; video.preload = "auto"; video.style = "height: 500px;width: 100%;max-width:100%"; let source = document.createElement("source"); source.src = videosSrcArray[i]; source.type = "video/mp4"; video.appendChild(source); fragment.appendChild(video); } } let end = document.createElement("p"); end.id = "FullPictureLoadEnd"; end.innerText = `${displayLanguage.str_52}:${noVideoNum}P`; fragment.appendChild(end); if (srcArr.length > 0 || (srcArr.length >= 0 && videosSrcArray.length > 0)) { if (siteData.insertImg[1] == 2 || siteData.insertImg[1] == 3) fun.picPreload(srcArr); let targetEle; try { if (typeof ele == "object") { targetEle = fun.ge(ele[0]); if (ele[1] == 0) { targetEle.appendChild(fragment); targetEle.style.textAlign = "center"; targetEle.style.display = "block"; } else if (ele[1] == 1) { targetEle.parentNode.insertBefore(fragment, targetEle); targetEle.parentNode.style.textAlign = "center"; targetEle.parentNode.style.display = "block"; } else if (ele[1] == 2) { targetEle.parentNode.insertBefore(fragment, targetEle.nextSibling); targetEle.parentNode.style.textAlign = "center"; targetEle.parentNode.style.display = "block"; } if (typeof ele[2] != "undefined") { fun.remove(ele[2]); } if (siteData.msg != 0 && siteData.category != "comic") fun.showMsg(displayLanguage.str_18); if (siteData.go == 1) goToNo1Img(); } else if (typeof ele == "string") { targetEle = fun.ge(ele); targetEle.innerHTML = ""; targetEle.appendChild(fragment); targetEle.style.textAlign = "center"; targetEle.style.display = "block"; if (siteData.msg != 0 && siteData.category != "comic") fun.showMsg(displayLanguage.str_18); if (siteData.go == 1) goToNo1Img(); } } catch (error) { fun.showMsg(displayLanguage.str_19, 3000); console.error("\nfun.insertImg() ele參數錯誤,或用來定位插入的元素不存在。", error); return; } let imgs = [...fun.gae(".FullPictureLoadImage:not(.small)")]; let imgsNum = 0; document.addEventListener("keydown", event => { if (fun.ge("#FullPictureLoadOptions:not([style])")) return; if (event.key == "ArrowUp") { if (fun.ge(".fancybox-container,.fancybox__container")) return; if (imgsNum > 0 && viewMode == 0) { imgsNum -= 1; imgs[imgsNum].scrollIntoView(); } } else if (event.key == "ArrowDown") { if (fun.ge(".fancybox-container,.fancybox__container")) return; event.preventDefault(); if (imgsNum < imgs.length && viewMode == 0) { imgsNum += 1; try { imgs[imgsNum].scrollIntoView(); } catch (e) { imgsNum = 0; imgs[0].scrollIntoView(); fun.showMsg(displayLanguage.str_94); } } } else { imgsNum = 0 - 1; } }); if (siteData.category == "comic") { let lastImg = imgs.pop(); fun.comicNextObserver.observe(lastImg); } [...fun.gae("#FullPictureLoadGoToFirstImage,#FullPictureLoadGoToLastImage")].forEach(e => e.style.display = "block"); if (options.fancybox == 1 && !blackList && !siteData.fancybox) { try { Fancybox.bind("[data-fancybox='FullPictureLoadImageOriginal']", FancyboxOptions); } catch (error) { console.error("沒有引入FancyboxV5", error); } } if (!/tupianwu\.com/.test(location.host)) fun.MutationObserver_aff(); if (siteData.viewMode == 1) toggleImgMode(); } else { fun.showMsg(displayLanguage.str_20); } }, immediateInsertImg: async () => { await fun.delay(siteData.insertImg[2] || 200); let selector = siteData.imgs; let imgsSrcArray = await getImgs(selector); fun.insertImg(imgsSrcArray, siteData.insertImg[0], siteData.insertImg[1]); }, ge: (selector, domNode) => /^\//.test(selector) ? (domNode || document).evaluate(selector, (domNode || document), null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue : (domNode || document).querySelector(selector), gae: (selector, domNode) => { if (/^\//.test(selector)) { let nodes = []; let results = (domNode || document).evaluate(selector, (domNode || document), null, XPathResult.ANY_TYPE, null); let node; while (node = results.iterateNext()) { nodes.push(node); } return nodes; } else { return (domNode || document).querySelectorAll(selector); } }, geT: (ele, mode = 1, doc = document) => { try { if (mode == 1) return fun.ge(ele, doc).innerText; if (mode == 2) return fun.ge(ele, doc).previousElementSibling.innerText; if (mode == 3) return fun.ge(ele, doc).previousElementSibling.previousElementSibling.innerText; } catch (error) { console.error("\nfun.geT() ERROR\n", error); return null; } }, attr: (ele, attr, doc = document) => fun.ge(ele, doc).getAttribute(attr), run: code => new Function("return " + code)(), doc: str => new DOMParser().parseFromString(str, "text/html"), xml: str => new DOMParser().parseFromString(str, "text/xml"), title: (str, mode = 0, doc = document) => { let split = doc.title.replace(/漫画|\s-\s(漫本|奇漫屋|漫画星球|6漫画)|\[\d+p(\d+v)?\]/gi, "").split(str); try { if (mode == 0) return doc.title.replace(str, "").trim(); if (mode == 1) return split[0].replace(/,$/g, "").replace(/,/g, " ").trim(); if (mode == 2) return (split[0] + str + split[1]).replace(/,$/g, "").replace(/,/g, " ").trim(); if (mode == 3) return (split[1] + str + split[0]).replace(/,$/g, "").replace(/,/g, " ").trim(); } catch (error) { console.error("\nfun.title() ERROR", error); return doc.title; } }, arr: num => new Array(parseInt(num, 10)).fill(), showMsg: (text, time = 1000) => { let msg = fun.ge(".FullPictureLoadMsg"); if (fun.ge(".FullPictureLoadMsg[style]")) msg.removeAttribute("style"); msg.innerText = text; if (time > 0) { setTimeout(() => fun.hideMsg(), time); } }, hideMsg: () => { if (!fun.ge(".FullPictureLoadMsg[style]")) { let msg = fun.ge(".FullPictureLoadMsg"); msg.innerText = "none"; msg.style.display = "none"; } }, imagesObserver: new IntersectionObserver((entries, observer) => { entries.forEach(entry => { if (entry.isIntersecting) { observer.unobserve(entry.target); let realSrc = entry.target.dataset.src; let nE = entry.target.nextElementSibling; let fancyboxE = entry.target.parentNode; let fancyboxNE = null; if (fancyboxE && fancyboxE.tagName == "A") fancyboxNE = fancyboxE.nextElementSibling; if (realSrc) { entry.target.src = realSrc; entry.target.onload = () => { if (!/^data/.test(entry.target.src)) entry.target.classList.remove("error"); }; entry.target.onerror = async (error) => { if (errorNum > 100) return; if (!/e-hentai\.org|exhentai\.org/.test(location.host)) errorNum += 1; if (/www\.yinghuamh\.net/.test(location.host)) { error.target.dataset.src = error.target.dataset.src.replace(Gm.getMediaHost(media), media); } if (/e-hentai\.org|exhentai\.org/.test(location.host)) { let url = error.target.dataset.loadfail ?? [...fun.gae(".gdtm a,.gdtl a")][error.target.dataset.index].href; let newSrc = await fun.fetchDoc(url).then(async doc => { let loadfail = fun.ge("#loadfail", doc); let newUrl = url.replace(/\?nl=.+$/, "") + "?nl=" + loadfail.getAttribute("onclick").split("'")[1]; error.target.dataset.loadfail = newUrl; return await fun.fetchDoc(newUrl).then(newDoc => { let src = fun.ge("#img", newDoc).src; if (fancyboxE && fancyboxE.tagName == "A") fancyboxE.href = src; return src; }); }); error.target.dataset.src = newSrc; } error.target.src = loading_bak; error.target.classList.add("error"); setTimeout(() => { if (/www\.yinghuamh\.net/.test(location.host)) { debug(`\nimagesObserver 樱花漫画圖片出錯 重新載入另一個圖片伺服器的圖片網址:\n${realSrc}\nto\n${error.target.dataset.src}`); } else if (/e-hentai\.org|exhentai\.org/.test(location.host)) { debug(`\nimagesObserver E紳士圖片出錯 重新載入新的圖片網址:\n${realSrc}\nto\n${error.target.dataset.src}`); } else { debug(`\nimagesObserver重新載入出錯圖片:\n${realSrc}`); } error.target.src = error.target.dataset.src; }, 1000); }; } if (nE && nE.tagName == "IMG" && nE.dataset.src) nE.src = nE.dataset.src; if (fancyboxNE && fancyboxNE.tagName == "A") { let ele = fancyboxNE.firstElementChild; if (ele && ele.tagName == "IMG" && ele.dataset.src) ele.src = ele.dataset.src; } } }); }), comicNextObserver: new IntersectionObserver((entries, observer) => { entries.forEach(entry => { if (entry.isIntersecting) { observer.unobserve(entry.target); if (nextLink) { const comicSpaceClickNext = () => { let click = 0; const callback = event => { if (event.keyCode == 32) { click += 1; if (click >= 5) { document.removeEventListener("keydown", callback); fun.showMsg(displayLanguage.str_34); location.href = nextLink; } } }; document.addEventListener("keydown", callback); }; comicSpaceClickNext(); } } }); }), addFullPictureLoadMsg: () => { let div = document.createElement("div"); div.className = "FullPictureLoadMsg"; div.style.display = "none"; div.innerText = "none"; document.body.appendChild(div); }, css: css => { let style = document.createElement("style"); style.type = "text/css"; style.className = "FullPictureLoadStyle"; style.innerHTML = css; document.head.appendChild(style); }, script: async (code, src = 0, pos = 0, doc = document) => { let script = document.createElement("script"); script.className = "FullPictureLoadScript"; if (src == 0) { script.type = "text/javascript"; script.innerHTML = code; } if (src == 0 && pos == 0) { return script; } else if (pos == 1) { if (src == 1) { await new Promise(resolve => { script.src = code; doc.body.appendChild(script); script.onload = () => { resolve(); } }); } else { doc.body.appendChild(script); } } }, delay: (time, msg = 1) => { if (time > 200 && msg == 1) fun.showMsg(`${displayLanguage.str_21}${time}${displayLanguage.str_22}...`, time); return new Promise(resolve => { setTimeout(resolve, time); }); }, waitEle: (ele, max = 200, doc = document) => { let loopNum = 0; return new Promise(resolve => { let loop = setInterval(() => { loopNum += 1; if (!!fun.ge(ele, doc) === true) { clearInterval(loop); resolve(true); } if (loopNum >= max) { clearInterval(loop); debug(`fun.waitEle()達循環上限,沒有出現"${ele}"元素。`); resolve(false); } }, 100); }); }, waitVar: (declares, max = 200) => { let loopNum = 0; return new Promise(resolve => { let loop = setInterval(() => { loopNum += 1; //console.log("typeof unsafeWindow[declares]", typeof unsafeWindow[declares]); if (typeof unsafeWindow[declares] != "undefined") { clearInterval(loop); resolve(true); } if (loopNum >= max) { clearInterval(loop); debug(`fun.waitVar()達循環上限,沒有出現"${declares}"變量。`); resolve(false); } }, 100); }); }, checkImgStatus: (src, msg = null) => { if (msg != 0) fun.showMsg(msg || displayLanguage.str_56, 0); return new Promise(resolve => { let temp = new Image(); temp.src = src; temp.onload = () => { fun.hideMsg(); resolve({ ok: true, src: src, width: temp.width, height: temp.height }); } temp.onerror = () => { fun.hideMsg(); resolve({ ok: false, src: src }); } }); }, checkDownloadThread: () => { return new Promise(resolve => { let loop = setInterval(() => { if (currentDownloadThread <= options.threading) { clearInterval(loop); resolve(); } }, 50); }); }, xhr: (url, type = "text", referer = siteUrl, ua = navigator.userAgent) => { return new Promise((resolve, reject) => { _GM_xmlhttpRequest({ method: "GET", url: url, responseType: type, headers: { "Referer": referer, "User-Agent": ua }, onload: data => { if (data.status > 400) debug(`\nfun.xhr()連線錯誤碼:${data.status}\n`, url); resolve(data.response); }, onerror: error => { reject(error); } }); }); }, xhrHEAD: url => { return new Promise(resolve => { _GM_xmlhttpRequest({ method: "HEAD", url: url, timeout: 20000, onload: data => { resolve(data); }, onerror: error => { console.log(`fun.xhrHEAD() ERROR\n${url}`, error); resolve({ status: 403 }); }, ontimeout: error => { console.log(`fun.xhrHEAD() Timeout\n${url}`, error); resolve({ status: 524 }); } }); }); }, imxXHR: url => { return new Promise((resolve, reject) => { _GM_xmlhttpRequest({ method: "POST", url: url, responseType: "document", headers: { "content-type": "application/x-www-form-urlencoded" }, data: "imgContinue=Continue+to+image+...+", onload: data => { resolve(data.response); }, onerror: error => { reject(error); } }); }); }, imageBamXHR: url => { return new Promise((resolve, reject) => { _GM_xmlhttpRequest({ method: "GET", url: url, responseType: "document", headers: { "referrer": url, "referrerPolicy": "strict-origin-when-cross-origin" }, onload: data => { resolve(data.response); }, onerror: error => { reject(error); } }); }); }, xhrDoc: (url, referer = siteUrl, ua = navigator.userAgent) => { return new Promise((resolve, reject) => { _GM_xmlhttpRequest({ method: "GET", url: url, responseType: "arraybuffer", headers: { "Referer": referer, "User-Agent": ua }, onload: data => { if (data.status >= 400) { debug(`\nfun.xhrDoc()連線錯誤碼:${data.status}\n`, url); let obj = { fn: "fun.xhrDoc()", url: url, status: data.status }; fetchErrorArray.push(obj); } let decoder = new TextDecoder(document.characterSet || document.charset || document.inputEncoding); let htmlText = decoder.decode(data.response); let doc = fun.doc(htmlText); resolve(doc); }, onerror: error => { reject(error); } }); }); }, fetchDoc: (url, retry = 10) => { return fetch(url).then(async res => { if (res.status >= 400 && retry > 0) { let resData = await fun.retryUrl(url, res, "fun.fetchDoc()", retry); if (resData !== null) return resData; } return res.arrayBuffer(); }).then(buffer => { const decoder = new TextDecoder(document.characterSet || document.charset || document.inputEncoding); const htmlText = decoder.decode(buffer); return fun.doc(htmlText); }); }, getImhentaiSrc: async () => { await fun.waitVar("g_th"); const findExt = i => { const c = unsafeWindow.g_th[i][0]; if (c === "p") return ".png"; if (c === "b") return ".bmp"; if (c === "g") return ".gif"; return ".jpg"; }; const findServer = cId => { if (cId > 0 && cId <= 274825) return "m1.imhentai.xxx"; if (cId > 274825 && cId <= 403818) return "m2.imhentai.xxx"; if (cId > 403818 && cId <= 527143) return "m3.imhentai.xxx"; if (cId > 527143 && cId <= 632481) return "m4.imhentai.xxx"; if (cId > 632481 && cId <= 816010) return "m5.imhentai.xxx"; if (cId > 816010 && cId <= 970098) return "m6.imhentai.xxx"; if (cId > 970098 && cId <= 1121113) return "m7.imhentai.xxx"; return "m8.imhentai.xxx"; }; const galleryId = fun.ge(".gview>#gallery_id,#load_id").value; const imageDir = fun.ge('#image_dir,#load_dir').value; const num = fun.ge('#pages,#load_pages').value ?? ""; const cId = parseInt(fun.ge('#u_id,#load_dir+#gallery_id').value ?? "", 10); const randomServer = unsafeWindow.random_server ?? findServer(cId); return fun.arr(num).map((_, i) => `//${randomServer}/${imageDir}/${galleryId}/${(i + 1)}${findExt(i + 1)}`); }, getKukudmSrc: async (url = siteUrl, doc = document, msg = 1) => { if (fun.ge("//title[contains(text(),'404')]", doc)) return []; getImgFn += " > fun.getKukudmSrc()"; let timeId = setTimeout(() => location.reload(), 20000); if (msg == 1) fun.showMsg(displayLanguage.str_05, 0); let max; fun.ge("//td[input]", doc) ? max = fun.geT("//td[input]", 1, doc).match(/共(\d+)/)[1] : max = fun.geT(".bottom .subNav", 1, doc).match(/\/(\d+)/)[1]; url = url.replace(/1\.htm$/, ""); let links = fun.arr(max).map((_, i) => url + (i + 1) + ".htm"); let fetchNum = 0; let resArr = links.map(url => { return fun.fetchDoc(url).then(doc => { if (msg == 1) fun.showMsg(`${displayLanguage.str_06}${fetchNum+=1}/${links.length}`, 0); let script = [...doc.scripts].find(s => s.innerText.search(/document\.write/) > -1).innerText; let arr = script.split("'><"); let host0, pathArr0, pathArr1, pathArr2; if (arr.length == 1) { let arr = script.split(`"+server+"`); if (arr.length == 2) { host0 = fun.run("server"); pathArr0 = arr[1].replace(/(\.[a-z]+).+/i, "$1").replace("\n", ""); } else { return null; } } else if (arr.length == 3) { let arr = script.split("+"); if (arr.length == 3) { host0 = fun.run(arr[1]); pathArr0 = arr[2].split("><")[0].slice(1, -1); } else { return null; } } else if (arr.length == 4) { pathArr1 = arr[0].split("/"); pathArr2 = arr[2].split("/"); } else if (arr.length == 5) { pathArr1 = arr[1].split("/"); pathArr2 = arr[3].split("/"); } else { return null; } if (arr.length == 1 || arr.length == 3) { let src0 = host0 + pathArr0; return src0; } else { let host1 = fun.run(pathArr1[0].split("+")[1]); let host2 = fun.run(pathArr2[0].split("+")[1]); pathArr1[0] = pathArr1[0].match(/\w+$/)[0]; pathArr2[0] = pathArr2[0].match(/\w+$/)[0]; let src1 = host1 + pathArr1.join("/"); let src2 = host2 + pathArr2.join("/"); return { src1: src1, src2: src2 }; } }); }); let allSrc = await Promise.all(resArr).then(arr => { clearTimeout(timeId); if (msg == 1) fun.hideMsg(); return arr; }); //debug("\nfun.getKukudmSrc() > allSrc\n", allSrc); try { if (typeof allSrc[0] === "string") { return allSrc; } else { let obj = await fun.checkImgStatus(allSrc[0].src1, msg == 1 ? null : 0); if (obj.ok) { return allSrc.map(e => e.src1); } else { return allSrc.map(e => e.src2); } } } catch (e) { return []; } }, remove: (ele, time = 0) => setTimeout(() => [...fun.gae(ele)].forEach(e => e.remove()), time), addUrlHtml: (url, ele, pos, text = "點選進入下一話") => { let _pos; switch (pos) { case 0: _pos = "beforebegin"; //在元素之前。 break; case 1: _pos = "afterend"; //在元素之後。 break; case 2: _pos = "beforeend"; //在元素裡面,最後一個子元素之後。 break; case 3: _pos = "afterbegin"; //在元素裡面,第一個子元素之前。 break; } let html = `<div style="padding: 20px 0; text-align: center;"><a href="${url}"style="font-size: 26px;line-height: 50px;height: 50px;text-align: center;">${text}</a></div>`; fun.ge(ele).insertAdjacentHTML(_pos, html); }, dataURLtoBlobURL: dataurl => { let arr = dataurl.split(","), mime = arr[0].match(/:(.*?);/)[1], bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n); while (n--) { u8arr[n] = bstr.charCodeAt(n); } return URL.createObjectURL(new Blob([u8arr], { type: mime })); }, imgSrcToDataURL: (src, type = "image/jpeg", cros = 0) => { return new Promise((resolve, reject) => { let img = new Image(); img.src = src; if (cros == 1) img.setAttribute("crossOrigin", ""); img.onload = () => { let canvas = document.createElement("canvas"); canvas.height = img.naturalWidth; canvas.width = img.naturalHeight; canvas.getContext("2d").drawImage(img, 0, 0); URL.revokeObjectURL(img.src); let dataURL = canvas.toDataURL(type); resolve(dataURL); }; img.onerror = error => { reject(error); } }); }, imgSrcToBlobURL: (src, type = "image/jpeg", cros = 0) => { return new Promise((resolve, reject) => { let img = new Image(); img.src = src; if (cros == 1) img.setAttribute("crossOrigin", ""); img.onload = () => { const canvas = new OffscreenCanvas(img.naturalWidth, img.naturalHeight); canvas.getContext("2d").drawImage(img, 0, 0); URL.revokeObjectURL(img.src); canvas.convertToBlob({ type: type, quality: 1 }).then(blob => { let blobURL = URL.createObjectURL(blob); resolve(blobURL); }); }; img.onerror = error => { reject(error); } }); }, imgToBlobURL: (img, type = "image/jpeg", quality = 1) => { const canvas = new OffscreenCanvas(img.naturalWidth, img.naturalHeight); canvas.getContext("2d").drawImage(img, 0, 0); return canvas.convertToBlob({ type: type, quality: quality }).then(blob => URL.createObjectURL(blob)); }, imgBlobArr: async (selector, type = "image/jpeg", quality = 1) => { fun.showMsg(displayLanguage.str_53, 0); await fun.delay(200, 0); let num = 0; let imgs = await [...fun.gae(selector)].map(async (img, index, arr) => { let blobUrl = await fun.imgToBlobURL(img, type, quality); fun.showMsg(`drawImage ${num += 1}/${arr.length}`, 0); return blobUrl; }); fun.hideMsg(); return imgs; }, blobToDataURL: blob => { return new Promise(resolve => { const reader = new FileReader(); reader.readAsDataURL(blob); reader.onload = () => { resolve(reader.result); } }); }, blobToJpgBlob: async blob => { let img = new Image(); img.src = URL.createObjectURL(blob); await new Promise((resolve, reject) => (img.onload = resolve, img.onerror = reject)); const canvas = new OffscreenCanvas(img.width, img.height); canvas.getContext("2d").drawImage(img, 0, 0); URL.revokeObjectURL(img.src); return canvas.convertToBlob({ type: "image/jpeg", quality: 1 }); }, scrollEles: async (ele, ms = 100) => { let eles = [...fun.gae(ele)]; for (let i in eles) { eles[i].scrollIntoView({ behavior: "smooth", block: "end" }); await fun.delay(ms, 0); } }, aotoScrollEles: async (selector, callback, time = 5000) => { let n = 0; let timeout = false; const autoScrollIntoView = async (arr, num) => { for (let i = 0; i < arr.length; i++) { fun.showMsg(`AutoScroll ${n += 1}/${num}`, 0); await new Promise(resolve => { let timeId = setTimeout(() => { timeout = true; clearInterval(loop); resolve(); }, time); let loop = setInterval(async () => { arr[i].scrollIntoView(); if (await callback(arr[i])) { clearTimeout(timeId); clearInterval(loop); resolve(); } }, 100); }); if (timeout) break; } fun.hideMsg(); if (timeout) fun.showMsg("Timeout"); }; let imgs = [...fun.gae(selector)]; await autoScrollIntoView(imgs, imgs.length); let newImgs = [...fun.gae(selector)]; if (imgs.length < newImgs.length) { newImgs = newImgs.slice(imgs.length); autoScrollIntoView(newImgs, imgs.length + newImgs.length); } }, openInTab: (url, target = "_blank") => { let a = document.createElement("a"); a.href = url; a.target = target; a.style = "display: none;"; document.body.appendChild(a); a.click(); a.remove(); }, CivitAiAutoShowNSFW: () => { const unBlur = async () => { if (/\/posts\/|\/models\//.test(siteUrl)) { let ele = [...fun.gae(".mantine-1pj0akd,.mantine-1a9x8zw,.mantine-qwgpbp,.mantine-1m05dul,.mantine-1gtzxoj,.mantine-7cmpjr,.mantine-hdmzgx,.mantine-10dlb,.mantine-17xqhym,.mantine-1ll12xr,.mantine-1ge3iyn,.mantine-1jb75iu,.mantine-5ix9q9,.mantine-1p64zh1,.mantine-k1f4y4,.mantine-kg33jb")][0]; let elePath = fun.ge("span+svg>path", ele); if (elePath) { let d = elePath.getAttribute("d"); if (d == "M10 12a2 2 0 1 0 4 0a2 2 0 0 0 -4 0") { ele.click(); //elementClick(ele); } await fun.delay(200); } } [...fun.gae(".mantine-1pj0akd,.mantine-1a9x8zw,.mantine-qwgpbp,.mantine-1m05dul,.mantine-1gtzxoj,.mantine-7cmpjr,.mantine-hdmzgx,.mantine-10dlb,.mantine-17xqhym,.mantine-1ll12xr,.mantine-1ge3iyn,.mantine-1jb75iu,.mantine-5ix9q9,.mantine-1p64zh1,.mantine-k1f4y4,.mantine-kg33jb")].forEach(ele => { let elePath = fun.ge("span+svg>path", ele); if (elePath) { let d = elePath.getAttribute("d"); if (d == "M10 12a2 2 0 1 0 4 0a2 2 0 0 0 -4 0") { ele.click(); //elementClick(ele); } } }); }; new MutationObserver(unBlur).observe(document.body, { childList: true, subtree: true, attributes: true }); unBlur(); }, scrollEvent: slideIndex => { let modeName = "Samll"; switch (viewMode) { case 0: modeName = "Original"; break; case 1: modeName = "Samll"; break; default: console.error("模式错误"); break; } debug(`\nfun.scrollEvent() > imgLocation${modeName}_` + slideIndex); let elementById = document.getElementById(`imgLocation${modeName}_` + slideIndex); if (elementById) { elementById.scrollIntoView({ block: "center", behavior: "smooth", inline: "center", }); } else { console.error(" # ", "未定位id!"); } }, clearAllTimer: (mode = 0) => { let debuggerStr = ` if ((() => {}).constructor === Function) Function.prototype.constructor = () => {}; `; if (mode == 0 || mode == 1) new Function(debuggerStr)(); let endTidStr = ` let endTid = setTimeout(() => {}); for (let i = 0; i <= endTid; i++) { clearTimeout(i); } `; if (mode == 0 || mode == 2) { new Function(endTidStr)(); let endTid = setTimeout(() => {}); for (let i = 0; i <= endTid; i++) { clearTimeout(i); } } let endIidStr = ` let endIid = setInterval(() => {}); for (let i = 1; i <= endIid; i++) { clearInterval(i); } `; if (mode == 0 || mode == 3) { new Function(endIidStr)(); let endIid = setInterval(() => {}); for (let i = 1; i <= endIid; i++) { clearInterval(i); } } } }; const ge = selector => document.querySelector(selector); const gae = selector => document.querySelectorAll(selector); const gx = xpath => document.evaluate(xpath, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue; const gax = xpath => { let nodes = []; let results = document.evaluate(xpath, document, null, XPathResult.ANY_TYPE, null); let node; while (node = results.iterateNext()) { nodes.push(node); } return nodes; }; const getNum = (i, padStart = 4) => { let n = parseInt(i, 10) + 1; let picNum = String(n).padStart(padStart, "0"); return picNum; }; const showMsg = (text, time = 1000) => { ge(".FullPictureLoadMsg").removeAttribute("style"); ge(".FullPictureLoadMsg").innerText = text; setTimeout(() => { ge(".FullPictureLoadMsg").innerText = "none"; ge(".FullPictureLoadMsg").style.display = "none"; }, time); }; const getDataMsg = (text, picNum, imgsNum) => { if (picNum != "none") fun.showMsg(`${displayLanguage.str_23}${downloadNum += 1}/${imgsNum}${displayLanguage.str_24}${text}`, 0); }; const getReferer = srcUrl => { let referer; if (/vipr\.im/.test(srcUrl) || siteData.referer == "src") { referer = srcUrl; } else if (typeof siteData.referer == "string" || siteData.referer == "") { referer = siteData.referer; } else { referer = siteUrl; } return referer; }; const Fetch_API_GetData = (srcUrl, picNum = "none", imgsNum = "none") => { currentDownloadThread++; return new Promise(resolve => { fetch(srcUrl, { referrer: getReferer(srcUrl) }).then(res => res.blob()).then(blob => { currentDownloadThread--; getDataMsg(displayLanguage.str_25, picNum, imgsNum); resolve({ load: "下載成功", blob: blob, picNum: picNum }); }).catch(error => { currentDownloadThread--; resolve({ error: "下載錯誤", picNum: picNum, src: srcUrl, errorLog: error }); getDataMsg(displayLanguage.str_26, picNum, imgsNum); console.error(`Fetch_API_GetData() Error: ${error}`); }); }) }; const GM_XHR_GetData = (srcUrl, picNum = "none", imgsNum = "none") => { currentDownloadThread++; return new Promise(resolve => { _GM_xmlhttpRequest({ method: "GET", url: srcUrl, responseType: "blob", headers: { origin: location.origin, referer: getReferer(srcUrl), accept: "*/*" }, onload: data => { currentDownloadThread--; let blob = data.response; //debug("GM blob", blob); if (blob.type == "application/octet-stream" || blob.type == "binary/octet-stream") { resolve({ load: "下載成功", blob: blob, picNum: picNum }); getDataMsg(displayLanguage.str_25, picNum, imgsNum); } else if (/^image|^video|text\/base64\.jpg/.test(blob.type)) { resolve({ load: "下載成功", blob: blob, picNum: picNum }); getDataMsg(displayLanguage.str_25, picNum, imgsNum); } else { let htmlText = "none"; if (/text\/html/.test(blob.type)) { htmlText = blob.text(); } resolve({ htmlText: htmlText, blob: blob, error: "下載錯誤", picNum: picNum, src: srcUrl }); getDataMsg(displayLanguage.str_26, picNum, imgsNum); } }, onerror: error => { currentDownloadThread--; resolve({ error: "下載錯誤", picNum: picNum, src: srcUrl, errorLog: error }); getDataMsg(displayLanguage.str_26, picNum, imgsNum); console.error(`GM_XHR_GetData() Error: ${error}`); } }); }); }; const saveData = (blob, fileName) => { let a = document.createElement("a"); a.href = URL.createObjectURL(blob); a.download = fileName; document.body.appendChild(a); a.click(); a.remove(); setTimeout(() => { URL.revokeObjectURL(blob); }, 1000); }; const checkGeting = () => { if (downloading) { alert(displayLanguage.str_48); return true; } if (fetching) { alert(displayLanguage.str_49); return true; } return false; }; const getImgs = async selector => { fetching = true; let imgs; if (ge(".FullPictureLoadImage") && siteData.repeat != 1) { imgs = [...gae(".FullPictureLoadImage:not(.small)")]; } else if (typeof selector == "function") { imgs = await selector(); if (getImgFn == "") getImgFn += " > " + siteData.name + "專用Fn"; } else if (!selector || selector === "") { showMsg(displayLanguage.str_41); return; } else if (selector.length < 3) { showMsg(displayLanguage.str_42); return; } else if (/^js;/.test(selector)) { imgs = await new Function("siteData", "fun", '"use strict";' + selector.slice(3))(siteData, fun); debug("\ngetImgs(selector) JSimgs:", imgs); if (getImgFn == "") getImgFn += " > " + siteData.name + "專用Fn"; } else if (/^\//.test(selector)) { imgs = [...gax(selector)]; getImgFn += " > [...gax(selector)]"; } else { imgs = [...gae(selector)]; getImgFn += " > [...gae(selector)]"; } imgs = await Promise.all(imgs); //取出new Promise的值 imgs = imgs.filter(item => item); //去除空、無用 let imgsSrcArr = imgs.map(img => { let check = fun.checkImgSrc(img); if (check.ok) { return check.src; } else { console.error("\ngetImgs() imgs 格式錯誤!", img); return null; } }).filter(item => item); debug(`\ngetImgs()${getImgFn} 所有圖片網址:`, imgsSrcArr); debug(`\ngetImgs()${getImgFn} 去重複後的圖片網址:`, [...new Set(imgsSrcArr)]); imgsSrcArr = [...new Set(imgsSrcArr)]; globalImgArray = imgsSrcArr; fetching = false; return imgsSrcArr; }; const startAutoDownload = async () => { let autoDownload = siteData.autoDownload; let next = siteData.next; if (!autoDownload) return; let ele; typeof next === "function" ? ele = await next() : ele = fun.ge(next); if (ele && siteData.autoDownload[0] == 1 || ele && options.autoDownload == 1) { let max = siteData.autoDownload[1] || options.autoDownloadCountdown; let countdownNum = max; fun.showMsg(`${displayLanguage.str_32}${max}${displayLanguage.str_33}`, 0); for (let i = 1; i < max; i++) { setTimeout(() => fun.showMsg(`${displayLanguage.str_32}${countdownNum-=1}${displayLanguage.str_33}`, 0), i * 1000); } setTimeout(() => { if (typeof next === "function") { fun.showMsg(displayLanguage.str_34); location.href = ele; } else { fun.showMsg(displayLanguage.str_35); ele.click(); } }, max * 1000); } else if (!ele && siteData.autoDownload[0] == 1 || !ele && options.autoDownload == 1) { fun.showMsg(displayLanguage.str_36, 0); options.autoDownload = 0; let jsonStr = JSON.stringify(options); localStorage.setItem("FullPictureLoadOptions", jsonStr); } }; const imgZipDownload = async () => { if (checkGeting() || ge("#FullPictureLoadOptions:not([style])")) return; let selector, titleText; if (fastDownload) { typeof siteData.imgs == "function" ? selector = siteData.imgs : selector = options.default; titleText = (customTitle || document.title.replace(/\[\d+p(\d+v)?\]|【\d+P】/i, "").replace(/[\/\?<>\\:\*\|":]/g, " ").trim()); } else { if (!siteData.autoDownload || siteData.autoDownload && siteData.autoDownload[0] != 1 && options.autoDownload != 1) { //typeof siteData.imgs == "function" ? selector = siteData.imgs : await prompt(displayLanguage.str_50, options.default); typeof siteData.imgs == "function" ? selector = siteData.imgs : selector = options.default; titleText = await prompt(displayLanguage.str_51, (customTitle || document.title.replace(/\[\d+p(\d+v)?\]|【\d+P】/i, "").replace(/[\/\?<>\\:\*\|":]/g, " ").trim())); } else if (siteData.autoDownload) { if (siteData.autoDownload[0] == 1 || options.autoDownload == 1) { selector = siteData.imgs; titleText = (customTitle || document.title.replace(/\[\d+p(\d+v)?\]|【\d+P】/i, "").replace(/[\/\?<>\\:\*\|":]/g, " ").trim()); } else { debug("未開啟自動下載"); return; } } } downloading = true; let imgsSrcArr = await getImgs(selector); if (imgsSrcArr.length > 0 && titleText != null && titleText != "") { fun.showMsg(displayLanguage.str_55, 0); const imgsNum = parseInt(imgsSrcArr.length, 10); let title = titleText; const zip = new JSZip(); let zipFolder; let videosNum; if (videosSrcArray.length > 0 && siteData.downloadVideo && siteData.downloadVideo == true) { videosNum = parseInt(videosSrcArray.length, 10); zipFolder = zip.folder(`${title} [${imgsNum}P + ${videosNum}V]`); } else { zipFolder = zip.folder(`${title} [${imgsNum}P]`); } const padStart = String(imgsSrcArr.length).length; for (let i = 0; i < imgsSrcArr.length; i++) { let picNum = getNum(i, padStart); let promiseBlob; await fun.checkDownloadThread(); siteData.fetch == 1 ? promiseBlob = Fetch_API_GetData(imgsSrcArr[i], picNum, imgsNum) : promiseBlob = GM_XHR_GetData(imgsSrcArr[i], picNum, imgsNum); promiseBlobArray.push(promiseBlob); } if (videosSrcArray.length > 0 && siteData.downloadVideo && siteData.downloadVideo == true) { const padStart = String(videosNum).length; for (let i = 0; i < videosSrcArray.length; i++) { let videoNum = getNum(i, padStart); let promiseBlob; await fun.checkDownloadThread(); siteData.fetch == 1 ? promiseBlob = Fetch_API_GetData(videosSrcArray[i], videoNum, imgsNum + videosNum) : promiseBlob = GM_XHR_GetData(videosSrcArray[i], videoNum, imgsNum + videosNum); promiseBlobArray.push(promiseBlob); } } debug("\nPromiseBlobArray:", promiseBlobArray); Promise.all(promiseBlobArray).then(async data => { debug("\nPromiseAllData:", data); let blobDataArray = data.filter(item => item.load); //成功下載 let errorDataArray = data.filter(item => item.error); //下載錯誤 debug("\nNewDataArray:", blobDataArray); debug("\nErrorDataArray:", errorDataArray); if (errorDataArray.length > 0) { options.autoDownload = 0; let jsonStr = JSON.stringify(options); localStorage.setItem("FullPictureLoadOptions", jsonStr); downloadNum = 0; downloading = false; let yes = await confirm(`${displayLanguage.str_27}${errorDataArray.length}${displayLanguage.str_28}${displayLanguage.str_29}`); if (!yes) { promiseBlobArray = []; blobDataArray = null; errorDataArray = null; return; } } if (blobDataArray.length > 0) { for (let i = 0; i < blobDataArray.length; i++) { let ex; let blobData = blobDataArray[i].blob; let type = blobData.type; try { if (/octet-stream/.test(type) /* || type == "image/webp"*/ ) { blobData = await fun.blobToJpgBlob(blobData); ex = "jpg"; } else if (/^text\/base64\.jpg/.test(type)) { ex = "jpg"; } else { ex = type.split("/")[1].match(/\w+/)[0]; } } catch (e) { if (/^image/.test(type)) { ex = "jpg"; } else { console.error("\nimgZipDownload() PromiseAll blob資料格式錯誤", blobDataArray); fun.showMsg(displayLanguage.str_30, 0); return; } } let fileName; ex == "mp4" ? fileName = `${blobDataArray[i].picNum}V.${(ex)}` : fileName = `${blobDataArray[i].picNum}P.${(siteData.ex || ex)}`; if (options.zip == 1) { //console.log(`第${n}/${blobDataArray.length}張,檔案名:${fileName},大小:${parseInt(blobDataArray[i].blob.size / 1024, 10)} Kb`); zipFolder.file(fileName, blobData, { binary: true }); } else { saveData(blobData, title + "_" + fileName); await fun.delay(200, 0); if (i === blobDataArray.length - 1) { promiseBlobArray = []; downloadNum = 0; downloading = false; fun.hideMsg(); startAutoDownload(); } } } if (options.zip == 1) { zip.generateAsync({ type: "blob" }, (metadata) => { fun.showMsg(displayLanguage.str_31 + metadata.percent.toFixed(2) + " %", 0); }).then(async data => { debug("\nZIP壓縮檔數據:", data); let fileName; if (videosSrcArray.length > 0 && siteData.downloadVideo && siteData.downloadVideo == true) { fileName = `${title} [${imgsNum}P + ${videosNum}V].${options.file_extension}`; } else { fileName = `${title} [${imgsNum}P].${options.file_extension}`; } saveData(data, fileName); promiseBlobArray = []; downloadNum = 0; downloading = false; fun.hideMsg(); startAutoDownload(); }); } } else { promiseBlobArray = []; downloadNum = 0; downloading = false; showMsg(displayLanguage.str_43); return; } }); } else { downloading = false; showMsg(displayLanguage.str_41); return; } }; const exportImgSrcText = async () => { if (checkGeting() || ge("#FullPictureLoadOptions:not([style])")) return; let selector; typeof siteData.imgs == "function" ? selector = siteData.imgs : selector = options.default; let srcArr = await getImgs(selector); if (srcArr.length == 0) { showMsg(displayLanguage.str_44); return; } let titleText = (customTitle || document.title); let fileName = `${titleText}_MediaURLs.txt`; if (videosSrcArray.length > 0) srcArr = srcArr.concat(videosSrcArray); let str = srcArr.join("\n"); let blob = new Blob([str], { type: "text/plain", endings: "native" }); saveData(blob, fileName); showMsg(`${displayLanguage.str_101}`); }; const copyImgSrcText = async () => { if (checkGeting() || ge("#FullPictureLoadOptions:not([style])")) return; let selector; typeof siteData.imgs == "function" ? selector = siteData.imgs : selector = options.default; let srcArr = await getImgs(selector); siteData.insertImg ? debug("手動插入圖片") : debug("複製網址"); if (srcArr.length == 0) { showMsg(displayLanguage.str_44); return; } if ((!fun.ge(".FullPictureLoadImage") && siteData.insertImg) || siteData.repeat == 1) { fun.insertImg(srcArr, siteData.insertImg[0], siteData.insertImg[1]); return; } if (videosSrcArray.length > 0) { srcArr = srcArr.concat(videosSrcArray); } let textArr = [customTitle || document.title].concat(srcArr); let str = textArr.join("\n"); console.log(str); copyToClipboard(str); showMsg(`${displayLanguage.str_45}(${textArr.length - 1})`); }; const copyToClipboard = text => { if (navigator.clipboard && window.isSecureContext) { return navigator.clipboard.writeText(text); } else { let textArea = document.createElement("textarea"); textArea.value = text; textArea.style.position = "absolute"; textArea.style.opacity = 0; textArea.style.left = "-999999px"; textArea.style.top = "-999999px"; document.body.appendChild(textArea); textArea.focus(); textArea.select(); return new Promise((res, rej) => { document.execCommand("copy") ? res() : rej(); textArea.remove(); }); } }; const goToNo1Img = (time = 1000) => { if (ge("#FullPictureLoadOptions:not([style])")) return; let ele; ge("#FullPictureLoadImgBox:not([style*=none])") ? ele = ge(".FullPictureLoadImage.small") : ele = ge(".FullPictureLoadImage"); if (ele) { if (time != 0) showMsg(displayLanguage.str_46); setTimeout(() => { ele.scrollIntoView({ behavior: "smooth" }); }, time); } }; const goToImg = img => { let ele = null; if (ge("#FullPictureLoadImgBox:not([style*=none])") && img == "first") { ele = ge(".FullPictureLoadImage.small"); } else if (img == "first") { ele = ge(".FullPictureLoadImage:not(.small)"); } if (ge("#FullPictureLoadImgBox:not([style*=none])") && img == "last") { ele = [...gae(".FullPictureLoadImage.small")].pop(); } else if (img == "last") { ele = [...gae(".FullPictureLoadImage:not(.small)")].pop(); } if (ele) ele.scrollIntoView(); }; const autoScrollEles = () => { if (ge("#FullPictureLoadOptions:not([style])")) return; let scrollEle = siteData.scrollEle; if (scrollEle) typeof scrollEle === "function" ? scrollEle() : fun.scrollEles(scrollEle[0], scrollEle[1]); }; const toggleZoom = () => { if (fetching || ge("#FullPictureLoadOptions:not([style])")) return; if (options.zoom <= 10 && ge(".FullPictureLoadImage:not(.small)")) { options.zoom == 0 ? options.zoom = 10 : options.zoom = options.zoom -= 1; if (options.zoom == 0) cancelZoom(); ge("#FullPictureLoadOptionsZoom").value = options.zoom; let jsonStr = JSON.stringify(options); localStorage.setItem("FullPictureLoadOptions", jsonStr); if (options.zoom > 0) { [...gae(".FullPictureLoadImage:not(.small)")].forEach(img => img.style.width = `${options.zoom * 10}%`); fun.showMsg(`${displayLanguage.str_60} ${options.zoom * 10}%`); } } }; let viewMode = 0; const toggleImgMode = async () => { if (fetching || ge("#FullPictureLoadOptions:not([style])")) return; let column; if ([...gae(".FullPictureLoadImage")].length < 1) { fun.showMsg("請先手動插入圖片"); return; } if (ge(".FullPictureLoadImage:not(.small):not([style*=none])")) { if (ge("#FullPictureLoadImgBox")) { ge("#FullPictureLoadImgBox").style.display = "block"; [...gae(".FullPictureLoadImage:not(.small),#FullPictureLoadEnd")].forEach(e => { if (e.tagName == "IMG") { e.setAttribute("style", "display:none!important;"); if (options.zoom > 0) { e.style.width = `${options.zoom * 10}%`; } } else { e.setAttribute("style", "display:none!important;"); } }); viewMode = 1; fun.showMsg(displayLanguage.str_93); return; } let width; if (options.column == 2 || siteData.category == "comic") { width = "48.8%"; column = 2; } else if (options.column == 3) { width = "32%"; column = 3; } else if (options.column == 5) { width = "19.2%"; column = 5; } else if (options.column == 6) { width = "16%"; column = 6; } else { column = 4; hasTouchEvents() ? width = "24%" : width = "24.4%"; } let imgBox = document.createElement("div"); imgBox.id = "FullPictureLoadImgBox"; imgBox.style.width = "100%"; imgBox.style.maxWidth = "1400px"; imgBox.style.backgroundColor = "#F6F6F6"; let srcArr1 = [...gae(".FullPictureLoadImage:not(.small)")].map(e => e.dataset.src ? e.dataset.src : e.src); let srcArr2 = srcArr1.map((item, index, arr) => parseInt(index, 10) % 2 == 0 ? (parseInt(index, 10) + 1) == arr.length ? arr[index] : arr[parseInt(index, 10) + 1] : arr[parseInt(index, 10) - 1]); let srcArr; siteData.category == "comic" || (options.column == 2 && siteData.category == "hcomic") ? srcArr = srcArr2 : srcArr = srcArr1; let padStart = String(srcArr.length).length; let blackList = fancyboxBlackList(); srcArr.forEach((e, i) => { let a = document.createElement("a"); if (options.fancybox == 1 && !blackList) { a.id = "imgLocationSamll_" + i; a.dataset.fancybox = "FullPictureLoadImageSmall"; thumbnailsSrcArray.length > 0 && thumbnailsSrcArray.length == srcArr.length ? a.dataset.thumb = thumbnailsSrcArray[i] : a.dataset.thumb = e; a.href = e; //a.dataset.downloadSrc = e; //a.dataset.downloadFilename = (customTitle || document.title) + `-${String(parseInt(i, 10) + 1).padStart(padStart, "0")}P`; } let img = new Image(); img.alt = `no.${parseInt(i, 10) + 1}`; img.dataset.index = i; img.className = "FullPictureLoadImage small"; if (siteData.insertImg[1] == 1) { img.src = e; } else { img.src = loading_bak; img.dataset.src = e; } if (siteData.referrerpolicy) img.setAttribute("referrerpolicy", siteData.referrerpolicy); fun.imagesObserver.observe(img); let item = document.createElement("div"); item.style.width = width; item.style.height = "auto"; //item.style.float = "left"; item.style.display = "inline-block"; siteData.category == "comic" || (options.column == 2 && siteData.category == "hcomic") ? item.style.verticalAlign = "middle" : item.style.verticalAlign = "top"; item.style.padding = "0.1%"; item.style.border = "1px solid #a0a0a0"; if (options.fancybox == 1 && !blackList) { a.appendChild(img); item.appendChild(a); imgBox.appendChild(item); } else { item.appendChild(img); imgBox.appendChild(item); } }); let tE = fun.ge("#FullPictureLoadEnd"); tE.parentNode.insertBefore(imgBox, tE); if (fun.ge(".FullPictureLoadVideo")) { [...fun.gae(".FullPictureLoadVideo")].forEach(e => tE.parentNode.insertBefore(e, tE)); } if (options.fancybox == 1 && !blackList && !siteData.fancybox) { try { Fancybox.bind("[data-fancybox='FullPictureLoadImageSmall']", FancyboxOptions); } catch (error) { debug("沒有引入FancyboxV5", error); } } tE.parentNode.style.textAlign = "center"; tE.parentNode.style.display = "block"; [...gae(".FullPictureLoadImage:not(.small),#FullPictureLoadEnd")].forEach(e => { if (e.tagName == "IMG") { e.setAttribute("style", "display:none!important;"); if (options.zoom > 0) e.style.width = `${options.zoom * 10}%`; } else { e.setAttribute("style", "display:none!important;"); } }); viewMode = 1; fun.showMsg(displayLanguage.str_93); let imgs = [...gae("#FullPictureLoadImgBox>div")]; if (siteData.category == "comic") { let lastImg = imgs.pop(); fun.comicNextObserver.observe(lastImg); } let imgsNum = 0; if (imgs[0].nextSibling && siteData.category == "comic") { await fun.checkImgStatus(imgs[0].nextSibling.querySelector("img").dataset.src, "Wait Loading..."); if (imgs[0].offsetHeight < imgs[0].nextSibling.offsetHeight) { imgs[0].style.height = (imgs[0].nextSibling.offsetHeight) + "px"; let img = imgs[0].querySelector("img"); await fun.checkImgStatus(img.dataset.src, "Wait Loading..."); let num = (imgs[0].offsetHeight - img.height) / 2; img.style.marginTop = `${num}px`; } imgs[0].scrollIntoView(); } document.addEventListener("keydown", async event => { if (ge("#FullPictureLoadOptions:not([style])")) return; if (event.key == "ArrowUp") { if (ge(".fancybox-container,.fancybox__container")) return; event.preventDefault(); if (imgsNum > 0 && viewMode == 1) { imgsNum -= column; imgs[imgsNum].scrollIntoView(); } } else if (event.key == "ArrowDown") { if (ge(".fancybox-container,.fancybox__container")) return; event.preventDefault(); if (imgsNum < imgs.length && imgsNum != imgs.length && viewMode == 1) { imgsNum += column; try { if (imgs[imgsNum].nextSibling && siteData.category == "comic") { debug(`\n第${parseInt(imgsNum, 10) + 1}張(左)高:${imgs[imgsNum].offsetHeight}\n第${parseInt(imgsNum, 10) + 2}張(右)高:${imgs[imgsNum].nextSibling.offsetHeight}`); await fun.checkImgStatus(imgs[imgsNum].nextSibling.querySelector("img").dataset.src, "Wait Loading..."); if (imgs[imgsNum].offsetHeight < imgs[imgsNum].nextSibling.offsetHeight) { imgs[imgsNum].style.height = (imgs[imgsNum].nextSibling.offsetHeight) + "px"; let img = imgs[imgsNum].querySelector("img"); await fun.checkImgStatus(img.dataset.src, "Wait Loading..."); let num = (imgs[imgsNum].offsetHeight - img.height) / 2; debug(`\n修改了之後\n第${parseInt(imgsNum, 10) + 1}張(左)高:${imgs[imgsNum].offsetHeight}\n第${parseInt(imgsNum, 10) + 2}張(右)高:${imgs[imgsNum].nextSibling.offsetHeight}`); img.style.marginTop = `${num}px`; } } else if (siteData.category == "comic") { imgs[imgsNum].src = imgs[imgsNum].dataset.src; await fun.checkImgStatus(imgs[imgsNum].dataset.src, "Wait Loading..."); } imgs[imgsNum].scrollIntoView(); await fun.delay(200); imgs[imgsNum].scrollIntoView(); } catch (e) { if (siteData.category == "comic" && siteData.next && siteData.insertImg) { if (typeof siteData.next === "string") { let next = fun.ge(siteData.next); if (next) { fun.showMsg(displayLanguage.str_95, 3000); //next.click(); elementClick(next); } else { imgsNum = 0 - column; fun.showMsg(displayLanguage.str_96, 3000); } } else if (typeof siteData.next === "function") { let next = await siteData.next(); if (next) { fun.showMsg(displayLanguage.str_95, 3000); location.href = next; } else { imgsNum = 0; fun.showMsg(displayLanguage.str_96, 3000); } } } else { imgsNum = 0; imgs[0].scrollIntoView(); fun.showMsg(displayLanguage.str_94); } } } } else { imgsNum = 0 - column; } }); } else if (ge(".FullPictureLoadImage.small")) { ge("#FullPictureLoadImgBox").style.display = "none"; [...gae(".FullPictureLoadImage:not(.small),#FullPictureLoadEnd")].forEach(e => e.removeAttribute("style")); if (options.zoom > 0)[...gae(".FullPictureLoadImage:not(.small)")].forEach(img => img.style.width = `${options.zoom * 10}%`); viewMode = 0; fun.showMsg(displayLanguage.str_92); } }; const cancelZoom = () => { if (ge("#FullPictureLoadOptions:not([style])")) return; if (ge(".FullPictureLoadImage:not(.small)")) { options.zoom = 0; ge("#FullPictureLoadOptionsZoom").value = options.zoom; let jsonStr = JSON.stringify(options); localStorage.setItem("FullPictureLoadOptions", jsonStr); [...gae(".FullPictureLoadImage:not(.small)")].forEach(e => e.style.width = ""); fun.showMsg(displayLanguage.str_61); } }; const addFullPictureLoadButton = () => { let img = new Image(); img.id = "FullPictureLoad"; img.className = "FullPictureLoadFixedBtn"; img.src = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAACFlBMVEVEREAAAABEREBEREBUXnFTXXBTXG5VXXJUXHFUW28grV0grV0hrl4hrV0hq10iql0oomAhrV2BiZiAiJd/h5V+h5Uiq16OlaKNlKGMk5+Mkp+KkZ89p28nq2Hp9+/n9u3t8PHs7/Dg9Ojp7O3d8+bo7O3o6+zn6+3m6uzl6evX8OLV8OHi5ujh5efO7dze4uTe4ePb3+LY3eDX29/W2t7T19u35Mu25Mr01lqw4sbz1Vmv4sXA1NWs4cPw0lnv0lmp4MCk3r3ozVuh3buu0M6vz83kylugysefycadx8OexsOdxsOF0qZ6zp5pyJK1p2S0pmOsoGRWv4SLlKEmuZpBsnc5t3AmuJmQi2ont5kmtpcptJiOiWg0tWwytGorr5Yqr5YsrpUws2kqrJRNmpMusmcsqpIuqJMssWkqsWQqsGUnsGUzoI8lsGGAf2wkr2Ekr2BzfI0irl8hrl5ye4x9fGogrWAhrV03mIwgrF9xeoshq10gql8dp2ccp2cdpmkcnIUanIYcm4QRoIUTnoURn4QdmYM/h4QcmIMSnYMXmoMWmoIbloIclYJDgYIYl4EaloAek4IfkYFqbm0jjoBqbW0ni4ApiX9Hd35kanBjaXBhaG9MbnpOanhOaXhPaHdDbXZHanZGanRLZnZJZ3RSYnVMZXRPY3ROY3VSYXRQYnRTYHRVX3NUX3RSYHNUXnNTXXJTXXFME6frAAAAHnRSTlMAAAUGZ2dqeHh7lrzNzc7O3O/09PT19fn5+fn5/f4hZOrvAAAB1UlEQVR42oWTzYoTQRSFv6q6RqOoqBicTTCKK1cOURBGBV9AXCgu9Vl8FF/ApcshI4qKgrtBByZK0HSGmMxkMrF/qq6LTjptErGX5zu3uu65dY3TYCh9ag2UNPsfjnmpZW4MgBbaIy/6PCnxvL7gEQhJ7AruAqifcZ96EHDX67ngKgCJn/k3B6AC1O9Cj9ri/2mBsZIf9iLi0rMFDhhjbO6NsL9er+CQG3pYMT+XuGVmuH9SzPF7S/UONDfUHl44/6A24wfdpMgsSO6tP52ffxjF6cUT056MBdxf/cVRzP6PiQG8KhZMJedhewik0QT43RsBQUEwLufZx53Td85p7wCwEu+Fs6qAGBsA1aO3XUZbG/EAsAJJlM/MGgOoDltdYNTam3JIOlVmOaj2N/sAjHf9lGdBqwACmmi0FU/TOWxfEY483o/9tcuvJBXU+90PaZHf5NtVFzTL+N7bqD4GS9DRmzl3btJWk2WFIKradqX8LfudU3VKBuKd0vwc+HCjNDJhkJXfB6jq+wZJBSAT5MmKN1/la7sJ+jmsiyQrdkZo9N819FNnXcSZFTt1rGnXhl/G6a26IP/YOXczi5prQmFY3snbkzNSXGyBV+28p+nNF+vn2h97PvHD5SOHkgAAAABJRU5ErkJggg=="; img.setAttribute("title", displayLanguage.str_47); img.oncontextmenu = () => false; img.addEventListener("click", () => { fastDownload = false; imgZipDownload(); }); img.addEventListener("mousedown", (event) => { if (event.button == 1) { event.preventDefault(); //goToNo1Img(0); exportImgSrcText(); } if (event.button == 2) { event.preventDefault(); copyImgSrcText(); } }); document.body.appendChild(img); let img2 = new Image(); img2.id = "FullPictureLoadGoToFirstImage"; img2.className = "FullPictureLoadFixedBtn"; img2.style.display = "none"; img2.src = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAA7BJREFUWEetl29olVUYwH/n3jvvGpp/WtNlIdoK1MJazBwO0/mlZqFgRCgGfZC7TTbwixqbMnPiHIIwmdd9MYiMhD4o6gqirenGsoF/MLfaahFz3a1Shlv7e9/3yHnnxXvv3vee96574P3wcp4/v/M8z3nOOQK3o67Oj2+0EMlWPKxEkg3Wp0YIQQiTLgQXCWc0UV4+4ca00Ao1HM3G8B0CuROYp5WfFhgGcQ5v+FMCFaFEOs4An1WlM+6vRIq9QIZLx/Fiowh5kvSJaj6uGrezYQ9QX7sEYV4A3pyl43i160jPNvbsG4ifmAlwquZVfDQieV7nfJE/3RJ5MGG7uFh1wT3CFFF24E70RCyAWrnH7NA5V0pH8gooW51r2Tp19wYHO1qROmIFYXryoiPxBEDlfCz9B13YlULd+s0EVq6JcdfQdZvytu/1EHCdp8Y3RmriCUDwWDVSVOgq1s55RMc1hJBHKfmkUulNA1hbzftbomp3Wnk8sEuIUbxGjtqi0wCnjwdBFjut3q3z5CIhzlC6v0Qw3eH+cWoyyTpPAmKYcMazgtM17wCNTk0iUc51Re8iHUWC+pozCAJ2DeL/OHcVCUmDIFjTgmRDPMDB3HzUl4qxq7mR87//MtOU4KpKQTfwUvTsgjl+QrtK8Qr9WeUGsG2gn02Xz9uJ9iiAYWBu9OwbmYtp36YOv9SM/8JTZH1ez5RpxhscsQWYP8fPnzsCZPh8MQph0+THv0MULFlqS9Y60M+6rGx8Hk/M/Nlf71B87Ts7HQtgRgqUZNkruZxYt/Fxp4JJ0+Cj5m/IeXoB1XkFtgCVHa10Dt2ndu0GcuYvtGR+fvAvO5uu0DV03yEFDkWopNVqtix70QrdFz2d9D4cYt+atQkBam//ZEFvXrqMCcPg2sA95zxaReiwDZ203AC4rhxrGyZoRHaGUgoARdpWHA+RQoDHrVh50BxG0RApBAhSeqDU9XEcgUgRwAhpRg67KwaTupAoiD2rX+dk/ibbOtvb3kz93Zv6GhTiECX7jyjBpK9k+Yufo+W9D22dvHXpK9oH/9IAiDYyxwr5oGoyFkD9ubyUfln4Lu+veDnG0de93exouqxz3kdaOE+FPiI4q2u5OqRKVr3G2y8st+x82/cHwc5bGDLRvVj0Ycgtia/lEayUP0xEG2nh7dErd45AZCY1T7MRhKjlmbHjkZzH50h/4M/ucfoQOEeacdhu1dEQeoCItPPzXCVenTj9SNmJ4BLeRS0EAlP6/QiPAMXOipDq4W0VAAAAAElFTkSuQmCC"; img2.setAttribute("title", displayLanguage.str_62); img2.addEventListener("click", () => { goToImg("first"); }); document.body.appendChild(img2); let img3 = new Image(); img3.id = "FullPictureLoadGoToLastImage"; img3.className = "FullPictureLoadFixedBtn"; img3.style.display = "none"; img3.src = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAA6lJREFUWEfFl21IlWcYx3/3c46vayG1lq5i5FablrQFbon2oiOYzlgfgsY2gvrinCQEwzayklI69SVQPMdDH4KJMkZBoxf6kpkYVjK32FqgtiGbs8xczeF0O5477ucknZfnzaPUDc+n57ru/++67uu6XwROh9+fwNToRiRbECIbWAIsBQQwhGCIILcRfEcgtY3KykknUytn63GibjH/uw4CnwDz7cyf/B8D0YIrcIiyfUNWPuYA39Yk8iBlL1JWAfMcCkebjSPkcZIna9lZM2E0hzGAHrX7NMj8OIWj3a4jta1UVN2N/hEL0ODJwSXOg1xmJu4SgvLst3h/2XLd5OLvv+H75UempDTnFfxBgBJ2f/lTuFEkQCjybitx5dxaVMq2zJURYqd+7eXjtnPWCVMQQS03PBNPAdSaj6S02aU9b/ErXNnykaHQxrPf0HXvT7tVu07KxKbpmngK4Du6HykP2XlXrHqb43mFhmZ7ui7TeOsHuylAyDrKv6pWhiGAUKv1O6n2qjXvUJtbYChS3d3JsZs37AFgHNfU66pFQwBejxcod+I5RwAq9iY+31suqK9Pwj1+H3jx2QIwRiB1kcDrKQYuOBFXNnOXAV2xRNDoaUJQ9lwAJH6Bz3MFyQYzgPXpS0lyubg0OIDaZpxkIHN+Gp+uyCZB0zg/cIdrwybHgaBDLUEvsCIaICttIS1FH7B6wUv6r/5Hf1F1o4PstIWWXdD/90O+LiwmUXPpfgr6i2vtNPzcYxRjnwIYM2q/pvWb2fVGToRTIBjUoylIVydx7Oi8O8i6lzNwa1rEz/FAgFdb/Tz6L+aE/scQQKVueEcFL7gTnJaGrV3emRa+H7kXbacDGC7B5dLt5JtEaqsWZaAOqYxmLw9jM9BnWoTbX3uT5sKSmWoZ2h/u6UJ9MUMvQpM2VFtkff57lGWtmRWE//ZNKq9e0osxZuhtaLERzRbCUjxEU2K7FccL4UD8yVasOLxHfSA/M8v1TCEciIcdRkrVX5fBlH4cp84Wwpl49HGsVH1HapFin1XF2WXCobjBhUSpnqxJ5t/kduDdeCAci4PJlUypNh5LRwt2I/UXj+lQmTicW8DuVWt1m4ZbPezv7jRutfBZLC+l04bqWu7mgh2EMl+QlKx7jU4avjkiA3B0LZ92UZkQwTN2yzGDHWoGD5PpWVVNTCRVI8Ueq+6wgYjzaRY+q96i7gMg1ePU0b0RmIPHaXRooctrEZIP0chCkgH6p0bcz/PHF6yIkDG/FFMAAAAASUVORK5CYII="; img3.setAttribute("title", displayLanguage.str_63); img3.addEventListener("click", () => { goToImg("last"); }); img3.addEventListener("mousedown", (event) => { if (event.button == 2) { event.preventDefault(); exportImgSrcText(); } }); document.body.appendChild(img3); }; const elementClick = ele => { const dispatchTouchEvent = (_ele, type) => { let touchEvent = document.createEvent("UIEvent"); touchEvent.initUIEvent(type, true, true); touchEvent.touches = [{ clientX: 1, clientY: 1 }]; _ele.dispatchEvent(touchEvent); }; if (hasTouchEvents()) { dispatchTouchEvent(ele, "touchstart"); dispatchTouchEvent(ele, "touchend"); } ele.click(); //if (hasTouchEvents()) { // ele.dispatchEvent(new Event("touchstart")); // ele.dispatchEvent(new Event("touchend")); // //ele.click(); // debug("\nelementClick touch事件式點擊\n", ele); //} else { // //ele.dispatchEvent(new Event("click")); // ele.click(); // debug("\nelementClick click事件式點擊\n", ele); //} }; const addReturnTopButton = () => { let a = document.createElement("a"); a.href = "javascript:void(0);"; a.setAttribute("onclick", "window.scrollTo({top:0,behavior:'smooth'});"); let img = new Image(); img.src = "data:image/png;base64,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"; img.className = "FullPictureLoadImageReturnTop"; a.appendChild(img); document.body.appendChild(a); }; const nsfw1Data = customData.filter(item => item.category == "nsfw1"); //列出寫真站 const nsfw2Data = customData.filter(item => item.category == "nsfw2"); //列出老司機站 const comicData = customData.filter(item => item.category == "comic"); //列出普漫站 const hcomicData = customData.filter(item => item.category == "hcomic"); //列出H漫站 const AIData = customData.filter(item => item.category == "AI"); //列出AI繪圖站 const autoPagerData = customData.filter(item => item.category == "autoPager"); //列出自動翻頁 const noneData = customData.filter(item => item.category == "none"); //列出未分類 const addFullPictureLoadOptionsMain = () => { const FullPictureLoadOptionsMain = document.createElement("div"); FullPictureLoadOptionsMain.id = "FullPictureLoadOptions"; FullPictureLoadOptionsMain.style.display = "none"; const FullPictureLoadOptionsMainHtmlStr = ` <div style="width: 100%;"> <p>${displayLanguage.str_68}</p> </div> <div style="width: 348px; display: flex;"> <input id="FullPictureLoadOptionsIcon" type="checkbox" style="width: 14px; margin: 0 6px;">${displayLanguage.str_69} </div> <div style="width: 348px; display: flex; margin-left: 6px;"> ${displayLanguage.str_70}<input id="FullPictureLoadOptionsThreading" style="width: 60px; margin: 0 6px !important;"> </div> <div style="width: 348px; display: flex;"> <input id="FullPictureLoadOptionsZip" type="checkbox" style="width: 14px; margin: 0 6px;">${displayLanguage.str_71} </div> <div style="width: 348px; display: flex; margin-left: 6px;"> ${displayLanguage.str_72}<input id="FullPictureLoadOptionsExtension" style="width: 60px; margin: 0 6px !important;"> </div> <div id="FullPictureLoadOptionsAutoDownloadDIV" style="width: 348px; display: flex;"> <input id="FullPictureLoadOptionsAutoDownload" type="checkbox" style="width: 14px; margin: 0 6px;">${displayLanguage.str_73}${displayLanguage.str_74} </div> <div id="FullPictureLoadOptionsCountdownDIV" style="width: 348px; display: flex; margin-left: 6px;"> ${displayLanguage.str_75}<input id="FullPictureLoadOptionsCountdown" style="width: 60px; margin: 0 6px !important;"> </div> <div id="FullPictureLoadOptionsComicDIV" style="width: 348px; display: none;"> <input id="FullPictureLoadOptionsComic" type="checkbox" style="width: 14px; margin: 0 6px;">${displayLanguage.str_76} </div> <div id="FullPictureLoadOptionsDoubleDIV" style="width: 348px; display: flex;"> <input id="FullPictureLoadOptionsDouble" type="checkbox" style="width: 14px; margin: 0 6px;">${displayLanguage.str_77} </div> <div style="width: 348px; display: flex;"> <input id="FullPictureLoadOptionsFancybox" type="checkbox" style="width: 14px; margin: 0 6px;">${displayLanguage.str_78} </div> <div style="width: 348px; display: flex; margin-left: 6px;"> ${displayLanguage.str_79}<input id="FullPictureLoadOptionsZoom" title="10 = 100%、5 = 50%、0 = auto" style="width: 60px; margin: 0 6px !important;"> </div> <div style="width: 348px; display: flex; margin-left: 6px;"> ${displayLanguage.str_80}<input id="FullPictureLoadOptionsColumn" title="${displayLanguage.str_81}" style="width: 60px; margin: 0 6px !important;"> </div> <button id="FullPictureLoadOptionsCancelBtn"><font color="black">${displayLanguage.str_82}</font></button> <button id="FullPictureLoadOptionsResetBtn"><font color="black">${displayLanguage.str_83}</font></button> <button id="FullPictureLoadOptionsSaveBtn"><font color="black">${displayLanguage.str_84}</font></button> `; FullPictureLoadOptionsMain.innerHTML = FullPictureLoadOptionsMainHtmlStr; document.body.appendChild(FullPictureLoadOptionsMain); const FullPictureLoadOptionsButtonAddEvent = () => { ge("#FullPictureLoadOptionsCancelBtn").addEventListener("click", event => { event.preventDefault(); ge("#FullPictureLoadOptions").style.display = "none"; }); ge("#FullPictureLoadOptionsResetBtn").addEventListener("click", event => { event.preventDefault(); localStorage.removeItem("FullPictureLoadOptions"); location.reload(); }); ge("#FullPictureLoadOptionsSaveBtn").addEventListener("click", event => { event.preventDefault(); options.icon = ge("#FullPictureLoadOptionsIcon").checked == true ? 1 : 0; options.threading = ge("#FullPictureLoadOptionsThreading").value; options.zip = ge("#FullPictureLoadOptionsZip").checked == true ? 1 : 0; options.file_extension = ge("#FullPictureLoadOptionsExtension").value; options.comic = ge("#FullPictureLoadOptionsComic").checked == true ? 1 : 0; options.autoDownload = ge("#FullPictureLoadOptionsAutoDownload").checked == true ? 1 : 0; options.autoDownloadCountdown = ge("#FullPictureLoadOptionsCountdown").value; options.doubleTouchNext = ge("#FullPictureLoadOptionsDouble").checked == true ? 1 : 0; options.fancybox = ge("#FullPictureLoadOptionsFancybox").checked == true ? 1 : 0; options.zoom = ge("#FullPictureLoadOptionsZoom").value; options.column = ge("#FullPictureLoadOptionsColumn").value; let jsonStr = JSON.stringify(options); localStorage.setItem("FullPictureLoadOptions", jsonStr); location.reload(); }); }; FullPictureLoadOptionsButtonAddEvent(); let optionsObserverTimeid = setTimeout(() => { optionsObserver.disconnect(); }, 5000); const optionsObserver = new MutationObserver((mutationsList, observer) => { //網站如果使用了rocket-loader.min.js,會修改含input的HTML,導致FullPictureLoadOptions結構樣式跑掉,必須再修改回來。 if (fun.ge("div.icheckbox_square-blue", FullPictureLoadOptionsMain)) { FullPictureLoadOptionsMain.innerHTML = FullPictureLoadOptionsMainHtmlStr; FullPictureLoadOptionsButtonAddEvent(); setValue(); clearTimeout(optionsObserverTimeid); observer.disconnect(); } }); optionsObserver.observe(FullPictureLoadOptionsMain, MutationObserverConfig); }; const setValue = () => { ge("#FullPictureLoadOptionsIcon").checked = options.icon == 1 ? true : false; ge("#FullPictureLoadOptionsThreading").value = options.threading; ge("#FullPictureLoadOptionsZip").checked = options.zip == 1 ? true : false; ge("#FullPictureLoadOptionsExtension").value = options.file_extension; ge("#FullPictureLoadOptionsAutoDownload").checked = options.autoDownload == 1 ? true : false; ge("#FullPictureLoadOptionsCountdown").value = options.autoDownloadCountdown; ge("#FullPictureLoadOptionsComic").checked = options.comic == 1 ? true : false; ge("#FullPictureLoadOptionsDouble").checked = options.doubleTouchNext == 1 ? true : false; if (fancyboxBlackList()) { ge("#FullPictureLoadOptionsFancybox").checked = false; } else { ge("#FullPictureLoadOptionsFancybox").checked = options.fancybox == 1 ? true : false; } ge("#FullPictureLoadOptionsZoom").value = options.zoom; siteData.category == "comic" ? ge("#FullPictureLoadOptionsColumn").value = 2 : ge("#FullPictureLoadOptionsColumn").value = options.column; }; const style = ` .fancybox-container,.fancybox__container { z-index: 2147483647 !important; } .FullPictureLoadImageReturnTop { position: fixed; right: 10px; bottom: 80px; width: 53px !important; height: 53px !important; border: unset; z-index: 99; opacity: 0.6; } #FullPictureLoadOptions { text-align: center; width: 360px !important; height: auto !important; position: fixed !important; top: 10%; left: 50%; margin-left: -180px; border: 1px solid #a0a0a0 !important; border-radius: 3px !important; box-shadow: -2px 2px 5px rgb(0 0 0 / 30%) !important; background-color: #FAFAFB; z-index: 2147483647 !important; } #FullPictureLoadOptions * { font: unset !important; font-family: Arial, sans-serif !important; font-size: 14px !important; color: black; float: none !important; line-height: 18px !important; margin-bottom: 4px !important; padding: 1px 4px !important; width: auto; } #FullPictureLoadOptions button { width: auto; min-width: 102px; max-width: 110px; margin-left: 2px; margin-right: 2px; margin-bottom: 4px !important; display: inline-block; border: 1px solid #a0a0a0 !important; background-color: transparent !important; } #FullPictureLoadOptions input { color: #000000 !important; height: 18px !important; border: 1px solid #a0a0a0 !important; background-color: transparent !important; outline: unset !important; -webkit-appearance: auto !important; } #FullPictureLoadOptions p { text-align: center !important; margin-block-start: 0px !important; margin-block-end: 0px !important; margin-inline-start: 0px !important; margin-inline-end: 0px !important; } #FullPictureLoad { bottom: 24px !important; display: block !important; } #FullPictureLoadGoToLastImage { bottom: 66px !important; } #FullPictureLoadGoToFirstImage { bottom: 108px !important; } .FullPictureLoadFixedBtn { position: fixed !important; left: 24px !important; width: 32px !important; height: 32px !important; border-radius: unset !important; z-index: 2147483647 !important; opacity: 1 !important; } .FullPictureLoadMsg { font-family: Arial, sans-serif !important; font-size: 24px; font-weight: bold; text-align: center; line-height: 50px; color: #ffffff; width: 360px; height: auto; top: 30%; left: 50%; margin-left: -180px; padding: 0px !important; background-color: #000; border: 1px solid #303030; border-radius: 10px; position: fixed; z-index: 2147483647; opacity: 0.7; } .FullPictureLoadImage:not(.small) { width: auto; height: auto; max-width: 100%; display: block !important; float: unset !important; opacity: 1 !important; border: none !important; border-radius: unset !important; padding: 0 !important; margin: 0 auto !important; transition: unset !important; transform: unset !important; } .FullPictureLoadImage.small { width: auto; height: auto; max-width: 100%; max-height: 100% !important; min-height: 50x !important; display: block !important; float: unset !important; opacity: 1 !important; border: none !important; border-radius: unset !important; padding: 0 !important; margin: auto; transition: unset !important; transform: unset !important; } #FullPictureLoadImgBox { display: block; opacity: 1 !important; border: none !important; border-radius: unset !important; padding: 0 !important; margin: 0 auto !important; } a[data-fancybox=FullPictureLoadImageOriginal],a[data-fancybox=FullPictureLoadImageSmall] { padding: 0 !important; margin: 0 !important; display: unset !important; } #FullPictureLoadEnd { font-size: 20px; height: 30px; width: 100%; line-height: 30px; text-align: center; margin: 5px auto !important; } #FullPictureLoadEnd~*:not(h3,ul):not(#FullPictureLoadOptions):not(.FullPictureLoadMsg):not(.FullPictureLoadFixedBtn):not(a[href='javascript:void(0);']):not(.post-info):not(.post-tags):not(.article-tags):not(*[class^=fancybox]):not(div[tabindex]):not(.row):not(.text-center):not(.link-d):not(#myrating):not(.gallery-a):not(.pagination):not(div[class^=picnext]):not(a.zwf):not(p):not(.bo_nav) { display: none !important; } .FullPictureLoadLoading { font-size: 20px; text-align: center; height: 30px; line-height: 30px; margin: 5px auto !important; border: none !important; } #FullPictureLoad~*:not(.FullPictureLoadFixedBtn):not([id^='pv-']):not([class^='pv-']):not(.pagetual_tipsWords):not(#comicRead):not(#fab):not(.pagetual_tipsWords):not(*[class^=fancybox]):not(div[tabindex]):not(#spotlight):not(div[id^='swiper-imgbox']) { display: none !important; } .autoPagerTitle { width: auto; height: 30px; font-size: 18px; color: black; font-family: Arial, sans-serif !important; line-height: 29px; text-align: center; overflow: hidden; display: block; margin: 10px 5px; border: 1px solid #e0e0e0; background-color: #f0f0f0; background: -webkit-gradient(linear, 0 0, 0 100%, from(#f9f9f9), to(#f0f0f0)); background: -moz-linear-gradient(top, #f9f9f9, #f0f0f0); box-shadow: 0 0 5px rgba(0, 0, 0, 0.6); border-radius: 5px; } .autoPagerTitle.off { color: white; border: 1px solid #0e0e0e; background-color: #0f0f0f; background: -webkit-gradient(linear, 0 0, 0 100%, from(#9f9f9f), to(#0f0f0f)); background: -moz-linear-gradient(top, #9f9f9f, #0f0f0f); box-shadow: 0 0 5px rgba(255, 255, 255, 0.6); border-radius: 5px; } .autoPagerTitle a:-webkit-any-link { font-family: Arial, sans-serif !important; color: black; } .autoPagerTitle.off a:-webkit-any-link { color: white; } .autoPagerLoading { width: auto; height: auto; display: block !important; opacity: 1 !important; border: none !important; border-radius: unset !important; padding: 0 !important; margin: 20px auto !important; } #FullPictureLoadOptionsBtn, #FullPictureLoadToggleImgModeBtn, #FullPictureLoadToggleZoomeBtn, #FullPictureLoadCancelZoomBtn { padding: 1px !important; margin-top: 10px !important; margin-bottom: 6px !important; appearance: auto; text-rendering: auto; color: buttontext; letter-spacing: normal; word-spacing: normal; line-height: normal; font-size: 14px !important; text-transform: none; text-indent: 0px; text-shadow: none; display: inline-block !important; text-align: center; align-items: flex-start; cursor: default; box-sizing: border-box; background-color: buttonface; border: 1px solid #a0a0a0 !important; } .viewer-open:not(.fancybox-active) { overflow: unset !important; padding-right: 0px !important; } .fancybox-infobar *,.fancybox__infobar,a[data-fancybox-download],a[data-fancybox-download]:hover,a[data-fancybox-download]:link,a[data-fancybox-download]:visited,a[data-fancybox-download]:active { color: white; } `; const checkOptionsData = async () => { const getOptionsData = localStorage.getItem("FullPictureLoadOptions"); if (getOptionsData === null && options.autoDownload !== 1) { let jsonStr = JSON.stringify(options); localStorage.setItem("FullPictureLoadOptions", jsonStr); } else if (options.autoDownload !== 1) { let optionsJson = JSON.parse(getOptionsData); if (optionsJson.fancybox != 1 && optionsJson.fancybox != 0) { localStorage.removeItem("FullPictureLoadOptions"); let jsonStr = JSON.stringify(options); localStorage.setItem("FullPictureLoadOptions", jsonStr); if (!fun.ge(".FullPictureLoadMsg")) fun.addFullPictureLoadMsg(); if (!fun.ge(".FullPictureLoadStyle")) fun.css(style); debug("圖片全載更新已初始化設定"); } else { options = optionsJson; } debug("\nFull Picture Load Options Json\n", options); } }; const Fancyboxl10nV5 = async () => { await new Promise(resolve => { let num = 0; let loop = setInterval(() => { num++; try { if (typeof Fancybox === "function") { clearInterval(loop); resolve(); } } catch (e) {} if (num >= 5) { clearInterval(loop); resolve(); console.error("FancyboxV5 注入逾時"); return; } }, 100); }); try { switch (language) { case "zh-TW": Fancybox.defaults.l10n = { PANUP: "上移", PANDOWN: "下移", PANLEFT: "左移", PANRIGHT: "右移", ZOOMIN: "放大", ZOOMOUT: "縮小", TOGGLEZOOM: "切換縮放等級", TOGGLE1TO1: "切換縮放等級", ITERATEZOOM: "切換縮放等級", ROTATECCW: "逆時針旋轉", ROTATECW: "順時針旋轉", FLIPX: "水平翻轉", FLIPY: "垂直翻轉", FITX: "水平適應", FITY: "垂直適應", RESET: "重設", TOGGLEFS: "切換全螢幕", CLOSE: "關閉", NEXT: "上一個", PREV: "下一個", MODAL: "使用 ESC 鍵關閉", ERROR: "發生了錯誤,請稍後再試", IMAGE_ERROR: "找不到圖像", ELEMENT_NOT_FOUND: "找不到 HTML 元素", AJAX_NOT_FOUND: "載入 AJAX 時出錯: 未找到", AJAX_FORBIDDEN: "載入 AJAX 時出錯: 被阻止", IFRAME_ERROR: "載入頁面出錯", TOGGLE_ZOOM: "切換縮放等級", TOGGLE_THUMBS: "切換縮圖", TOGGLE_SLIDESHOW: "切換幻燈片", TOGGLE_FULLSCREEN: "切換全螢幕", DOWNLOAD: "下載" }; break; case "zh-CN": Fancybox.defaults.l10n = { PANUP: "上移", PANDOWN: "下移", PANLEFT: "左移", PANRIGHT: "右移", ZOOMIN: "放大", ZOOMOUT: "缩小", TOGGLEZOOM: "切换缩放级别", TOGGLE1TO1: "切换缩放级别", ITERATEZOOM: "切换缩放级别", ROTATECCW: "逆时针旋转", ROTATECW: "顺时针旋转", FLIPX: "水平翻转", FLIPY: "垂直翻转", FITX: "水平适应", FITY: "垂直适应", RESET: "重置", TOGGLEFS: "切换全屏", CLOSE: "关闭", NEXT: "上一个", PREV: "下一个", MODAL: "使用 ESC 键关闭", ERROR: "发生了错误,请稍后再试", IMAGE_ERROR: "找不到图像", ELEMENT_NOT_FOUND: "找不到 HTML 元素", AJAX_NOT_FOUND: "载入 AJAX 时出错: 未找到", AJAX_FORBIDDEN: "载入 AJAX 时出错: 被阻止", IFRAME_ERROR: "加载页面出错", TOGGLE_ZOOM: "切换缩放级别", TOGGLE_THUMBS: "切换缩略图", TOGGLE_SLIDESHOW: "切换幻灯片", TOGGLE_FULLSCREEN: "切换全屏", DOWNLOAD: "下载" }; break; }; Fancybox.defaults.animated = false; debug("\nFancybox 5.0.xx 預設選項物件 Fancybox.defaults\n", Fancybox.defaults); } catch (error) { if (!siteData.fancybox) { try { const jcss = "https://cdn.jsdelivr.net/npm/@fancyapps/[email protected]/dist/jquery.fancybox.min.css"; const fancyBoxCss = await fetch(jcss).then(res => res.text()); fun.css(fancyBoxCss); } catch (error) { console.error("\ncdn.jsdelivr.net [email protected] jquery.fancybox.min.css 注入失敗", error); try { const bcss = "https://cdn.bootcdn.net/ajax/libs/fancybox/3.5.7/jquery.fancybox.min.js"; const fancyBoxCss = await fetch(bcss).then(res => res.text()); fun.css(fancyBoxCss); } catch (error) { console.error("\n無法注入CSS,不使用Fancybox", error); options.fancybox = 0; } } } debug("沒有引入FancyboxV5", error); } }; const Fancyboxi18nV3 = async () => { if (siteData.fancybox.js === false) return; let str = ` switch (language) { case "zh-TW": $.fancybox.defaults.i18n.tw = { "CLOSE": "關閉", "NEXT": "下一個", "PREV": "上一個", "ERROR": "無法載入請求的內容。 <br/> 請稍後重試。", "PLAY_START": "開始幻燈片", "PLAY_STOP": "暫停幻燈片", "FULL_SCREEN": "全螢幕", "THUMBS": "縮圖", "DOWNLOAD": "下載", "SHARE": "分享", "ZOOM": "縮放" }; $.fancybox.defaults.lang = "tw"; break; case "zh-CN": $.fancybox.defaults.i18n.cn = { "CLOSE": "关闭", "NEXT": "下一个", "PREV": "上一个", "ERROR": "无法加载请求的内容。 <br/> 请稍后重试。", "PLAY_START": "开始幻灯片", "PLAY_STOP": "暂停幻灯片", "FULL_SCREEN": "全面屏", "THUMBS": "缩略图", "DOWNLOAD": "下载", "SHARE": "分享", "ZOOM": "缩放" }; $.fancybox.defaults.lang = "cn"; break; } `; new Function("language", str)(language); }; const FancyboxOptionsV3 = () => { if (siteData.fancybox.js === false) return; //"download", let str = ` $.fancybox.defaults.buttons = ["zoom", "slideShow", "fullScreen", "thumbs", "close"]; $.fancybox.defaults.loop = true; $.fancybox.defaults.toolbar = true; console.log("fancybox 3.5.7 選項物件",$.fancybox.defaults); `; new Function(str)(); }; let showOptions = false; let comicSwitch = false; for (let i = 0; i < customData.length; i++) { let check = null; if (typeof customData[i].reg === "object") { check = customData[i].reg.test(siteUrl); } else if (typeof customData[i].reg === "function") { check = await customData[i].reg(); } if (check) { let category = customData[i].category; if (category === "comic" && customData[i].enable === 0) { showOptions = true; comicSwitch = true; } let delay = customData[i].delay; if (delay) await fun.delay(delay, 0); options.enable = 1; if (customData[i].enable == 0) { await checkOptionsData(); if (options.comic == 1 && category === "comic") { showOptions = true; options.enable = 1; debug("\n漫畫類預設關閉的此站規則已開啟"); } else { //showOptions = true; options.enable = 0; debug("\n此規則禁用", customData[i]); continue; } } if (customData[i].enable != 0) await checkOptionsData(); let include = customData[i].include; if (include) { if (!fun.ge(include)) { options.enable = 0; debug("\n頁面沒有包含必須元素", customData[i]); continue; } } let exclude = customData[i].exclude; if (exclude) { if (fun.ge(exclude)) { options.enable = 0; debug("\n頁面包含排除元素", customData[i]); continue; } } siteData = customData[i]; if (siteData.category != "none") showOptions = true; if (!ge(".FullPictureLoadMsg")) fun.addFullPictureLoadMsg(); if (!ge(".FullPictureLoadStyle")) fun.css(style); let css = customData[i].css; if (css) fun.css(css); let initCode = customData[i].init; if (initCode) { if (typeof initCode == "string") { await new Function("siteData", "fun", '"use strict";' + initCode)(siteData, fun); } else if (typeof initCode == "function") { await initCode(); } } if (options.fancybox == 1 && !siteData.fancybox && category !== "none" && !siteData.autoPager) { //const fancyBoxCssHtml = `<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fancyapps/[email protected]/dist/fancybox/fancybox.css">`; //document.head.insertAdjacentHTML("beforeend", fancyBoxCssHtml); if (typeof Fancybox === "function") { try { const jcss = "https://cdn.jsdelivr.net/npm/@fancyapps/[email protected]/dist/fancybox/fancybox.css"; const fancyBoxCss = await fetch(jcss).then(res => res.text()); fun.css(fancyBoxCss); } catch (error) { console.error("\ncdn.jsdelivr.net CSS注入失敗", error); try { const bcss = "https://cdn.bootcdn.net/ajax/libs/fancyapps-ui/5.0.22/fancybox/fancybox.css"; const fancyBoxCss = await fetch(bcss).then(res => res.text()); fun.css(fancyBoxCss); } catch (error) { console.error("\n無法注入CSS,不使用Fancybox", error); options.fancybox = 0; } } } await Fancyboxl10nV5(); } else if (options.fancybox == 1 && category !== "none" && !siteData.autoPager && siteData.fancybox.v == 5 && siteData.fancybox.insertLibrarys == 1) { //加規則 //fancybox: { // v: 5, // insertLibrarys : 1 //}, await addLibrarysV5(); await Fancyboxl10nV5(); } else if (options.fancybox == 1 && category !== "none" && !siteData.autoPager && siteData.fancybox.v == 3 && siteData.fancybox.insertLibrarys == 1) { //加規則 //fancybox: { // v: 3, // insertLibrarys : 1 //}, await addLibrarysV3(); Fancyboxi18nV3(); FancyboxOptionsV3(); } if (customData[i].imgs) { options.default = customData[i].imgs; debug(`\nCSS/Xpath/JS選擇器:${options.default}`); } if (customData[i].threading) { options.threading = customData[i].threading; debug("\n下載線程數:" + options.threading); } let titleCode = customData[i].customTitle; if (titleCode) { const getTitle = async () => { if (typeof titleCode == "string") { customTitle = await new Function("siteData", "fun", '"use strict";' + titleCode)(siteData, fun); } else if (typeof titleCode == "function") { customTitle = await titleCode(); } }; await getTitle(); debug(`\n自定義標題:${customTitle}`); if (customData[i].observerTitle) { new MutationObserver(async () => { await getTitle(); debug(`\n自定義標題:${customTitle}`); }).observe(document.body, MutationObserverConfig); } } let next = customData[i].next; if (next) { let link = null; typeof next === "function" ? link = await next() : link = fun.ge(next); debug("\n圖片全載NEXT:", link); try { if (link !== null) { typeof link === "string" ? nextLink = link : null; if (link.tagName == "A") { try { /^http/.test(link.href) ? nextLink = link.href : nextLink = null; } catch (e) {} } } } catch (e) {} const callback = () => { if (typeof next === "function") { fun.showMsg(displayLanguage.str_34, 0); /^http/.test(link) ? location.href = link : fun.showMsg(displayLanguage.str_37); } else if (typeof next === "string") { if (link) { //link.click(); elementClick(link); fun.showMsg(displayLanguage.str_35); } else { fun.showMsg(displayLanguage.str_37); } } }; if (hasTouchEvents() && siteData.next && options.doubleTouchNext == 1) document.addEventListener("dblclick", () => callback()); document.addEventListener("keydown", event => { if (ge(".fancybox-container,.fancybox__container")) return; let key = window.event ? event.keyCode : event.which; if (key == 39) callback(); }); } let prev = customData[i].prev; if (typeof prev == "string" && prev != 1) { document.addEventListener("keydown", event => { if (ge(".fancybox-container,.fancybox__container")) return; let key = window.event ? event.keyCode : event.which; if (key == 37) { event.preventDefault(); let ele = fun.ge(prev); if (ele) { //ele.click(); elementClick(ele); fun.showMsg(displayLanguage.str_39); } else { fun.showMsg(displayLanguage.str_40); } } }); } else if (prev == 1) { document.addEventListener("keydown", (event) => { if (ge(".fancybox-container,.fancybox__container")) return; let key = window.event ? event.keyCode : event.which; if (key == 37) { event.preventDefault(); fun.showMsg(displayLanguage.str_38); history.back(); } }); } let autoClick = customData[i].autoClick; if (autoClick) { if (typeof autoClick == "object") { setTimeout(() => { let ele = fun.ge(autoClick[0]); if (ele) { elementClick(ele); debug(`\n圖片全載autoClick("${autoClick}")`, ele); } }, autoClick[1] || 1000); } else if (typeof autoClick == "string") { let ele = fun.ge(autoClick); if (ele) { elementClick(ele); debug(`\n圖片全載autoClick("${autoClick}")`, ele); } } } let observerClick = customData[i].observerClick; if (observerClick) { let ele = fun.ge(observerClick); if (ele) { const observer = new IntersectionObserver((entries, observer) => { entries.forEach(entry => { if (entry.isIntersecting) { observer.unobserve(entry.target); elementClick(entry.target); debug(`\n圖片全載observerClick("${observerClick}")`, entry.target); setTimeout(async () => { if (await fun.waitEle(observerClick, 30)) observer.observe(fun.ge(observerClick)); }, 1000); } }); }); setTimeout(() => observer.observe(ele), 1000) } } let loadMore = customData[i].loadMore; if (loadMore) { const callback = () => { if (window.innerHeight + window.pageYOffset >= document.body.offsetHeight - 200) { document.removeEventListener("scroll", callback); let ele = fun.ge(loadMore); if (ele) { elementClick(ele); debug(`圖片全載loadMore("${loadMore}")`); } setTimeout(async () => { if (await fun.waitEle(loadMore, 30)) document.addEventListener("scroll", callback); }, 1000); } }; document.addEventListener("scroll", callback); } if (siteData.autoPager) { if (siteData.autoPager.observer) { let ele = [...fun.gae(siteData.autoPager.observer)].pop(); if (ele) fun.autoPagerNextObserver.observe(ele); } else { const callback = async () => { if (window.innerHeight + window.pageYOffset >= document.body.offsetHeight - (siteData.autoPager.bottom || 1000)) { if (!autoPager) return; document.removeEventListener("scroll", callback); await fun.autoPager(); await fun.delay(siteData.autoPager.sleep || 1000, 0); document.addEventListener("scroll", callback); } }; document.addEventListener("scroll", callback); } document.addEventListener("dblclick", () => fun.toggleAutoPager()); } let openInNewTab = customData[i].openInNewTab; if (openInNewTab) { const _openInNewTab = () => [...fun.gae(openInNewTab)].forEach(a => a.setAttribute("target", "_blank")); _openInNewTab(); new MutationObserver(() => _openInNewTab()).observe(document.body, MutationObserverConfig); } let autoDownload = siteData.autoDownload; if (autoDownload) { if (autoDownload[0] == 1 || options.autoDownload == 1) imgZipDownload(); } let insertImg = customData[i].insertImg; if (insertImg) { if (autoDownload) { if (autoDownload[0] == 1 || options.autoDownload == 1) break; } if (insertImg[1] == 1 || insertImg[1] == 2) fun.immediateInsertImg(); } let button = customData[i].topButton; if (button) addReturnTopButton(); break; } } if (siteData.reg) { debug("\n列出此站資料", siteData); debug(`\n列出規則總數(${customData.length})`); debug("\n列出NSFW規則", nsfw1Data); debug("\n列出NSFW+規則", nsfw2Data); debug("\n列出COMIC規則", comicData); debug("\n列出HCOMIC規則", hcomicData); debug("\n列出AI繪圖規則", AIData); debug("\n列出自動翻頁規則", autoPagerData); debug("\n列出未分類規則", noneData); } if (showOptions) { //debug("\n圖片全載開啟了GM選單?\n", showOptions); _GM_registerMenuCommand(displayLanguage.str_67, () => { ge("#FullPictureLoadOptions").removeAttribute("style"); }); addFullPictureLoadOptionsMain(); setValue(); if (comicSwitch) ge("#FullPictureLoadOptionsComicDIV").style.display = "flex"; } if (!ge(".FullPictureLoadStyle")) fun.css(style); let autoDownload = siteData.autoDownload; if (hasTouchEvents() && showOptions || !autoDownload && showOptions)[...gae("#FullPictureLoadOptionsAutoDownloadDIV,#FullPictureLoadOptionsCountdownDIV")].forEach(e => e.style.display = "none") if (!hasTouchEvents() && showOptions || (hasTouchEvents() && showOptions && !siteData.next)) ge("#FullPictureLoadOptionsDoubleDIV").style.display = "none"; if (autoDownload) { document.addEventListener("keydown", event => { if (ge("#FullPictureLoadOptions:not([style])")) return; if (event.ctrlKey && event.key == ".") { if (options.autoDownload == 0) { fun.showMsg(displayLanguage.str_64, 0); options.autoDownload = 1; let jsonStr = JSON.stringify(options); localStorage.setItem("FullPictureLoadOptions", jsonStr); setTimeout(() => { location.reload(); }, 2000); } else { options.autoDownload = 0; let jsonStr = JSON.stringify(options); localStorage.setItem("FullPictureLoadOptions", jsonStr); fun.clearAllTimer(2); fun.showMsg(displayLanguage.str_65, 0); location.reload(); } } }); } if (hasTouchEvents() && siteData.insertImg && (siteData.insertImg[1] == 0 || siteData.insertImg[1] == 3)) { let timeId; document.addEventListener("touchstart", event => { if ((event.target.tagName == "IMG" && event.target.id != "FullPictureLoad") || event.target.tagName == "CANVAS") { timeId = setTimeout(() => copyImgSrcText(), 500); } }); document.addEventListener("touchmove", event => clearTimeout(timeId)); document.addEventListener("touchend", event => clearTimeout(timeId)); } debug("\n最終options物件\n", options); _GM_registerMenuCommand(displayLanguage.str_66, () => { _GM_openInTab("https://greasyfork.org/scripts/463305/feedback"); }); setTimeout(() => { let preloadNext = siteData.preloadNext; try { if (nextLink && preloadNext && !downloading) { window.addEventListener("message", e => { if (e.data.iframePicArr) fun.picPreload(e.data.iframePicArr, e.data.title, "next");; }, false); fun.fetchDoc(nextLink).then(async nextDoc => { debug("\nnextDoc", nextDoc); if (typeof preloadNext === "boolean" && preloadNext === true && typeof siteData.imgs === "function" && typeof siteData.customTitle === "function") { fun.picPreload(await siteData.imgs(nextDoc), await siteData.customTitle(nextDoc), "next"); } else if (typeof preloadNext === "boolean" && preloadNext === true && typeof siteData.imgs === "string" && typeof siteData.customTitle === "function") { let arr = fun.getImgSrcArr(siteData.imgs, nextDoc); fun.picPreload(arr, await siteData.customTitle(nextDoc), "next"); } else if (typeof preloadNext == "function") { preloadNext(nextDoc, siteData); } }); } } catch (error) { console.error("圖片全載preloadNext()出錯", error); } }, 1000); if (options.enable == 1 && !siteData.category.includes("autoPager") && !siteData.category.includes("none") && !siteData.category.includes("ad")) { if (!ge(".FullPictureLoadMsg")) fun.addFullPictureLoadMsg(); if (!ge(".FullPictureLoadStyle")) fun.css(style); if (siteData.key != 0) { document.addEventListener("keydown", event => { if (event.keyCode != 27) { if (ge("#FullPictureLoadOptions:not([style])")) return; } switch (event.keyCode) { case 96: //數字鍵0 fastDownload = false; imgZipDownload(); break; case 97: //數字鍵1 copyImgSrcText(); break; case 98: //數字鍵2 goToImg("first"); break; case 99: //數字鍵3 fastDownload = true; imgZipDownload(); break; case 100: //數字鍵4 goToImg("last"); break; case 101: //數字鍵5 toggleImgMode(); break; case 102: //數字鍵6 autoScrollEles(); break; case 103: //數字鍵7 exportImgSrcText(); break; case 109: //數字鍵- fun.clearAllTimer(2); toggleZoom(); break; case 107: //數字鍵+ fun.clearAllTimer(2); cancelZoom(); break; case 106: //數字鍵* ge("#FullPictureLoadOptions").removeAttribute("style"); break; case 27: //Esc ge("#FullPictureLoadOptions").style.display = "none"; break; case 111: //數字鍵/ fun.showMsg(displayLanguage.str_91); localStorage.removeItem("FullPictureLoadOptions"); //重置當前網站的用戶設定恢復為預設選項 setTimeout(() => location.reload(), 1000); break; } }); } if (siteData.icon == 0) { return; } else if (options.icon == 1 || siteData.icon == 1) { addFullPictureLoadButton(); } } })();