// ==UserScript==
// @name 圖片全載
// @name:en Full picture load
// @name:zh-CN 图片全载
// @name:zh-TW 圖片全載
// @version 1.4.19
// @description 專注於寫真、H漫、漫畫的網站,目前規則數500+,進行圖片全量加載,也能進行下載壓縮打包,如有下一頁元素能做到自動化下載。
// @description:en Load all pictures for picture websites, and can also compress and package them for download.
// @description:zh-CN 专注于写真、H漫、漫画的网站,目前规则数500+,进行图片全量加载,也能进行下载压缩打包,如有下一页元素能做到自动化下载。
// @description:zh-TW 專注於寫真、H漫、漫畫的網站,目前規則數500+,進行圖片全量加載,也能進行下載壓縮打包,如有下一頁元素能做到自動化下載。
// @author tony0809
// @match *://*/*
// @exclude *hcaptcha*
// @exclude *iframe*
// @exclude *addthis*
// @exclude *www.youtube.com*
// @exclude *docs.google.com*
// @exclude *google*/maps/*
// @exclude *mail.google.com*
// @exclude *video.ngamgaixinh.us*
// @exclude *www.facebook.com/*/plugins/*
// @exclude *18p.fun/ForInject/SetHistory/*
// @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 unsafeWindow
// @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/[email protected]/dist/html2canvas.min.js
// @require https://cdn.jsdelivr.net/npm/@fancyapps/[email protected]/dist/jquery.fancybox.min.js
// ==/UserScript==
(async () => {
"use strict";
let options = { //預設選項基本上不要改動,如果改動了最好透過UI選項設定或按/,重置儲存在localStorage的設定
enable: 0, //!!!維持0不要改!!!
icon: 1, //是否顯示左下圖示0關1開
threading: 32, //最大下載線程數
default: "img[src]", //預設CSS/Xpath選擇器/javascript代碼
//default: "js;return [...document.images];",
zip: true, //true圖片下載後壓縮打包,false批量下載圖片,無法全自動下載
file_extension: "zip", //zip or cbz
autoDownload: 0, //!!!維持0不要改!!!建議透過UI選項設定來開啟,需要customData也有autoDownload
autoDownloadCountdown: 5, //有有效的NEXT時自動下載的倒數秒數
comic: 0, //1,忽視漫畫站點開關選項,啟用漫畫規則
doubleTouchNext: true, //true開啟false關閉,觸控裝置雙擊前往下一頁
zoom: 0, //1 ~ 10 腳本插入的圖片縮放比例,10 = 100%,9 = 90%,0 = auto
column: 4 //圖片並排顯示的數量2、3、4、5
};
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);
options = optionsJson;
console.log("Full Picture Load Options Json\n", optionsJson);
}
const siteUrl = window.location.href;
let siteData = {};
let siteJson = null;
const language = window.navigator.language;
let displayLanguage = {};
let globalImgArray = [];
let promiseBlobArray = [];
let customTitle = null;
let downloading = false;
let fetching = false;
let fastDownload = false;
let currentDownloadThread = 0;
let downloadNum = 0;
let errorNum = 0;
let doc = document;
let autoPager = true;
let currentPageNum = 0;
let nextLink = null;
const PcUa = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36 Edg/117.0.2045.43";
const MobileUa = "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Mobile Safari/537.36";
const loading_bak = "data:image/gif;base64,R0lGODlhIANYAuZoAHt7e7CwsF9fX9HR0aurq8LCwrOzs4iIiNjY2HV1dcrKyt3d3d7e3rGxsX9/f7Kysru7u6Ojo9vb25GRkcvLy2pqatzc3Nra2ra2ttbW1ri4uNfX18bGxtnZ2bS0tNDQ0M3NzZqamsXFxbW1tb29vcDAwH19fdTU1Lm5ucHBwYCAgLe3t8zMzH5+fsjIyL6+vsTExMPDw9LS0oGBgbq6unx8fNPT08/Pz7+/v7y8vNXV1cnJyZaWlo2NjcfHx6qqqs7OzouLi4mJiaGhoZ6enqioqJycnIqKipOTk6enp4WFhYODg4+Pj66urpKSko6OjqysrKWlpYeHh4SEhJ+fn5mZmZiYmIKCgqamppSUlIyMjIaGhpeXl6+vr5WVla2trZCQkJ2dnampqZubm6KioqCgoKSkpN/f3wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQFCgBoACwAAAAAIANYAgAH/4BngoOEhYaHiImKi4yNjo+QkZKTlJWWl5iZmpucnZ6foKGio6SlpqeoqaqrrK2ur7CxsrO0tba3uLm6u7y9vr/AwcLDxMXGx8jJysvMzc7P0NHS09TV1tfY2drb3N3e3+Dh4uPk5ebn6Onq6+zt7u/w8fLz9PX29/j5+vv8/f7/AAMKHEiwoMGDCBMqXMiwocOHECNKnEixosWLGDNq3Mixo8ePIEOKHEmypMmTKFOqXMmypcuXMGPKnEmzps2bOHPq3Mmzp8+fQIMKHUq0qNGjSJMqXcq0qdOnUKNKnUq1qtWrWLNq3cq1q9evYMOKHUu2rNmzaNOqXcu2rdu3cP/jyp1Lt67du3jz6t3Lt6/fv4ADCx5MuLDhw4gTK17MuLHjx5AjS55MubLly5gza97MubPnz6BDix5NurTp06hTq17NurXr17Bjy55Nu7bt27hz697Nu7fv38CDCx9OvLjx48iTK1/OvLnz59CjS59Ovbr169iza9/Ovbv37+DDix9Pvrz58+jTq1/Pvr379/Djy59Pv779+/jz69/Pv7///wAGKOCABBZo4IEIJqjgggw26OCDEEYo4YQUVmjhhRhmqOGGHHbo4YcghijiiCSWaOKJKKao4oostujiizDGKOOMNNZo44045qjjjjz26OOPQAYp5JBEFmnkkUgmqeT/kkw26eSTUEYp5ZRUVmnllVhm2RkCFJTgwQ9DVIFEDwcsccUMAAAwwxVLHNADElUM8YMHJVCAgJakIeDDCBFMcEWagAYq6KCEAnDFBBGM4MOdeF7GABAYUHFAoZRWammaB1CBARAMNPqYDBiEgOalpJZa6AwhYCCDp4i5UEQQpsYqa6FBFOECq4EpUMQWs/bqq6BbFKEArnrZ0IQQvyarbJpCNGEDsXMxkIIVNSxrrbI1WJFCp9CydYEByF4r7rJCGHBBt2hlQMCo47ar7AwEZIDuWBv84IC7+FrrwA+MzstVB1CokO/A1qoARQf+ZrXAA+wS7HCyMzywQMJVlRDu/8MYKytECRRHJQMXGYdsLRcDdMzUwveKrHKyDnQxsclHscDEyjQr2wMFMBO1wBcm1OzzryZ88XLOPg0Axs9I/wpGyUTzBIHASQNgwhRaIMGDEUZQQQXWPCChxRQ9R60CBE3nZEEEPqvgRAQPvGAnJFy+8EAETkBNcwQWlF3TCROobMIESeCwaicy4JDEBGGHPMEJesvEwRIhB5EEDBKYIgEMScCa8RIcNP4SCokTPIEBg7MigwF9P2wCCp6zRMDDQTzw7Cw2PKA5wQS0jpIFRBDswBC35uLCECnnS0Teuo8kAQ8DT9FFv7sg0MUUA/NQefIgdYBEvkJogDwwFmhwcf+7SCCMfUcIzOyuFBoMPcwCGkiBLxPQn3/RBj24u8QI7huzwAiQa1cPNmA/jHRAfeIyQRQI2AwERCF01mKC+Qo4EQk4oV1OAII0gHDBcTnhehSEyAK8MC4VjIBb0mDACOxmLS/0L4QLocK4eMC4a5yAeeKiAgwd8gNxteAB22DAA1ogrh/scCErENcRWOANFhxBXBg4IkJEAMFfjeFc37jAGK5lAhFIsSAyCCC2AkCOAFRrWUso3Rf/IYEnFCwF5khB8ZL1BBCusR9DsJYScHYOCijBWkO4oz8gYK0gzA4dNrhdsmggyH3IgIW+eoK8WHEBEKQAA11IQgSGgLUhRKD/CF1YQQpAgMVVZMCNylKBGhtJDwakLlkTqB8pMoCDH1iBV7LaghV+gINJngIBr/zVBF7ISnhAYVkTKOUoJFCAKDxRiVEogB1FcYFg+goKxaQHBaooqydMMBQSIIER5uguBxiBBNP8RAdQ+asa8DGb71gAO30VBAaGggVRaNjDZhAFJopiA4rs1ROICU90BEBZW6jhJxhQgu35DAklQKEnToDLX5GxoOz4ABF/5YB3doIBLwioz4JAAolyggXklFULPoDRdeDQVzXg2CdikL+oBaoHMQBFCc7oKx60NB0lUNZFO/EBkNmUUFxgqScaoCyZ/pQcFnimr4zgiQU0YaNH/yVUC5pAUEsYIVlH+N5Tw/GAZAVBmZkAQU2zWqkegKATFxBprIA41nBsAJKxasFbOTFEtpLqh50AAVZnpQJZ1lUbRUiWATjRgSr4NVZV+CYmDJAsIx62GycYrKx8ugkgSPWxpTqCBjfx0lk5wJeXzQYWfjUDhWICBvoELalmAINNnCC2pkpCarWhg5SaKoqaAJ1se7W6TWCAozrYLTZ66CskbMIDw02WBzbh0F5ZVrnUuABuSWWCG2jioNFNVgM0cQNuzhat2H0GdH2l20xQNrzKmm4mkvAr+aYXGguYVK+WIFlKaAC+1mIdJjogRllJoav3PQYOfjWCTFAxZCqYgv8QmEDhA+B1YF3MxAh+5dQEM6O0sToAgh0Bgu1eywFeIAAJSImISpKAAFnwrbhmsFdL5NdXVvBwM2TwK0ZeogPjG5cSiiCCER9iASIowh/xJYT+SoIGMHWtjo9xzF4dwciMsIK7TECFGJh0EgyIARXMm6wqYGIBn43VF6acDAbIr1c+tkRZx+WAJEg5EydIgox/RVdLQLlXUvgym4PBAV8pAcuKYAGZZ2UCLKDWExnAwqJV6s9KLGDJs/LBoI2Btl6N18ZaEJcTajwKEHTQWlpAdCKY2issbJoYCyiwqVTgZEg04cTARQUG9iyrJvz4wpeagqBfvQsR+IoMl7iBZn3/1QOlquIDoV5WC7xrCTL4qnPEBsZqezUsSxhVWUZIJyok8NVlceESCvBVFLINjCCXqgeXKIC1ojBsVDAgCtYqwCXWGispsNsXH/CVfcEc7WT5eha3VpYW6t2I986K1P/GxXplVYPkViIHyxrqLMCbrBxYQgc8nWvEd6HlWTm3EgxI86yuWwvm/uoIDGdEdWN17pHjYgG8plSDKxHUZBFBF71LVoclsWHTqtrmqKCAryxOCWvKqgfinoUE+D2rCXzcVztAui0cHit4V0Lpv1KBs3PxAWCXyqOSoHqpPq31WZRbViyXRKd9pQFf/PdXZrCEy2M1hrbTAtOxwvYkJGD2/0t5YRMWYAEJDNCFLhiABCwQ6yVI6CsVRL0RhZ7VFPwuiwz0qgVHLwTGfWWCsVMiAwbIwrLT1IIsGODRk/jApCvlcUpYYPWXgj3nVQGDXp2cEiH4VREuAQIihLxSNSACxCWRWF+FwBIzN1Vtd++KOcO9EhfA/aUcYE9JICACxydVDSJgWEdsIOeUagF6HyGGXvWZ+qvI46zgSIme96q9k+AA4GelBMFLgr6+MnSQkAK9okPwxwrzZCp39ghzp1JMFwkjEH6zUgMDBwk6oH2WEgGVcAICdYCsUHiFcgWWoF+zEkiT8AXjsmaTUAa+cgCW8CeyogIeqAoI0CtZUAk68P8rwRMJx9UuuQYJPvArDxgJWdAr5TeDoAB2suJqlPACLZh/Eogt/vcIJCgrL1AJ2yYraIeEouCEs1KBkNB8syIG3rd/4qIER5gI7dcrw0cJExcrJMCFpsBqskJ/kwBipqJpkdCA7qKBkRCEvcJZk0CAs8J2cigKYhgry/cI1ENYoQcCUXgtNbCIirAAIFgom0cJIMCGh0gK8icr69cIHdBTkhB0BPNzkYCHpVJrjHABvWKCnRgKjiUrDlAJLHBNkZABkZhAuqcIVTYrlSYJ6DcoZhaLoeB0l+JvlLBgvXKFkGB9DvN+jeCFs4IDlVBRpmJ1xggKKncpTFAJRTcro/X/CEWIMTcICUDgKzs3CQhkKkewjaDwZrEiiJKQcLNyeYcgARg4Li2Aj4YgAb5ycHc4K8oIj51gYpRSjJOQhbEyA5GQbiGzhYsAg7KCf5JQcrEiggZ5kLOCipPwibEiBJFASCFTe4/gbqQCi6U4Kw65kZwwe4PikSs5K173CND4MIsFCWpHKjIZCaZoKibgkpzQK344CWHQK04QCb+IMQLpCKcWK2FQCXxYKkK5CURZCUc5K2CglCLTlI3QjqYSlZQwlaRSlZrQAAGQlmq5lmyplnYoCSnQlnLZlivwkHN5l3iZl2nZbY+wAnopl28ZCXH5l2tpiGZZCQZAmGsZmJBQ/wCKuZbr6AhA8JiUKZfj6AgjUJkBoG+UMJiPmZOHaQmJSZnOOAkwoJmg6Qg6oJmsGQC9mAijSZnTNwkvUJmpGZqTgAGVGYeU4AKseXQLgJat+ZgNAJysuYOSQAKV+YO4KQl+SZkCNgkUwJrd1wg5MJyPaZLmx5oS6QgoUJl12ZyUQAPLWQkfwJqmxwgKgJ2KyZeOcJ6amZ6PkJmUGWfiGQm1SZnSCAkZwJp6+AgXIJzsiZcN4I+G4AOs+ZqM8ACVWZr32ZiaGXqDYAGsyZuQUAIDmpcCyAjKqZmS9wgLoJmc+aCQIAKaWZ2Q4AGa+QAxZwgbkKF4iaKLIESaCYaP8P+ilelFJAoJO6CZTDMJHVqZC7gIMQCjcplTkXACFVoJA6CZWbejj3ADmtmdjWCimjmFjSAB9GmkaTkCBmoIHMCaOiqdmkltUNoI/VmZsykJUqqZzOkINiCgMNoAhwQJulmmlXCalTmEZ5oIEqCZ2hkJF9CaQ7oILMClARCMj6CkrBmK1qmZX9qnZ8CglHmbPMiaIxoJvgmjyAmhbiqalbmfkooI31mZjsoIRbqikWoIFCCnrNkAVLoIEkCplYmkkzColRmdo6oIjlmZPyoJ8KmZ/ykJNqCirekBdfqHrSmfjtCklcmYu2oI61mZWAqirqqYBvChjyABqVqrq2oIFhD/m5RZnJUQppXpntF6CDKgmWRTCTjQmmNKCRuQAtc6lw2QAjJaoq1pjZUAAZq5SulaCH9amQ3Qookwma+aho4gAQqQA/UaAA2QAwrwrYiAAA/7l2YqCQxwsXhJsWe6pY9ZqIywMK0ZqJbAABlwAxTgAi5AATeQAQbrCNfJmhJTCTZQowG7CBhKrZbQrZpJibZwqK1pq/mnmfyas4gwnZVZdzg4nA+gsLGAALSqmXwKCaVKmU+KtIewmpp5qoxAnq3ZProAP8Npn5KAq0KqtYhAo5UZq4wQrKy5obOws8tqCUqrnzEbrUGanZfwnK1ZrbFgrq0ZnhenmRaqtqzaqJbQ/6bDmbWz0KPYmbFny5roiriDgADceQkawJ6d+gqbOpxM+3XUabmIcKfQeQnOip1r6gp6ip2/OglX+5hvSrqC0LqUqaCNsLetWQISygkLQLfDebiTkKZqSruHcLOaSbSTYLEDqgFQCwoIsLns2QDPqwg++5jJarxnwADGqp/aCgmfi50PoKilwAJTO5ydGwkWcL6E6QF5m7PX256XwADSO6AQkK+esAH+mqEa8L6HMK3Fq72GgLyVeUKXkAEcO64i4LGQIAEikMDEibuMoEKsKbK0a7qUeZmUAMAZ+gAcwMCyygHsi52VKwkIW54CfAgIqpkr4L+HkJ9Geq8y4MKGwP8AMkCviOqglMAAfkuZ6ZvCHdCaQPsIFtDDRjoCImADLswANiACIGukGPC96NiaXmu8uquYGEDDhbAB4oqoD5ADHHADG0BQC7ABN8ABOTDCMGoA+PsIDIDBj6nDKUwIcEuZbgunEAyjD+ABGIACfowBaoyoEJu9kyC08TnHawvHiukBUgwJICDIkIydQ0zE3UuZWYzISQuvmnC3kdzJhHnHjmClU4rJiLAAXayY1KsJkOvJrHyXjmsJzIuavYu4gluZ7ZoJnNzKuhwAoOwI+3ulpJwIAdqa5FsJIJDHuzy9kwwJhhyqVYzItlupz+wIp5PMnUw6m/AtmhzMwozMcin/vJewAUZszRm6Am2cnK35ACBMu6I8yogHw+Q8oC/QyJLAwTzLzYogAaeMyudcz94cz/ZawpawAf/MlgawzsZrz5QptpywAfUL0Avdz5FAtq0p0PhMCDw8nEe7CQzgAgUdzw3gAlqsCO86uCMtwKnLmq+sCQhwxRD9zdUbCauMnhftCC6Nyq+7CTLw0C+9lhoAsJowAB+9luBc0xU71Gr5ABJNCTfA0xCtAZLb0IH8l6ls1I0w05o5AtNMCQPwy/EMATnNCRfwxJW50la9trGrmRqA0GgKA/scyQYAAxJ8CRLg1NB50qSMwNiJAvScCQtwAzgw1ez5ADhwA7MMCRaQ/9YEO9dnPQgrXLaHPdEDAAPjPJwrAAMDENmQsABgO5zD2tgT7NWsSQN93QkS8AEc8AJkrZcj8AIc8AFsLQkW0NmtSQN4jc8dINh/iQKxbWkZMAAs4AIiEAMFUAIlUAAxIAI7wAIDkAGabQkSoNihyoqgnQiPzJ4aQN3g0AF2XZnLXN2H0KvYOQKMrQ0ZsNqVmangDaLSHaph/Q0DoNu7/dxn3QGV3JoNYNbdsANIzZYeoN3rrQhxmqE4UNrTYAElPb2EHOCP0MzYuQLl/QwZUNmsWcwMDgm1jJ0NYNHToAD93ZaAe+EDaKQksNXJcAE3zZrQKuKRwAAzm6EG0MvIQP8Bb82aOXDbLL4Aos2e9ysN+sulEEDfLH4Gic2lDUA5zmABMPDhcsnXQ74JdY2oHkABOB4LDEAB9928vf3kgxDdgowBIFDlrMAAIKDIA8rbXN4JFrDjGQrmYn4KZG7m9mvgab7ZLy7lO0Dnr2ABO5DlMJoDQl7nhcBQnfwABWDBr3ACBSDfu/vmgl4IGS7IGqAAJk4KF6AA3W2kIf7omnDMrQwBFADgotABFMDmiNoA383pl1Csu7wCIiADgb4ICyADIkDhgoysql4KF0DbrdwANCACHyDqkdABHyACNMDklUkDlZ7rKBe/u2wAEBADCvABGfCtEpABH6AAMQABNc7/yl7G7KgABIzOyg3gARoAASRg3CmQAsZNAhCgAR6A7B2sweBeCgjA6z2d74RJAzFd75zAAD4g7/pO7j7g6P7On+098AOvARF+8AulAOOu8Lr8ACLt8LHQASku8dZMAv1u8aTwAbau8ay8Aszq8a7AAArQ7SKPqAagAAZv8ppgAT4Q8Su/oj6g5zC/ChIgwjXvxR+c876w8yrf84RpAD8P9MCwABQg50SvlxhAAbGO9KkwAPDc9Hn5Au8t9cHQAS7A9E2PAS4g7Fr/CzrgxFbfpSJQtWO/DCdQ6zXv6oi+9svQASyAA0PPygaAAywg9nLvDBtAAZeUzBiQAhSw1H1v/w0WcAIUEAM0cPfYSgMxQAEngPOHzw0WoAMfQAEcUAAv8O4Y4AEGMJqhz8fn/gIFwAEU8AE6QPmV3/qu//qwH/uyP/u0X/u2f/u4n/u6v/u83/u+//vAH/zCP/zEX/zGf/zIn/zKv/zM3/zO//zQH/3SP/3UX/3Wf/3Yn/3av/3c3/3ZgAAEQAATIAADoQDh7wAuePgFIADsz/4CQQDtLwDp3/frH//vH//zL/f13/73DwgCggdnhYaHiImKi4yNjo+QkZKTlJWWl5iZmpucnZ6foKGio6Slpp8FgqqnrK2WBKoChI+wAhUGrrm6u7y9vr/AwcLDxMWGqbHGypq1g/+PE7ECEcvU1dbX2Nna29y9yKvd3M2yjgrRggjh6uvs7e7v8PGL34Lyy+OzjAbnAgX2/wADChxIsGAhegIM/sLnaN85fwojSpxIsaJFTAgvtmLYyNy5dBpDihxJsiS3jCZDcWwELda0lDBjypxJUxPKmplWNqp1C6fPn0CDirwpVJLOokiTKl0akCjTRUefSp1KtWowp1bPRM3KtavXr5SwWt0KtqzZs1nFViWLtq3btz7VUmULt67duxblTqWLt6/fv/H0SuULuLDhw9UERxpAYNwgArg+KWjc8lzjAaMgEAhxLkFjRIQ7aSYQgd9jAqYaHzDt+TLi17BTKnZEwIH/6WghFGiCwPn2OQeROQ0o7VvVAQiFCA+IhhkSY8fFVU2A6AlC5ejSCeiOzb17xNmLICTAHmsCyFfkoznYnql3egEJNMfKx2h5rOaN7L/nZ55TAdv7nePdgAT+A14i171XAXKWOBRgPxiN96At8z2inyD41TdhZ+xd4t6G9RQo4ojqHGjIAABuiFolCO3XoSQQgHgOfYtcKECGNcoYSwU4SoJAijqSKOSQ15h4xgASqkcAdclBJ8iKkyCgSmMvJkdcNAmcF0mM/BywJCIFEJBgNDQqYmOPidgoS2PBIaIZkKo4YAkCSUYTAQFaHtNYnSES6eefV0UTJZyyVAlaBZZV/6JdJB8+OYlHuKEJGqHkOHKmhcxJosBq0UApCaEVeOqIkYCWauomJo4pKiMIcBqLoZ44KEgFebLKZwVMPiIemZje16sqkjLSKK2TXCldrY2QeuqyzEZyIJex5PqIq4IkYIqxArS5E5bBNkJtmWlmaqm4kyS4KiPQTsmioM22624mB/LJICVwagsKAohK51w0PF6iHLka+kqJjXJGwudLYbH77sIMPwKerAKEcMkA+VZ77Y6QYGuvURWOK3B+AEvSaLeGQAwuJMo2rDKg4AFJrL/RbFxdNMgiUrEABcNs3K8Y8nyjJZAKIjMifJLMSMorJy3kbEELcK6PN5/ciY2wGv+SbrY5dQzyxwEDe8nNCB+NG0YKK222u7NhW7MkapcSjbSIGFsBM1p33bPHXltyndSGYGu02MmcLXizswHJdyRNzyvKzXAfUucEdO+M991b561oLNY6AmTOliA9+OeIKSZlLE9TAnYpdQ59xujqZi155ZTb/XODZSvCuqNkBw767kQq1nTjlFzHeSipJxtN1ZH8y3WOy0siGELAo1w779QTqBjEaxeLsaKk8dOaP8XrQ3Pkzkw+O+znU9J0t9jDO3318MemmGOd0B8JAgTw+Z7q9rtePvpGu5QlBAiV7eUOHPFLoPzeBxrMdQJif8PWg/jnQPJVCoA++5uZQtZAVWT/7oB9UqAIDaOYD31QExAsh/4m2AgTbkJ5lpOdBsPVvEO40H26G6EO/VLCCm4ihYDTEdaE5UNMwDB2zIvhJAioiBuCMCE7jCJe5lfETADRTDfzYGOQZQAxnYOCHnxh3ZKIxA3WcF9nTE4V15VDKbqxLVRsoxEZWAhqDQJ5RIsFGBE4x9fJMIMT4+Ah+ncJz73xkEW53vg2Ibcgtk4S4VtE+/x3wT+ab4aIYGIirtg5OiLyk1RRDPQ4ITxGmKsSkVTEKCl5uCMJMpOvBKQjBaA4NvIRlLisiug6xYnTLeJmJ4SkHhtxO6dZsJWaNKMSJZHMQxQzbLYMYS6n+ZTClWcT/017WjFL14hUKmJzx5QlBgcYy0IAKZgJkyM115lIT/ZtkX1URc0SZwlvJsJvrBSnJSvRzENgK3qjcic7BzqT2SCEm5C42fAOsUpK2BMRTZNYPCtJxvRVFJOH6OcxeFVIgRL0oyYBT51ehp5hVrSWBjNpI+CE0UGOUZllpOEyF1POQsiro+oEqU5l49EzQAyazLwZSROxzXqqVHyxWCjH/HhRfS6xpj7lV0vPYMidWlUgTcue46KBUkjACaFRM6oqVGcIPkn0ckyFqUXVOlVXpnGrSdWqIiB21bqaxEZdnetDKNEodCKIq6g86iwjVtL/7fOwT32r1TikvZ4aQEIHAP9oIR47CMlOFrKWtatmN8FRSIwpr0S1owDwGNUdkTaPY42EBA+A0SOuVaYxReNMFSFBaVjISVB0hATxuNtH9HazwBXFV++nvwng0QBZNCYk9IdQ1ApNEqKVhlwN4doAQrWpkaBUxPAEmtr4xmcWk114xQuf4Jr3E9DxDGhPtEIvvagxpgEquuK7KDM1hgA3I6szteulvN43i8iEqkYv6aPobogWpgkWbru14PM6WBP4uo2FVvie5nZQiPpFhIEfFGDFunW2Tn1EoxQkUNwCz8Tb4kdmH8ziRODWr0QdU3rWy4jaspASuA1Qh0F8ouuytRK72k9uSpxgRjTYyEVusZL/J+EkyG2JwrfpzyUgkNwAZThNMt7PjmObUR/D9rWQMMCGO5UOG4G3vOSFcY87s+Q2w+hgONYubk5LCyj7xgGfwQRjHhQCAvxtwIUANGK5J9o+M+lCavbnOXi7aN822s2QdpgXlTsw+JIJMqF4DoXxzKZQTAa/puG0hWHpYUFjlxVBS/QhKCsLy7I6spF49YojTWsW00Optc61rosRml37+tesMJZ8gU3sYpfiZqM2trKXnU5V0JnZ0I72IuqEa2lb+9qIaFSysc3tYidoqN0Od4vN8SUmJ/fK4k63VWXFaf8SwMBOVre8z2tjHc/73uaV83uGje9+g7TK7znAs/1N/3BQTmbMt6lvwRde10/Xu89+ZrjEJ07xilv84hjPuMY3zvGOe/zjIA+5yEdO8pKb/OQoT7nKV87ylrv85TCPucxnTvOa2/zmOM+5znfO8577/OdAD7rQh070ohv96EhPutKXzvSmO/3pUI+61KdO9apb/epYz7rWt871rnv962APu9jHTvaym/3saE+72tfO9ra7/e1wj7vc5073utv97njPu973zve++/3vgA+84AdP+MIb/vCIT7ziF8/4xjv+8ZCPvOQnT/nKW/7ymM+85jfP+c57/vOgD73oR0/60pv+9KhPvepXz/rWu/71sI+97GdP+9rb/va4z73ud8/73pH7/vfAD77wh0/84hv/+MhPvvKXz/zmO//50I++9KdP/epb//rYz772t8/97nv/++APv/jHT/7ym//86E+/+tfP/va7//3wj7/850//+tv//vjPv/73z//++///ABiAAjiABFiABniACJiACriADNiADviAEBiBEjiBFFiBFniBGJiBGriBHNiBHviBIBiCFxEIACH5BAUKAGgALCwBjAACATABAAf/gGiCg4SFhoeIiYqLjI2JAQYGHhgaEC8FHBQfOhaOnp+goaKjpKWmp6iKAausra0GNDEUJ52ptre4ubq7vGiuv8CrGCksG2e9yMnKy8yOwc/ABjgsHc3W19jZo9DcwCsiJ9ri4+TW3ee/IyI65e3u76Xo8q4YLtXw+Pn6gvP9rS8Dju0bSBCbv4PCKCwoyLAhL4QQDXCQ4LCixXgQIT6YeLGjx0UZQz7wUeujyY8hUxpQwOCkS4spY6748LJmwZg4SdyzyfMdTpwPXLTsSXTcz58oMhRdavAozgY+hjKdiszpURoIqGrdlaJECRIQNHhoYBXhAyBb0yKTkOGDghgQ/wyURRdDqtq7vDp8EEGD7NxgNC7gHYxsgQwRK/7+8mCDsONeHShAUMyqAYjHmHd1UJCYso/MoHOdKPBAcQm7oVOXsrDDw18SC1XLLsUABIa5EErO3g2q9m2rKCjyHv6JAQXXTjUIJ86ckQQYfpHqbk790IbJRyHErs690BkKpX/mQN29+wUSR1OUXz/ojILoKTmwn5+hc0wW89lbwPG0cf71O8AHkQc7/cfdAOGFhMJ2BlaXwQgxFdBgeR3YlxFaE+pTQgExiLADCwNkwKA1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";
const mh_loading_bak = "data:image/png;base64,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";
const autoPagerLoading = "data:image/gif;base64,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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=";
//自定義站點規則
const customData = [{
name: "小黃書/8色人體攝影 xchina.co xchina.biz xchina.fun 8se.me", //按數字鍵1、Enter插入圖片(手動模式),按0、Enter、Enter壓縮打包下載
enable: 0, //0此規則禁用 1啟用
reg: /(xchina|8se)\.(co|me|biz|fun)\/photo\/id-\w+\.html/, //網址正則匹配
include: ".photos>a",
imgs: () => {
let numP = fun.geT("//i[@class='fa fa-picture-o']/parent::div").match(/\d+/)[0];
let max = Math.ceil(numP / 19);
return fun.getImg("img.cr_only", max, 2, ["_600x0", ""]); //xhr併發請求抓取所有頁面的圖片元素
},
insertImg: ["//div[div[@class='photos']]", 1], //清空元素內容把所有圖片插入到此元素 0手動插入模式 1自動插入模式 2自動插入Lazyloading模式
customTitle: () => { //js代碼自訂壓縮檔和資料夾名稱
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(.FullPictureLoadMsg):not(#FullPictureLoad):not(#FullPictureLoadOptions):not(a):not(.fancybox-container),.photoMask,.banner_ad{display: none!important;}",
category: "nsfw2"
}, {
name: "小黃書/8色人體攝影 xchina.co xchina.biz xchina.fun 8se.me", //xhr翻頁模式,翻完所有預覽圖後,立刻在預覽縮圖下面插入全部大圖
enable: 0,
reg: /(xchina|8se)\.(co|me|biz|fun)\/photo\/id-\w+\.html/,
include: ".photos>a",
imgs: async () => {
await fun.getNP(".photos>a", ".pager a[current=true]+a:not(.next)", null, ".pager"); //xhr翻頁模式聚集所有預覽圖
return [...fun.gae(".cr_only")].map(e => e.src.replace("_600x0", ""));
},
//insertImg: ["//div[div[@class='photos']]", 1],
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(.FullPictureLoadMsg):not(#FullPictureLoad):not(#FullPictureLoadOptions):not(a):not(.fancybox-container),.photoMask,.banner_ad{display: none!important;}",
category: "nsfw2"
}, {
name: "小黃書/8色人體攝影 xchina.co xchina.biz 8se.me", //xhr翻頁模式,聚集所有預覽圖,手動插入全部大圖,圖片量是幾百張的比較不會卡,不插大圖也能下載
enable: 0,
reg: /(xchina|8se)\.(co|me|biz|fun)\/photo\/id-\w+\.html/,
include: ".photos>a",
init: async () => {
await fun.getNP(".photos>a", ".pager a[current=true]+a:not(.next)", null, ".pager");
},
imgs: () => [...fun.gae("img.cr_only")].map(e => e.src.replace("_600x0", "")),
insertImg: ["//div[div[@class='photos']]", 0],
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(.FullPictureLoadMsg):not(#FullPictureLoad):not(#FullPictureLoadOptions):not(a):not(.fancybox-container),.photoMask,.banner_ad{display: none!important;}",
category: "nsfw2"
}, {
name: "小黃書/8色人體攝影 xchina.co xchina.biz xchina.fun 8se.me",
enable: 1,
reg: /(xchina|8se)\.(co|me|biz|fun)\/photo\/id-\w+\.html/,
include: ".photos>a",
imgs: async () => {
let numP = fun.geT("//i[@class='fa fa-picture-o']/parent::div").match(/\d+/)[0];
let max = Math.ceil(numP / 19);
if (max > 1 && [...fun.gae(".photos>a")].length < 20) {
let links = [];
let url = location.href.replace(".html", "");
for (let i = 2; i <= max; i++) {
links.push(url + "/" + i + ".html");
}
await fun.getEle(links, ".photos>a", [".photos", 0], ".pager,.photos>.item,.photos>.photoMask");
}
return [...fun.gae("img.cr_only")].map(e => e.src.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(.FullPictureLoadMsg):not(#FullPictureLoad):not(#FullPictureLoadOptions):not(a):not(.fancybox-container),.photoMask,.banner_ad{display: none!important;}",
topButton: true,
category: "nsfw2"
}, {
name: "JavSX.com https://w3.javsx.com/photos.html",
reg: /w3\.javsx\.com\/photos\/[\w-]+\.html$/,
imgs: async () => {
try {
let max = fun.ge("//a[text()='Last']").href.match(/\d+$/)[0];
let links = [];
for (let i = 2; i <= max; i++) {
links.push(location.href + "?page=" + i);
}
await fun.getEle(links, ".col-photos>a", [".col-photos", 0], ".pagination");
fun.gae("img[data-src]").forEach(e => {
e.src = e.dataset.src;
});
} catch (e) {}
//await fun.getNP(".col-photos>a", ".PageNav>a[style]+a", null, ".PageNav");
return [...fun.gae("img[data-src]")].map(e => e.dataset.src.replace(/resize=[^&]+&/, ""));
},
button: [4],
insertImg: [
[".col-photos", 2], 2
],
go: 1,
customTitle: () => fun.geT("h1.title").replace("| Body Photography", "").replace("- JVID", "").replace("- 未分类人体摄影", "").trim(),
css: ".col-photos{margin-bottom:60px}.pagination{margin-top:0px!important}",
category: "nsfw2"
}, {
name: "Nlegs/HoneyLeg www.nlegs.com www.honeyleg.com", //無法完全應對此站的人機驗證,請使用專用腳本 https://greasyfork.org/scripts/463123
enable: 0,
reg: /(www\.nlegs\.com|www.honeyleg.com)\/(girls|article)\//,
init: () => {
let loopFind = setInterval(() => {
fun.ge(".pagination>li:last-child>a") && (clearInterval(loopFind), fun.getNP("//div[a/div[contains(@style,'thumb') and span]]", "li.active+li>a", null, ".pagination"))
}, 100);
},
imgs: "js;return fun.getImgA('.img-res','a[href*=image]',1);",
insertImg: ["//div[div[@class='col-md-2 col-sm-4 col-xs-12']]", 0],
customTitle: () => fun.geT("strong"),
threading: 1,
fetch: 1,
//css: ".col-md-2.col-sm-4.col-xs-12{width:1000px!important;height:auto!important;display:block!important;margin:0 auto !important;float: none!important;}",
category: "nsfw2"
}, {
name: "雅拉伊 www.yalayi.com 免VIP僅支援圖片簡單命名數字遞增的。",
reg: /https?:\/\/www\.yalayi\.com\/gallery\/\d+\.html/i,
imgs: async () => {
await fun.waitEle(".bigimg>img");
let max = fun.ge(".tishiwenzi-box").innerText.match(/\d+/)[0];
let firstImg = fun.ge(".bigimg>img");
let path = firstImg.dataset.original.match(/.+\//)[0];
let testArr = [path + "1.jpg", path + "01.jpg", path + "001.jpg", path + "0001.jpg"];
let ok = false;
let padStart;
for (let i in testArr) {
let obj = await fun.checkImgStatus(testArr[i]);
console.log(`確認圖片[${i}]`, obj);
if (obj.ok) {
ok = true;
padStart = parseInt(i) + 1;
break;
}
}
let arr = [];
if (ok) {
arr.push(firstImg.src);
for (let i = 1; i <= max; i++) {
let src = path + String(i).padStart(padStart, "0") + ".jpg";
arr.push(src);
}
return arr;
} else {
return arr;
}
},
button: [4, "24%", 4],
insertImg: [".bigimg", 2],
customTitle: () => fun.title(" - ", 3),
threading: 4,
category: "nsfw1"
}, {
name: "JKF www.jkforum.net",
reg: /www\.jkforum\.net\/thread/,
imgs: "img[id^=aimg]",
customTitle: () => fun.title("-", 1),
category: "nsfw2"
}, {
name: "草榴 www.t66y.com cl.6962x.xyz",
reg: /\/htm_data\/\d+\/\d+\/\d+\.html/,
include: "img[ess-data]",
imgs: "img[ess-data]",
customTitle: () => fun.geT("h4.f16").replace(/\[\d+P\]$/i, ""),
category: "nsfw2"
}, {
name: "X成人论坛 xbbs.me",
reg: /xbbs\.me\/thread\/id-\w+\.html$/,
imgs: () => [...fun.gae(".xbbs-thread-image img[data]")].map(e => e.getAttribute("data")),
customTitle: () => fun.geT(".article>h1").trim(),
category: "nsfw2"
}, {
name: "驲哔么 ribi.me",
reg: /ribi\.me\/text\/\d+\/1$/,
imgs: ".img-fluid",
button: [4],
insertImg: [".container", 1],
customTitle: () => fun.attr(".img-fluid", "alt").replace(/\[福利COS\]\s?/, ""),
category: "nsfw1"
}, {
name: "优丝库HD - 免VIP yskhd.com ysk567.com",
reg: /(yskhd\.com|ysk567\.com)\/archives\/\d+/i,
exclude: "#menu-item-57917[class*=current]",
imgs: () => [...fun.gae(".article-content img[src*='-285x285']")].map(e => e.src.replace("-285x285", "")),
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, ""),
category: "nsfw1"
}, {
name: "优丝库HD - 日韓免VIP yskhd.com ysk567.com",
reg: /(yskhd\.com|ysk567\.com)\/archives\/\d+/i,
include: "#menu-item-57917[class*=current]",
imgs: () => [...fun.gae(".article-content img[src*='-285x285']")].map(e => e.src.replace("-285x285", "")),
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, ""),
category: "nsfw1"
}, {
name: "洛花秀 免VIP luohuaxiu.com",
reg: /luohuaxiu\.com\/archives\/\d+/,
exclude: ".single-video",
init: () => {
new MutationObserver(() => {
document.body.classList.remove("compensate-for-scrollbar");
}).observe(document.body, {
childList: true,
subtree: true
});
},
imgs: () => {
let arr = [];
let max = fun.gae(".gallery-item").length;
let url = fun.ge(".gallery-item a").href;
let m = url.match(/^(.+\/)([\w-]+)(\.[a-z]{3,4})$/i);
let path;
try {
path = m[1];
} catch (e) {
try {
if (/\(\d+\)\./.test(url)) {
let m = url.match(/^(.+\()(\d+)(\)\.[a-z]{3,4})$/i);
for (let i = 1; i <= max; i++) {
arr.push(decodeURI(m[1] + i + m[3]));
}
}
return arr;
} catch (e) {
return arr;
}
}
let fileName = m[2];
let ex = m[3];
let blur = fun.ge(".gallery-blur-item");
if (blur && fileName.length <= 4) {
let n = url.match(/(\d+)\.[a-z]{3,4}$/)[1];
for (let i = parseInt(n); i < (parseInt(n) + parseInt(max)); i++) {
arr.push(decodeURI(path + String(i).padStart(fileName.length, "0") + ex));
}
} else if (blur && fun.ge(".size-thumbnail[src*='-285x180']")) {
arr = [...fun.gae(".size-thumbnail[src*='-285x180']")].map(e => e.src.replace("-285x180", ""));
} else if (blur && fun.ge("img[src*='?width=285']")) {
arr = [...fun.gae("img[src*='?width=285']")].map(e => decodeURI(e.src.replace(/\?width=285.+/, "")));
} else if (blur) {
return arr;
} else {
arr = [...fun.gae(".gallery-item a")].map(e => e.href);
}
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"),
category: "nsfw1"
}, {
name: "24FA https://www.24fa.com/c49.aspx",
reg: /(www\.)?\d{2,3}(m|w|faw|fa|aa)?\.[a-z]{2,4}\/m?n\w+\.aspx/,
init: "document.onkeydown=null",
imgs: () => fun.getImgA("#content img", ".pager a:not([title])"),
button: [4],
insertImg: ["#content", 1],
autoDownload: [0],
next: ".prevNews>a",
prev: ".nextNews>a",
customTitle: () => fun.geT("h1"),
css: "body>section[id],#footer~*:not([id^='pv-']):not([class^='pv-']):not(.pagetual_tipsWords):not(.FullPictureLoadMsg):not(#FullPictureLoad):not(#FullPictureLoadOptions):not(.fancybox-container){display:none!important}",
category: "nsfw2"
}, {
name: "Hit-x-Hot www.hitxhot.org www.depvailon.com pic.yailay.com nungvl.net www.kaizty.com lootiu.com",
reg: /(www\.hitxhot\.org|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$/i,
imgs: () => {
let max;
try {
max = fun.geT("h1,h2").match(/\d+$/)[0];
} catch (e) {
max = 1;
}
return fun.getImg(".contentme img,.contentme2 img", max);
},
button: [4],
insertImg: [".contentme,.contentme2", 2],
customTitle: () => document.title.split("|")[0].slice(10).trim(),
css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}",
category: "nsfw2"
}, {
name: "Hit-x-HotM www.hitxhot.org www.depvailon.com pic.yailay.com nungvl.net www.kaizty.com lootiu.com",
reg: /(www\.hitxhot\.org|pic\.yailay\.com|www\.kaizty\.com)\/(gallerys|articles|photos)\/(?!\?page=|\?m=|hot|top|tag)\w+\.html\?m=1$|www\.depvailon\.com\/(?!\?page=|\?m=).+\.html\?m=1$|nungvl\.net\/gallerys\/\d+\.cg\?m=1$|lootiu\.com\/gallery\/.+\.cfg\?m=1$/i,
imgs: () => {
let max;
try {
max = fun.geT("h1,h2").match(/\d+$/)[0];
} catch (e) {
max = 1;
}
return fun.getImg(".contentme img,.contentme2 img", max, "8");
},
button: [4],
insertImg: [".contentme,.contentme2", 1],
customTitle: () => document.title.split("|")[0].slice(10).trim(),
css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}",
category: "nsfw2"
}, {
name: "TGStat Show more",
icon: 0,
key: 0,
reg: /^https:\/\/([a-z]{2}\.)?tgstat\.com\//,
observerClick: "//button[contains(text(),'Show more')]",
category: "nsfw2"
}, {
name: "Telegram Web",
reg: /^https:\/\/telegra\.ph\/.+/,
imgs: ".figure_wrapper img",
customTitle: () => fun.geT("h1"),
category: "nsfw2"
}, {
name: "新闻吧 https://www.xinwenba.net/web/meinv/ m.xwbar.com",
reg: /(www\.xinwenba\.net|m\.xwbar\.com)\/plus\/view-\d+-\d+\.html/,
imgs: () => {
let max;
try {
max = fun.geT(".paging>li>a").match(/\d+/)[0];
} catch (e) {
max = 1;
}
return fun.getImg(".main img", max, "5");
},
button: [4],
insertImg: [".view_img", 1],
autoDownload: [0],
next: ".pre_next li:first-child a",
prev: ".pre_next li:last-child a",
customTitle: () => fun.geT(".title>h1"),
category: "nsfw1"
}, {
name: "留园酷 https://www.cool18.com/",
reg: /(www\.cool18\.com\/bbs\d*\/index\.php\?app=forum&act=threadview&tid=\d+|wap\.cool18\.com\/index\.php\?app=index&act=view&cid=\d+)/,
imgs: "img[mydatasrc],#shownewsc img,.show_content img",
customTitle: () => fun.geT(".show_content b,h1.article-tit").replace(/(\s?\.?)?\s?\(\d+P\)\s?/i, ""),
css: ".img_ad_list{display:none!important}",
category: "nsfw2"
}, {
name: "ACG 资源网 meituzyw.com",
reg: /meituzyw\.com\/\d+\.html/i,
exclude: ".ri-hide-warp",
imgs: "img[data-lazy-src],.content-wrapper img",
button: [4],
insertImg: ["//p[img]", 2],
autoDownload: [0],
next: "a.entry-page-prev",
prev: "a.entry-page-next",
customTitle: () => fun.geT(".post-title,.entry-title").replace(/\[\d+p\]/i, "").trim(),
category: "nsfw1"
}, {
name: "秀人集 www.xr02.xyz",
reg: /www\.(xiuren\d+|xr\d+)\.\w+\/\w+\/\d+\.html/i,
imgs: () => fun.getImg('.content>p img[alt]', fun.geT(".page a:last-child", 2), 3),
button: [4],
insertImg: ["//div[p[img[@alt and @title]]]", 2],
autoDownload: [0],
next: "//span[contains(text(),'下一篇')]/a[contains(@href,'html')]",
prev: "//span[contains(text(),'上一篇')]/a[contains(@href,'html')]",
customTitle: () => fun.geT(".item_title>h1"),
//threading: 4,
css: ".content br{display:none!important}",
category: "nsfw1"
}, {
name: "秀人美女網 www.xrmnw.xyz www.xrmn01.vip www.xrmn03.cc",
reg: /(www\.xrmnw\.\w+|www.xrmn\d+.\w+)\/\w+\/\d+\/\d+\.html/i,
imgs: () => fun.getImg('.content p img[alt]', fun.geT(".page a:last-child", 2), 3),
button: [4],
insertImg: ["//div[p[img[@alt]]]", 2],
autoDownload: [0],
next: "//span[contains(text(),'下一篇')]/a[contains(@href,'html')]",
prev: "//span[contains(text(),'上一篇')]/a[contains(@href,'html')]",
customTitle: () => fun.geT(".item_title>h1").replace(/\d+P$/i, ""),
//threading: 4,
css: ".item_title>a,.content br,.bottom_fixed,body>div[id]:not([id^='pv-']):not([class^='pv-']):not(.pagetual_tipsWords):not(.FullPictureLoadMsg):not(#FullPictureLoad):not(#FullPictureLoadOptions):not(.fancybox-container){display:none!important}",
category: "nsfw1"
}, {
name: "爱美女网 www.imn5.net www.imn5.cc",
reg: /www\.imn5\.\w+\/\w+\/\w+\/\d+\.html/i,
imgs: () => fun.getImg('.imgwebp p img[alt]', fun.geT(".page a:last-child", 2), 3),
button: [4],
insertImg: ["//div[p[img[@alt]]]", 2],
autoDownload: [0],
next: "//span/b[contains(text(),'下一篇')]/a[contains(@href,'html')]",
prev: "//span/b[contains(text(),'上一篇')]/a[contains(@href,'html')]",
customTitle: () => fun.geT(".focusbox h1+div").replace(/\d+P$/i, ""),
//threading: 4,
css: ".imgwebp br,img[src*='zz2.gif']{display:none!important}",
category: "nsfw1"
}, {
name: "美人图 meirentu.cc",
reg: /meirentu\.\w+\/pic\/\d+\.html/i,
imgs: () => fun.getImg('.content_left img[alt]', fun.geT(".page a:last-child", 2), 5),
button: [4],
insertImg: [".content_left", 2],
autoDownload: [0],
next: "//span[contains(text(),'下一篇')]/a[contains(@href,'html')]",
prev: "//span[contains(text(),'上一篇')]/a[contains(@href,'html')]",
customTitle: () => fun.geT(".item_title>h1").replace(/\d+P$/i, ""),
//threading: 4,
css: "img[alt]~br{display:none!important}",
category: "nsfw1"
}, {
name: "极品性感美女 www.xgyw.pro",
reg: /www\.xg\w+\.\w+\/\w+\/\w+\.html/i,
include: "//div[@class='toptip']/a[text()='极品性感美女']",
imgs: () => fun.getImg('.article-content img[alt]', fun.geT("a.current~*:last-child", 2), 3),
button: [4, "22%"],
insertImg: ["//p[img[@alt]]", 2],
autoDownload: [0],
next: ".article-nav-next>a[href$=html]",
prev: ".article-nav-prev>a[href$=html]",
customTitle: () => fun.geT(".article-title").replace(/\d+p$/i, ""),
//threading: 4,
css: ".article-header>a,.article-content br,img[src*='zz1.gif'],.bottom_fixed,.article-content~a,#bottom-banner,.content>div[id]{display:none!important}",
category: "nsfw1"
}, {
name: "爱看美女网 www.ikmn03.cc",
reg: /www\.ikmn(\d+)?\.\w+\/\w+\/\d+\.html/i,
include: ".info-pagebar>a",
imgs: () => fun.getImg('.info-imtg-box img[alt]', fun.geT(".pagebar>*:last-child", 2), 3),
button: [4],
insertImg: ["//p[img[@alt]]", 2],
autoDownload: [0],
next: ".info-next li:last-child a",
prev: ".info-next li:first-child a",
customTitle: () => fun.geT("h1").replace(/\d+p$/i, ""),
//threading: 4,
category: "nsfw1"
}, {
name: "美女秀 www.22mm.net",
reg: /www\.22mm\.net\/a\/\w+\.html$/i,
imgs: () => fun.getImg(".content img", fun.ge(".page>li:last-child>a").href.match(/_(\d+)/)[1], 9),
button: [4],
insertImg: [".content", 2],
autoDownload: [0],
next: "//span[contains(text(),'上一篇')]/a",
prev: "//span[contains(text(),'下一篇')]/a",
customTitle: () => fun.geT(".item_title>h1"),
css: "union,.update_area_lists>li:nth-child(n+3):nth-child(-n+4){display:none!important}",
category: "nsfw1"
}, {
name: "卡卡美女网 www.kaka234.cc m.kaka234.cc",
reg: /https?:\/\/(www|m)\.kaka234\.cc\/HTM\/pic\/\w+\/\d+\/\d+\/\d+\.html/i,
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");
if (next) {
return next.href;
} else {
return null;
}
},
prev: 1,
customTitle: () => fun.geT(".Title>h1,.PsBox"),
css: ".m_adv{display:none!important}",
category: "nsfw1"
}, {
name: "福利图 fulitu.me",
reg: /fulitu\.me\/pic\/\d+\.html/i,
imgs: () => fun.getImg(".content_left img", fun.geT("//a[text()='下页']", 2), 5),
button: [4],
insertImg: [".content_left", 2],
autoDownload: [0],
next: "//span[contains(text(),'下一篇')]/a",
prev: "//span[contains(text(),'上一篇')]/a",
customTitle: () => fun.geT(".item_title>h1").replace(/\d+P$/i, "").trim(),
css: ".content br{display:none!important}",
category: "nsfw1"
}, {
name: "爱图门 aitu.men 佼人馆 jaoren.com",
reg: /^https:\/\/(aitu\.men|jaoren\.com)\/[^\/]+\/\d+\.html/i,
imgs: async () => {
await fun.getNP(".context img", ".pagelist span+a", null, ".pagelist", 0, null, 0);
return [...fun.gae(".context img")];
},
button: [4],
insertImg: [".context", 1],
autoDownload: [0],
next: ".post-previous a",
prev: ".post-next a",
customTitle: () => fun.geT("#content h1"),
category: "nsfw1"
}, {
name: "女神排行榜 nsphb.com",
reg: /^https:\/\/nsphb\.com\/\w+\/\d+\.html/i,
imgs: () => fun.getImgA(".article-content img", ".post-nav-links a"),
button: [4],
insertImg: [".article-content", 2],
autoDownload: [0],
next: "//a[p[text()='上一篇'] and not(starts-with(@href,'java'))]",
prev: "//a[p[text()='下一篇'] and not(starts-with(@href,'java'))]",
customTitle: () => fun.geT(".article-title>a").replace(/\d+p/i, ""),
category: "nsfw1"
}, {
name: "Hotgirl.biz",
reg: /^https:\/\/hotgirl\.biz\/[^\/]+\/$/i,
imgs: ".entry-content img",
button: [4],
insertImg: [".entry-content", 2],
customTitle: () => fun.geT(".entry-title"),
category: "nsfw1"
}, {
name: "XLUST.ORG",
reg: /^https:\/\/xlust\.org\/[^\/]+\/$/i,
imgs: ".rl-gallery-item a",
button: [4],
insertImg: [
[".rl-gallery", 2], 2
],
go: 1,
customTitle: () => fun.geT(".entry-title").replace(/\([\d\s]+pics\)\s?/, ""),
category: "nsfw1"
}, {
name: "秀人网 xiurenwang.me",
reg: /^https:\/\/xiurenwang\.me\/photo\.php\?id=\w+/i,
imgs: () => [...fun.gae(".intro>img")].map(e => e.src.replace("_600x0", "")),
button: [4],
insertImg: [".intro", 2],
customTitle: () => fun.geT("h1").replace(/\(\d+P\)/i, "").trim(),
css: "@media only screen and (max-width:640px){.paragraph .intro img{width:100%!important}}",
category: "nsfw1"
}, {
name: "秀人图 www.xiurenugril.com",
reg: /^https:\/\/www\.xiurenugril\.com\/\d+\.html/i,
exclude: "//button[contains(text(),'登录购买')]",
imgs: () => fun.getImgA("a[data-fancybox],.entry-content img", [...new Set([...fun.gae(".fenye a")].map(a => a.href))]),
button: [4],
insertImg: [".entry-content", 2],
autoDownload: [0],
next: ".article-nav-prev a",
prev: ".article-nav-next a",
customTitle: () => fun.geT(".entry-title").replace(/\d+p/i, "").trim(),
category: "nsfw1"
}, {
name: "微密猫 wememiao.com weme.su weme2.com",
reg: /(wememiao\.com|weme\.su|weme2\.com)\/archives\/\d+/i,
imgs: "a[data-fancybox]",
button: [4],
insertImg: [
[".single-content .article-tags", 2], 2
],
autoDownload: [0],
next: ".article-nav-prev a",
prev: ".article-nav-next a",
customTitle: () => fun.geT(".article-title").replace(/\[[0-9a-z-\.\s]+\]/i, "").trim(),
go: 1,
category: "nsfw1"
}, {
name: "优美图录 umei.net",
reg: /umei\.net\/\w+\/\d+\.html/i,
imgs: () => fun.getImg(".image_div img", fun.geT(".item_info span"), 9),
button: [4],
insertImg: [".image_div", 2],
customTitle: () => fun.geT(".item_title>h1"),
css: ".content_left img{cursor:unset}.affs,.xg_content>li:nth-child(n+1):nth-child(-n+2){display:none!important}",
category: "nsfw1"
}, {
name: "秀人图集 xiuren0.com",
reg: /xiuren\d\.com\/\d+\.html/i,
include: ".article-paging>*:last-child",
init: () => {
fun.remove("//p[img[@decoding and not(contains(@src,'/pic/'))]]");
},
imgs: () => fun.getImg(".article-content img:not([src*='/pic/'])", fun.geT(".article-paging>*:last-child"), "4"),
button: [4],
insertImg: [
[".article-paging", 1], 1
],
next: ".article-nav-prev>a",
prev: 1,
customTitle: () => fun.geT(".article-title"),
css: ".modown-ad{display:none!important}",
category: "nsfw1"
}, {
name: "秀人图集 xiuren0.com",
reg: /xiuren\d\.com\/\d+\.html/i,
imgs: ".article-content img:not([src*='p.xiurenb.top'])",
next: ".article-nav-prev>a",
prev: 1,
customTitle: () => fun.geT(".article-title"),
category: "nsfw1"
}, {
name: "Xiutaku xiutaku.com Kostaku kostaku.art",
reg: /(xiutaku\.com|kostaku\.art)\/\d+$/,
init: () => {
fun.remove(".search-form~*,.blog~*:not([class]),.pagination~*:not([class]):not(hr),.article.content~*:not([class]):not(hr),.bottom-articles~*");
},
imgs: () => fun.getImg(".article-fulltext img", fun.geT(".pagination-list>span:last-child")),
button: [4],
insertImg: [".article-fulltext", 2],
customTitle: () => fun.geT(".article-header>h1").replace("(mitaku.net)", "").trim(),
category: "nsfw1"
}, {
name: "私图网 baoruba.com tukuku.cc",
reg: /(baoruba\.com|tukuku\.cc)\/(bb|t)\d+\.html/i,
imgs: "img[decoding]",
button: [4],
insertImg: [".entry-content", 2],
customTitle: () => fun.title(" - 私图网"),
css: "[id].widget_text,.gridmode-post-thumbnail-single,.gridbit-thumbnail-alignwide{display:none!important}",
category: "nsfw1"
}, {
name: "找套图 www.zhaotaotu.cc",
reg: /www\.zhaotaotu\.cc\/thread-\d+\.htm/i,
imgs: ".message>img:not(:first-of-type)",
button: [4],
insertImg: [".message", 2],
customTitle: () => fun.geT(".media-body>h4").replace(/\(\d+P\)/i, ""),
category: "nsfw1"
}, {
name: "豆花520 www.douhua520.com",
reg: /www\.douhua520\.com\/p\/\d+/i,
imgs: () => [...fun.gae(".tm-container-content div>.img-fluid")].map(e => encodeURI("https://www.douhua520.com/" + e.alt)),
button: [4],
insertImg: ["//div[div[div[img[@class='img-fluid']]]]", 2],
customTitle: () => fun.geT(".tm-container-content h2.tm-text-primary"),
category: "nsfw1"
}, {
name: "尤美图库 www.umeitu.com",
reg: /www\.umeitu\.com\/img\/\d+\.html/,
imgs: () => fun.getImg(".vipimglist img", fun.geT(".stitle>h1>span").match(/\d+/)[0], 9),
button: [4],
insertImg: [".vipimglist", 2],
customTitle: () => fun.title(" - 尤美图库", 1).replace(/\[\d+P\]/i, ""),
css: ".sb.list2>li:nth-child(n+2):nth-child(-n+3){display:none!important}",
category: "nsfw1"
}, {
name: "美图库 www.meituku.org",
reg: /www\.meituku\.org\/\d+\/\d+\.html/,
imgs: () => [...fun.doc(imgs.join("")).images],
button: [4],
insertImg: ["#content", 2],
autoDownload: [0],
next: "//div[contains(text(),'下一篇')]/a",
prev: "//div[contains(text(),'上一篇')]/a",
customTitle: () => fun.geT(".info-title>a:nth-child(3)"),
category: "nsfw1"
}, {
name: "秀爱美女网 www.2mn.cc 秀套图吧 www.taotu8.cc",
reg: /(www\.2mn\.cc|www\.taotu8\.cc)\/mm\/\d+\.html/i,
imgs: () => {
let max;
try {
max = fun.ge(".page_navi a:last-child").href.split("_")[1].match(/\d+/)[0];
} catch (e) {
max = 1;
}
return fun.getImg(".sg_img img", max, 9);
},
button: [4],
insertImg: [".sg_img", 2],
customTitle: () => fun.geT("h1"),
css: "#divpsg,.tujia{display:none!important}",
category: "nsfw1"
}, {
name: "Xiuren 秀人网 www.xiuren.org",
reg: /www\.xiuren\.org\/.+\.html/i,
imgs: "a[rel='gallery']:not([href*='html']",
button: [4],
insertImg: [
[".post p>a:not([title])", 2, ".post p>a[title],.post p>span"], 1
],
customTitle: () => fun.geT("#title>h1").replace(/\d+p$/i, "").trim(),
css: "#post .post img{max-width:100% !important}",
category: "nsfw2"
}, {
name: "微圖坊 www.v2ph.com www.v2ph.net www.v2ph.ru",
//reg: /v2ph\.\w+\/album\/.+/i,
reg: () => {
if (/v2ph\.\w+\/album\/.+/i.test(siteUrl)) {
if (!siteUrl.includes("?page=")) {
return true;
}
}
return false;
},
include: ".photos-list",
init: () => {
if (/\.html\?hl=/.test(siteUrl)) {
location.href = location.href.replace(/\.html\?hl=.*/, ".html");
}
},
imgs: async () => {
let numP = fun.geT("dd:last-child").match(/\d+/)[0];
let max = Math.ceil(numP / 10);
let links = [];
links.push(siteUrl.replace(/\?page=\d+/, ""));
for (let i = 2; i <= max; i++) {
links.push(siteUrl.replace(/\?page=\d+/, "") + `?page=${i}`);
}
let srcArr = [];
let status = 200;
let vip = false;
let fetchNum = 0;
fun.show(displayLanguage.str_01, 0);
for (let i in links) {
await fetch(links[i]).then(res => {
if (res.status == 403) {
status = 403;
}
fun.show(`${displayLanguage.str_02}${fetchNum+=1}/${links.length}`, 0);
return res.arrayBuffer();
}).then(buffer => {
const decoder = new TextDecoder(document.characterSet || document.charset || document.inputEncoding);
const htmlText = decoder.decode(buffer);
const doc = fun.doc(htmlText);
debug(`\n${links[i]}\n`, doc);
let vipEle = fun.ge(".lead", doc);
if (vipEle) {
vip = true;
}
let imgs = [...fun.gae(".album-photo img[alt]", doc)];
if (imgs.length == 0) {
debug(`\n${links[i]}\n沒有任何圖片`);
} else {
debug(`\n${links[i]}\n此頁圖片`, imgs);
}
let tE = [...fun.gae("div.album-photo")].pop();
imgs.forEach(e => {
if (e.dataset.src) {
srcArr.push(e.dataset.src);
e.src = e.dataset.src;
} else {
srcArr.push(e.src);
}
tE.parentNode.insertBefore(e.parentNode.cloneNode(true), tE.nextSibling);
});
try {
fun.ge(".pagination").outerHTML = fun.ge(".pagination", doc).outerHTML;
} catch (e) {}
});
if (status == 403) {
setTimeout(() => {
fun.show("403請先登錄網站!", 0);
}, 1200);
return srcArr;
}
if (vip) {
setTimeout(() => {
fun.show("VIP限定專輯圖片!", 5000);
}, 1200);
return srcArr;
}
await fun.delay(600, 0);
}
debug(`\n所有圖片\n`, srcArr);
debug(`\n去重複後的圖片\n`, [...new Set(srcArr)]);
if (numP != srcArr.length && !vip) {
setTimeout(() => {
fun.hide();
fun.show("圖片有缺,請看主控台訊息", 5000);
}, 1300)
}
return srcArr;
},
button: [4],
insertImg: [".photos-list", 2],
customTitle: () => fun.geT("h1"),
css: ".albums-list img,.photos-list img{opacity:1!important}",
threading: 10,
category: "nsfw2"
}, {
name: "柠檬皮 www.cybesx.com",
reg: /www\.cybesx\.com\/\d+\.html$/i,
include: ".page-links",
exclude: ".read-point-box",
imgs: () => fun.getImg(".single-content img", (fun.geT(".page-links>a:last-child", 2) || 1), 7),
button: [4],
insertImg: [".single-content", 1],
customTitle: () => fun.geT("h1.entry-title"),
category: "nsfw1"
}, {
name: "柠檬皮 www.cybesx.com",
reg: /www\.cybesx\.com\/\d+\.html$/i,
include: ".single-content img",
exclude: ".read-point-box",
imgs: ".single-content img",
button: [4],
insertImg: [".single-content", 1],
customTitle: () => fun.geT("h1.entry-title"),
category: "nsfw1"
}, {
name: "Cherryfans cherryfans.cc",
reg: /cherryfans\.cc\/[^/]+\/$/i,
imgs: ".entry-content img[data-src]",
button: [4],
insertImg: [".entry-content", 2],
autoDownload: [0],
next: "a[rel=prev]",
prev: "a[rel=next]",
customTitle: () => fun.geT("h1.entry-title"),
css: ".entry-featured-media-main{display:none!important}",
category: "nsfw2"
}, {
name: "51sex 51sex.vip",
reg: /51sex\.vip\/pic\/\d+/i,
init: () => {
let url = siteData.next();
fun.addUrlHtml(url, ".headling_main", 1, "下一篇");
},
imgs: () => {
let max;
try {
max = fun.geT(".headling_swiper_num_small").match(/\d+/)[0];
} catch (e) {
max = 1;
}
let links = [];
for (let i = 1; i <= max; i++) {
links.push(location.href + "/" + i);
}
return fun.getImgA("#bigimg", links);
},
button: [4, "24%"],
insertImg: [".headling_main", 2],
next: () => {
let num = location.href.match(/\d+$/)[0];
return location.href.replace(/\d+$/, "") + (parseInt(num) - 1);
},
customTitle: () => fun.geT('.headling_word_main_box_title').replace(/\[\d+P\]/i, "").replace(/\d+P$/i, "").replace(/\(\d+P\)/i, "").trim(),
css: ".headling_main{height:auto}",
category: "nsfw1"
}, {
name: "51sex 51sex.vip 分類自動翻頁",
reg: /https?:\/\/51sex\.vip\/category\/\d+/i,
icon: 0,
key: 0,
init: () => {
let pathnameArr = location.pathname.split("/");
if (pathnameArr.length == 3) {
currentPageNum = 1;
} else {
currentPageNum = parseInt(location.pathname.split("/").pop());
}
},
autoPager: {
ele: ".headling_main_a",
observer: ".headling_main_a",
next: () => {
let url = location.href.match(/https?:\/\/51sex\.vip\/category\/\d+/)[0] + `/${currentPageNum += 1}`;
return url;
},
stop: () => {
let currentEles = [...fun.gae(".headling_main_a")];
if (currentEles.length < 24) {
return true;
} else {
if (currentEles.length > 24) {
currentEles = currentEles.slice(-24);
}
let nextEles = [...fun.gae(".headling_main_a", doc)];
for (let i in currentEles) {
for (let n in nextEles) {
if (currentEles[i].href == nextEles[n].href) {
return true;
}
}
}
}
return false;
},
history: 1,
title: () => {
return doc.title + ` - Page ${currentPageNum}`;
}
},
openInNewTab: ".headling_main_a",
category: "autoPager"
}, {
name: "美图乐 www.meitule.net",
reg: /www\.meitule\.\w+\/photo\/\d+\.html/i,
imgs: () => {
let max;
try {
max = fun.ge(".page>li:last-child>a").href.split("_")[1].match(/\d+/)[0];
} catch (e) {
max = 1;
}
return fun.getImg(".content img", max, 9);
},
button: [4],
insertImg: [".content", 2],
customTitle: () => fun.geT("h1.h5"),
css: "#dtag>center,#divpsg,.tujia,.list-album>li:nth-child(n+1):nth-child(-n+2){display:none!important}",
category: "nsfw1"
}, {
name: "美桌 http://www.win4000.com/meitu.html",
reg: /www\.win4000\.com\/\w+\.html/,
imgs: () => fun.getImgA(".pic-large", "#scroll>li:not(.current)>a", 200),
button: [4],
insertImg: ["#pic-meinv,.pic-meinv", 2],
autoDownload: [0],
next: ".group-next>a",
prev: ".group-prev>a",
customTitle: () => fun.geT(".ptitle>h1"),
threading: 3,
category: "nsfw1"
}, {
name: "MM1311 www.mm1311.net m.mm1311.net",
reg: /(www|m)\.mm1311\.net\/\w+\/\d+\.html/,
imgs: () => {
let max;
try {
max = fun.geT(".page-ch").match(/\d+/)[0];
} catch (e) {
max = fun.geT(".fenye>.rw").match(/\d+\/(\d+)/)[1];
}
return fun.getImg(".content-pic img,.post-content img", max, 9);
},
button: [4],
insertImg: [".content-pic,.post-content", 1],
autoDownload: [0],
next: ".updown_r",
prev: ".updown_l",
customTitle: () => fun.geT(".content>h5,.mm-title"),
css: "union{display:none!important}",
category: "nsfw1"
}, {
name: "依依图片网 www.eemm.cc 精选美女网 www.jxmm.net",
reg: /(www\.eemm\.cc|www\.jxmm\.net)\/pic\/\d+\.html/,
imgs: async () => {
await fun.getNP("#content img", "a.on+a:not(.next)", null, ".page", 0, null, 0);
return [...fun.gae('#content img')];
},
button: [4],
insertImg: ["#content", 1],
customTitle: () => fun.geT(".article>h1"),
css: ".article .content img{max-width:100%!important}",
category: "nsfw1"
}, {
name: "依依图片网M m.eemm.cc 精选美女网M m.jxmm.net",
reg: /(m\.eemm\.cc|m\.jxmm\.net)\/pic\/\d+\.html/,
imgs: async () => {
let max = fun.geT(".contentpage").match(/\d+\/(\d+)/)[1];
return fun.getImg(".content img", max, 9);
},
button: [4],
insertImg: [".content", 1],
customTitle: () => fun.geT(".content>h1"),
css: ".topad,.mdiv{display:none!important}",
category: "nsfw1"
}, {
name: "内涵吧 www.neihantu.net",
reg: /(www|wap)\.neihantu\.net\/zhainannvshen\/\d+\.html$/,
imgs: async () => {
let max = fun.geT("a[title=Page]>b:last-child");
return fun.getImg("#adcon img,.newsbox img", max, 9);
},
button: [4],
insertImg: ["#adcon,.newsbox", 1],
autoDownload: [0],
next: "//li[@id='pre']/a | //a[text()='上一篇']",
prev: "//li[@id='next']/a | //a[text()='下一篇']",
customTitle: () => fun.geT(".inner>h1,.titbox>h1"),
category: "nsfw1"
}, {
name: "青年美圖 jrants.com",
reg: /^https?:\/\/jrants\.com\/\d+\.html$/,
imgs: async () => {
let ele = fun.ge(".page-links");
if (ele) {
let max = fun.geT(">a:last-child");
return fun.getImg(".entry-content img", max, 7);
} else {
return [...fun.gae(".entry-content img")];
}
},
button: [4],
insertImg: [".entry-content", 1],
customTitle: () => fun.geT(".entry-title").replace(/\(\d+P\)|\[\d+P\]|\[\d+P\/\d+1M\]/gi, "").trim(),
category: "nsfw2"
}, {
name: "MM5MM5美女图片 www.mm5mm5.com",
reg: /www\.mm5mm5\.com\/mm\/\d+/,
imgs: () => picinfo[0].split(","),
button: [4],
insertImg: ["#content", 1],
customTitle: () => fun.geT(".article>h2"),
css: ".article .content img{max-width:100%!important}",
category: "nsfw1"
}, {
name: "MM5MM5美女图片M m.mm5mm5.com",
reg: /m\.mm5mm5\.com\/mm\/\d+/,
imgs: () => {
let max = fun.geT(".contentpage>span>i").match(/\/(\d+)/)[1];
let links = [];
links.push(location.href);
for (let i = 1; i < max; i++) {
links.push(location.href + "/" + i);
}
return fun.getImgA("div>a>img", links, 333);
},
button: [4],
insertImg: ["//div[a[img]]", 2],
customTitle: () => fun.geT(".content>h1"),
css: "union[id],.pag-ts,.contentpage{display:none!important}",
category: "nsfw1"
}, {
name: "可爱小图 www.keaitupian.com m.keaitupian.com",
reg: /(www|m)\.keaitupian\.com\/pic\/\d+\.html/,
imgs: () => {
try {
let max = fun.geT(".entry-title,.desk-tit>h1").match(/\/(\d+)/)[1];
let links = [];
links.push(siteUrl)
let url = siteUrl.replace(".html", "");
for (let i = 1; i < max; i++) {
links.push(url + "-" + i + ".html");
}
return fun.getImgA(".entry-content img,#content_pic img", links, 1000);
} catch (e) {
return [...fun.gae(".entry-content img,#content_pic img")];
}
},
button: [4],
insertImg: [".entry-content,#content_pic", 1],
customTitle: () => fun.geT(".entry-title,.desk-tit>h1").replace(/(\d+\/\d+)/, "").trim(),
category: "nsfw1"
}, {
name: "回车桌面 www.enterdesk.com m.enterdesk.com",
reg: /^https?:\/\/((m\.)?mm?\.|www\.)enterdesk\.com\/\w+\/[0-9-]+\.html/,
include: ".arc_pandn .swiper-wrapper img,.marc_pandn .swiper-wrapper img",
imgs: () => [...fun.gae(".arc_pandn .swiper-wrapper img,.marc_pandn .swiper-wrapper 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"),
category: "nsfw1"
}, {
name: "女人吧 www.nvhai8.com m.nvhai8.com",
reg: /^https?:\/\/(www|m)\.nvhai8\.com\/body\/\d+\/\d+\.htm/,
init: () => {
fun.remove("//div[iframe] | //div[@class='hengfu2'] | //div[@onclick]");
document.body.removeAttribute("style");
},
imgs: () => {
try {
let max = fun.geT(".imgfooter>a").match(/\d+/)[0];
return fun.getImgA(".remark img,.ui-article-detail img", ".imgfooter>a[href]");
} catch (e) {
return [...fun.gae(".remark img,.ui-article-detail img")]
}
},
button: [4],
insertImg: [".remark,.ui-article-detail", 2],
autoDownload: [0],
next: "//label[contains(text(),'下一篇')]/preceding-sibling::a[1]",
prev: "//label[contains(text(),'上一篇')]/following-sibling::a[1]",
customTitle: () => fun.geT(".text_content>h1,.arc_location>a:last-child,.m_h1>a,h1"),
category: "nsfw1"
}, {
name: "3G 壁纸 https://www.3gbizhi.com/meinv",
reg: /(www|m|desk)\.3gbizhi\.com\/meinv\/(\w+\/)?\w+\.html/,
imgs: () => fun.getImgA("#contpic,#mobile_c_img>img", ".swiper-slide:not(:first-child) a"),
button: [4],
insertImg: ["#showimg", 1],
autoDownload: [0],
next: "a.next[href$=html]",
prev: "a.pver[href$=html]",
customTitle: () => fun.geT("h2.title,.titlew>h2"),
css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}.showcontw #showimg{height:auto!important}[class^=ad_id]{display:none!important}",
category: "nsfw1"
}, {
name: "亿图全景图库 https://www.yeitu.com/meinv/",
reg: /(www|m)\.yeitu\.com\/\w+\/\w+\/\w+\.html/,
imgs: () => {
let max = fun.geT(".imageset-sum,span.num").match(/\/\s?(\d+)/)[1];
let links = [];
links.push(siteUrl);
let url = siteUrl.replace(".html", "");
for (let i = 2; i <= max; i++) {
links.push(url + "_" + i + ".html");
}
return fun.getImgA(".img_box img[alt],.gallery-item img[alt],.article-show img", links, 333);
},
button: [4],
insertImg: [".img_box,.gallery-item,.article-show", 2],
customTitle: () => fun.geT("#title>h1,h1.article-title,.article-info>h1"),
css: ".appbox,.uk-page~section,.yt-pages+.mssp{display:none!important}",
category: "nsfw1"
}, {
name: "优美图库 https://www.umei.cc/meinvtupian/",
reg: /www\.umei\.cc\/meinvtupian\/\w+\/\d+\.htm/i,
imgs: () => {
let a = fun.ge(".pages li:last-child>a");
let max = a.href.match(/_(\d+).htm/)[1];
return fun.getImg(".big-pic img", max, 17);
},
button: [4],
insertImg: [".big-pic", 1],
autoDownload: [0],
next: ".preandnext:not(.connext)>a",
prev: ".preandnext.connext>a[href$=htm]",
customTitle: () => fun.geT("#photos>h1"),
css: ".photo img {max-width:100% !important}",
category: "nsfw1"
}, {
name: "优美图库M wap.umei.cc",
reg: /wap\.umei\.cc\/meinvtupian\/\w+\/\d+\.htm/i,
imgs: () => {
let max = fun.geT("a.noclick").match(/\/(\d+)/)[1];
return fun.getImg("#maincont img", max, 17);
},
button: [4],
insertImg: ["#maincont", 1],
autoDownload: [0],
next: () => {
let next = fun.ge("a.f-r.l3");
if (next) {
return next.href;
} else {
return null;
}
},
prev: 1,
customTitle: () => fun.geT(".title>h1"),
css: "#maincont>div:not(#FullPictureLoadImgBox),dl:nth-child(n+1):nth-child(-n+2){display:none!important}",
category: "nsfw1"
}, {
name: "MEITU131 www.meitu131.net/nvshen/ www.meitu131.net/meinv/ www.meitu131.net/jigou/ m.meitu131.net",
reg: /(www|m)\.meitu131\.(com|net)\/(\w+\/)?meinv\/\d+\//,
imgs: () => {
let max = fun.geT("a[title],.uk-page>span").match(/\/(\d+)/)[1];
let links = [];
let url = location.href.replace(/index(\w+)?\.html$/, "");
for (let i = 1; i <= max; i++) {
if (i == 1) {
links.push(url + "index.html");
} else {
links.push(url + "index_" + i + ".html");
}
}
return fun.getImgA(".work-content img,.uk-article-bd img", links, 333);
//return fun.getImg(".work-content img,.uk-article-bd img", max, 15);
},
button: [4],
insertImg: [".work-content>p,.uk-article-bd", 1],
customTitle: () => fun.geT(".contitle-box>h1,h1.uk-article-title"),
css: ".appbox,.uk-page~section{display:none!important}.work-content img{max-width:100%!important}",
category: "nsfw1"
}, {
name: "晴空头像图库 www.qq7k.com",
reg: /www\.qq7k\.com\/\w+\/\w+\/\d+.html/i,
init: () => {
let a = fun.ge(".content a");
a.outerHTML = a.innerHTML;
},
imgs: () => {
let max = parseInt(qingtiancms_Details.Total);
if (max > 1) {
return fun.getImg(".content img", max, 9);
} else {
return [...fun.gae(".content img")];
}
},
button: [4],
insertImg: [".content", 1],
autoDownload: [0],
next: "//a[text()='上一篇']",
prev: 1,
customTitle: () => fun.geT(".contitle-box>h1"),
css: ".content img{cursor:unset!important;margin:0px auto!important;border:none!important}",
category: "nsfw1"
}, {
name: "晴空头像图库M m.qq7k.com",
reg: /m\.qq7k\.com\/\w+\/\w+\/\d+.html/i,
init: () => {
let a = fun.ge(".show-simg a");
a.outerHTML = a.innerHTML;
},
imgs: async () => {
await fun.getNP(".show-simg img", "#playnext[href*=_]", null, ".show-pages", 0, null, 0);
return [...fun.gae(".show-simg img")];
},
button: [4],
insertImg: [".show-simg", 1],
autoDownload: [0],
next: "#playpre",
prev: 1,
customTitle: () => fun.geT(".m-article>h1"),
css: "#bigImg{margin:0px!important}",
category: "nsfw1"
}, {
name: "930图片网 www.930tu.com m.930tu.com",
reg: /(www|m)\.930tu\.com\/\w+\/\w+\/\d+.html$/i,
include: ".page a,a[title=Page]",
init: () => {
let a = fun.ge(".pic-main a,.pic-m a");
a.outerHTML = a.innerHTML;
},
imgs: () => {
let max = fun.ge("//a[text()='尾页']").href.match(/_(\d+)/)[1];
return fun.getImg(".pic-main img,.pic-m img", max, 9);
},
button: [4],
insertImg: [".pic-main,.pic-m", 1],
autoDownload: [0],
next: "//a[@class='pic-next']|//a[text()='下一组图']",
prev: "//a[@class='pic-prew']|//a[text()='上一组图']",
customTitle: () => fun.geT(".pic h1,.tit-m h1"),
css: ".pic .pic-main img{max-width:100%!important}",
category: "nsfw1"
}, {
name: "爱美女 www.2meinv.com",
reg: /www\.2meinv\.com\/article.+\.html/,
imgs: () => {
let max = fun.geT(".des>h1,.post_title_topimg").match(/\/\s?(\d+)/)[1];
return fun.getImg(".pp.hh img[alt],#image_div img", max, 5);
},
button: [4],
insertImg: [".pp.hh,.content", 1],
autoDownload: [0],
next: "//a[@class='active' and contains(text(),'下一篇')] | //a[@class='active' and contains(text(),'下一组')]",
prev: "//a[@class='active' and contains(text(),'上一篇')] | //a[@class='active' and contains(text(),'上一组')]",
css: ".pp img{max-width:100%!important}",
customTitle: () => fun.title("_", 1),
category: "nsfw1"
}, {
name: "爱美女M mm.2meinv.com",
reg: /mm\.2meinv\.com\/article-\d+\.html/,
imgs: () => {
let max = fun.geT(".article-page>*:last-child", 2);
return fun.getImg(".arcmain img,#image_div img", max, 5);
},
button: [4],
insertImg: [".clearfix.arcmain,.content", 1],
autoDownload: [0],
next: "a.f-r.l3",
prev: "a.f-l.l2",
css: "body>a{display:none!important}",
customTitle: () => fun.title("_", 1),
category: "nsfw1"
}, {
name: "绅士猫 www.cos6.net",
reg: /www\.cos6\.net\/\d+\.html/,
exclude: ".tinymce-hide",
imgs: ".wp-posts-content img[data-src]",
button: [4],
insertImg: [".bialty-container", 2],
autoDownload: [0],
next: ".article-nav>div:first-child>a[href$=html]",
prev: ".article-nav>div:last-child>a[href$=html]",
customTitle: () => fun.geT("h1.article-title"),
category: "nsfw1"
}, {
name: "RedBust redbust.com",
reg: /redbust\.com\/[^\/]+\/$/,
include: ".entry-inner img",
imgs: () => {
//return fun.getImgA(".image-attachment img", ".gallery a");
return [...fun.gae(".entry-inner img")].map(img => {
let srcset = img.getAttribute("srcset");
if (srcset) {
let splitArr = srcset.split(",");
splitArr = splitArr.sort((a, b) => {
return a.match(/\s(\d+)w/)[1] - b.match(/\s(\d+)w/)[1];
});
return splitArr.pop().trim().split(" ")[0];
} else {
return img.src.replace(/-\d+x\d+\./, ".");
}
});
},
button: [4],
insertImg: [".entry-inner", 2],
autoDownload: [0],
next: ".previous>a",
prev: ".next>a",
customTitle: () => fun.geT("h1.post-title"),
category: "nsfw2"
}, {
name: "妞妞之家 niuniuhome.club",
reg: /niuniuhome\.club\/[^\/]+\/$/,
imgs: ".entry-content img",
button: [4],
insertImg: [".post-content", 2],
autoDownload: [0],
next: "a.post-nav-prev",
prev: "a.post-nav-next",
customTitle: () => fun.geT(".post-title"),
category: "nsfw1"
}, {
name: "PixiBB www.pixibb.com",
reg: /(htps?:\/\/www\.pixibb\.com\/$|https?:\/\/www\.pixibb\.com\/\?list=)/,
icon: 0,
key: 0,
openInNewTab: ".list-item-image a",
category: "nsfw1"
}, {
name: "PixiBB www.pixibb.com",
reg: /www\.pixibb\.com\/album\//,
imgs: () => {
let arr = [...fun.gae(".list-item-image img")].map(e => e.src.replace(".md.", "."));
arr = arr.sort((a, b) => {
return a.match(/---(\d+)/)[1] - b.match(/---(\d+)/)[1];
});
return arr;
},
button: [4],
insertImg: [
[".pad-content-listing", 2], 2
],
go: 1,
topButton: true,
customTitle: () => fun.title(" - PixiBB", 1),
category: "nsfw1"
}, {
name: "E次元 www.evacg.org",
reg: /www\.evacg\.org\/archives\/\d+/,
imgs: ".wp-caption img",
button: [4],
insertImg: [
[".inn-singular__post__body__content", 0, ".wp-caption"], 2
],
customTitle: () => fun.geT(".inn-singular__post__title"),
category: "nsfw1"
}, {
name: "3楼猫图库 pic.3loumao.org",
reg: /pic\.3loumao\.org\/[a-z-]+\/\d+\.html/i,
imgs: "article img",
button: [4],
insertImg: ["//p[img]", 2],
customTitle: () => fun.geT("h1"),
category: "nsfw1"
}, {
name: "Simply Cosplay www.simply-cosplay.com",
reg: /www\.simply-cosplay\.com\/gallery\//,
imgs: async () => {
fun.show(displayLanguage.str_04, 0);
await fun.waitEle(".swipe-area img", 600);
fun.hide();
return [...fun.gae(".swiper-slide img")].map(e => e.dataset.src.replace("small_square_", ""));
},
button: [4],
insertImg: ["//div[div[div[div[@class='image-wrapper']]]]", 2],
customTitle: async () => {
await fun.waitEle("h1.content-headline", 600);
return fun.geT('h1.content-headline');
},
fetch: 1,
css: ".gallery-view .row{display:block}",
category: "nsfw1"
}, {
name: "COSPLAY ZIP coszip.com",
reg: /^https?:\/\/coszip\.com\/\d+\.html$/,
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: "萝莉少女 cosporn.online",
reg: /cosporn\.online\/.+\//,
init: "setTimeout(()=>{fun.gae('.g1-nav-single a').forEach(e=>{e.removeAttribute('target')})},2000)",
include: ".g1-content-narrow",
imgs: () => {
return [...fun.gae(".g1-content-narrow img:not([id])")].map(e => {
let lazySrc = e.dataset.lazySrc;
if (lazySrc) {
return lazySrc.replace(/\?w=\d+&ssl=1/, "");
} else {
return e.src.replace(/\?w=\d+&ssl=1/, "");
}
})
},
button: [4],
insertImg: [".g1-content-narrow", 2],
autoDownload: [0],
next: "#content .g1-teaser-prev",
prev: "#content .g1-teaser-next",
customTitle: () => fun.geT("h1.entry-title"),
css: "#simple-banner,.touchy-wrapper,.touchy-wrapper~*:not([id^='pv-']):not([class^='pv-']):not(.pagetual_tipsWords):not(.FullPictureLoadMsg):not(#FullPictureLoad):not(#FullPictureLoadOptions):not(.fancybox-container),.code-block,#secondary{display:none!important}",
category: "hcomic"
}, {
name: "女神社 nshens.com inewgirl.com",
reg: /(nshens\.com|inewgirl\.com)\/\d+\/\d+\/\d+\/[^/]+$/,
exclude: ".justify-center>button>.v-btn__content",
delay: 800,
imgs: async () => {
fun.show(displayLanguage.str_05, 0);
let links = [];
let resArr = [];
let fetchNum = 0;
let max = fun.geT(".v-pagination li:last-child", 2);
links.push(location.href);
for (let i = 2; i <= max; i++) {
links.push(location.href + "/" + i);
}
for (let i in links) {
let res = fun.fetchDoc(links[i]).then(doc => {
fun.show(`${displayLanguage.str_06}${fetchNum+=1}/${links.length}`, 0);
let code = [...doc.scripts].find(s => s.innerHTML.search(/photoList/) > -1).innerHTML;
return fun.run(code.match(/photoList:([^\]]+\])/)[1]);
});
resArr.push(res);
}
let photourl = await Promise.all(resArr).then(data => {
fun.hide();
return data.flat().map(e => e.photourl);
});
if (photourl.length > [...new Set(photourl)].length) {
setTimeout(() => {
fun.show("VIP套圖需升級為VIP", 5000);
}, 1200)
}
return photourl;
},
button: [4],
insertImg: ["//div[a[div[@class='v-image v-responsive theme--light']]]", 2],
customTitle: () => fun.geT("h3"),
category: "nsfw2"
}, {
name: "女神社 nshens.com inewgirl.com lovens.cc",
reg: /(nshens\.com|inewgirl\.com)\/latestpost$/,
delay: 500,
icon: 0,
key: 0,
observerClick: "//button[span[text()='加載更多'] or span[text()='加载更多'] or span[text()='Load More'] or span[text()='Tải thêm']]",
category: "nsfw2"
}, {
name: "Chottie chottie.com", //很多都需要VIP,不然只會重複抓到第一頁的圖片
reg: /chottie\.com\/blog\/(\w{2}\/)?archives\/\d+$/,
exclude: ".justify-center>button>.v-btn__content",
delay: 800,
imgs: async () => {
fun.show(displayLanguage.str_05, 0);
let links = [];
let resArr = [];
let fetchNum = 0;
let max = fun.geT(".v-pagination li:last-child", 2);
links.push(location.href);
for (let i = 2; i <= max; i++) {
links.push(location.href + "/" + i);
}
for (let i in links) {
let res = fun.fetchDoc(links[i]).then(doc => {
fun.show(`${displayLanguage.str_06}${fetchNum+=1}/${links.length}`, 0);
let code, imgs;
try {
code = [...doc.scripts].find(s => s.innerHTML.search(/imgList/) > -1).innerHTML;
imgs = fun.run(code.match(/imgList:([^\]]+\])/)[1]);
} catch (e) {
code = [...doc.scripts].find(s => s.innerHTML.search(/snapshotList/) > -1).innerHTML;
imgs = fun.run(code.match(/snapshotList:([^\]]+\])/)[1]);
}
return imgs;
});
resArr.push(res);
}
let data = await Promise.all(resArr).then(data => {
fun.hide();
return data.flat();
});
if (data.length > [...new Set(data)].length) {
setTimeout(() => {
fun.show("VIP套圖需升級為VIP", 5000);
}, 1200)
}
return data;
},
button: [4],
insertImg: ["//div[a[div[@class='v-image v-responsive theme--light']]]", 2],
//css: ".text-center{display:none!important}",
customTitle: () => fun.geT("h3"),
category: "nsfw2"
}, {
name: "街角图片社 ijjiao.com",
reg: /https?:\/\/ijjiao\.com\/\d+\/\d+\/\d+\/album/,
include: ".v-pagination",
exclude: "//span[text()='加载更多']",
delay: 800,
imgs: async () => {
let max = fun.geT("//li[button[@aria-label='Next page']]", 2);
let links = [];
let url = siteUrl.replace(/\/\d+$/, "");
links.push(url);
for (let i = 2; i <= max; i++) {
links.push(url + "/" + i)
}
fun.show(displayLanguage.str_07, 0);
let check = await fun.fetchDoc(links[1]).then(doc => {
let code = [...doc.scripts].find(s => s.innerHTML.search(/photoList/) > -1).innerHTML;
let photoList = fun.run(code.match(/photoList:([^\]]+\])/)[1]);
if (photoList.length < 1) {
return false;
} else {
return true;
}
});
if (check) {
fun.show(displayLanguage.str_05, 0);
let resArr = [];
let fetchNum = 0;
for (let i = 0; i < links.length; i++) {
let res = fun.fetchDoc(links[i]).then(doc => {
fun.show(`${displayLanguage.str_06}${fetchNum+=1}/${links.length}`, 0);
let code = [...doc.scripts].find(s => s.innerHTML.search(/photoList/) > -1).innerHTML;
let photoList = fun.run(code.match(/photoList:([^\]]+\])/)[1]);
return photoList;
});
resArr.push(res);
}
return Promise.all(resArr).then(data => {
fun.hide();
return data.flat().map(e => e.photourl);
});
} else {
fun.hide();
alert("登錄狀態已失效!請手動點擊第2頁,觸發密碼輸入框重新登錄。");
return [];
}
},
button: [4],
insertImg: ["//div[div[@class='image-item']]", 2],
customTitle: () => fun.geT("h3"),
category: "nsfw1"
}, {
name: "美妹妹 www.meimeimei.org",
reg: /www\.meimeimei\.org\/\d+\/\d+\/$|www\.meimeimei\.org\/\d+\/\d+\/\d+\.html/,
imgs: () => {
let max = fun.geT(".chapterpage>a:last-child", 2);
let links = [];
if (/\.html/.test(siteUrl)) {
let url = fun.ge(".pageCurr").href.replace("_1.html", "");
for (let i = 1; i <= max; i++) {
links.push(url + "_" + i + ".html");
}
} else {
let url = fun.ge(".pageCurr").href.replace("1.html", "");
for (let i = 1; i <= max; i++) {
links.push(url + i + ".html");
}
}
return fun.getImgA(".img>img", links, 100);
},
button: [4],
insertImg: [".txt_tcontent", 1],
autoDownload: [0],
next: "//div[contains(text(),'上一篇')]/a[not(@href='#')]",
prev: "//div[contains(text(),'下一篇')]/a[not(@href='#')]",
customTitle: () => fun.geT(".bread>li:last-child>a"),
category: "nsfw1"
}, {
name: "爱死美女图片站 www.24tupian.org",
reg: /^https?:\/\/www\.24tupian\.org\/\w+\/\d+\/\d+\/\d+\.html$/,
include: "img[data-original*='imgs.diercun.com']",
imgs: async () => {
await new Promise(async resolve => {
fun.show(displayLanguage.str_08, 0);
for (let i = 1; i <= 100; i++) {
if (fun.ge("//div[@class='moremsg'][contains(text(),'没有更多图片了')]")) {
fun.hide();
resolve();
break;
}
let ele = fun.ge(".mores>a");
if (ele) {
ele.click();
}
await fun.delay(200);
}
});
return [...fun.gae("#piclist img[data-original]")].map(e => {
let arr = e.dataset.original.split("/");
arr[2] = arr[2].replace("imgs.diercun.com", "big.diercun.com");
arr[arr.length - 1] = arr[arr.length - 1].replace(/^m/, "");
let bigSrc = arr.join("/");
return bigSrc;
});
},
button: [4],
insertImg: [
[".mores", 2], 2
],
go: 1,
topButton: true,
threading: 12,
customTitle: () => fun.geT(".gtitle1>h1"),
css: "body>.mask{display:none!important}",
category: "nsfw1"
}, {
name: "爱死cos美女图片站 www.24cos.org www.lovecos.net",
reg: /(www\.24cos\.org|www\.lovecos\.net)\/\w+\/\d+\.html$/,
imgs: async () => {
let pages = [...fun.gae(".page>a")];
let liImgs = [...fun.gae(".mtp>li")];
if (pages.length > 0 && liImgs.length < 21) {
fun.show(displayLanguage.str_08, 0);
for (let i in pages) {
await fun.fetchDoc(pages[i].href).then(doc => {
[...fun.gae(".mtp>li", doc)].forEach(ele => {
fun.ge(".mtp").appendChild(ele);
});
});
}
fun.hide();
}
return [...fun.gae(".mtp img")].map(e => decodeURI(e.src.replace("/m", "/")));
},
insertImg: [
[".mtp", 2], 2
],
go: 1,
topButton: true,
threading: 5,
customTitle: () => fun.geT(".tmsg>h1"),
category: "nsfw1"
}, {
name: "Huamao wallpaper 花猫壁纸 en.huamaobizhi.com 聚集的只是大一點點的預覽圖",
reg: /https?:\/\/en\.huamaobizhi\.com\/mix\/\d+/,
init: () => {
let load = fun.ge(".load-more-photos");
if (load) load.remove();
},
imgs: async () => {
await fun.getNP(".images-card", "//a[text()='Next' or text()='下一页' or text()='次へ']");
return fun.getImgA("figure img", ".images-card>a", 200);
},
button: [4],
insertImg: [
["#main", 2], 2
],
go: 1,
customTitle: () => fun.geT(".title>h1"),
category: "nsfw1"
}, {
name: "新美图录 www.xinmeitulu.com 臺灣美腿女郎 www.twlegs.com",
reg: /(www\.xinmeitulu\.com|www\.twlegs\.com)\/photo\/.+/,
imgs: "img[data-original]",
button: [4],
insertImg: [".text-center", 2],
customTitle: () => fun.geT("h1.h3"),
category: "nsfw1"
}, {
name: "美图录 meitulu.me",
reg: /meitulu\.me\/item\/\d+\.html/,
imgs: () => fun.getImg(".mb-4>img[alt]", fun.geT(".pagination>li:last-child", 2), 9),
button: [4],
insertImg: [".mb-4", 1],
customTitle: () => fun.geT(".top-title"),
category: "nsfw1"
}, {
name: "jk-coser www.jk-coser.com",
reg: /www.\jk-coser\.com\/m\d\/\d+\.html/,
imgs: ".image_div img",
button: [4],
insertImg: [".image_div", 2],
autoDownload: [0],
next: ".article-nav-prev a,.nav-links .next",
prev: 1,
customTitle: () => fun.geT(".item_title>h1").replace(/\/?\(\d+P\)/i, "").trim(),
css: ".content_left img{cursor:unset}",
category: "nsfw1"
}, {
name: "赞MM www.zanmm.com 恩图集 www.entuji.com",
reg: /www\.zanmm\.com\/tupian\/\d+\.html|www\.entuji\.com\/\w+\/\d+\.html/,
imgs: () => {
let max = fun.geT("//p[contains(text(),'图片数量')]").match(/\d+/)[0];
return fun.getImg("#showimg img", max, 9);
},
button: [4],
insertImg: ["#showimg", 1],
customTitle: () => fun.geT(".weizhi h1"),
css: "@media only screen and (max-width:3840px){.content img{max-width:100%!important}}",
category: "nsfw1"
}, {
name: "秀窝 www.xiuwo.net RMM吧 rmm8.com",
reg: /(www\.xiuwo\.net|rmm8\.com)\/tu\/\d+\.html/,
imgs: () => {
let max;
try {
max = fun.geT(".c_l>p:nth-child(3)").match(/\d+/)[0];
} catch (e) {
max = 1;
}
return fun.getImg('#showimg img', max, 9);
},
button: [4],
insertImg: ["#showimg", 1],
customTitle: () => fun.geT(".weizhi h1"),
css: "@media only screen and (max-width:3840px){.content img{max-width:100%!important}}",
category: "nsfw1"
}, {
name: "妹妹图 mm.tvv.tw",
reg: /mm\.tvv\.tw\/archives\/\d+\.html/,
imgs: ".img-responsive",
button: [4],
insertImg: ["//p[img]", 2],
customTitle: () => fun.geT(".blog-details-headline"),
category: "nsfw1"
}, {
name: "小姐姐 www.nvsheng.cc",
reg: /nvsheng\.cc\/\w+\/\d+\.html/,
imgs: () => fun.getImg(".info-imtg-box>img[alt]", fun.geT(".pagebar>*:last-child", 3)),
button: [4],
insertImg: [".info-imtg-box", 1],
autoDownload: [0],
next: "//a[p[text()='上一篇']]",
prev: "//a[p[text()='下一篇']]",
customTitle: () => fun.title("-", 1),
//threading: 4,
category: "nsfw1"
}, {
name: "洛秀网 loxiu.com",
reg: /loxiu\.com\/post\/\d+\.html/,
imgs: () => fun.getImg(".info-imtg-box>img[alt]", fun.geT(".pagebar>*:last-child", 3)),
button: [4],
insertImg: [".info-imtg-box", 1],
autoDownload: [0],
next: "//a[p[text()='上一篇']]",
prev: "//a[p[text()='下一篇']]",
customTitle: () => fun.geT(".info-title>h1"),
category: "nsfw1"
}, {
name: "遛无写真 www.6evu.com KP写真 www.6kpo.com 美女云图网 www.c0h.net tck天天番号 www.3tck.com 4tck番号库 www.4tck.com 5tck天天番号 www.5tck.com 6K美女 www.6tck.com 7tck番号网 www.7tck.com 1凸5宅男福利 www.1tu5.com 有脾气美图 www.1plq.com 极品番号社 www.wsqap.com",
reg: /(www\.6evu\.com|www\.6kpo\.com|www\.c0h\.net|www\.\dtck\.com|www\.1tu5\.com|www\.1plq\.com|www\.wsqap\.com)\/\d+\.html/,
imgs: () => {
let arr = [];
arr.push(siteUrl);
[...fun.gae(".pagelist a,.pagination a,.article-paging a")].forEach(a => {
arr.push(a.href);
});
let links = [...new Set(arr)];
return fun.getImgA("#post_content img,.article-content img,.entry-content img", links);
},
button: [4],
insertImg: ["#post_content,.article-content,.entry-content", 2],
autoDownload: [0],
next: "a[rel=prev],.article-nav-prev a",
prev: "a[rel=next],.article-nav-next a",
customTitle: () => fun.geT("h1").replace(/\(\d+P\)/i, "").replace(/高品质壁纸图片传疯了|无圣光壁纸图片免费在线|无圣光私房写真良心推荐|超高清私家拍摄作品珍藏版|超高清私房照片在线浏览|无圣光写真作品流出|无水印壁纸图片良心推荐|无水印绝版网图在线浏览|无水印私房照片珍藏版|无水印私房照片个人分享/g, "").trim(),
category: "nsfw1"
}, {
name: "原创妹子图/尤物私房图/极品美女图/免费私房图/私房网红图/尤物妹妹图 www.ycmzt.com/www.ywsft.com/www.jpmnt.com/www.mfsft.com/www.sfwht.com/www.ywmmt.com",
reg: /www\.(ywmmt|mnwht|ycmeinv|yhsft|yhmnt|mfsft|jpsft|akxzt|flwht|threnti|ywnmt|ztmeinv|mstaotu|tstaotu|ywmtw|mgtaotu|prmzt|xrtaotu|jjtaotu|prmeinv|axtaotu|mgmeinv|xsmeinv|ugtaotu|msmeinv|flxzw|axmeinv|swtaotu|hjtaotu|nsxzw|ugmeinv|hytaotu|xrmeinv|zfmeinv|jpmnt|zttaotu|mfmzt|ykmeinv|qjtaotu|pmtaotu|ddtaotu|plxzw|mfxzt|mtgqt|fltuku|yhtuku|ycmeitu|mttuku|xhtuku|qjtuku|jpflt|ycwht|yctuk|akywt|ywtuk|jctuk|xstuk|xgtuk|mztuk|xztuk|sytuk|gcxzt|tsxzt|gqxzt|mfnmt|spxzt|yhxzt|mtxzt|nsxzt|jdxzt|spmeitu|jpmzw|yhmeitu|mzmeitu|qpmzt|flsft|ywsft|wkmzt|snmzt|thmzt|brtaotu|aimzt|qtmzt|mtmnt|jrmzt|yztaotu|jrmeinv|xsmzt|zbtaotu|yhmnw|zbmzt|xjjtaotu|jpnst|ywmeitu|jrmnt|ftmeinv|xjjmzt|smtaotu|mtywt|sfsnt|jdtaotu|xgyouwu|ywmzt|xgywt|mtflt|nmtaotu|mtmnw|flmeitu|gqtaot|plmeitu|zpmzt|mtmzt|mtwht|sfwht|gqsft|yhmeinv|jdmnt|yctaotu|wkrenti|yzrenti|mtsyt|sptaotu|mttaotu|wsgtu|ywtaotu|sfmzt|sftaotu|gcmeinv|nstaotu|xhtaotu|jdwht|mtmeinv|gqwht|jpywt|jcwht|tptaotu|spyouwu|xgmeitu|nsmeitu|jstaotu|yhtaotu|sytaotu|nsxiez|swmzt|jpmzt|yhflt|sfywt|ywxzt|plmzt|sfmtw|jpyouwu|sfxzt|zftaotu|ycmzt|whtaotu|jpxzt|sftuku|plwht|symzt|sfmnt|sfnmt|jcmeinv|tsmnt|jjmeinv|wsgmzt|gqnmt)\.com\/[a-z]+\/[a-z]+\/\d+\/\w+\.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: () => fun.getImgO("#picg img[alt]", fun.geT(".pagelist font~*:last-child", 2), 9, [null, null], 1000, "h1,.page .pagelist", 0),
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`);
}
//let fetchNum = 0;
//fun.show(displayLanguage.str_01, 0);
for (let i in links) {
//fun.show(`${displayLanguage.str_02}${fetchNum+=1}/${links.length}`, 0);
let doc = await new Promise(async resolve => {
for (let check = 1; check <= 100; check++) {
let res = await fetch(links[i]);
if (res.status == 304 || res.status == 200) {
let buffer = await res.arrayBuffer();
let decoder = new TextDecoder(document.characterSet || document.charset || document.inputEncoding);
let htmlText = decoder.decode(buffer);
let doc = fun.doc(htmlText);
resolve(doc);
break;
} else {
fun.show(`第${parseInt(i) + 1}頁403重試第${check}次`, 2900);
await fun.delay(3000, 0);
}
}
});
//debug(`\n${links[i]}\n`, doc);
let imgs = [...fun.gae("#picg img[alt]", doc)];
let te = [...fun.gae("#picg img[alt]")].pop();
imgs.forEach(e => {
imgsArr.push(e.cloneNode(true));
te.parentNode.insertBefore(e.cloneNode(true), te.nextSibling);
});
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);
}
//debug(`\n所有src\n`, imgsArr.map(e => e.src));
//debug(`\n去重複的src\n`, [...new Set(imgsArr.map(e => e.src))]);
return imgsArr;
},
button: [4],
insertImg: ["#picg", 1],
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,
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,.interestline+.nav~*:not([id^='pv-']):not([class^='pv-']):not(.pagetual_tipsWords):not(.FullPictureLoadMsg):not(#FullPictureLoad):not(#FullPictureLoadOptions):not(.fancybox-container){display:none !important}",
category: "nsfw2"
}, {
name: "魅狸图片网 www.rosi8.com 美女私房照 www.sfjpg.com 看妹图 www.kanmeitu.net www.kanmeitu1.cc kanmeitu.net kanmeitu1.cc",
reg: /(www\.rosi8\.\w+|www\.sfjpg\.com|www\.sfjpg\.net|kanmeitu\.net|kanmeitu1\.cc)\/\w+\/\d+\.html$/,
init: () => {
fun.gae(".b a").forEach(a => {
a.removeAttribute("target");
});
fun.gae("#picg a").forEach(a => {
a.outerHTML = a.innerHTML;
});
},
imgs: () => {
let max = fun.geT(".pagelist span,.pagelist a[title=Page]").match(/\/(\d+)/)[1];
return fun.getImgO("#picg img", max, 9, [null, null], 200, ".page .pagelist", 0);
},
button: [4],
insertImg: ["#picg", 1],
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,
css: "#imgc img{margin:0px auto!important}#picg{max-width: 1110px!important;margin: 0 auto;}#picg img:hover{transform:none !important}#picg img{filter:blur(0px)!important}body>br,.interestline+center,center+#pic,#xzpap1,#divpsgx,#bdivpx,#divfts,#divftsp,#app+div,#xzappsq,div.bg-text,#divpsg,#divStayTopright2,#bdssy,#qrcode2>center,#d5tig,#pcapicb,#pcapic,#google_translate_element,#d5a>*:not([id]):not([class]),union[id]{display:none !important}",
category: "nsfw2"
}, {
name: "爱妹子 xx.knit.bid",
reg: /xx\.knit\.bid\/article\/\d+\//,
imgs: () => fun.getImg(".item-image img", (fun.geT("li.next-page", 2) || 1)),
button: [4],
insertImg: ["#img-box", 2],
customTitle: () => fun.geT(".focusbox-title").replace(/\[\d+P\]/i, "").replace(/\d+P/i, "").trim(),
category: "nsfw1"
}, {
name: "美女写真 portrait.knit.bid",
reg: /portrait\.knit\.bid\/\w+\/\d+$/,
imgs: async () => {
let max = fun.geT("//li[a[text()='下页']]", 2);
let links = [];
for (let i = 1; i <= max; i++) {
links.push(siteUrl + "?page=" + i);
}
return fun.getImgA(".container>.container>img", links, 300);
},
button: [4],
insertImg: [
[".container>.container>nav", 2, "nav[aria-label=pagination],.img-fluid"], 2
],
customTitle: () => fun.geT(".container h1"),
category: "nsfw1"
}, {
name: "萌图社 www.446m.com 446m.com",
reg: /https?:\/\/(www\.)?446m\.com\/index\.php\/\w+\/\d+\.html/,
imgs: ".post-item .img",
button: [4],
insertImg: [".post-content", 2],
customTitle: () => document.title.slice(0, -6),
category: "nsfw1"
}, {
name: "妹妹美 mmm.red",
reg: /(www\.)?mmm\.red\/art\/\d+$/,
exclude: ".login-tip",
imgs: "div[data-fancybox][data-src]",
autoDownload: [0],
next: "//div[text()='上一篇']/following-sibling::a",
prev: "//div[text()='下一篇']/following-sibling::a",
customTitle: () => fun.geT(".post-info-text"),
category: "nsfw1"
}, {
name: "胴体的诱惑 dongti.blog.2nt.com",
reg: /dongti\.blog\.2nt\.com\/blog-entry-\d+.html/,
imgs: ".inner-contents img",
button: [4],
insertImg: [".entry-content", 2],
autoDownload: [0],
next: "//a[div[@class='pager_entry-box next-justify']]",
prev: "//a[div[@class='pager_entry-image-prev']]",
customTitle: () => fun.geT("#entry-title").replace(/\[\d+P-[\d\.]+MB?\]/i, "").trim(),
category: "nsfw1"
}, {
name: "好圖屋 www.haotuwu.com m.haotuwu.com",
reg: /(www|m)\.haotuwu\.com\/\w+\/\d+(\/page\/\d+)?(\.html)?$/,
include: ".suoyou",
init: () => {
let url = location.href;
if (/\/page\/\d+/.test(url)) {
location.href = url.replace(/\/page\/\d+/, "");
}
},
imgs: () => {
let links = [];
links.push(location.href);
let url = location.href.replace(".html", "");
let max = fun.geT(".suoyou").match(/\d+\/(\d+)/)[1];
for (let i = 2; i <= max; i++) {
links.push(url + "/page/" + i + ".html");
}
return fun.getImgA("#showimg img,.img-box img", links);
},
button: [4],
insertImg: ["#showimg,.img-box", 2],
autoDownload: [0],
next: "//div[contains(text(),'上一篇')]/a | //span[contains(text(),'上一篇')]/following-sibling::a[1]",
prev: "//div[contains(text(),'下一篇')]/a | //span[contains(text(),'下一篇')]/following-sibling::a[1]",
customTitle: () => fun.geT(".showtitle>h2,.imgTitle-name"),
css: "#imgshow .flow-box:nth-child(n+1):nth-child(-n+2){display:none!important}",
category: "nsfw1"
}, {
name: "秀色女神 www.xsnvshen.co",
reg: /www\.xsnvshen\.(co|com)\/album\/\d+/,
imgs: () => [...fun.gae("img[id^='imglist'][data-original]")].map(e => e.dataset.original.replace("thumb_600x900/", "")),
button: [4],
insertImg: ["//li[img[@id='bigImg']]", 2],
customTitle: () => fun.geT("h1"),
css: ".workShow li img{max-width:100%!important}",
category: "nsfw1"
}, {
name: "秀色女神M https://m.xsnvshen.co/album/39844",
reg: /m\.xsnvshen\.(co|com)\/album\/\d+/,
imgs: () => {
let max = fun.geT(".pg_current").match(/\d+$/)[0];
return fun.getImg("#arcbox img.lazy", max, 6, ["thumb_600x900/", ""]);
},
button: [4],
insertImg: ["#arcbox", 1],
customTitle: () => fun.geT("h1"),
css: "#arcbox img{max-width:100%!important;margin:10px auto!important;min-height:50px!important;min-width:50px!important}",
category: "nsfw1"
}, {
name: "HotAsiaGirl hotgirl.asia 分頁模式",
reg: /hotgirl\.asia\/.+\//,
include: ".galeria_img",
imgs: () => fun.getImgA(".galeria_img>img", ".pagination a[href]"),
button: [4],
insertImg: [".mx-auto", 1],
customTitle: () => fun.geT("h3"),
css: ".galeria_img{display:none!important}",
category: "nsfw2"
}, {
name: "HotAsiaGirl hotgirl.asia 幻燈片模式",
reg: /hotgirl\.asia\/.+\//,
include: "#carouselImageIndicators",
imgs: "#carouselImageIndicators img",
button: [4],
insertImg: [".mx-auto", 1],
customTitle: () => fun.geT("h3"),
css: ".galeria_img{display:none!important}",
category: "nsfw2"
}, {
name: "BeautyLeg www.beautyleg6.com",
reg: /www\.beautyleg6\.com\/\w+\/\d+\/\d+\.html/i,
imgs: () => {
let max;
try {
max = fun.geT(".page a").match(/\d+/)[0];
} catch (e) {
max = 1;
}
return fun.getImg(".contents img[alt]", max, 9);
},
button: [4],
insertImg: [".contents", 2],
autoDownload: [0],
next: ".pre>a",
prev: ".next>a",
customTitle: () => fun.geT(".content>h1").replace(/\[\d+P\/\d+M\]/i, ""),
css: ".content .contents img{max-width:100%!important}",
category: "nsfw1"
}, {
name: "BeautyLegM m.beautyleg6.com",
reg: /m\.beautyleg6\.com\/view\.php\?aid=\d+/,
imgs: async () => {
let links = [];
links.push(location.href);
for (let i = 2; i <= totalpage; i++) {
links.push(location.href + "&pageno=" + i);
}
await fun.getEle(links, "#bigImg", ".show-simg", ".show-pages");
return [...fun.gae("#bigImg")];
},
button: [4],
insertImg: [".show-simg", 2],
autoDownload: [0],
next: () => {
let next = fun.ge("a.f-r.l3");
if (next) {
return next.href;
} else {
return null;
}
},
prev: 1,
customTitle: () => fun.geT(".showcontbt>h1").replace(/\s?\(\d+\/\d+\)/, ""),
category: "nsfw1"
}, {
name: "Asianude4u www.asianude4u.net",
reg: /www\.asianude4u\.net\/.+\/.+\/$/,
exclude: "//a[@rel='category tag' and text()='Videos' or text()='Madonna-AV']",
imgs: () => {
if (fun.ge(".wp-block-image a[href*=attachment_id]")) {
return [...fun.gae(".wp-block-image img[data-id]")];
} else {
return [...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{display:none!important}",
category: "nsfw1"
}, {
name: "Chinese Beauties sxchinesegirlz.one sxchinesegirlz01.xyz",
reg: /sxchinesegirlz(\d+)?\.\w+\/\d+\/\d+\/\d+\/.+\/$/,
imgs: () => fun.getImg(".wp-block-image img", fun.geT(".pagination>*:last-child", 2), 4),
button: [4],
insertImg: [".thecontent", 1],
customTitle: () => fun.geT("h1.entry-title"),
category: "nsfw2"
}, {
name: "爱看 INS www.ikanins.com",
reg: /www\.ikanins\.com\/[\w-]+\//,
imgs: "img[srcset]",
autoDownload: [0],
next: "a[rel=prev]",
prev: "a[rel=next]",
customTitle: () => fun.geT(".entry-title").replace(/\s?\d+P\s?$/i, "").trim(),
category: "nsfw1"
}, {
name: "Dmmtu 美女图 www.dmmtu.com",
reg: /www\.dmmtu\.com\/\w+\/\d+\.html/,
imgs: () => {
let max = fun.geT("a[title=Page]>b").match(/共(\d+)/)[1];
return fun.getImg(".main-body img", max, 9);
},
button: [4],
insertImg: [".main-body", 1],
autoDownload: [0],
next: "//a[text()='上一组']",
prev: 1,
customTitle: () => fun.geT(".main-title"),
css: ".single .main-body img{max-width:100%!important}",
category: "nsfw2"
}, {
name: "好女神网 www.haonvshen.com",
reg: /www\.haonvshen\.com\/gallery\/\d+\.html/,
imgs: () => {
let max;
try {
max = fun.geT(".page").match(/\d+\/(\d+)/)[1];
} catch (e) {
max = fun.geT("#pages>*:last-child", 3) || 1;
}
return fun.getImg("#hgallery>img,#imgwrap img", max, 9);
},
button: [4],
insertImg: ["#hgallery,#imgwrap", 1],
customTitle: () => fun.title(" - 第1页-美女图片-好女神网"),
css: ".f_b_c_d{display:none!important}",
category: "nsfw1"
}, {
name: "Jablehk jablehk.com",
reg: /jablehk\.com\/\w+/,
imgs: ".gallery-strips-lightbox-link>img[data-src]",
button: [4],
insertImg: [
[".gallery-strips-wrapper", 2], 2, 2000
],
autoDownload: [0],
next: ".item-pagination-link--next",
prev: ".item-pagination-link--prev",
go: 1,
customTitle: () => fun.geT("h1>strong"),
category: "nsfw1"
}, {
name: "TangMoc tangmoc.com",
reg: /^https:\/\/tangmoc\.com\/blog\/show\/\w+\/view/,
init: async () => {
fun.remove("//div[@class='row mt-3'] | //div[ins[@class='adsbygoogle']]");
},
imgs: () => {
let pages = fun.ge(".btn-warning+.btn-secondary");
if (pages) {
return fun.getImgA("a[href*=media]>.media-preview", "a.btn-secondary");
} else {
return [...fun.gae("a[href*=media]>.media-preview")];
}
},
button: [4],
insertImg: ["//media[article]", 2],
customTitle: () => fun.geT("h1"),
category: "nsfw1"
}, {
name: "นางแบบคือลือ modelsexyth.com",
reg: /^https:\/\/modelsexyth\.com\/[^\/]+\/$/,
imgs: "//img[@decoding] | //a[contains(@class,'e-gallery-item')]",
button: [4],
insertImg: [
["//div[div[div[img[@decoding]]]]", 0, "//div[img[@decoding] and @class ='elementor-widget-container'] | //div[contains(@class,'elementor-widget-gallery')]"], 2
],
customTitle: () => fun.geT("h1.elementor-heading-title>a").replace(/\(\d+p\)/i, "").trim(),
css: ".elementor-element-2060f59,.elementor-element-f838527,.elementor-element-988fdac,.elementor-element-3b501ba{display:none!important}#FullPictureLoadEnd{color:rgb(255, 255, 255)}",
category: "nsfw1"
}, {
name: "Hot Girl Pix www.hotgirlpix.com",
reg: /^https:\/\/www\.hotgirlpix\.com\/p\//,
imgs: () => fun.getImgA("article img", "#singlePostPagination a", 300),
button: [4],
insertImg: ["article", 2],
customTitle: () => fun.geT("#singlePostTitle"),
css: "#modalAdblock{display:none!important}",
category: "nsfw1"
}, {
name: "LUVBP luvbp.com",
reg: /^https:\/\/luvbp\.com\/\d+\//,
exclude: "//a[text()='网盘下载'] | //h4[text()='此文章仅供订阅者阅读']",
imgs: "figure img",
button: [4],
insertImg: [".c-content", 2],
customTitle: () => fun.geT(".c-post-hero__title"),
css: "@media(max-width:39.99em){.c-content img{max-width:100%!important}}",
category: "nsfw1"
}, {
name: "自拍图库 自拍图库.com zipaipic.com",
reg: /^https:\/\/[^\/]+\/content_\d+\.html/i,
include: "//title[contains(text(),'自拍图库')]",
imgs: ".showimg",
button: [4],
insertImg: ["#imgviewer", 2],
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: "套圖TAOTU.ORG taotu.org",
reg: /https?:\/\/(\w{2}\.)?taotu\.org\/[\w-]+\//i,
include: ".piclist",
imgs: "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,
category: "nsfw1"
}, {
name: "Taotuxp.com www.taotucc.com",
reg: /www\.taotucc\.com\/\d+\.html/,
imgs: () => fun.getImg("#post_content img[alt]", fun.geT(".pagelist>*:last-child"), 7),
button: [4],
insertImg: ["#post_content", 1],
autoDownload: [0],
next: "a[rel=prev]",
prev: "a[rel=next]",
customTitle: () => fun.geT("h1"),
category: "nsfw1"
}, {
name: "MM 范 www.95mm.vip",
reg: /www\.95mm\.\w+\/\d+\.html/,
init: "$(document).unbind('keydown');$(document).unbind('keyup');",
imgs: () => {
let max = fun.geT(".post-title").match(/\/(\d+)/)[1];
return fun.getImg(".post img[alt]", max, 2);
},
button: [4],
insertImg: [".post", 1],
autoDownload: [0],
next: "//div[div[text()='上一组']]/preceding-sibling::div/a",
prev: "//div[div[text()='下一组']]/preceding-sibling::a",
customTitle: () => fun.geT(".post-title").replace(/(\d+\/\d+)$/, ""),
category: "nsfw1"
}, {
name: "推图网 https://www.tuiimg.com/meinv/",
reg: /(www|m)\.tuiimg\.com\/meinv\/\d+\//,
init: "goshowall();",
imgs: () => {
let max = fun.geT("#allbtn").match(/\/(\d+)/)[1];
let path = fun.ge("#content>img").src.match(/.+\//)[0];
let arr = [];
for (let i = 1; i <= max; i++) {
arr.push(path + i + ".jpg");
}
return arr;
},
button: [4],
insertImg: ["#content", 1],
autoDownload: [0],
next: "#nextbtn>a",
prev: "#prebtn>a",
customTitle: () => fun.geT("#main>h1,.main>h1"),
category: "nsfw1"
}, {
name: "18AV https://18av.mm-cg.com/zh/cg_random/all/index.html",
reg: /18av\.mm-cg\.com\/(\w{2}\/)?\w+\/\d+\/content\.html|18av\.mm-cg\.com\/.+\.html/,
include: ".sel_enlarge_page,.sel_enlarge",
imgs: () => Large_cgurl,
button: [4],
insertImg: ["#show_cg_html,#showcg_container", 2],
customTitle: () => fun.geT('.archive-title>h1,h1').replace(/\s?\[\d+p\]|\s?\(\d+p\)/i, "").trim(),
category: "nsfw1"
}, {
name: "Xgirls xgirlscollection.com img3xgirls.com",
reg: /(xgirlscollection\.com|img3xgirls\.com)\/(collection|album)\/\d+/,
imgs: () => fun.getImg("img[id].collection-image,.album-image[data-pin-media]", (fun.geT(".pagination>*:last-child", 2) || 1)),
button: [4],
insertImg: ["//div[img[@data-pin-url]]", 1],
customTitle: () => fun.geT(".container>h1"),
category: "nsfw1"
}, {
name: "SexyAsianGirl www.sexyasiangirl.xyz",
reg: /www\.sexyasiangirl\.xyz\/album\/\d+\.html/,
init: () => {
fun.remove("//article/div[a[img]]");
},
imgs: () => {
let max;
try {
max = fun.geT("span.inline-block").match(/\d+$/)[0];
} catch (e) {
max = 1;
}
return fun.getImg("img.block", max);
},
button: [4],
insertImg: ["//div[img[@title]]", 1],
customTitle: () => fun.geT("header>h2").replace(/\s?\(\d+\s?photos\s?\)/, "").trim(),
category: "nsfw2"
}, {
name: "福利姬美图 fuligirl.net",
reg: /fuligirl\.net\/albums\/\d+/,
imgs: () => fun.getImg("img.block", (fun.geT("a[rel=next]", 2) || 1)),
button: [4],
insertImg: ["//div[@class='my-1' and img[@class='block my-1']]", 1],
customTitle: () => fun.geT("#main h1").replace(/(\d+月\d+打赏群资源)|\[\d+P(\d+v)?-\d+MB\]|\[\d+P\]|\d+mb|\s?\d+p/gi, "").trim(),
category: "nsfw2"
}, {
name: "顶尖美女图 djjpg.com",
reg: /https?:\/\/djjpg\.com\/\d+.html/,
imgs: ".post-countent-data img",
autoDownload: [0],
next: "//a[div[h5[text()=' 上一篇']]]",
prev: "//a[div[h5[text()=' 下一篇']]]",
customTitle: () => fun.geT('.multi-single-header>h1').replace(/\(\d+\/\d+\)|(\s–\s)?\(\d+P\)/i, "").trim(),
category: "nsfw1"
}, {
name: "秀人图吧 www.502x.com",
reg: /https?:\/\/www\.502x\.com\/\w+\/\d+\.html/,
button: [4],
imgs: () => fun.getImg("#image_div img", (fun.geT("a.prev", 2) || 1), 9),
button: [4],
insertImg: ["#image_div", 2],
customTitle: () => fun.geT(".item_title>h1"),
css: ".affs{display:none!important}",
category: "nsfw1"
}, {
name: "Nude Bird nudebird.biz",
reg: /nudebird\.biz\/.+\//,
imgs: ".thecontent a",
button: [4],
insertImg: ["//p[a[img]]", 2],
customTitle: () => fun.geT("h1"),
category: "nsfw1"
}, {
name: "R18 Cosplay r18cosplay.com",
reg: /r18cosplay\.com\/\?p=\d+/,
imgs: ".wp-block-image img",
button: [4],
insertImg: [
[".content-inner", 0, ".wp-block-image"], 2
],
customTitle: () => fun.geT(".entry-header>h1"),
category: "nsfw1"
}, {
name: "NUDECOSPLAY nudecosplaygirls.com",
reg: /nudecosplaygirls\.com\/.+\/$/,
imgs: ".single-thumb>.wp-post-image,img[class*='wp-image'],.icon-overlay>img[decoding],.msacwl-img,.entry-content>img,.gallery-item img",
button: [4],
insertImg: [".entry-content", 2],
autoDownload: [0],
next: ".g1-nav-single-next>a",
prev: ".g1-nav-single-prev>a",
customTitle: () => fun.geT("h1.entry-title").replace(/“[0-9a-z ]+”/i, "").trim(),
category: "nsfw2"
}, {
name: "Cosplaytele cosplaytele.com",
reg: /cosplaytele\.com\/[^/]+\//,
include: "figure.gallery-item",
imgs: "figure.gallery-item a",
button: [4, "21%"],
insertImg: [".gallery", 2],
customTitle: () => fun.geT("h1.entry-title").replace(/\s?“[^”]+”/, "").trim(),
css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}",
category: "nsfw2"
}, {
name: "X Cosplay xcosplay.top",
reg: /xcosplay\.top\/\d+\/\d+\/\d+\//,
imgs: ".galeria_img>img",
button: [4],
insertImg: [".entry-content", 2],
autoDownload: [0],
next: "a[rel=prev]",
prev: "a[rel=next]",
customTitle: () => fun.geT("h1.entry-title"),
category: "nsfw1"
}, {
name: "AsiaOnTop asiaon.top",
reg: /https?:\/\/asiaon\.top\/[^\/]+\/$/,
include: ".modula-items",
imgs: "a[data-image-id]",
button: [4],
insertImg: [
[".modula-items", 2], 2
],
autoDownload: [0],
next: "a#prepost",
prev: "a#nextpost",
customTitle: () => fun.geT(".single_post_title_main").replace(":", " -"),
go: 1,
category: "nsfw2"
}, {
name: "Mitaku mitaku.net",
reg: /mitaku\.net\/.+\/.+\/$/,
imgs: () => [...fun.gae(".msacwl-img")].slice(1, -1),
button: [4],
insertImg: [
[".article-content", 2], 2
],
autoDownload: [0],
next: ".previous>a",
prev: ".next>a",
customTitle: () => fun.geT("h1.entry-title"),
category: "nsfw2"
}, {
name: "nudeslegion.com",
reg: /nudeslegion.com\/[^\/]+\/$/i,
include: ".msacwl-slider-wrap",
imgs: () => [...fun.gae(".msacwl-img")].slice(1, -1),
button: [4],
insertImg: [
[".msacwl-slider-wrap", 2], 2
],
customTitle: () => fun.geT("h1.entry-title").replace(/\([\w\/\s]+\)/i, "").trim(),
css: "footer+script+div[id]{display:none!important}",
category: "nsfw2"
}, {
name: "MrCong.com",
reg: /mrcong\.com\/.+\//,
imgs: () => fun.getImg(".entry img[decoding]", fun.geT(".page-link>*:last-child"), 4),
button: [4],
insertImg: ["//p[img[@decoding]]", 1],
customTitle: () => fun.geT("h1").replace(/\(\d+\s?photos?\s?(\+\s?\d+\s?videos?)?\)/gi, "").trim(),
category: "nsfw1"
}, {
name: "Xiuren xiuren.biz",
reg: /https?:\/\/xiuren\.biz\/[^\/]+\//,
include: ".content-inner a[data-lbwps-srcsmall]",
imgs: ".content-inner a[data-lbwps-srcsmall]",
button: [4],
insertImg: [".content-inner", 2],
autoDownload: [0],
next: "a.post.prev-post",
prev: "a.post.next-post",
customTitle: () => fun.geT('h1.jeg_post_title').replace(/\d+P/i, ""),
category: "nsfw1"
}, {
name: "4KHD www.4khd.com www.4kep.com xjav.cc hhhy.quest",
reg: /(www\.4k(hd|ep)\.com|xjav\.cc|hhhy\.quest)\/\d+\/\d+\/\d+\/.+\.html/,
imgs: async () => {
await fun.getNP("#basicExample>a,figure.wp-block-image", ".current+li>a", null, ".page-link-box");
let mobile = fun.ge("figure.wp-block-image>a");
if (mobile) {
return [...fun.gae("figure.wp-block-image>a")];
} else {
return fun.getImgA("#gallery a", "#basicExample>a");
}
},
button: [4],
insertImg: [
[".page-link-box,.wp-block-post-content>*:last-child,#khd", 1, "#basicExample,.wp-block-image"], 2
],
//autoDownload: [0],
//next: ".post-navigation-link-previous>a",
//prev: ".post-navigation-link-next>a",
customTitle: () => fun.geT("h3.wp-block-post-title").replace(/\[(\d+)?mb-\d+photos\]|\[\d+photos\]|\(\d+8MB\)\(\d+photos\)/i, "").trim(),
fetch: 1,
//threading: 4,
css: ".popup,.wp-container-13{display:none!important}.FullPictureLoadImage{max-width:100%!important}",
category: "nsfw2"
}, {
name: "Buon Dua buondua.com",
reg: /buondua\.com\/(?!hot|collection)[^\?]+$/,
imgs: () => {
let max = fun.geT(".pagination-list>span:last-child>a").match(/\d+/)[0];
return fun.getImg(".article-fulltext img[alt]", max);
},
button: [4],
insertImg: [".article-fulltext", 1],
customTitle: () => fun.geT(".article-header>h1").replace(/\(\d+\s?photos\s?\)/i, "").trim(),
category: "nsfw2"
}, {
name: "baobua.com",
reg: /https?:\/\/baobua\.com\/post\/\w+\.html/i,
imgs: () => {
let max;
try {
max = fun.geT(".article-header>h1").match(/Page\s?\d+\/(\d+)/i)[1];
} catch (e) {
max = 1;
}
if (/\?m=1/.test(siteUrl)) {
return fun.getImg(".contentme img", max, "8");
} else {
return fun.getImg(".contentme img", max);
}
},
button: [4],
insertImg: [".contentme", 2],
customTitle: () => fun.geT(".article-header>h1").split("|")[0].trim(),
category: "nsfw2"
}, {
name: "BAOBUA.COM",
reg: /www\.baobua\.net\/post\/.+/,
imgs: () => fun.getImg(".wp-block-image img[alt]", (fun.geT(".nav-links>*:last-child") || 1), 6),
button: [4],
insertImg: [".entry-content.read-details", 2],
customTitle: () => fun.title("|", 1),
category: "nsfw2"
}, {
name: "blog.baobua.net",
reg: /(blog|fb|vn)\.baobua\.net\/\w+\/.+/,
imgs: "a.fancybox",
button: [4],
//insertImg: [".article-body", 2],
insertImg: [
[".article-body", 2], 2
],
go: 1,
customTitle: () => fun.title("@BaoBua", 1),
css: "#fix_scale img:hover{transform:none!important}",
category: "nsfw2"
}, {
name: "HOTGIRLchina hotgirlchina.com theasiagirl.com anhsec.com sex4viet.com cutexinh.com girlxinhxinh.com",
reg: /(hotgirlchina\.com|theasiagirl\.com|anhsec\.com|sex4viet\.com|cutexinh\.com|girlxinhxinh\.com)\/.+(photos?|videos?|anh)?\/?/,
include: ".entry-inner img[alt]",
imgs: () => {
let max;
try {
max = fun.geT("span.pages").match(/\d+$/)[0];
} catch (e) {
max = 1
}
return fun.getImg(".entry-inner img[alt]", max, 4);
},
button: [4],
insertImg: [
[".pagination", 1, ".entry-inner>p:not(#FullPictureLoadEnd)"], 2
],
customTitle: () => fun.geT(".post-title").replace(/\(\d+\s?photos\s?\)|(\s?\(\d+\s?photos?\s?\+\s?\d+\s?videos?\))|\([0-9\s]+ảnh[0-9\s\+]+video\)|\([0-9\s]+ảnh\)/i, "").trim(),
css: ".boxzilla-container{display:none!important}",
category: "nsfw1"
}, {
name: "FoamGirl foamgirl.net",
reg: /foamgirl\.net\/\d+\.html/,
imgs: () => {
let max;
try {
max = fun.geT(".mbx-nav-right").match(/\d+\/(\d+)/)[1];
} catch (e) {
max = 1;
}
return fun.getImg("a.imageclick-imgbox", max, 9);
},
button: [4],
insertImg: [
["#image_div>*:last-child", 1, "#image_div br,a.imageclick-imgbox"], 1
],
customTitle: () => fun.geT(".item_title>h1").replace(/\(\d+P\)|\n/gi, ""),
css: ".affs{display:none!important}",
category: "nsfw2"
}, {
name: "photo.camcam.cc",
reg: /photo\.camcam\.cc\/[^/]+\/$/,
imgs: "a.rgg-img",
button: [4],
insertImg: [
[".rgg-imagegrid", 2], 2
],
go: 1,
next: "a[rel=prev]",
prev: "a[rel=next]",
customTitle: () => fun.geT(".page-title").replace(/\[\d+P-?\d+MB?\]/i, "").trim(),
category: "nsfw2"
}, {
name: "Everia.club ",
reg: /(everia\.club|everiaeveria\.b-cdn\.net)\/\d+\/\d+\/\d+\/[^/]+\//,
imgs: ".wp-block-image img",
button: [4],
insertImg: [".entry-content", 2],
customTitle: () => fun.geT("h1"),
category: "nsfw2"
}, {
name: "Everia club",
reg: () => {
if (/^https?:\/\/www\.everiaclub\.com\/.+/.test(siteUrl)) {
if (!siteUrl.includes(".html")) {
return true;
}
}
return false;
},
//exclude: ".pagination",
imgs: ".mainleft img",
button: [4],
insertImg: [".mainleft", 2],
customTitle: () => fun.geT(".mainleft h1"),
category: "nsfw2"
}, {
name: "SexyGirl sexygirl.cc",
reg: /sexygirl\.cc\/a\/\d+\.html/,
imgs: "div>img.img-fluid",
button: [4],
insertImg: ["//div[img]", 2],
next: "//a[text()='Previous']",
prev: "//a[text()='Next']",
category: "nsfw2"
}, {
name: "dongojyousan.com",
reg: /www\.dongojyousan\.com\/articles\/\w+\.html/i,
imgs: () => {
let max;
try {
max = fun.geT(".entry-title>a").match(/Page\s1\/(\d+)/)[1];
} catch (e) {
max = 1;
}
if (/\?m=1/.test(siteUrl)) {
return fun.getImg(".entry-content img", max, "8");
} else {
return fun.getImg(".entry-content img", max);
}
},
button: [4],
insertImg: [".entry-content", 2],
customTitle: () => fun.geT(".entry-title>a").split("|")[0].trim(),
category: "nsfw1"
}, {
name: "Anh VL xem.anhvl.net",
reg: /xem\.anhvl\.net\/[^/]+\/$/,
imgs: () => {
try {
let url = location.href;
let max = fun.geT(".page-links a[onclick]", 2);
let links = [];
links.push(url);
for (let i = 2; i <= max; i++) {
links.push(url + "p-" + i);
}
return fun.getImgA(".wp-content-ex img[data-src]", links);
} catch (e) {
return [...fun.gae(".wp-content-ex img[data-src]")];
}
},
button: [4],
insertImg: [".wp-content-ex", 2],
css: "#rtb,.float-ck-center-lt,#popupContact,#backgroundPopupp,.col-9>.col-12{display:none!important}",
category: "nsfw2"
}, {
name: "Anh VL xem.anhvl.net",
reg: /xem\.anhvl\.net/,
icon: 0,
key: 0,
css: "#backgroundPopupp,#popupContact,.float-ck-center-lt{display:none!important}",
category: "nsfw2"
}, {
name: "Phym18 phym18.org https://phym18.org/tag/%E1%BA%A3nh-sex",
reg: /phym18\.org\/anh\/[^/]+$/,
imgs: () => {
try {
let url = location.href;
let max = fun.geT("select>option:last-child").match(/\d+/)[0];
let links = [];
links.push(url);
for (let i = 2; i <= max; i++) {
links.push(url + "/phan-" + i);
}
return fun.getImgA(".ndtruyen>img", links);
} catch (e) {
return [...fun.gae(".ndtruyen>img")];
}
},
button: [4],
insertImg: [".ndtruyen", 2],
css: "#wap_bottombanner,#backgroundPopupp,#popupContact{display:none!important}",
category: "nsfw2"
}, {
name: "Porn Pics www.pornpics.com",
reg: /www\.pornpics\.com\/.*galleries\//,
imgs: "#tiles a.rel-link",
button: [4],
insertImg: ["#main", 0],
customTitle: () => fun.geT(".title-section h1"),
category: "nsfw2"
}, {
name: "Freebigtit www.freebigtitpornpics.com",
reg: /www\.freebigtitpornpics\.com\/content\/\d+\//,
imgs: "//ul[@id='dylan']//a[img[@data-src]]",
button: [4],
insertImg: [
["#dylan", 2], 1
],
category: "nsfw2"
}, {
name: "Freejappic www.freejapanpornpics.com",
reg: /www\.freebigtitpornpics\.com\/content\/\d+\//,
imgs: "//ul[@id='dylan']//a[img[@data-src]]",
button: [4],
insertImg: [
["#dylan", 2], 1
],
category: "nsfw2"
}, {
name: "NongMo.Zone www.ilovexs.com",
reg: /www\.ilovexs\.com\/post_id\/\d+\//,
imgs: ".separator img",
button: [4],
insertImg: [".entry-content", 2],
customTitle: () => fun.geT(".entry-title"),
category: "nsfw2"
}, {
name: "idol.gravureprincess.date",
reg: /idol\.gravureprincess\.date\/\d+\/\d+\/.+\.html/,
imgs: ".separator img",
button: [4],
insertImg: [".entry-content", 2],
autoDownload: [0],
next: "a.blog-pager-older-link",
prev: "a.blog-pager-newer-link",
customTitle: () => fun.geT(".post-title"),
category: "nsfw2"
}, {
name: "劍心回憶 https://kenshin.hk/category/jnews/photoalbum/",
reg: /kenshin\.hk\/\d+\/\d+\/\d+\/[^/]+\/$/,
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");
},
imgs: ".entry-content>img,.post-page-content>img",
customTitle: () => fun.geT("h1.entry-title,h2.post-title").replace(/【寫真】|\s?\(\d+P,片\)/gi, ""),
category: "nsfw1"
}, {
name: "韩剧组 https://www.hanjuzu.com/hantype/23.html",
reg: /www\.hanjuzu\.com\/handetail-\d+\.html/,
imgs: () => {
let max = fun.geT(".num").match(/\d+\/(\d+)/)[1];
return fun.getImg(".hl-article-box>img", max, );
},
button: [4],
insertImg: [".hl-article-box", 1],
autoDownload: [0],
next: ".hl-next",
prev: ".hl-prev",
customTitle: () => fun.geT(".hl-article-title"),
category: "nsfw1"
}, {
name: "J M G T www.qiuyeshudian.com",
reg: /https:\/\/www\.qiuyeshudian\.com\/[^\/]+\/$/,
imgs: () => {
let arr = [...fun.gae(".feature-box img,.entry-content img")].map(e => e.src.replace(/\?w=\d+&ssl=1/, "").replace(/\?resize.+/, ""));
if (arr.length > 1) {
return arr;
} else {
return [];
}
},
button: [4],
insertImg: [".entry-content", 2],
autoDownload: [0],
next: "a[rel=prev]",
prev: "a[rel=next]",
customTitle: () => fun.geT("article h1"),
category: "nsfw1"
}, {
name: "Gravia gravia.site",
reg: /gravia\.site\/box\/show\.php\?id=\d+$/,
imgs: ".slideshow .item>img",
button: [4],
insertImg: [".slideshow.for_box", 2],
customTitle: () => fun.geT(".container>h1").replace(/\s?【\d+枚】/, ""),
css: "img.small{max-width:100% !important;max-height:auto !important}.cmd_bar.wide{display:none!important}",
category: "nsfw1"
}, {
name: "グラビア週刊誌 9 gravurezasshi9.doorblog.jp",
reg: /gravurezasshi9\.doorblog\.jp\/archives\/\d+\.html(\?ref=)?/,
imgs: ".article-body-inner>a,#article-contents>a",
button: [4],
insertImg: [".article-body-inner,#article-contents", 2],
autoDownload: [0],
next: ".original-pager a,li.prev>a,li.prev>span>a",
prev: ".original-pager li:last-child>a,li.next>a,li.next>span>a",
customTitle: () => fun.geT("h1.article-title>a,.article-header>h1").trim(),
category: "nsfw2"
}, {
name: "エロ役場 eroyakuba.com",
reg: /eroyakuba\.com\/[^/]+\/$/,
imgs: () => {
return [...fun.gae(".flexitem_content img[srcset],.entry-content img[srcset]")].map(img => {
if (img.dataset.srcset !== "") {
let splitArr = img.dataset.srcset.split(",");
splitArr = splitArr.sort((a, b) => {
return a.match(/\s(\d+)w/)[1] - b.match(/\s(\d+)w/)[1];
});
return splitArr.pop().trim().split(" ")[0];
} else if (img.dataset.src) {
return img.dataset.src;
} else {
return null;
}
});
},
customTitle: () => fun.geT("h1.entry-title"),
category: "nsfw2"
}, {
name: "エロ画像まとめ geinou-nude.com",
reg: /geinou-nude\.com\/[^/]+\/$/,
imgs: ".post_content>p>a[href*=uploads]",
autoDownload: [0],
next: "a.nav_link_l",
prev: "a.f_row_r",
customTitle: () => fun.geT("h1.post_title"),
category: "nsfw2"
}, {
name: "JANidolig janidolig.com",
reg: /janidolig\.com\/\?p=\d+/,
imgs: ".entry-content img.size-full",
button: [4],
insertImg: [".entry-content", 2],
customTitle: () => fun.geT("h1.entry-title"),
category: "nsfw2"
}, {
name: "Gravure Idols gravureidols.top",
reg: /gravureidols\.top\/\d+\/\d+\/\d+\/[^/]+\//,
imgs: ".content-inner p>a",
autoDownload: [0],
next: "a.prev-post",
prev: "a.next-post",
customTitle: () => fun.geT(".jeg_post_title"),
category: "nsfw2"
}, {
name: "復刻書林 reprint-kh.com",
reg: /reprint-kh\.com\/archives\/\d+/,
imgs: async () => {
await fun.getNP(".gallery-row", "//a[span[text()='次のページ']]");
return [...fun.gae(".tiled-gallery a")];
},
button: [4],
insertImg: [
[".single-post-main>.share,.single-post-main .content", 2], 2
],
go: 1,
autoDownload: [0],
next: ".previous_post>a",
prev: ".next_post>a",
customTitle: () => fun.geT(".single-post-title").replace(/\d+photos/, "").trim(),
category: "nsfw2"
}, {
name: "マブい女画像集 mabui-onna.com",
reg: /^https:\/\/mabui-onna\.com\/blog-entry-\d+\.html/,
imgs: ".topentry_text div>a:not([href*='.html']),.entry_body div>a:not([href*='.html'])",
button: [4],
insertImg: [".topentry_text,.entry_body", 2],
autoDownload: [0],
next: "a.pager_next,.next_entry>a",
prev: "a.pager_prev,.prev_entry>a",
customTitle: () => fun.geT(".topentry_title span,.entry_title h1>strong").replace(/\d+枚/, "").replace(/\s\s/g, " ").trim(),
category: "nsfw1"
}, {
name: "ドッグ速報 dog-sokuhou.com",
reg: /^https:\/\/dog-sokuhou\.com\/archives\/\d+\/[^\/]+\//,
imgs: ".eye-catch>img,.wp_rss_scrapeing_post-content div>a",
button: [4],
insertImg: [".wp_rss_scrapeing_post-content", 2],
customTitle: () => fun.geT(".entry-title").replace(/\d+枚/, "").replace(/\s\s/g, " ").trim(),
css: "#oxzilla-overlay,boxzilla-overlay{display:none!important}",
category: "nsfw1"
}, {
name: "IVPhoto_Gravure ivphoto.tistory.com",
reg: /ivphoto\.tistory\.com\/(m\/)?\d+/,
imgs: ".imageblock img",
button: [4],
insertImg: [".entry-content,.blogview_content", 2],
customTitle: () => fun.geT('.tit_blogview,.hgroup h1').replace(/\[\d+p\]/i, "").trim(),
category: "nsfw1"
}, {
name: "MIC MIC IDOL www.micmicidol.club",
reg: /www\.micmicidol\.club\/\d+\/\d+\/.+\.html/,
init: () => {
[...fun.gae("iframe[title]")].forEach(e => {
let x = fun.ge(".entry-content");
x.parentNode.insertBefore(e, x);
});
},
imgs: async () => {
let srcArr = [...fun.gae(".entry-content a[href]")].map(a => a.href);
let firstSrcArr = srcArr[0].split("/");
if (firstSrcArr.length === 9) {
firstSrcArr[7] = "s11200";
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] = "s11200";
return arr.join("/");
});
return srcArr;
} else {
return srcArr;
}
} else {
return srcArr;
}
},
button: [4],
insertImg: [".entry-content", 2],
customTitle: () => fun.geT(".entry-title").trim(),
css: ".post img{max-width:100% !important}.post-body{margin:0px!important;}",
category: "nsfw2"
}, {
name: "MIC MIC IDOL www.micmicidol.club micmicunc unc.micmicdoll.com 分類自動翻頁",
reg: /^https:\/\/www\.micmicidol\.club\/(\?m=1)?$|^https:\/\/www\.micmicidol\.club\/search|^https:\/\/unc\.micmicdoll\.com\/(\?m=1)?$|^https:\/\/unc\.micmicdoll\.com\/search/,
icon: 0,
key: 0,
init: () => {
if (siteUrl.includes("unc.micmicdoll.com")) {
setTimeout(() => {
[...document.querySelectorAll("a[href*='www.micmicdoll.com']")].forEach(a => {
a.href = a.href.replace("www.micmicdoll.com", "unc.micmicdoll.com");
});
}, 1000);
fun.css(".autoPagerTitle{width:950px!important}");
}
},
autoPager: {
//mode: 1,
ele: ".blog-posts",
next: "a.blog-pager-older-link",
http: "https",
observer: ".blog-posts",
re: "#blog-pager",
stop: () => {
let ele = fun.ge(".date-outer", doc);
if (!ele) {
return true
}
return false
},
history: 1,
aF: () => {
[...fun.gae("//div[@class='snips-image']/a[not(img)]")].forEach(a => {
let script = fun.ge("script", a);
if (script) {
let code = script.innerText;
if (/document\.write/.test(code)) {
let arr = code.split('"');
let url = arr[1];
let alt = arr[3];
let img = new Image();
img.src = url.replace("/s72-c/", "/w400/").replace("=s72-c", "=w400");
img.alt = alt;
script.parentNode.insertBefore(img, script.nextSibling);
}
}
});
},
title: () => {
let num;
if (/start=/.test(nextLink)) {
if (siteUrl.includes("unc.micmicdoll.com")) {
num = parseInt(nextLink.match(/start=(\d+)/)[1])
if (num % 2 == 0) {
num = num / 50 + 1;
} else {
num = num / 39 + 1;
}
} else {
num = parseInt(nextLink.match(/start=(\d+)/)[1]) / 50 + 1;
}
} else {
num = 1;
}
return doc.title + ` - Page ${num}`;
}
},
openInNewTab: ".date-outer a[href]",
category: "autoPager"
}, {
name: "Kemono https://kemono.party/fantia/user/17148/post/1633768 coomer.party",
reg: /(kemono\.party|kemono\.su|coomer\.party)\/.+post/,
imgs: "a.fileThumb.image-link",
button: [4],
insertImg: [".post__files", 2],
autoDownload: [0],
next: "a.next",
prev: "a.prev",
customTitle: () => fun.geT(".post__title"),
threading: 4,
category: "nsfw2"
}, {
name: "半次元 bcy.net",
reg: /bcy\.net\/item\/detail\/\d+\?_source_page=\w+/,
imgs: ".inner-container img",
customTitle: () => fun.title(" - ", 1),
category: "none"
}, {
name: "套图之家 taotuhome.com",
reg: /taotuhome\.com\/\d+\.html/i,
imgs: () => fun.getImg(".single-content img[alt]", (fun.geT(".page-links>*:last-child", 2) || 1), 7),
button: [4],
insertImg: [".single-content", 1],
autoDownload: [0],
next: "a[rel=prev]:not([href^=j])",
prev: "a[rel=next]:not([href^=j])",
customTitle: () => fun.geT('.entry-title').replace("-套图之家", ""),
category: "nsfw1"
}, {
name: "俊美图 www.meijuntu.com www.junmeitu.com www.jeya.de www.jeya.jp",
reg: /(www\.meijuntu\.com|www\.junmeitu\.com|www\.jeya\.\w+)\/\w+\/\w+\.html/i,
imgs: () => fun.getImg(".pictures img[alt]", (fun.geT("#pages>*:last-child", 2) || 1), 5),
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"),
category: "nsfw1"
}, {
name: "x6o https://x6o.com/topics/14#articles",
reg: /(www\.)?x6o\.com\/articles\/\d+/,
delay: 500,
imgs: ".content img",
button: [4],
insertImg: [".content", 2, 2000],
customTitle: () => fun.geT("h1.title").replace(/\[\d+P-\d+MB\]|\[\d+P\]|\s?\d+P$/gi, "").trim(),
category: "nsfw2"
}, {
name: "妹子图 mt316.com",
reg: /mt316\.com\/\w+\/\d+\.html/,
imgs: ".m-list-content img",
button: [4],
insertImg: [".m-list-content", 1],
autoDownload: [0],
next: ".sxpage_l>a",
prev: 1,
customTitle: () => fun.geT(".m-list-tools>h2").replace(/\/?\(\d+P\)/i, "").trim(),
css: ".m-list-content img{max-width:100%!important}",
category: "nsfw1"
}, {
name: "硬盘少女 diskgirl.com",
reg: /diskgirl\.com\/image\/\w+/,
imgs: "a[data-fancybox]",
button: [4],
insertImg: [
[".flexauto>*:last-child", 1, "a[data-fancybox]"], 2
],
customTitle: () => fun.geT(".image-title").replace(/\[\d+(\+\d+)?PB?\]|\(\d+(\+\d+)?PB?\)/i, ""),
category: "nsfw1"
}, {
name: "心动美图 www.wai76.com",
reg: /https:\/\/www\.wai\d+\.com\/[^\/]+\//,
include: ".entry-content div[data-src]",
imgs: () => fun.getImgA(".entry-content div[data-src]", ".page-links a"),
button: [4],
insertImg: [".entry-content", 2],
customTitle: () => fun.geT(".entry-title"),
category: "nsfw1"
}, {
name: "美女库 www.meinvku.org.cn",
reg: /www\.meinvku\.org\.cn\/album\/\d+(\/)?(\.html)?$/,
imgs: async () => {
let firstImg = fun.ge("#img_src img").src;
let path = firstImg.match(/.+\//)[0];
let arr = [];
let max = fun.geT("//span[contains(text(),'页次')]").match(/\/(\d+)/)[1];
for (let i = 1; i <= max; i++) {
arr.push(path + i + ".jpg");
}
let a = fun.ge("#img_src");
if (a) {
a.outerHTML = `<div class="CustomPictureBox">${fun.ge("img", a).outerHTML}</div>`;
}
return arr;
/*
let links = [];
let url = location.href;
links.push(url);
let max = fun.geT("//span[contains(text(),'页次')]").match(/\/(\d+)/)[1];
for (let i = 2; i <= max; i++) {
links.push(url + "/page/" + i + ".html");
}
return fun.getImgA(".post-content img", links);
*/
/*
await fun.getNP(".CustomPictureBox img,#img_src img", ".pagination li.active+li>a", null, ".pagination", 0, null, 0);
return [...fun.gae(".CustomPictureBox img")];
*/
},
button: [4],
insertImg: [".CustomPictureBox", 1],
css: ".CustomPictureBox>img{max-width:100%}",
category: "nsfw1"
}, {
name: "图宅网 www.tuzac.com dev.tuzac.com 咔咔西三 www.kkc3.com YouFreeX www.youfreex.com",
reg: /(www\.tuzac\.com|dev\.tuzac\.com|www\.kkc3\.com|www\.youfreex\.com)\/file\/.+/,
imgs: async () => {
let a = fun.ge("#the-photo-link");
if (a) {
a.outerHTML = a.innerHTML;
}
await fun.getNP("#fdp-photo img,#fdp-photo-old img,.file-detail img", ".page-curr+a", null, "#pager", 0, null, 0);
return [...fun.gae("#fdp-photo img,#fdp-photo-old img,.file-detail img")];
},
button: [4, "22%"],
insertImg: ["#task,#fdp-photo,#fdp-photo-old", 2],
customTitle: () => fun.geT(".fc-text-content>h1").replace(/(\[\d+P\]|\n|\(\d+P\))/gi, "").trim(),
css: ".content-container .content{margin-right:0px!important}.fdp-click-area,.ad-side-right,.footer{display:none!important}",
category: "nsfw2"
}, {
name: "七仙子图片 www.qixianzi.com",
reg: /www\.qixianzi\.com\/\w+\/\d+\.html$/,
imgs: async () => {
let a = fun.ge(".picture_content>a");
a.outerHTML = a.innerHTML;
await fun.getNP(".picture_content img", "//a[text()='下一页']", null, ".pagination", 0, null, 0);
return [...fun.gae(".picture_content img")];
},
button: [4],
insertImg: [".picture_content", 2],
next: "//li[contains(text(),'上一篇')]/a",
prev: "//li[contains(text(),'下一篇')]/a",
customTitle: () => fun.geT("h1.diy-h1").replace(/\d+p/i, "").trim(),
category: "nsfw1"
}, {
name: "七仙子图片M www.qixianzi.com/e/wap/",
reg: /www\.qixianzi\.com\/e\/wap\/show\.php\?/,
imgs: ".arcmain img",
button: [4],
insertImg: [".arcmain", 1],
customTitle: () => fun.geT(".header>span"),
category: "nsfw1"
}, {
name: "嘿~色女孩 heysexgirl.com",
reg: /heysexgirl\.com\/archives\/\d+$/,
imgs: async () => {
let max = fun.geT(".page-links>*:last-child");
return fun.getImg(".entry-content p>a,.entry-content p>img", max, "4");
},
button: [4],
insertImg: [".entry-container", 2],
autoDownload: [0],
next: ".nav-previous>a",
prev: ".nav-next>a",
customTitle: () => fun.geT("h1.page-title"),
category: "nsfw2"
}, {
name: "2LSP 2lsp.xyz",
reg: /2lsp\.xyz\/[^/]+\/$/,
include: ".entry-content img[data-srcset]",
exclude: ".content-hide-tips",
observerClick: ".swal2-close",
imgs: () => [...fun.gae(".entry-content img[data-srcset]")].map(e => e.dataset.srcset),
button: [4],
insertImg: [".entry-content", 2],
autoDownload: [0],
next: ".article-nav-prev>a",
prev: ".article-nav-next>a",
customTitle: () => fun.geT("h1.entry-title"),
category: "nsfw1"
}, {
name: "2LSP 2lsp.xyz",
reg: /2lsp\.xyz\//,
icon: 0,
key: 0,
observerClick: ".swal2-close",
category: "nsfw1"
}, {
name: "性趣套图 myjkwd.com 534798.xyz H漫画 123548.xyz",
reg: /(myjkwd\.com|534798\.xyz|123548\.xyz)\/e\/action\/ShowInfo\.php/i,
include: ".entry img",
imgs: () => fun.getImg(".entry img", fun.geT("a[title=总数]"), 8),
button: [4],
insertImg: ["//div[@class='entry']//img/parent::*", 1],
autoDownload: [0],
next: "//p[contains(text(),'上一')]/a",
prev: "//p[contains(text(),'下一')]/a",
customTitle: () => fun.geT(".contitle"),
css: "aside.side{display:none!important;}.main-content{margin-left:0px!important;}body{background:#EDEDED!important;}",
category: "nsfw2"
}, {
name: "苍井优图片 www.28tyu.com www.28wer.com sldlxz.com",
reg: /(www\.(\d+tyu|\d+wer)\.com|sldlxz\.com)\/e\/action\/ShowInfo\.php/i,
imgs: "img[id^='aimg'],.entry img",
button: [4],
insertImg: [".entry", 2],
autoDownload: [0],
next: "//p[contains(text(),'上一')]/a",
prev: "//p[contains(text(),'下一')]/a",
customTitle: () => fun.geT(".contitle").replace(/【\d+P】|\(\d+P\)/i, "").trim(),
category: "nsfw2"
}, {
name: "YY美女图片 www.yyzhenshun.com 美眉大宝贝 www.mmdabaobei.com",
reg: /(www\.yyzhenshun\.com|www.mmdabaobei\.com)\/\d+\.html/i,
imgs: ".wzy_body img[alt]",
button: [4, "22%"],
insertImg: ["//p[img] | //p[strong[img]]", 2],
autoDownload: [0],
next: "//li[contains(text(),'上一篇')]/a",
prev: "//li[contains(text(),'下一篇')]/a",
customTitle: () => fun.geT(".wzy_tit"),
css: "body>section[id],a[href*=download]{display:none!important}header{margin-top:0px!important}",
category: "nsfw1"
}, {
name: "羞涩姬 xiuseaa.com xiusea.com",
reg: /(xiuseaa?\.com)\/index\.php\/art\/detail\/id\/\d+\.html$/i,
imgs: ".embed-responsive>img,.embed-responsive P>img",
button: [4],
insertImg: [".embed-responsive", 2],
customTitle: () => fun.geT("h1.h3").replace(/\[\d+P\]/i, ""),
category: "nsfw2"
}, {
name: "爱看美图网 www.ikmt.net m.ikmt.net",
reg: /(www|m)\.ikmt\.net\/\w+\/\w+\/\d+\/\d+\.html/i,
imgs: () => {
let mouse_page = fun.ge("#mouse_page");
if (mouse_page) {
let max = fun.geT("//li[a[text()='下一页']]", 2) || fun.geT("//a[text()='下一张']", 2).match(/\/(\d+)/)[1];
return fun.getImg("#picBody img,.post-content img", max, 9);
} else {
return [...fun.gae("#picBody img,.post-content img")];
}
},
button: [4],
insertImg: ["#picBody,.post-content", 2],
autoDownload: [0],
next: "//div[contains(text(),'上一篇')]/a",
prev: "//div[contains(text(),'下一篇')]/a",
customTitle: () => fun.geT(".articleV2Title>h1,.mm-title"),
css: ".articleV2Body img{max-width:100% !important}",
category: "nsfw1"
}, {
name: "妮兔美图 www.nitutu.com m.nitutu.com",
reg: /(www|m)\.nitutu\.com\/\w+\/\w+\/\d+\.html/i,
imgs: () => fun.getImg(".pic-body img,.picshow-second img", totalpage, 9),
button: [4],
insertImg: [".pic-body,.picshow-second", 2],
autoDownload: [0],
next: "//li[@class='next']/a | //a[text()='下一篇']",
prev: "//li[@class='prev']/a | //a[text()='上一篇']",
customTitle: () => fun.geT(".pictitle>h1,.picart-title").replace(/\[\d+P\]/i, ""),
category: "nsfw1"
}, {
name: "犀牛图片网 www.xintp.com",
reg: /www\.xintp\.com\/(\w+\/\w+\/\d+\.html|\w+\/\d+\.html)/i,
imgs: async () => {
let page = fun.ge(".page-links");
if (page) {
/*
let max = fun.geT(".page-links>a.post-page-numbers:last-child", 2);
return fun.getImg(".single-content img", max, 7)
*/
await fun.getNP(".single-content img", "//span[@class='post-page-numbers current']/following-sibling::a[span][1]", null, ".page-links");
return [...fun.gae(".single-content img")];
} else {
return [...fun.gae(".single-content img")];
}
},
button: [4],
insertImg: [
[".single-content", 0, ".wp-block-image,.single-content>p~p:not(#FullPictureLoadEnd)"], 2
],
customTitle: () => fun.geT(".entry-title"),
css: ".header-sub,.tg-box{display:none!important}",
category: "nsfw1"
}, {
name: "小姐姐图库 xjjtk.link",
reg: /xjjtk\.link\/posts\/\w+\/$/i,
imgs: "img.block",
button: [4],
insertImg: ["//div[img]", 2],
customTitle: () => fun.geT("h1"),
category: "nsfw2"
}, {
name: "AVJB https://avjb.com/albums/",
reg: /https?:\/\/(avjb\.com|avjb\.fun|av\d{2}\.fun|bav\d{2}\.xyz|bbav\d{3}\.com|onebookcms\.com)\/(\w{2}\/)?albums\/\d+\/[\w-]+\/$/i,
imgs: ".images>a",
button: [4],
insertImg: [
[".images", 2], 2
],
go: 1,
customTitle: () => fun.geT(".headline>h1"),
css: ".sponsor{display:none!important}",
category: "nsfw2"
}, {
name: "Asian To Lick asiantolick.com",
reg: /asiantolick\.com\/post/,
imgs: "div[data-src]",
button: [4],
insertImg: [
["#categoria_tags_post", 1], 2
],
go: 1,
customTitle: () => fun.geT("h1"),
css: "#touch_to_see{display:none!important}",
category: "nsfw2"
}, {
name: "Models Vibe www.modelsvibe.com",
reg: /https?:\/\/www\.modelsvibe\.com\/[^/]+\/$/,
init: () => {
let ele = fun.ge("//p[br and not(contains(text(),'[ad_1]'))]");
if (ele) {
ele = ele.cloneNode(true);
ele.querySelectorAll("img").forEach(img => {
img.remove();
});
let tE = fun.ge(".td-post-content");
tE.parentNode.insertBefore(ele, tE);
}
let ele2 = fun.ge("//p[contains(text(),'Number of pictures')]");
if (ele2) {
if (ele2.previousSibling.tagName == "P") {
ele2.previousSibling.innerHTML = ele2.previousSibling.innerHTML + "<br>" + ele2.innerText;
let e = ele2.previousSibling;
let te = ele2.previousSibling.parentNode;
te.parentNode.insertBefore(e, te);
}
}
},
imgs: () => {
if (fun.ge(".page-nav")) {
let max = fun.geT(".page-nav>*:last-child", 2);
return fun.getImg(".td-post-content img", max, 4);
} else if (fun.ge(".td-post-content img[srcset]")) {
let srcs = [...fun.gae(".td-post-content img[src]")].map(e => e.src);
let srcsets = [...fun.gae(".td-post-content img[srcset]")].map(img => {
let splitArr = img.getAttribute("srcset").split(",");
splitArr = splitArr.sort((a, b) => {
return 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"),
category: "nsfw1"
}, {
name: "Models Vibe www.modelsvibe.com 分類自動翻頁",
reg: /https:\/\/www\.modelsvibe\.com\/(albums\/.+)?(page\/\d+\/)?$/,
icon: 0,
key: 0,
init: () => {
if (/page\/\d+\//.test(location.pathname)) {
currentPageNum = parseInt(location.pathname.match(/\/page\/(\d+)/)[1]);
} else {
currentPageNum = 1;
}
},
autoPager: {
ele: ".td_flex_block:not(.td-flex-radius),.td_block_inner.tdb-block-inner",
observer: ".td_flex_block:not(.td-flex-radius),.td_block_inner.tdb-block-inner",
next: () => {
let url = location.href.replace(/page\/\d+\/?/, "") + `page/${currentPageNum += 1}/`;
return url;
},
stop: () => {
let error = fun.ge(".td-404-title", doc);
if (error) {
return true;
}
return false;
},
history: 1,
bF: () => {
[...fun.gae("span[data-img-url]", doc)].forEach(span => {
span.classList.add("td-animation-stack-type0-2");
span.style.backgroundImage = `url('${span.dataset.imgUrl}')`;
});
},
title: () => {
return doc.title.replace(" - Models Vibe", "").replace(/\s-\sPage\s\d+/, "") + ` - Page ${currentPageNum}`;
}
},
openInNewTab: ".td-module-thumb>a",
category: "autoPager"
}, {
name: "goddess247.com",
reg: /goddess247\.com\/.+\//,
imgs: ".elementor-widget-container p img[alt]",
button: [4],
insertImg: ["//p[img]", 2],
customTitle: async () => {
let ele = "#content h1.elementor-heading-title";
await fun.waitEle(ele);
return fun.geT(ele);
},
category: "nsfw1"
}, {
name: "BestGirlSexy bestgirlsexy.com",
reg: /bestgirlsexy\.com\/.+\//,
imgs: ".elementor-widget-theme-post-content img",
button: [4],
insertImg: ["//p[img]", 2],
customTitle: async () => {
let ele = "#content h1.elementor-heading-title";
await fun.waitEle(ele);
return fun.geT(ele);
},
category: "nsfw1"
}, {
name: "PhimVu m.phimvuspot.com",
reg: /m\.phimvuspot\.com\/\d+\/\d+\/[\w-]+\.html/,
imgs: ".separator>a",
button: [4],
insertImg: [".post-content", 2],
customTitle: () => fun.geT("h1.post-title").replace(/\s?\(\d+\s?photos(\s?\+\s?\d+\s?videos?)?\)/i, ""),
category: "nsfw1"
}, {
name: "Chinese Nude Art Photos chinesenudeart.blogspot.com",
reg: /^https?:\/\/chinesenudeart\.blogspot\.com\/\d+\/\d+\/[\w-]+\.html/i,
imgs: ".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("h1.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", ""),
category: "nsfw1"
}, {
name: "CUTE GIRLS ADDICT cutegirlsaddict.blogspot.com",
reg: /cutegirlsaddict\.blogspot\.com\/\d+\/\d+\/[a-z0-9-]+\.html/i,
imgs: async () => {
let srcArr = [...fun.gae(".separator>a")].map(a => a.href);
let firstSrcArr = srcArr[0].split("/");
if (firstSrcArr.length === 9) {
firstSrcArr[7] = "s11200";
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] = "s11200";
return arr.join("/");
});
return srcArr;
} else {
return srcArr;
}
} else {
return srcArr;
}
},
button: [4],
insertImg: [".entry-content", 2],
customTitle: () => fun.geT("h1.post-title,h3.entry-title").trim(),
category: "nsfw1"
}, {
name: "4KUP 4kup.net",
reg: /https:\/\/4kup\.net\/(?!getlink)[^\/]+\/$/,
exclude: "//button[text()='Click here to continue']",
imgs: "a.thumb-photo",
button: [4],
insertImg: ["#gallery", 2],
go: 1,
autoDownload: [0],
next: "a[rel=prev]",
prev: "a[rel=next]",
customTitle: () => fun.geT(".entry-title"),
category: "nsfw2"
}, {
name: "Fliporn fliporn.biz",
reg: /fliporn\.biz\/videos\//,
include: "//span[@class='entry-category']/a[text()='亚洲贴图' or text()='写真' or text()='动漫贴图' or text()='性感贴图' or text()='欧美贴图' or text()='网友自拍']",
imgs: () => {
return [...fun.gae(".entry-content img")].map(e => {
if (e.dataset.src) {
return e.dataset.src.replace(/\?w=858(&ssl=1)?/, "");
} else {
return e.src.replace("%3C/center%3E%3C/p%3E%3Cdiv%20class=", "").replace(/\?w=858(&ssl=1)?/, "");
}
});
},
button: [4],
insertImg: ["//center[img] | //center[p[img]]", 2],
customTitle: () => document.title.replace(/\s?\[[0-9p\s]+\]|\[\d+P\]/i, "").trim(),
category: "nsfw2"
}, {
name: "人妻租借所 jingunav.info",
reg: /jingunav\.info\/index\.php\/artdetail-\d+\.html/,
imgs: ".embed-responsive img",
button: [4],
insertImg: [".embed-responsive", 2],
customTitle: () => fun.title(/ - 貼圖| - 歐美美女/, 1).replace(/【\d+P】\s?\n?/i, "").replace(/\s?完整版無水印寫真/, ""),
css: "body>.wrap{display:none!important}.player img{max-width:100% !important}",
category: "nsfw2"
}, {
name: "ACGN小鎮 www.bbsacgn.com",
reg: /www\.bbsacgn\.com\/archives\/\d+/,
imgs: ".entry-content img",
button: [4],
insertImg: ["//p[img]", 2],
autoDownload: [0],
next: ".entry-page-prev",
prev: ".entry-page-next",
customTitle: () => fun.geT("h1.entry-title"),
category: "nsfw1"
}, {
name: "皮皮动漫社 pipidm.top www.pipidm.top",
reg: /pipidm\.top\/\d+\.html/,
imgs: ".content_left img",
button: [4],
insertImg: ["//p[img]", 2],
autoDownload: [0],
next: ".entry-page-prev",
prev: ".entry-page-next",
customTitle: () => fun.geT("h1.entry-title"),
category: "nsfw1"
}, {
name: "成人图片 Qinimg www.qinimg.com",
reg: /www\.qinimg\.com\/image\/\d+\.html/,
imgs: "#image a",
button: [4],
insertImg: [
["#image", 2], 2
],
go: 1,
customTitle: () => fun.geT(".box>h1").replace(/\[\d+P\]/i, "").trim(),
category: "nsfw2"
}, {
name: "零零COS 00cos.com",
reg: /00cos\.com\/\d+\.html/,
exclude: ".tinymce-hide,.fa-info-circle[aria-hidden=true]",
imgs: ".article-content img",
customTitle: () => fun.geT(".article-title>a").replace(/\s?\[\d+P-\d+MB\]|\s\[\d+P\s?\d+V\s?\d+M\]\s?/gi, "").trim(),
category: "nsfw1"
}, {
name: "Elite Babes www.elitebabes.com PmateHunter pmatehunter.com www.jperotica.com www.metarthunter.com www.femjoyhunter.com",
reg: /(www\.)?(elitebabes|pmatehunter|jperotica|metarthunter|femjoyhunter)\.com\/.+\//,
exclude: "#content video",
imgs: ".list-gallery a[data-fancybox]",
button: [4, "23%"],
insertImg: [
[".list-gallery", 2], 2
],
go: 1,
customTitle: () => fun.geT("#content>p"),
category: "nsfw2"
}, {
name: "FreeXcafe www.freexcafe.com",
reg: /www\.freexcafe\.com\/erotica\/[\w-]+\/[\w-]+\/index\.php/,
imgs: () => fun.getImgA("#imagelink>img", ".thumbs>a", 500),
button: [4],
insertImg: [
["#content>*:last-child", 2], 2
],
go: 1,
category: "nsfw2"
}, {
name: "EPORNER Photo www.eporner.com/profile/namaiki/ www.eporner.com/profile/janekhansen/",
reg: /\w{2,3}\.eporner\.com\/gallery\/.+\//,
imgs: () => [...fun.gae("#container img")].map(e => e.src.replace("_296x1000", "")),
button: [4],
insertImg: [
[".photosgrid", 2], 2
],
go: 1,
customTitle: () => fun.geT("#galleryheader>h1"),
css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}",
category: "nsfw2"
}, {
name: "Xasiat www.xasiat.com/albums/ https://www.xasiat.com/albums/3346/sidam-yeeun-vol-001-event/",
reg: /www\.xasiat\.com\/([\w]{2}\/)?albums\/\d+\/[\w-]+\//i,
init: () => {
fun.gae("img.thumb[data-original]").forEach(img => {
img.src = img.dataset.original;
});
fun.remove(".sponsor,.footer-margin");
},
imgs: ".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,.footer~*:not([id^='pv-']):not([class^='pv-']):not(.pagetual_tipsWords):not(.FullPictureLoadMsg):not(#FullPictureLoad):not(#FullPictureLoadOptions):not(.fancybox-container){display:none!important}",
category: "nsfw2"
}, {
name: "Xasiat loadMore www.xasiat.com/albums/",
reg: /www\.xasiat\.com\/albums\//,
icon: 0,
key: 0,
include: "#list_albums_common_albums_list_pagination",
init: () => {
setInterval(() => {
fun.remove("//div[iframe] | //iframe");
if (document.body.getAttribute("class").length > 13) {
document.body.setAttribute("class", "big-container");
}
}, 500);
},
observerClick: ".load-more>a",
category: "nsfw2"
}, {
name: "Xasiat https://www.xasiat.com/albums/",
reg: /(www\.xasiat\.com\/albums\/$|www\.xasiat\.com\/albums\/categories\/)/,
icon: 0,
key: 0,
init: () => {
fun.gae("img.thumb[data-original]").forEach(img => {
img.src = img.dataset.original;
});
fun.remove(".footer~*", 2000);
},
css: ".footer~*{display:none!important}",
category: "nsfw2"
}, {
name: "xHamster gallery xhamster.com/users/eros721_official/photos",
reg: /xhamster\.com\/photos\/gallery\/[^/]+$/,
include: ".gallery-section",
imgs: async () => {
await fun.getNP(".photo-thumb", "//div[@class='gallery-section']//li[a[contains(@class,'active')]]/following-sibling::li[1]/a", null, ".gallery-section .pager-section");
[...fun.gae(".photo-thumb")].forEach(ele => {
let width, height;
if (parseInt(ele.dataset.w) > parseInt(ele.dataset.h)) {
width = 374;
height = 251;
} else {
width = 168;
height = 251;
}
ele.style = `margin-right:10px;width:${width}px;height:${height}px;display:block;`;
fun.ge(".dots-loader", ele).remove();
let thumb = fun.ge(".image-thumb", ele);
thumb.style.backgroundImage = `url('${thumb.dataset.lazy}')`;
});
let links = [...fun.gae("a.photo-thumb")].map(a => a.href);
let resArr = [];
let fetchNum = 0;
for (let i = 0; i < links.length; i += 3) {
let res = fun.fetchDoc(links[i]).then(doc => {
fun.show(`${displayLanguage.str_06}${fetchNum+=1}/${Math.ceil(links.length/3)}`, 0);
let items = JSON.parse(fun.ge("#initials-script", doc).innerHTML.replace(/window.initials=|;/g, "")).photosGalleryModel.photos.items;
return items;
});
resArr.push(res);
await fun.delay(300, 0);
}
let imageURLs = await Promise.all(resArr).then(data => {
fun.hide();
return data.flat().map(e => e.imageURL);
});
return [...new Set(imageURLs)];
/*
const callback = async n => {
let resArr = [];
let fetchNum = 0;
for (let i = n; i < links.length; i += 16) {
let res = fun.fetchDoc(links[i]).then(doc => {
fun.show(`${displayLanguage.str_06}${fetchNum+=1}/${Math.ceil(links.length/16)}`, 0);
let items = JSON.parse(fun.ge("#initials-script", doc).innerHTML.replace(/window.initials=|;/g, "")).photosGalleryModel.photos.items;
return items;
});
resArr.push(res);
await fun.delay(300, 0);
}
let imageURLs = await Promise.all(resArr).then(data => {
fun.hide();
return data.flat().map(e => e.imageURL);
});
debug(`\n起始為第${parseInt(n) + 1}張圖片的imageURLs\n`, imageURLs);
debug(`\n起始為第${parseInt(n) + 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) === parseInt(fun.geT(".page-title__count"))) {
return images;
} else if (parseInt(images.length) < 16) {
console.clear();
let one = await callback(0);
let concat = one.concat(images);
debug(`\n起始為第${parseInt(i) + 1}張圖片的imageURLs\n`, images);
debug(`\n起始為第${parseInt(i) + 1}張圖片並合併起始為1的imageURLs\n`, concat);
debug(`\n合併後去重複的imageURLs\n`, [...new Set(concat)]);
return concat;
} else {
fun.show("圖片數量不正確重新獲取", 1900);
await fun.delay(2000, 0);
}
}
return [];
*/
},
init: "fun.remove('.mixed-list>.flex-element')",
button: [4],
insertImg: [
["main>article", 2], 2
],
go: 1,
customTitle: () => fun.geT(".page-title h1"),
css: "div[data-role=promo-messages-wrapper]{display:none!important}",
category: "nsfw2"
}, {
name: "xHamsterM gallery xhamster.com/users/eros721_official/photos",
reg: /xhamster\.com\/photos\/gallery\/[^/]+$/,
imgs: async () => {
await fun.getNP(".items[data-role='gallery-photos']>.item-container", "//ol[@class='page-list']/li[@class='page-button' and a[@class='page-button-link page-button-link--active']]/following-sibling::li[1]/a", null, "//ol[@class='page-list']");
return fun.getImgA("#photoCurr", "a.item.slided", 1, [null, null], 0);
},
button: [4],
insertImg: [".items[data-role=gallery-photos]", 1],
customTitle: () => fun.geT("h1.page-title"),
css: ".items[data-role=gallery-photos]>.item-container{width:100%!important}aside[data-role=yld-mdtop],.yld-md--bottom,.yld-pc--bottom,aside[data-role=yld-pctop],div[data-role=promo-messages-wrapper]{display:none!important}",
category: "nsfw2"
}, {
name: "PornHub photo pornhub.com/albums", //很容易會被短暫封IP
enable: 1,
reg: /pornhub\.com\/album\/\d+/,
imgs: () => fun.getImgA("#photoImageSection img", ".js_lazy_bkg a", 200),
button: [4],
insertImg: [
[".photoBlockBox .clear", 1], 1
],
go: 1,
customTitle: () => fun.geT(".photoAlbumTitleV2").trim(),
category: "nsfw2"
}, {
name: "BITCHES GIRLS bitchesgirls.com",
reg: /https:\/\/bitchesgirls\.com\/[^\/]+\/[^\/]+\/[^\/]+\/$/,
init: async () => {
await fun.getNP(".albumgrid a,.popup-element", "a#loadMore");
},
imgs: () => {
const selector = "script[type='application/ld+json']";
const getUrls = (ele, doc) => {
let text = fun.ge(ele, doc).innerText;
let urls = text.match(/"url":\s?"[^"]+/g).map(e => e.replace(/"url":\s?"/, ""));
return urls.filter(e => !/\/logos\//.test(e));
}
const max = adConstants.pagesAmount;
if (max > 1) {
let links = [];
links.push(siteUrl);
for (let i = 2; i <= max; i++) {
links.push(siteUrl + `${i}/`);
}
let resArr = [];
let fetchNum = 0;
for (let i in links) {
let res = fun.fetchDoc(links[i]).then(doc => {
fun.show(`${displayLanguage.str_06}${fetchNum+=1}/${max}`, 0);
return getUrls(selector, doc);
});
resArr.push(res);
}
return Promise.all(resArr).then(data => {
fun.hide();
return data.flat();
});
} else {
return getUrls(selector, document);
}
},
repeat: 1,
button: [4],
insertImg: [
[".button-container", 2], 2
],
go: 1,
css: "a#loadMore{display:none!important}",
category: "nsfw2"
}, {
name: "EroMe www.erome.com",
reg: /^https:\/\/www\.erome\.com\/a\/\w+$/i,
imgs: "div[data-src],.img>img[data-src]",
customTitle: () => fun.geT(".page-content h1"),
category: "nsfw2"
}, {
name: "DirtyChicks dirtychicks.net",
reg: /^https:\/\/dirtychicks\.net\/gallery\/[^\/]+\/$/i,
imgs: () => [...fun.gae("#album img")].map(e => e.src.replace(/-\d+x\d+./, ".")),
button: [4],
insertImg: [".gallery_grid", 2],
customTitle: () => fun.title(" - DirtyChicks"),
category: "nsfw2"
}, {
name: "Amateur Likes amateurlikes.com",
reg: /^https:\/\/amateurlikes\.com\/n\/[^\/]+\/\d+$/i,
imgs: "#gallery img",
button: [4],
insertImg: ["#gallery .masonry", 2],
customTitle: () => fun.geT(".full_h1").replace(/\([\d\s]+Photos\)/i, "").trim(),
css: "#gallery .masonry{display:block!important}",
category: "nsfw2"
}, {
name: "Nakedsex nakedsex.pics",
reg: /^https:\/\/nakedsex\.pics\/.+\.php$/i,
imgs: ".gallerycontent a",
button: [4],
insertImg: [
[".tags", 2], 2
],
go: 1,
customTitle: () => fun.title(" - Best adult videos and photos"),
css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}",
category: "nsfw2"
}, {
name: "Onlyfans Leaks topleaks.net",
reg: /^https:\/\/topleaks\.net\/[^\/]+\/$/i,
imgs: () => [...fun.gae(".entry-content img")].map(e => e.src.replace(/-\d+x\d+./, ".")),
customTitle: () => fun.geT(".entry-title"),
category: "nsfw2"
}, {
name: "ThotHub Leaks thothub.vip",
reg: /^https:\/\/thothub\.vip\/[^\/]+\/$/i,
imgs: ".entry-content img",
customTitle: () => fun.geT(".entry-title").replace(/\([\d\s]+Photos\)/i, "").trim(),
category: "nsfw2"
}, {
name: "MrDeepFakes mrdeepfakes.com",
reg: /https?:\/\/mrdeepfakes\.com\/photo\/\d+\//,
imgs: "a[data-fancybox-type=image]",
button: [4],
insertImg: [
[".info-holder", 2], 1
],
customTitle: () => fun.geT(".headline>h1"),
go: 1,
category: "nsfw2"
}, {
name: "PicHunter www.pichunter.com",
reg: /www\.pichunter\.com\/gallery\/\d+\/.+/,
imgs: ".flex-images figure>a",
button: [4],
insertImg: [
[".flex-images", 2], 1
],
go: 1,
customTitle: () => fun.geT("h1"),
category: "nsfw2"
}, {
name: "Pictoa www.pictoa.com",
reg: /www\.pictoa\.com\/(thumbs|albums)\/.+\.html/i,
imgs: () => fun.getImgA("#player img", ".thumb-nav-img a"),
button: [4],
insertImg: ["#player", 2],
customTitle: () => fun.geT(".title>h1"),
css: "#gallery #player{cursor:unset!important}",
category: "nsfw2"
}, {
name: "PimpAndHost https://pimpandhost.com/site/trending",
reg: /pimpandhost\.com\/(image|album)\/\d+/,
init: () => {
if (/image/.test(location.href)) location.href = fun.ge('a[title=Album]').href;
fun.remove(".flex-block-1,.flex-block-2,#comments,.ano_po");
},
imgs: async () => {
await fun.getNP("#album-images>.image-block", "li.active+li:not(.next)>a", null, ".pagination");
return [...fun.gae("#album-images .image-block a[data-src]")];
},
button: [4, "18%"],
insertImg: [
[".summary", 2], 2
],
go: 1,
customTitle: () => fun.geT(".author-header__album-name"),
category: "nsfw2"
}, {
name: "PimpAndHost 隱藏廣告",
reg: /pimpandhost\.com\//,
icon: 0,
key: 0,
init: "fun.remove('.flex-block-1,.flex-block-2,#comments,.ano_po')",
css: ".list-view:not(#main-list-view) .item:not(.image-block){display:none!important}",
category: "nsfw2"
}, {
name: "BabeSource babesource.com",
reg: /babesource\.com\/galleries\/.+\.html/i,
imgs: ".box-massage__card-link",
button: [4],
insertImg: [
[".albaums-box", 1], 2
],
go: 1,
customTitle: () => fun.title("|", 1),
category: "nsfw2"
}, {
name: "Pornpaw 圖片清單頁 www.pornpaw.com",
reg: /www\.pornpaw\.com\/gallery\/[\w-]+\.html/i,
delay: 500,
imgs: () => [...fun.gae("img[data-src]")].map(e => e.dataset.src.replace("x160.", ".")),
button: [4],
insertImg: [
[".container>.row", 2], 2
],
go: 1,
customTitle: () => fun.geT("h1"),
category: "nsfw2"
}, {
name: "ImageFap 圖片清單頁 www.imagefap.com https://www.imagefap.com/pictures/11084503/SIDAM%20Son%20Ye-Eun%20Vol.001%20Event",
reg: /www\.imagefap\.com\/(gallery|pictures)\/\d+/i,
icon: 0,
key: 0,
init: () => {
fun.getNP('//tr[td[@id]]', 'b+a.link3', null, '#gallery>font>span');
},
category: "nsfw2"
}, {
name: "ImageFap www.imagefap.com",
reg: /www\.imagefap\.com\/photo\/\d+\//i,
imgs: async () => {
let max = fun.ge("div[data-total]").dataset.total;
await fun.waitEle(".image-wrapper img");
let arr = [];
arr.push(fun.ge(".image-wrapper img").cloneNode(true));
fun.show(`${displayLanguage.str_02}1/${max}`, 0);
let n = 1;
for (let i = 1; i < max; i++) {
fun.ge("a.next[title=Next]").click();
await fun.delay(1000, 0);
if (await fun.waitEle(".image-wrapper img")) {
arr.push(fun.ge(".image-wrapper img").cloneNode(true));
fun.show(`${displayLanguage.str_02}${n+=1}/${max}`, 0);
}
}
fun.hide();
return arr;
},
button: [4],
insertImg: [".mainouter", 1],
customTitle: () => fun.geT("#main h1"),
category: "nsfw2"
}, {
name: "fuskator.com 圖片清單頁",
reg: /fuskator\.com\/thumbs\/[\w-~]+\/[\w-~]+\.html/i,
imgs: async () => {
fun.show(displayLanguage.str_04, 0);
await fun.waitEle(".pic_pad");
fun.hide();
return [...fun.gae("#thumbimages a,.swipebox a")];
},
insertImg: [
["//a[text()='View full images']", 2], 2
],
go: 1,
//customTitle: "return fun.geT('#info+h1')",
category: "nsfw2"
}, {
name: "fuskator.com 大圖頁",
reg: /^https:\/\/fuskator\.com\//i,
include: "//a[text()='View gallery thumbnails']",
imgs: "img.full",
insertImg: ["#fullimages", 2, 1000],
category: "nsfw2"
}, {
name: "TOKYO Motion www.tokyomotion.net",
reg: /^https:\/\/www\.tokyomotion\.net\/album\/\d+\/.+/,
imgs: async () => {
await fun.getNP("div[id^=album_photo]", ".pagination li.active+li>a", null, ".pagination");
return [...fun.gae(".thumb-overlay img")].map(e => e.src.replace("tmb/", ""));
},
button: [4],
insertImg: [
["//div[div[div[contains(@id,'album_photo')]]]", 0], 2
],
go: 1,
customTitle: () => [...fun.gae(".pull-left")][2].innerText.trim(),
category: "nsfw2"
}, {
name: "javbangers.com",
reg: /www\.javbangers\.com\/albums\/.+/,
imgs: ".images a",
button: [4],
insertImg: [
[".album-info", 2], 2
],
go: 1,
customTitle: () => fun.geT(".headline>h1").trim(),
category: "nsfw2"
}, {
name: "multi.xnxx.com",
reg: /multi\.xnxx\.com\/gallery\/.+/,
imgs: ".galleryPage .boxImg",
button: [4],
insertImg: [
[".originalLink", 2], 1
],
go: 1,
category: "nsfw2"
}, {
name: "色情圖片網 www.photos18.com",
reg: /www\.photos18\.com\/\w+\/\w+/i,
imgs: ".imgHolder a[data-fancybox]",
button: [4],
insertImg: ["#content", 1],
customTitle: () => fun.geT("h1.title").replace(/\d+P|\s?\(\d+P\)/i, ""),
category: "nsfw2"
}, {
name: "GavPorn 相冊 https://cav103.com/albums/",
reg: /cav\d+\.com\/albums\/\d+\/\w+\//,
imgs: "a[data-fancybox-type]",
button: [4],
insertImg: [".sponsor", 2],
customTitle: () => fun.geT(".headline>h1"),
css: ".top{display:none!important}",
category: "nsfw2"
}, {
name: "BuzzAV www.buzzav.com",
reg: /old\.buzzav\.com\/album\/\d+\//,
imgs: async () => {
await fun.getNP("//div[a[div[img[contains(@id,'album_photo')]]]]", ".pagination li.active+li>a", null, ".d-sm-block>.pagination");
return [...fun.gae("[id^=album_photo]")].map(e => e.src.replace("tmb/", ""));
},
button: [4],
insertImg: [
[".well-info+.content-row", 2], 1
],
go: 1,
//customTitle: "return fun.geT('.box>h1').replace(/\\[\\d+P\\]/i,'').trim();",
//css: ".well-info+.content-row{display: block!important;}#FullPictureLoadEnd{color:rgb(255, 255, 255)}",
css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}",
category: "nsfw2"
}, {
name: "Hentai Image hentai-img.com hentai-cosplays.com porn-images-xxx.com porn-gravure-idol.com",
reg: /(hentai-img|hentai-cosplays|porn-images-xxx|porn-gravure-idol)\.com\/image\/[^/]+\//,
include: "//a[text()='DETAIL PAGE' or text()='DETAIL HALAMAN' or text()='詳細へ' or text()='详细信息页面' or text()='Страница сведений' or text()='상세 페이지' or text()='página de detalles' or text()='หน้ารายละเอียด' or text()='TRANG CHI TIẾT']",
imgs: () => {
let max = document.title.split("/").pop().match(/\d+/)[0];
let links = [];
let url = siteUrl.replace(/\/\d+\/$/, "");
for (let i = 1; i <= max; i++) {
links.push(url + `/${i}/`);
}
return fun.getImgA("#display_image_detail a,#detail_list a", links, 100);
/*
let max = document.title.split("/").pop().match(/\d+/)[0];
let srcs = [];
let mode = location.href.split("/").slice(0, -1).pop();
let firstSrc = fun.ge("#display_image_detail a,#detail_list a").href;
let path = firstSrc.replace(/(image-)?\d+\.\w+$/i, "");
for (let i = 1; i <= max; i++) {
if (/image/.test(mode)) {
srcs.push(path + "image-" + String(i).padStart(3, "0") + ".jpg");
} else {
srcs.push(path + i + ".jpg");
}
}
return srcs;
*/
},
button: [4],
insertImg: ["#display_image_detail,#detail_list", 2],
customTitle: () => fun.geT("#title>h2,#page h3").replace(/\s?Photo\s?\d+P|\s?-\s?\d+\/\d+\s?|\([0-9\s]+ảnh\)/i, "").trim(),
css: "#display_image_detail img{max-width:100% !important}",
category: "nsfw2"
}, {
name: "Hentai Image hentai-img.com hentai-cosplays.com porn-images-xxx.com porn-gravure-idol.com",
reg: /(hentai-img|hentai-cosplays|porn-images-xxx|porn-gravure-idol)\.com\/image\/[^/]+\/(page\/\d+\/)?$/,
init: () => {
let ele = fun.ge("//div[span[a]]");
if (ele) {
let tE = fun.ge("#display_image_detail,#detail_list");
tE.parentNode.insertBefore(ele, tE);
}
},
imgs: async () => {
let max = fun.geT("#paginator>*:last-child", 3) || fun.geT(".paginator_page[rel=next]", 2) || 1;
let links = [];
let url = siteUrl.replace(/page\/\d+\/$/, "");
for (let i = 1; i <= max; i++) {
links.push(url + `page/${i}/`);
}
let arr = await fun.getImgA(".icon-overlay img,#display_image_detail img", links, 100);
return arr.map(e => e.replace(/\/p=(700|305)/, ""));
/*
let currentName = location.href.split("/")[4];
let last;
try {
last = fun.ge(".paginator_page[rel=next]").previousElementSibling;
} catch (e) {
last = fun.ge("#paginator>*:last-child>a");
}
let lastUrl;
try {
lastUrl = last.href;
} catch (e) {
return [...fun.gae(".icon-overlay img,#display_image_detail img")].map(e => e.src.replace(/\/p=(700|305)/, ""));
}
debug("\nlastURL\n", lastUrl);
let lastUrlName = lastUrl.split("/")[4];
if (last && currentName === lastUrlName) {
let srcs = [];
fun.show(displayLanguage.str_09, 0);
let timeId = setTimeout(() => {
location.reload();
}, 30000);
let lastFileName = await fun.fetchDoc(lastUrl).then(doc => {
clearTimeout(timeId);
let ele = [...fun.gae(".icon-overlay img,#display_image_detail img", doc)].pop();
let fileName = ele.src.match(/.+\/(.+)/)[1];
return fileName;
});
fun.hide();
let max = parseInt(lastFileName.match(/\d+/)[0]);
let path = fun.ge(".icon-overlay img,#display_image_detail img").src.match(/.+\//)[0].replace(/\/p=\d+\//, "/");
for (let i = 1; i <= max; i++) {
if (/image/.test(lastFileName)) {
srcs.push(path + "image-" + String(i).padStart(3, "0") + ".jpg");
} else {
srcs.push(path + i + ".jpg");
}
}
return srcs;
} else {
return [...fun.gae(".icon-overlay img,#display_image_detail img")].map(e => e.src.replace(/\/p=(700|305)/, ""));
}
*/
},
button: [4],
insertImg: ["#display_image_detail,#detail_list", 2],
autoDownload: [0],
next: () => {
let next = fun.ge("//a[text()='Prev Article' or text()='前の記事' or text()='前一篇']");
if (next) {
return next.href;
} else {
return 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: "Fapator 圖片清單頁",
reg: /www\.fapator\.com\/\?content_id=/i,
imgs: "a[data-lightbox]",
init: () => {
fun.remove("//div[@class='img' and a[@target and img]]");
},
button: [4],
insertImg: [".fcon+.fapad", 1],
next: "//a[contains(text(),'next photos')]",
prev: 1,
go: 1,
category: "nsfw2"
}, {
name: "SMUTPOND www.smutpond.com",
reg: /www\.smutpond\.com\/gallery-pics\/\?uid=/i,
imgs: "img[alt=Pic]",
button: [4],
insertImg: [".viewerBox", 2],
customTitle: async () => {
await fun.delay(2000, 0);
return fun.geT("h2.sectionTitleLeft");
},
category: "nsfw2"
}, {
name: "SexyGirlsPics sexygirlspics.com",
reg: /sexygirlspics\.com\/pics\/[\w-]+\//i,
imgs: "a.ss-image",
button: [4],
insertImg: [
[".sponsor-button", 2], 1
],
go: 1,
category: "nsfw2"
}, {
name: "PornPic www.pornpic.com",
reg: /www\.pornpic\.com\/gallery\/[\w-]+/i,
imgs: ".gallery-grid a.item-link",
button: [4],
insertImg: [
[".gallery-info", 2], 1
],
go: 1,
category: "nsfw2"
}, {
name: "PornPic www.pornpic.com",
reg: /www\.pornpic\.com\/gallery\/[\w-]+/i,
imgs: ".gallery-grid a.item-link",
button: [4],
insertImg: [
[".gallery-info", 2], 1
],
go: 1,
category: "nsfw2"
}, {
name: "Girlsreleased 載入更多",
icon: 0,
key: 0,
delay: 1000,
reg: /girlsreleased\.com\//,
include: "//button[text()='more']",
observerClick: "//button[text()='more']",
openInNewTab: ".content .main a",
category: "nsfw2"
}, {
name: "Girlsreleased",
reg: /girlsreleased\.com\/set\/\d+/,
imgs: async () => {
let ele = ".images .imageContainer .image img";
await fun.waitEle(ele);
let src = fun.ge(ele).src;
let images = [...fun.gae(ele)];
if (/imx\.to/.test(src)) {
let tempSrc = src.replace("https://imx.to/u/t/", "https://i.imx.to/i/");
return new Promise(async resolve => {
let obj = await fun.checkImgStatus(tempSrc);
if (obj.ok && obj.width > 200) {
resolve(images.map(e => e.src.replace("https://imx.to/u/t/", "https://i.imx.to/i/")));
} else {
resolve(images.map(e => e.src.replace("/t/", "/i/")));
}
});
} else if (/imgadult\.com/.test(src)) {
return images.map(e => e.src.replace("small-medium/", "big/"));
} else if (/pixhost\.to/.test(src)) {
return images.map(e => e.src.replace("https://t", "https://img").replace("/thumbs/", "/images/"));
} else {
return [];
}
},
button: [4],
insertImg: [
[".images", 2], 2
],
go: 1,
referer: "src",
category: "nsfw2"
}, {
name: "Eropics eropics.to eropics.co",
reg: /eropics\.\w+\/\d+\/\d+\/\d+\//i,
include: "a[href*='pixhost.to'],a[href*='www.turboimagehost.com'],a[href*='imgbox.com'],a[href*='www.imagevenue.com']",
imgs: () => {
if (fun.gae("a[href*='imx.to']").length > 3) {
let yes = confirm(displayLanguage.str_10);
if (yes) {
let arr = [...fun.gae(".entry-content a")].map(a => a.href);
let str = arr.join("\n");
console.log(str);
copyToClipboard(str);
fun.show(displayLanguage.str_11);
}
return [];
}
let links = [...fun.gae(".entry-content a:not([href*='imx.to'])")].map(a => a.href);
let resArr = [];
let xhrNum = 0;
for (let i in links) {
let res = fun.xhr(links[i], "document").then(doc => {
fun.show(`${displayLanguage.str_02}${xhrNum+=1}/${links.length}`, 0);
return fun.ge("#image,.pic.img.img-responsive,#imageid,#img.image-content,.card-body img", doc);
});
resArr.push(res);
}
return Promise.all(resArr).then(arr => {
fun.hide();
return arr;
});
},
button: [4],
insertImg: [
[".entry-footer", 2], 2
],
go: 1,
referer: "src",
customTitle: () => fun.geT("h1.entry-title"),
category: "nsfw2"
}, {
name: "Eropics",
reg: /eropics\.to\/\d+\/\d+\/\d+\//i,
include: "a[href*='imx.to']",
init: () => {
fun.show(displayLanguage.str_12, 5000);
},
imgs: ".entry-content p>a",
category: "nsfw2"
}, {
name: "imx.to gallery",
reg: /https?:\/\/imx\.to\/g\/\w+$/i,
imgs: () => [...fun.gae("img.imgtooltip")].map(e => e.src.replace("/u/t/", "/u/i/")),
button: [4],
insertImg: [
["#content", 2], 2
],
go: 1,
category: "nsfw2"
}, {
name: "imx.to",
reg: /https?:\/\/imx\.to\/i\/\w+$/i,
icon: 0,
key: 0,
autoClick: ".button.blue.large,#continuebutton,a[title='Show gallery']",
category: "nsfw2"
}, {
name: "Ngắm Gái Xinh ngamgaixinh.us",
reg: /ngamgaixinh\.us\/[^/]+\/(\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) => {
return a.match(/\s(\d+)w/)[1] - b.match(/\s(\d+)w/)[1];
});
return splitArr.pop().trim().split(" ")[0];
} else {
return img.src;
}
});
},
button: [4],
insertImg: [
[".penci-single-link-pages", 2], 2
],
go: 1,
category: "nsfw2"
}, {
name: "Ngắm Gái Xinh ngamgaixinh.us album",
reg: /ngamgaixinh\.\w+\/album\/.+/,
imgs: () => [...fun.gae(".list-item-image img")].map(img => img.src.replace(/\.(th|md)\./, ".")),
button: [4],
insertImg: [
[".pad-content-listing", 2], 2
],
go: 1,
category: "nsfw2"
}, {
name: "Degoo Cloud app.degoo.com",
reg: /^https?:\/\/app\.degoo\.com\/share\//,
imgs: async () => {
let max = prompt(displayLanguage.str_13, "100");
let img = ".preview-media .hidden";
await fun.waitEle(img);
let arr = [];
arr.push(fun.ge(img).cloneNode(true));
fun.show(`${displayLanguage.str_02}1/${max}`, 0);
let n = 1;
for (let i = 1; i < max; i++) {
fun.ge("#nextFileButton").click();
await fun.delay(200, 0);
if (await fun.waitEle(img)) {
arr.push(fun.ge(img).cloneNode(true));
fun.show(`${displayLanguage.str_02}${n+=1}/${max}`, 0);
}
}
fun.hide();
arr = arr.map(e => e.src);
return [...new Set(arr)];
},
category: "nsfw2"
}, {
name: "xher.net",
reg: /xher\.net\/index\.php\?\/category\/\d+$/i,
imgs: async () => {
await fun.getNP("#thumbnails>li", ".pageNumberSelected+a", null, ".navigationBar");
return [...fun.gae("#thumbnails img")].map(e => e.src.replace("_data/i/", "").replace(/-(2s|xs|sm||me|la|xl)\./, "."));
},
button: [4],
insertImg: [
[".navigationBar", 2], 2
],
go: 1,
category: "nsfw2"
}, {
name: "Bunkr bunkrr.su",
reg: /^https:\/\/bunkrr\.su\/a\/\w+/i,
imgs: () => {
return fun.getImgA(".lightgallery img", "a[href^='/i/']");
},
button: [4],
insertImg: [
[".grid-images", 2], 2
],
go: 1,
customTitle: () => {
return fun.geT("h1");
},
category: "nsfw2"
}, {
name: "Bunkr bunkr-albums.io 列表自動翻頁",
reg: /^https:\/\/bunkr-albums\.io\//,
icon: 0,
key: 0,
autoPager: {
ele: ".table-auto>tbody",
next: "a.bg-gray-300+a",
re: ".justify-center",
observer: ".table-auto>tbody",
history: 1,
title: () => {
let num = fun.ge("a.bg-gray-300", doc).innerText;
return `Page ${num}`;
}
},
category: "autoPager"
}, {
name: "girlgirlgo.org girlgirlgo.net girlgirlgo.top girlgirlgo.icu girlgirlgo.biz girlygirlpic.com",
reg: /https?:\/\/\w{2}\.(girlgirlgo|girlygirlpic)\.(org|net|icu|com|biz|top)\/a\/\w+/,
imgs: ".figure-link",
button: [4],
insertImg: [".post-media-body", 2],
next: async () => {
await fun.waitEle("a[rel=next]", 30);
let next = fun.ge("a[rel=next]");
if (next) {
return next.href;
} else {
return null;
}
},
prev: "a[rel=prev]",
customTitle: async () => {
await fun.waitEle(".figure-link");
return fun.geT(".entry-title a").split(" No.")[0].trim();
},
category: "nsfw1"
}, {
name: "QGirlz qgirlz.com CuteLadyPic cuteladypic.com",
reg: /https?:\/\/(\w{2}\.)?(qgirlz|cuteladypic)\.(com)\/a\/[\w-]+/,
imgs: () => fun.getImg("//a[@data-title and picture/source]", (fun.geT(".next", 2) || 1), 16),
button: [4],
insertImg: [".main-image", 2],
customTitle: () => fun.geT(".main-title").split(" No.")[0].trim(),
category: "nsfw1"
}, {
name: "cn.angirlz.com", //SPA
reg: /https?:\/\/\w{2}\.angirlz\.com\/album\/\w+/,
imgs: async () => {
if (await fun.waitEle(".loading[style$=hidden]")) {
return [...fun.gae("#divGallery a")];
} else {
return [];
}
},
button: [4],
insertImg: ["div[key=album_main]", 2],
customTitle: () => fun.geT("h1"),
category: "nsfw2"
}, {
name: "bunnyxgirl.com letsgirlz.com bootyxgirl.com xbeautyzone.com",
reg: /https?:\/\/(bunnyxgirl|letsgirlz|bootyxgirl|xbeautyzone)\.com\/[^/]+\/.+/,
include: ".separator>a",
imgs: ".separator>a",
button: [4],
insertImg: [
[".album-post-inner,.album-postmeta-primarypix", 2, ".separator"], 2
],
customTitle: () => fun.geT(".breadcrumbs>span:last-child"),
category: "nsfw2"
}, {
name: "cn.bunnyxgirl.com cn.letsgirlz.com cn.bestxleg.com cn.xbeautyzone.com",
reg: /https?:\/\/\w{2}\.(bunnyxgirl|letsgirlz|bestxleg|xbeautyzone)\.com\/[^/]+\/\w+/,
include: ".separator>a",
imgs: () => fun.getImg(".separator>a", (fun.geT(".nav-links>*:last-child", 2) || 1), 16),
insertImg: [
[".album-post-body .clear,.album-post-share-wrap", 1, "div[itemprop='description articleBody'],.album-post-body>*:not(.album-post-inner):not(.album-post-share-wrap):not(.FullPictureLoadImage):not(#FullPictureLoadEnd)"], 2
],
customTitle: () => fun.geT(".breadcrumbs>span:last-child"),
category: "nsfw2"
}, {
name: "kawaiix.com kawaiixgirl.com kawaiixpic.com kinkygirlz.com kawaiimetas.com eroticxgirl.com sexyxpic.com hottyxpic.com thongxxx.com juicexgirl.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|eroticxgirl|sexyxpic|hottyxpic|thongxxx|juicexgirl|eroticxpic|bustyxgirl|beautyxgirl|bellexpic|pantyxpic|peachgirlz|pantyxart|beautyxpic|cutemetas|cutexpic|perfectxbody|sexyqgirl|bestxhips|assgirlz|beautifulmetas|pantyxgirl|greatxpic|xartpic|perfectxpic|bestxboobs|artthong|hotbeautypic|greatxgirl|asianxpic|bestxleg|tokyohotgirl|bestxass)\.com\/[^/]+\/.+/,
include: "//a[@data-title and picture/source]",
imgs: "//a[@data-title and picture/source]",
button: [4],
insertImg: [".hero+.hero,.entry-content,.d-flex>.col-24,.album-post,.album-h1", 2],
customTitle: () => fun.title(/( - Kawa| - KinkyGirlz| - BelleXPic| - Peach| - Panty| - Beauty| - Cute| - Ass| - Beaut| - Great| - Xart| - Perfect| - Art| - GreatXGirl)/i, 1).replace(/\s?\(\d+\s?photos\)/, "").trim(),
category: "nsfw2"
}, {
name: "cn.kawaiix.com cn.kawaiixgirl.com cn.kawaiixpic.com cn.kinkygirlz.com cn.kawaiimetas.com cn.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.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|eroticxgirl|sexyxpic|hottyxpic|thongxxx|juicexgirl|eroticxpic|bustyxgirl|beautyxgirl|bellexpic|pantyxpic|peachgirlz|pantyxart|beautyxpic|cutemetas|cutexpic|perfectxbody|sexyqgirl|bestxhips|bestxass|assgirlz|bestxbum|adultmetas|eroticxpic|xxxthong|thongxgirl|bestxlingerie|sexyxart|hotxhips|hotbeautypic|greatxgirl|asianxpic|bootyxgirl|tokyohotgirl)\.com\/[^/]+\/\w+/,
include: "//a[@data-title and picture/source]",
imgs: () => fun.getImg("//a[@data-title and picture/source]", (fun.geT(".nav-links>*:last-child", 2) || 1), 16),
button: [4],
insertImg: [".hero+.hero,.entry-content,.d-flex>.col-24,.album-post", 2],
customTitle: () => fun.geT(".entry-title,.album-title,.album-post-title,.col-12>h1,.album-h1").split(" No.")[0].trim(),
css: ".flex-grid:not(.masonry){display:block!important;}",
category: "nsfw2"
}, {
name: "gogo人体艺术M",
reg: /\/(wap|mip|m)\.(gogortrt|gogo38|956n|48mp|133rt|xixirt|488xm|rtys96|renti92|rt211|gogo44|xixi78|816mm|999zv|28rtys|454t|454t|784z|34tp|28xv|22bb|444rp|03hb|39um|45xm|444wp|005mm|188rt|7m11|61ak|34bu|344F|23bp|rty6|22gs|44aq|291103|508332|693350|660183|702038|873750|981070)\.(com|org)\/\w+\/\d+\/$/i,
init: () => {
fun.remove("//div[div[@class='ad-16 clearfix']]");
},
imgs: () => fun.getImg(".tal a>img[alt]", fun.gae(".p_select option").length, 11),
button: [4],
insertImg: [".tal", 2],
category: "nsfw2"
}, {
name: "gogo人体艺术M2",
reg: /\/(m)\.(98ah|02aj|139tu)\.com\/\w+\/(\d+\/)?\d+\.html$/i,
imgs: () => fun.getImg(".tal a>img[alt]", fun.gae(".p_select option").length, 9),
button: [4],
insertImg: [".tal", 2],
css: "div[style='margin:3px 0 0 0;']{display:none!important}",
category: "nsfw2"
}, {
name: "666人体艺术M",
reg: /\/(m)\.(6666rt)\.com\/\w+\/\d+\/1\.html$/i,
imgs: () => {
let max = fun.geT(".article_page a").match(/\/(\d+)/)[1];
return fun.getImg(".tal a>img[alt]", max, 11);
},
button: [4],
insertImg: [".tal", 2],
customTitle: () => fun.title("-第1张", 1),
css: "div[style='margin:2px 0 0 0;']{display:none!important}",
category: "nsfw2"
}, {
name: "gogo人体艺术 gogortrt.com 956n.com",
reg: /\/(gogortrt|956n)\.[a-z]{2,3}\/[a-z]+\/\d+\//i,
imgs: () => {
let max = fun.geT("//span[@class='current']/preceding-sibling::a|//a[@class='thisclass']/preceding-sibling::a").match(/\d+/)[0];
return fun.getImg(".main>div>a>img[alt],.warp .content>a>img[alt]", max, 11);
},
button: [4],
insertImg: ["//div[contains(@class,'main')]/div/a/parent::* | //div[contains(@class,'content') and a/img[@alt]]", 2],
autoDownload: [0],
next: ".crc_l_pic.left>a:not([href^=j])",
prev: ".crc_r_pic.right>a:not([href^=j])",
customTitle: () => {
if (/gogortrt\.com/.test(location.origin)) {
return fun.geT(".content_title");
} else {
return fun.title(",", 1);
}
},
category: "nsfw2"
}, {
name: "GOGO人体艺术 48mp.com 133rt.com 816mm.com",
reg: /(48mp\.com|133rt\.com|816mm\.com)\/\w+\/\d+\//i,
imgs: () => {
let max = fun.geT(".main span", 2).match(/\d+/)[0];
return fun.getImg(".main>div>a>img[alt]", max, 11);
},
button: [4],
insertImg: ["//div[contains(@class,'main')]/div[a/img[@alt]]", 2],
autoDownload: [0],
next: ".crc_l_pic.left>a:not([href^=j])",
prev: ".crc_r_pic.right>a:not([href^=j])",
customTitle: () => fun.geT(".content_title"),
category: "nsfw2"
}, {
name: "6666rt.com 只翻預覽圖",
reg: /6666rt\.com\/\w+\/\d+\/(index\.html)?/i,
enable: 0,
include: "//div[@class='boxx']//li[a[@target]/img]",
init: () => {
fun.getNP("//div[@class='boxx']//li[a[@target]/img]", "a.curent+a[href]", null, ".pagelist");
},
category: "nsfw2"
}, {
name: "6666rt.com 大圖頁聚圖",
reg: /6666rt\.com\/\w+\/\d+\//i,
enable: 0,
init: "document.onkeydown=null;",
imgs: () => {
let max = fun.geT(".page>span#hover", 3).match(/\d+$/)[0];
return fun.getImg(".imgbox>a>img[alt]", max, 11);
},
button: [4],
insertImg: ["//div[@class='imgbox' and a/img[@alt]]", 2],
customTitle: () => fun.geT(".contitle h1>a"),
css: "#FullPictureLoadEnd{color:rgb(0, 0, 0)}",
category: "nsfw2"
}, {
name: "6666rt.com 翻完預覽圖立即插入大圖 getNP搭配getImgA",
reg: /6666rt\.com\/\w+\/\d+\/(index\.html)?/i,
enable: 1,
include: "//div[@class='boxx']//li[a[@target]/img]",
imgs: async () => {
await fun.getNP("//div[@class='boxx']//li[a[@target]/img]", "a.curent+a[href]", null, ".pagelist");
return fun.getImgA(".imgbox>a>img[alt]", "//div[@class='boxx']//li/a[@target and img]");
},
button: [4],
//insertImg: [".boxx ul", 1],
insertImg: [
[".footdh", 1], 2
],
go: 1,
autoDownload: [0],
next: "//li[contains(text(),'上一')]/a",
prev: "//li[contains(text(),'下一')]/a",
customTitle: () => fun.title("_", 1),
css: ".fzltp img{height:auto!important;width:100%!important}",
category: "nsfw2"
}, {
name: "508人体艺术 508332.com",
reg: /508332\.com\/\w+\/\d+\//i,
imgs: () => {
let max = fun.geT(".pagelist>a").match(/\d+/)[0];
return fun.getImg(".imgbox>a>img[alt]", max, 11);
},
button: [4],
insertImg: ["//div[contains(@class,'imgbox') and a/img[@alt]]", 1],
autoDownload: [0],
next: "//li[contains(text(),'下一')]/a",
prev: 1,
customTitle: () => fun.title(" - 508", 1),
category: "nsfw2"
}, {
name: "444人体艺术 444rp.com",
reg: /444rp\.com\/\w+\/\d+\//i,
imgs: () => {
let max = fun.geT(".pagelist>a").match(/\d+/)[0];
return fun.getImg(".imgbox>a>img[alt]", max, 11);
},
button: [4],
insertImg: ["//div[contains(@class,'imgbox') and a/img[@alt]]", 2],
autoDownload: [0],
next: ".zuopre>a",
prev: ".younext>a",
customTitle: () => fun.geT("font>a:nth-child(3)"),
category: "nsfw2"
}, {
name: "64人体艺术 www.64ay.com",
reg: /www\.64ay\.com\/\w+\/\d+/i,
imgs: () => {
let max = fun.geT(".page-show>span.current", 2).match(/\d+/)[0];
return fun.getImg(".tu>a>img[alt]", max, 9);
},
button: [4],
insertImg: ["//div[@class='tu' and a/img[@alt]]", 2],
autoDownload: [0],
next: "//div[contains(text(),'下一')]/a[1]",
prev: "//div[contains(text(),'上一')]/a[2]",
customTitle: () => fun.title(",", 1),
category: "nsfw2"
}, {
name: "45人体艺术 45xm.com 873人体艺术 873750.com",
reg: /(45xm\.com|873750\.com)\/\w+\/\d+/i,
imgs: () => {
let max = fun.geT(".page-show>span.current", 2).match(/\d+/)[0];
return fun.getImg(".tu>a>img[alt]", max, 11);
},
button: [4],
insertImg: ["//div[contains(@class,'tu') and a/img[@alt]]", 2],
autoDownload: [0],
next: "//div[contains(text(),'下一')]/a[1]",
prev: "//div[contains(text(),'上一')]/a[2]",
customTitle: () => {
try {
return fun.geT(".wzbody>h1").split(/,|_/)[0];
} catch (e) {
return fun.geT(".wzbody>h1");
}
},
category: "nsfw2"
}, {
name: "98人体艺术 www.98ah.com",
reg: /www\.98ah\.com\/\w+\/\d+\.html/i,
imgs: () => {
let max = fun.geT(".current", 2).match(/\d+/)[0];
return fun.getImg(".content-pic img[alt]", max, 9);
},
button: [4],
insertImg: [".content-pic", 2],
autoDownload: [0],
next: "//div[contains(text(),'下一')]/a[1]",
prev: "//div[contains(text(),'下一')]/a[2]",
customTitle: () => fun.geT("h5").split(",")[0],
category: "nsfw2"
}, {
name: "54人体艺术 www.54aj.com",
reg: /www\.54aj\.com\/\w+\/\d+\.html/i,
imgs: () => {
let max = fun.geT("#hover", 2).match(/\d+/)[0];
return fun.getImg(".content img[alt]", max, 9);
},
button: [4],
insertImg: [".content", 2],
autoDownload: [0],
next: "//span[contains(text(),'下一')]/a",
prev: "//span[contains(text(),'上一')]/a",
customTitle: () => fun.geT(".content>h1").split(",")[0],
category: "nsfw2"
}, {
name: "03人体艺术网 03hb.com",
reg: /03hb\.com\/\w+\/\d+\//i,
imgs: () => {
let max = fun.geT("#hover", 2).match(/\d+/)[0];
return fun.getImg(".content img[alt]", max, 11);
},
button: [4],
insertImg: [".content", 2],
autoDownload: [0],
next: "//span[contains(text(),'下一')]/a",
prev: "//span[contains(text(),'上一')]/a",
customTitle: () => fun.geT(".currentpath span:nth-child(2)>a:nth-child(2)").split(",")[0],
category: "nsfw2"
}, {
name: "48人体艺术 www.48gd.com",
reg: /www\.48gd\.com\/\w+\/\d+\.html/i,
init: "document.onkeydown=null",
imgs: () => {
let max = fun.geT('.pagelist>strong', 2).match(/\d+/)[0];
return fun.getImg('#content img[alt]', max, 9);
},
button: [4],
insertImg: ["#content", 2],
autoDownload: [0],
next: "//span[contains(text(),'下一')]/a",
prev: "//span[contains(text(),'上一')]/a",
customTitle: () => fun.geT(".photo-tit>h3").split(",")[0],
category: "nsfw2"
}, {
name: "693人体艺术 693350.com",
reg: /693350\.com\/\w+\/\d+\//i,
imgs: () => {
let max = fun.geT(".pagelist>a").match(/\d+/)[0];
return fun.getImg("#content img[alt]", max, 11);
},
button: [4],
insertImg: ["#content", 2],
autoDownload: [0],
next: "//span[contains(text(),'下一')]/a",
prev: "//span[contains(text(),'上一')]/a",
customTitle: () => fun.geT(".photo-tit>h3").split(",")[0],
category: "nsfw2"
}, {
name: "42人体艺术 www.42jd.com",
reg: /www\.42jd\.com\/\w+\/\d+\.html/i,
imgs: () => {
let max = fun.geT(".pagelist>.curent", 2).match(/\d+/)[0];
return fun.getImg(".imgbox img[alt]", max, 9);
},
button: [4],
insertImg: [".imgbox", 2],
autoDownload: [0],
next: "//li[contains(text(),'下一')]/a",
prev: "//li[contains(text(),'上一')]/a",
customTitle: () => fun.geT(".imgbox h1").split(",")[0],
category: "nsfw2"
}, {
name: "36人体艺术 www.36ut.com",
reg: /www\.36ut\.com\/\w+\/\d+\.html/i,
init: "document.onkeydown=null",
imgs: () => {
let max = fun.geT(".page-show>.current", 2).match(/\d+/)[0];
return fun.getImg(".pp.hh img[alt]", max, 9);
},
button: [4],
insertImg: [".pp.hh", 2],
customTitle: () => fun.geT(".des>h1").split(",")[0],
category: "nsfw2"
}, {
name: "西西人体艺术 xixirt.org 291103.com",
reg: /(xixirt\.org|291103\.com)\/\w+\/\d+\//i,
init: "document.onkeydown=null",
imgs: () => {
let max = fun.geT(".page-show>.current", 2).match(/\d+/)[0];
return fun.getImg(".pp.hh img[alt]", max, 11);
},
button: [4],
insertImg: [".pp.hh", 2],
customTitle: () => fun.geT(".des>h1").split(",")[0],
category: "nsfw2"
}, {
name: "366人体艺术 366807.com 660人体艺术 18人体艺术",
reg: /(366807\.com|660183\.com|18renti\.com)\/\w+\/\d+\//i,
imgs: () => {
let max = fun.geT(".page-show>a,.page>a").match(/\d+/)[0];
return fun.getImg(".content img[alt]", max, 11);
},
button: [4],
insertImg: [".content", 2],
autoDownload: [0],
next: "//span[contains(text(),'下一')]/a",
prev: "//span[contains(text(),'上一')]/a",
customTitle: () => fun.title(/_西西| - 660| - 18/, 1),
category: "nsfw2"
}, {
name: "702人体艺术 211人体艺术",
reg: /(702038\.com|rt211.com)\/\w+\/\d+\//i,
imgs: () => {
let max = fun.geT(".page-show>a").match(/\d+/)[0];
return fun.getImg(".content-pic img[alt],#bomei img[alt]", max, 11);
},
button: [4],
insertImg: [".content-pic,#bomei", 2],
autoDownload: [0],
next: ".updown>a,#prenext a",
prev: 1,
customTitle: () => fun.title(/- 702| - 211/, 1),
category: "nsfw2"
}, {
name: "188人体艺术 188rt.com",
reg: /188rt\.com\/\w+\/\d+\//i,
imgs: () => {
let max = fun.geT(".page-show>a").match(/\d+/)[0];
return fun.getImg("#bomei img[alt]", max, 11);
},
button: [4],
insertImg: ["#bomei", 2],
autoDownload: [0],
next: "#prenext a",
prev: "#prenext li:last-child>a",
customTitle: () => fun.geT("#bobox>h1").split(",")[0],
category: "nsfw2"
}, {
name: "39人体艺术 39um.com",
reg: /39um\.com\/\w+\/\d+\//i,
imgs: () => {
let max = fun.geT(".page-show>a").match(/\d+/)[0];
return fun.getImg(".content-pic img[alt],#bomei img[alt]", max, 11);
},
button: [4],
insertImg: [".content-pic", 2],
autoDownload: [0],
next: ".updown>a",
prev: 1,
customTitle: () => fun.geT(".content>h5"),
category: "nsfw2"
}, {
name: "23人体艺术 www.23fe.com",
reg: /www\.23fe\.com\/\w+\/\d+\.html/i,
imgs: () => {
let max = fun.geT(".thispg", 2).match(/\d+/)[0];
return fun.getImg("#content-p img[alt]", max, 9);
},
button: [4],
insertImg: ["#content-p", 2],
autoDownload: [0],
next: "//span[contains(text(),'下一')]/a",
prev: "//span[contains(text(),'上一')]/a",
customTitle: () => fun.geT("#ctt>h1").split(",")[0],
category: "nsfw2"
}, {
name: "AJ人体艺术 www.02aj.com",
reg: /www\.02aj\.com\/\w+\/\d+\.html/i,
imgs: () => {
let max = fun.geT(".thisclass", 2).match(/\d+/)[0];
return fun.getImg(".content img[alt]", max, 9);
},
button: [4],
insertImg: [".content", 2],
autoDownload: [0],
next: "//div[contains(text(),'下一')]/a",
prev: "//div[contains(text(),'上一')]/a",
customTitle: "return fun.geT('.title>h1');",
category: "nsfw2"
}, {
name: "gogo人体艺术 gogo44.com",
reg: /gogo44\.com\/\w+\/\d+\//i,
init: "fun.ge('.content a').removeAttribute('href')",
imgs: () => {
let max = fun.geT(".thisclass", 2).match(/\d+/)[0];
return fun.getImg(".content img[alt]", max, 11);
},
button: [4],
insertImg: [".content a", 2],
autoDownload: [0],
next: ".updown a",
prev: ".updown span:last-child>a",
customTitle: () => fun.title(/ - gogo/, 1),
category: "nsfw2"
}, {
name: "28人体艺术 28rtys.com 4F人体艺术 344f.com",
reg: /(28rtys\.com|344f\.com)\/\w+\/\d+\//i,
imgs: () => {
let max = fun.geT(".thisclass", 2).match(/\d+/)[0];
return fun.getImg(".picbox img[alt]", max, 11);
},
button: [4],
insertImg: [".picbox", 2],
autoDownload: [0],
next: ".page+.content-msg a",
prev: 1,
customTitle: () => fun.title(/ - 28| - 4F/, 1),
category: "nsfw2"
}, {
name: "西西人体艺术 44aq.com",
reg: /44aq\.com\/\w+\/\d+\//i,
imgs: () => {
let max = fun.geT(".page a").match(/\d+/)[0];
return fun.getImg(".picbox img[alt]", max, 11);
},
button: [4],
insertImg: [".picbox", 2],
autoDownload: [0],
next: ".updown_r>a",
prev: ".updown_l>a",
customTitle: () => fun.title(/,/, 1),
category: "nsfw2"
}, {
name: "139人体艺术 www.139tu.com",
reg: /www\.139tu\.com\/\w+\/\d+\/\d+\.html/i,
imgs: () => {
let max = fun.geT("#hover", 2).match(/\d+/)[0];
return fun.getImg(".img_content img[alt]", max, 9);
},
button: [4],
insertImg: [".img_content", 2],
customTitle: () => fun.geT("#title>h1"),
category: "nsfw2"
}, {
name: "GOGO人体艺术网 gogo38.com",
reg: /(gogo38\.com|981070\.com)\/\w+\/\d+\//i,
imgs: () => {
let max = fun.geT(".current", 2).match(/\d+/)[0];
return fun.getImg(".content_pic img[alt]", max, 11);
},
button: [4],
insertImg: [".content_pic", 2],
customTitle: () => fun.geT(".content>h1>a"),
category: "nsfw2"
}, {
name: "488人体艺术 488xm.com",
reg: /488xm\.com\/\w+\/\d+\//i,
imgs: () => {
let max = fun.geT(".pagelist>strong", 2).match(/\d+/)[0];
return fun.getImg("#content img[alt]", max, 11)
},
button: [4],
insertImg: ["#content", 2],
autoDownload: [0],
next: "//span[contains(text(),'下一')]/a",
prev: "//span[contains(text(),'上一')]/a",
customTitle: () => fun.geT("h3>a").split(",")[0],
category: "nsfw2"
}, {
name: "92人体艺术 renti92.com",
reg: /renti92\.com\/\w+\/\d+\//i,
imgs: () => {
let max = fun.geT(".pagination>a").match(/\d+/)[0];
return fun.getImg("#gallery img[alt]", max, 11);
},
button: [4],
insertImg: ["#gallery", 2],
autoDownload: [0],
next: ".other-prev a",
prev: ".other-next a",
customTitle: () => fun.title(/ - 92/, 1),
category: "nsfw2"
}, {
name: "005人体艺术 005mm.com",
reg: /005mm\.com\/\w+\/\d+\//i,
imgs: () => {
let max = fun.geT(".pagination>a").match(/\d+/)[0];
return fun.getImg("#gallery img[alt]", max, 11);
},
button: [4],
insertImg: ["#gallery", 2],
autoDownload: [0],
next: ".other-prev a",
prev: ".other-next a",
customTitle: () => fun.geT(".post-nav>a:nth-child(3)"),
category: "nsfw2"
}, {
name: "西西人体艺术 xixi78.com 711人体艺术 7m11.com",
reg: /(xixi78\.com|7m11\.com)\/\w+\/\d+\//i,
imgs: () => {
let max = fun.geT(".content-page>a").match(/\d+/)[0];
return fun.getImg("#content img[alt]", max, 11);
},
button: [4],
insertImg: ["#content", 2],
customTitle: () => fun.title(/ - 西西| - 711/, 1),
category: "nsfw2"
}, {
name: "96人体艺术 rtys96.com 61人体艺术 61ak.com",
reg: /(rtys96\.com|61ak.com)\/\w+\/\d+\//i,
imgs: () => {
let max = fun.geT(".bigpages>a").match(/\d+/)[0];
return fun.getImg("#showimages img[alt]", max, 11);
},
button: [4],
insertImg: ["#showimages", 2],
autoDownload: [0],
next: "#pageNum a",
prev: 1,
customTitle: () => fun.title(/ - 96| - 61/, 1),
category: "nsfw2"
}, {
name: "999人体艺术 999zv.com 西西人体艺术 34bu.com",
reg: /(999zv\.com|34bu.com)\/\w+\/\d+\//i,
imgs: () => {
let max = fun.geT(".pages a").match(/\d+/)[0];
return fun.getImg(".section.fix.tc img[alt]", max, 11);
},
button: [4],
insertImg: [".section.fix.tc", 2],
autoDownload: [0],
next: ".arcLocal.r a",
prev: 1,
customTitle: () => fun.title(",", 1),
category: "nsfw2"
}, {
name: "454人体艺术 454t.com 爱上人体艺术 23bp.com",
reg: /(454t\.com|23bp\.com)\/\w+\/\d+\//i,
imgs: () => {
let max = fun.geT(".page a").match(/\d+/)[0];
return fun.getImg("#content-p img[alt]", max, 11);
},
button: [4],
insertImg: ["#content-p", 2],
customTitle: () => fun.title(",", 1),
category: "nsfw2"
}, {
name: "748人体艺术 784z.com 66人体艺术 rty6.com",
reg: /(784z\.com|rty6.com)\/\w+\/\d+\//i,
imgs: () => {
let max = fun.geT(".pages a").match(/\d+/)[0];
return fun.getImg(".image-view img[alt]", max, 11);
},
button: [4],
insertImg: [".image-view", 2],
autoDownload: [0],
next: ".i-digg>.article-adbottom a",
prev: 1,
customTitle: () => fun.title(/,|_/, 1),
category: "nsfw2"
}, {
name: "34人体艺术 34tp.com 高清人体艺术 22gs.com",
reg: /(34tp\.com|22gs.com)\/\w+\/\d+\//i,
imgs: () => {
let max = fun.geT(".gengduo a").match(/\d+/)[0];
return fun.getImg("#content-p img[alt]", max, 11);
},
button: [4],
insertImg: ["#content-p p", 2],
autoDownload: [0],
next: ".gg a",
prev: 1,
customTitle: () => fun.title(/ - 34|,/, 1),
category: "nsfw2"
}, {
name: "22bb人体艺术 22bb.org",
reg: /22bb\.org\/\w+\/\d+\//i,
imgs: () => {
let max = fun.geT(".page-show>a").match(/\d+/)[0];
return fun.getImg(".content img[alt]", max, 11);
},
button: [4],
insertImg: [".content", 2],
autoDownload: [0],
next: "//span[contains(text(),'下一')]/a",
prev: "//span[contains(text(),'上一')]/a",
customTitle: () => fun.title(",", 1),
category: "nsfw2"
}, {
name: "444人体艺术 444wp.com",
reg: /444wp\.com\/\w+\/\d+\//i,
imgs: () => {
let max = fun.geT(".page a").match(/\d+/)[0];
return fun.getImg(".content img[alt]", max, 11);
},
button: [4],
insertImg: [".content", 2],
autoDownload: [0],
next: ".page+.page a",
prev: ".page+.page a+a",
customTitle: () => fun.geT("h2"),
category: "nsfw2"
}, {
name: "爱人体艺术 28xv.com",
reg: /28xv\.com\/\w+\/\d+\//i,
imgs: () => {
let max = fun.geT(".page a").match(/\d+/)[0];
return fun.getImg(".imgTip+a>img[alt]", max, 11);
},
button: [4],
insertImg: [".imgTip+a", 2],
autoDownload: [0],
next: ".updown_r>a",
prev: ".updown_l>a",
customTitle: () => fun.geT("h1").split(",")[0],
category: "nsfw2"
}, {
name: "E-Hentai圖片清單頁 e-hentai.org exhentai.org",
reg: /(e-hentai|exhentai).org\/g\/\d+\/\w+\/$/,
exclude: "//h1[text()='Content Warning']",
init: async () => {
await fun.getNP(".gdtm,.gdtl", ".ptds+td>a", null, "//tr[td[@class='ptds']]");
},
imgs: () => fun.getImgA("#img", ".gdtm a,.gdtl a", 100),
button: [4],
insertImg: [
["#gdt", 0], 2
],
customTitle: () => {
let t = fun.geT("#gj").replace(/\//, "");
if (t.length > 0) {
return t;
} else {
return fun.geT("#gn").replace(/\|.+/, "").trim();
}
},
go: 1,
topButton: true,
threading: 4,
category: "hcomic"
}, {
name: "E-Hentai圖片清單頁 https://e-hentai.org/lofi/",
reg: /https?:\/\/e-hentai\.org\/lofi\/g\/\w+\/\w+\//,
init: async () => {
await fun.getNP(".gi", "//a[text()='Next Page >']", null, "#ia");
},
imgs: async () => {
return fun.getImgA("#sm", ".gi>a", 100);
},
button: [4],
insertImg: [
["#ia", 2], 2
],
customTitle: () => fun.title(" - E-Hentai", 1).replace(/\|.+/, "").replace(/\//, "").trim(),
go: 1,
topButton: true,
threading: 4,
category: "hcomic"
}, {
name: "nhentai圖片清單頁 nhentai.net nyahentai.red www.hentai.name nhentai.xxx nhentai.to",
reg: /(nhentai\.net|nyahentai\.red|www\.hentai\.name|nhentai\.xxx|nhentai\.to)\/g\/\d+\/?$/,
imgs: () => {
if (/nhentai\.net/.test(siteUrl)) {
return fun.getImgA("#image-container img", "a.gallerythumb", 300);
} else if (/nyahentai\.red|nhentai\.xxx|nhentai\.to/.test(siteUrl)) {
return [...fun.gae(".thumbs img,.thumb-container img")].map(e => e.dataset.src.replace(/t\.jpg/, ".jpg").replace(/t\.png/, ".png"));
} else if (/www\.hentai\.name/.test(siteUrl)) {
return [...fun.gae(".thumb-container img")].map(e => e.src.replace("_thumb\.jpg", ".jpg"));
}
},
button: [4, "100%"],
insertImg: [
[".thumbs,#thumbnail-container", 0], 2
],
autoClick: ["#show-all-images-button"],
customTitle: () => {
let h2 = fun.geT("h2.title,h2");
if (h2.length > 4) {
return h2;
} else {
return fun.geT("h1.title,h1");
}
},
threading: 2,
go: 1,
topButton: true,
css: ".advt{display:none!important}",
category: "hcomic"
}, {
name: "Cathentai/Hentaibeeg/Hentaicolor/圖片清單頁showAll cathentai.net hentaibeeg.com hentaicolor.net",
reg: /(cathentai\.net|hentaibeeg\.com|hentaicolor\.net)\/[^/]+\/(#collapse)?$/i,
icon: 0,
key: 0,
autoClick: ["#showAll"],
category: "hcomic"
}, {
name: "Cathentai/Hentaibeeg/Hentaicolor/List Read頁 cathentai.net hentaibeeg.com hentaicolor.net",
reg: /(cathentai\.net|hentaibeeg\.com|hentaicolor\.net)\/read\/\d+\.html$/i,
imgs: () => fun.run(fun.geT("#listImgH")),
button: [4],
insertImg: ["#image-container", 2],
customTitle: () => fun.title(/ - Cathentai| - Hentaicolor| - Hentaibeeg/, 1),
category: "hcomic"
}, {
name: "3hentai圖片清單頁 3hentai.net",
reg: /(www\.3hentai1\.buzz|3hentai\.net)\/\??d\/\d+$/,
imgs: () => fun.getImgA(".js-main-img", ".single-thumb>a", 100),
button: [4, "100%"],
insertImg: [
["#thumbnail-gallery", 0], 2
],
customTitle: () => fun.geT("#main-info>h2"),
go: 1,
topButton: true,
threading: 4,
//css: "#header-ban-agsy,#middle-ban-agsy,#footer-ban-agsy{display:none!important}.single-thumb-col{padding:0px!important;width:100%!important}",
category: "hcomic"
}, {
name: "HentaiFox圖片清單頁 hentaifox.com",
reg: /hentaifox\.com\/gallery\/\d+\/$/,
include: ".view_group",
imgs: async () => {
fun.show(displayLanguage.str_04, 0);
await fun.waitEle(".view_group[style]");
fun.hide();
return [...fun.gae(".gallery_thumb img")].map(e => e.dataset.src.replace("t.", "."));
//return fun.getImgA("#gimg", ".g_thumb>a", 300);
},
button: [4, "100%"],
insertImg: [
["#append_thumbs", 0], 2
],
autoClick: ["#load_all"],
customTitle: () => fun.geT(".info>h1"),
go: 1,
topButton: true,
threading: 4,
category: "hcomic"
}, {
name: "HentaiFox圖片清單頁 hentaifox.com",
reg: /hentaifox\.com\/gallery\/\d+\/$/,
imgs: () => {
return [...fun.gae(".gallery_thumb img")].map(e => e.dataset.src.replace("t.", "."));
//return fun.getImgA("#gimg", ".g_thumb>a", 300);
},
button: [4, "100%"],
insertImg: [
["#append_thumbs", 0], 2
],
customTitle: () => fun.geT(".info>h1"),
go: 1,
topButton: true,
threading: 4,
category: "hcomic"
}, {
name: "nhentai閱讀頁 nhentai.com",
reg: /nhentai\.com\/\w+\/comic\/[^/]+\/reader\//i,
imgs: ".vertical-image img[data-src]",
button: [4],
insertImg: [".reader", 2],
customTitle: async () => {
await fun.delay(1000, 0);
return fun.geT(".router-link-active")
},
category: "hcomic"
}, {
name: "Pururin圖片清單頁 pururin.to",
reg: /pururin\.to\/gallery\/\d+\/.+/,
enable: 1,
icon: 0,
key: 0,
autoClick: ["//button[contains(text(),'View all')]"],
category: "hcomic"
}, {
name: "Pururin閱讀頁 pururin.to",
reg: /pururin\.to\/read\/\d+\/\d+\/.+/,
imgs: () => {
let ele = fun.ge(".img-viewer");
let svr = ele.dataset.svr;
let data = JSON.parse(ele.dataset.img);
//按頁數排列
let arr = data.images.sort((a, b) => {
return a.page - b.page;
});
return arr.map(e => svr + "/" + data.directory + "/" + e.filename);
},
button: [4],
insertImg: [".img-viewer", 2],
customTitle: () => fun.ge("[placeholder=Japanese]").value,
css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}",
category: "hcomic"
}, {
name: "9hentai閱讀頁 9hentai.to",
reg: /9hentai\.to\/g\/\d+\/\d+\/$/,
delay: 300,
imgs: () => {
let arr = [];
let path = fun.ge(".image-viewer .img-fluid").src.match(/.+\//)[0];
let max = fun.attr(".number-input__input", "max");
for (let i = 1; i <= max; i++) {
arr.push(path + i + ".jpg");
}
return arr;
},
button: [4],
insertImg: [".image-viewer", 2],
customTitle: () => fun.title(" - Page", 1),
css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}",
category: "hcomic"
}, {
name: "AsmHentai閱讀頁 asmhentai.com",
reg: /asmhentai\.com\/gallery\/\d+\/\d+\/$/,
imgs: () => {
let arr = [];
let path = document.querySelector("#fimg").dataset.src.match(/.+\//)[0];
let max = $("#pages").val();
for (let i = 1; i <= max; i++) {
arr.push(path + i + ".jpg");
}
return arr;
},
insertImg: [".rd_fimg", 2],
customTitle: () => fun.title(" Page", 1),
css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}",
category: "hcomic"
}, {
name: "AsmHentai View All asmhentai.com",
reg: /asmhentai\.com\/g\/\d+\/$/,
icon: 0,
key: 0,
autoClick: ["#load_all"],
category: "hcomic"
}, {
name: "MultPorn閱讀頁 multporn.net",
reg: /multporn\.net\//,
include: "//script[contains(text(),'configUrl')]",
imgs: () => {
let str = [...document.scripts].find(s => s.innerHTML.search(/configUrl/) > -1).innerHTML.match(/configUrl":"[^,]+/g)[0].slice(12, -1).replaceAll("\\", "");
let url = location.origin + str;
return fetch(url).then(res => res.text()).then(res => {
let xml = fun.xml(res);
let imgs = [...fun.gae("image", xml)];
return imgs.map(e => e.getAttribute("linkURL"));
});
},
button: [4],
insertImg: [
[".juicebox-parent", 2], 2
],
go: 1,
autoDownload: [0],
next: "//a[text()='Next Part']",
prev: "//a[text()='Previous Part']",
customTitle: () => fun.geT("#page-title"),
css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}",
category: "hcomic"
}, {
name: "HentaiHere閱讀頁 hentaihere.com",
reg: /hentaihere\.com\/m\/\w+\/\d+\/\d+\/$/i,
include: "//script[contains(text(),'rff_imageList')]",
imgs: () => rff_imageList.map(e => "https://hentaicdn.com/hentai" + e),
button: [4],
insertImg: ["#reader-content", 2],
autoDownload: [0],
next: "//li[a[@class='bg-info']]/following-sibling::li[1]/a",
prev: 1,
customTitle: () => fun.geT("#detail span") + " - " + fun.geT("#chapter span"),
css: ".afs_ads,[data-type]{display:none!important}",
category: "hcomic"
}, {
name: "HentaiPaw圖片清單頁 hentaipaw.com",
reg: /hentaipaw\.com\/articles\/\d+/i,
delay: 2000,
imgs: async () => {
fun.show("獲取數據中...", 0);
let url = fun.ge(".gallery-image-container a").href;
let doc = await fun.fetchDoc(url);
let data = [...doc.scripts].find(s => s.innerHTML.search(/startingPage/) > -1).innerHTML.replace(/\\/g, "").match(/\[{.+"}]/)[0];
fun.hide();
return JSON.parse(data).map(e => e.src);
},
button: [4, "100%"],
insertImg: [
[".detail-gallery-list", 2], 2
],
go: 1,
customTitle: () => fun.geT(".detail-ttl").replace(/\/|\|/g, " "),
category: "hcomic"
}, {
name: "HDpornComics圖片清單頁 hdporncomics.com",
reg: /hdporncomics\.com\/[^/]+\/([^/]+\/)?$/i,
include: ".my-gallery.scrollmenu",
imgs: ".my-gallery a[data-size]",
button: [4],
insertImg: [
[".postContent>.items-center,#likeDislikeVue", 2], 2
],
go: 1,
customTitle: () => fun.geT("#infoBox>h1").replace(" – Gay Manga", "").replace(" Comic Porn", ""),
category: "hcomic"
}, {
name: "HDpornComics閱讀頁 hdporncomics.com",
reg: /hdporncomics\.com\/manhwa\/[^/]+\/chapter/i,
imgs: "#imageContainer>img",
button: [4],
insertImg: ["#imageContainer", 2],
autoDownload: [0],
next: "//a[contains(text(),'Next')]",
prev: "//a[contains(text(),'Prev')]",
customTitle: () => fun.geT(".list-reset li:nth-child(5)>a") + " - " + fun.geT("option[selected]"),
category: "hcomic"
}, {
name: "Doujins圖片清單頁 doujins.com",
reg: /doujins\.com\/.+\/.+/i,
include: "#thumbnails",
imgs: ".swiper-wrapper>div:not(:first-of-type):not(:last-of-type) .swiper-lazy",
button: [4],
insertImg: [
["#thumbnails", 2], 2
],
go: 1,
customTitle: () => fun.geT(".folder-title>a:last-child"),
category: "hcomic"
}, {
name: "Simply Hentai圖片清單頁 www.simply-hentai.com",
reg: /www\.simply-hentai\.com\/[0-9a-z-]+\/.+/i,
include: "//main[@class='container' and div[div[a[div[@class='image-wrapper' and img]]]]]",
exclude: "nav.pagination,#reader-image",
imgs: () => [...fun.gae("img[data-src]")].map(e => e.dataset.src.replace("small_thumb_", "")),
button: [4],
insertImg: [
["//main[@class='container']/*[last()]", 2], 2, 2000
],
go: 1,
autoClick: "a[href$='all-pages']",
customTitle: () => {
try {
return fun.geT("h1.content-headline>a").replace(/\/|\|/g, "-");
} catch (e) {
return fun.geT("h1").replace(/\/|\|/g, "-");
}
},
css: ".text-center{display:none!important}",
category: "hcomic"
}, {
name: "Hanime1圖片清單頁 https://hanime1.me/comics",
reg: /hanime1\.me\/comic\/\d+$/,
imgs: () => [...fun.gae(".comics-thumbnail-wrapper img[data-srcset]")].map(e => e.dataset.srcset.replace("t.n", "i.n").replace("t.jpg", ".jpg").replace("t.png", ".png")),
button: [4],
insertImg: [".comics-thumbnail-wrapper", 2, 1000],
autoClick: "#show-all-comics-btn",
customTitle: () => fun.geT("h4.title"),
threading: 4,
referer: "src",
css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}",
category: "hcomic"
}, {
name: "IMHentai imhentai.xxx 圖片清單頁",
reg: /imhentai\.xxx\/gallery\/\d+\//,
delay: 1000,
autoClick: "#load_all",
imgs: async () => {
/*
let links = [...fun.gae("#append_thumbs a")];
let fetchNum = 0;
let resArr = [];
for (let i in links) {
let url = links[i].href;
let res = fun.fetchDoc(url).then(doc => {
fun.show(`${displayLanguage.str_02}${fetchNum+=1}/${links.length}`, 0);
return fun.ge("#gimg", doc);
});
resArr.push(res);
await fun.delay(300, 0);
}
return Promise.all(resArr).then(arr => {
fun.hide();
return arr;
});
*/
return [...fun.gae("#append_thumbs img")].map(e => e.dataset.src.replace("t.jpg", ".jpg").replace("t.png", ".png"));
},
button: [4],
insertImg: [
["#append_thumbs", 0], 2, 3000
],
customTitle: () => {
let t = fun.geT(".subtitle");
if (t.length > 0) {
return t;
} else {
return fun.geT('h1').replace(/\||\+/g, "");
}
},
go: 1,
topButton: true,
threading: 4,
category: "hcomic"
}, {
name: "IMHentai imhentai.xxx",
reg: /imhentai\.xxx\/view\/\d+\/\d+\//,
init: "setTimeout(()=>{fun.ge('.pre_img').removeAttribute('style');$('a.next_img').unbind('click');},1000)",
imgs: () => fun.getImgO("#gimg", fun.geT(".total_pages"), 14, [null, null], 0, ".nav_pagination", 0),
button: [4],
insertImg: [".pre_img", 1, 2000],
customTitle: () => fun.title("-", 1),
threading: 4,
category: "hcomic"
}, {
name: "Hentai2Read hentai2read.com",
reg: /hentai2read\.com\/\w+\/\d+\/(\d+\/)?$/,
imgs: () => gData.images.map(e => "https://static.hentai.direct/hentai" + e),
button: [4],
insertImg: ["#js-reader", 2],
autoDownload: [0],
next: "//li[a[contains(@class,'bg-info')]]/preceding-sibling::li[1]/a",
prev: 1,
customTitle: () => fun.geT(".reader-left-text.text-ellipsis").replace(/\//g, "-"),
//threading: 4,
category: "hcomic"
}, {
name: "XlecX xlecx.one",
reg: /xlecx\.one\/[\w-]+\.html$/,
imgs: ".ug-thumb-image,img[data-src]",
button: [4],
insertImg: [
[".page__col-left", 0], 2
],
go: 1,
customTitle: () => fun.geT(".page__col-left>h1"),
category: "hcomic"
}, {
name: "HentaiPorns hentaiporns.net",
reg: /hentaiporns\.net\/[\w-]+\/$/,
include: ".gallery",
imgs: ".gallery-item a",
button: [4, "100%"],
insertImg: [
[".gallery", 0], 2
],
go: 1,
customTitle: () => {
let ele = fun.ge("#gn+h1");
if (ele) {
return fun.geT("#gn+h1");
} else {
return fun.geT("#gn,.entry-title");
}
},
category: "hcomic"
}, {
name: "8muses comics.8muses.com",
reg: /https?:\/\/comics\.8muses\.com\/comics\/album\/[\w-]+\/[\w-]+\//i,
include: ".gallery",
exclude: ".image-title>.title-text",
imgs: () => {
let th = [...fun.gae("img[data-src]")].map(e => e.dataset.src.replace("/image/th/", "https://comics.8muses.com/image/fl/"));
let arr = [];
let loadnum = 0;
fun.show("Loading...", 0);
for (let i in th) {
let promise = new Promise(resolve => {
let temp = new Image();
temp.src = th[i];
temp.onload = () => {
loadnum++;
fun.show(`Loading ${loadnum}/${th.length}`, 0);
resolve(th[i]);
}
temp.onerror = () => {
loadnum++;
fun.show(`Loading ${loadnum}/${th.length}`, 0);
resolve(th[i].replace("/fl/", "/fm/"));
}
});
arr.push(promise);
}
return Promise.all(arr).then(arr => {
fun.hide();
return arr;
});
},
button: [4],
insertImg: [
[".gallery", 2], 1
],
go: 1,
css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}",
category: "hcomic"
}, {
name: "H漫畫貼圖 - 7mmtv.sx",
reg: /7mmtv\.sx\/.*hcomic/,
include: "//script[contains(text(),'Large_cgurl')]",
imgs: () => {
let arr = Large_cgurl.map(e => {
if (/imgur/.test(e)) return e;
return null;
});
arr = arr.filter(item => item);
if (arr.length == 0) {
return Large_cgurl;
} else {
return arr;
}
},
button: [4],
insertImg: ["#show_cg_html", 2],
customTitle: () => fun.title(" - 7mmtv.sx", 1).replace(/\s?\(\d+P\)/i, ""),
css: ".ut1_img_content_js{display:none!important}",
category: "hcomic"
}, {
name: "18H 18h.mm-cg.com",
reg: /18h\.mm-cg\.com\/(zh\/?)\w+_content\/\d+\/content\.html/i,
imgs: () => Large_cgurl,
button: [4],
insertImg: ["#show_cg_html", 2],
customTitle: () => fun.title("-", 1),
category: "hcomic"
}, {
name: "H 次元 h-ciyuan.com",
reg: /h-ciyuan\.com\/\d+\/\d+\/.+\//,
include: "a[data-fancybox],.rl-gallery-container a",
imgs: "a[data-fancybox],.rl-gallery-container a",
button: [4],
//insertImg: [".entry-content", 2],
insertImg: [
[".entry-content,.rl-gallery-container", 2], 2
],
go: 1,
next: ".nav-previous>a",
prev: ".nav-next>a",
customTitle: () => fun.geT(".post-title"),
category: "hcomic"
}, {
name: "淫漫画 www.yinmh.com www.yinmh.top www.yinmh.xyz",
reg: /www\.yinmh\.(com|top|xyz)\/\d+\.html/,
imgs: () => {
let arr = [];
[...fun.gae(".left>.image img.lazy")].forEach(e => {
if (!/loading/.test(e.src)) {
arr.push(e.src);
} else {
arr.push(e.getAttribute("img"));
}
});
return arr;
},
button: [4],
insertImg: [".left", 2],
customTitle: () => fun.geT(".box>h1"),
category: "hcomic"
}, {
name: "漫畫聯合國 www.comicun.com",
reg: /www\.comicun\.com\/index-look(-cid)?-name-.+/,
FixURL: url => {
if (/index-look-cid-name-/.test(url)) {
let arr = url.split("-");
let str = "";
for (let i = 0; i < arr.length; i++) {
if (i == 7) {
str += arr[i];
} else if (i == 5) {
str += "cid-" + arr[i] + "-";
} else if (i != 2) {
str += arr[i] + "-";
}
}
return decodeURI(str);
} else {
return decodeURI(url);
}
},
init: () => {
$(document).unbind("click");
if (/index-look-cid-name-/.test(siteUrl)) {
location.href = siteData.FixURL(siteUrl);
}
[...fun.gae("//a[text()='下一章'] | //a[text()='上一章']")].forEach(a => {
a.href = siteData.FixURL(a.href);
});
},
imgs: () => fun.getImg("#ComicPic", $("#total").val(), 20),
button: [4],
insertImg: [".e", 1],
autoDownload: [0],
next: "//a[text()='下一章']",
prev: 1,
css: "body{overflow:unset!important}",
category: "comic"
}, {
name: "丽图·污漫画 litu100.xyz",
reg: /litu\d+\.xyz\/comic\/id-\w+\/\d+\.html/,
imgs: ".article.comic img",
button: [4],
insertImg: [".article.comic", 2],
autoDownload: [0],
next: "a.next",
prev: "a.prev",
customTitle: () => fun.geT(".breadcrumb span:nth-child(2)").replace("首页", ""),
category: "hcomic"
}, {
name: "韩国污漫画 www.ikanmh.xyz www.hmfby.com",
reg: /(www\.ikanmh\.xyz|www\.mxshm\.site|www\.92hm\.life|www\.ikanhm\.xyz|592mh\.top|592hm\.top|52wxz\.top|52kanmh\.top|52kanhm\.top|52hmw\.top|92comic\.top|91comic\.top|18comic2\.top|ikanyy\.top|18hm\.top|yycomic\.top|18hcomic\.top|18xcomic\.top|18xmh\.top|18xhm\.top|iikanwxz\.top|ikwxz\.top|wxzmh\.top)\/chapter\/\d+/,
imgs: "img[data-original]",
button: [4],
insertImg: [".comicpage", 2],
autoDownload: [0],
next: "//a[text()='下一章']",
prev: "//a[text()='上一章']",
customTitle: () => fun.geT("h1.title"),
referer: "src",
category: "hcomic"
}, {
name: "Avbebe.com https://avbebe.com/archives/category/%e6%88%90%e4%ba%bah%e6%bc%ab%e7%95%ab",
reg: /avbebe\.com\/archives\/\d+/,
include: "//a[@rel='category tag' and text()='成人漫畫']",
imgs: "img[decoding]",
button: [4],
insertImg: [".content-inner", 2],
customTitle: () => fun.geT(".jeg_post_title").replace(/\[\d+P\]/i, ""),
category: "hcomic"
}, {
name: "ACG漫画网 www.acgomh.com www.acgxmh.com www.acgomh.com www.cool-manga.com www.porn-comic.com",
reg: /(www\.acg(x|o)mh\.com|www\.cool-manga\.com|www\.porn-comic\.com)\/(h|hentai)\/\d+\.html/,
imgs: () => fun.getImg(".manga-page img", fun.geT("#pages>*:last-child", 2), 5),
button: [4],
insertImg: [".manga-page", 1],
autoDownload: [0],
next: ".next_pics>.fr>a[href$=html]",
prev: ".next_pics>.fl>a[href$=html]",
customTitle: () => fun.geT("h2.title,h1.title").replace(/_\d+P$/i, ""),
category: "hcomic"
}, {
name: "紳士漫畫 圖片清單頁 wnacg.com www.wnacg.com www.wnacg.org m.wnacg.org m.wnacg.com www.wnacglink.top wn01.ru wn02.ru www.htmanga3.top www.htmanga4.top www.htmanga5.top www.hentaicomic.ru www.wn3.lol",
reg: /https:\/\/(wnacg\.com|www\.wnacg\.com|www\.wnacg\.org|m\.wnacg\.com|m\.wnacg\.org|www\.htmanga\d\.top|www\.hentaicomic\.ru|www\.wn3\.lol)\/photos-index(-page-\d+)?-aid-\d+\.html/,
icon: 0,
key: 0,
init: () => {
fun.getNP(".gallary_item", ".thispage+a", null, ".paginator", 0, null, 0);
},
category: "nsfw2"
}, {
name: "紳士漫畫 下拉閱讀頁 wnacg.com www.wnacg.com www.wnacg.org m.wnacg.org m.wnacg.com www.wnacglink.top wn01.ru wn02.ru www.htmanga3.top www.htmanga4.top www.htmanga5.top www.hentaicomic.ru www.wn3.lol",
reg: /https:\/\/(wnacg\.com|www\.wnacg\.com|www\.wnacg\.org|m\.wnacg\.com|m\.wnacg\.org|www\.htmanga\d\.top|www\.hentaicomic\.ru|www\.wn3\.lol)\/photos-(slide|slidelow|list)-aid-\d+\.html/,
imgs: () => imglist.map(e => e.url),
button: [4],
insertImg: ["#img_list", 2],
customTitle: () => fun.title(" - 列表", 1),
category: "hcomic"
}, {
name: "VN漫画网 下拉阅读 www.vnacg.com",
reg: /(www|m)\.vnacg\.com\/show\/\d+\.html/,
imgs: async () => {
fun.show(displayLanguage.str_05, 0);
let api = `/e/extend/api/show.php?id=${info.id}&page=`;
let max = await fetch(`${api}1`).then(res => res.json()).then(res => {
return res.pages;
});
let resArr = [];
let fetchNum = 0;
for (let i = 1; i <= max; i++) {
let res = fetch(`${api+i}`).then(res => res.json()).then(res => {
fun.show(`${displayLanguage.str_06}${fetchNum+=1}/${max}`, 0);
return res.data;
});
resArr.push(res);
}
return Promise.all(resArr).then(data => {
fun.hide();
return data.flat().map(e => e.src);
});
},
button: [4],
insertImg: [".show,.read", 2],
customTitle: () => fun.title("_免费阅读", 1),
category: "hcomic"
}, {
name: "VN漫画网 清單頁 www.vnacg.com",
reg: /www\.vnacg\.com\/detail\/\d+\.html/,
icon: 0,
key: 0,
observerClick: ".layui-flow-more>a",
category: "hcomic"
}, {
name: "TWHentai 圖片清單頁 twhentai.com",
reg: /twhentai\.com\/hentai_manga\/\d+\/$/,
imgs: async () => {
await fun.getNP(".recommended-grids:not(.english-grid)", ".pagination li.active+li:not(.disabled)>a", null, ".pagination");
return [...fun.gae(".recommended img")].map(e => e.src.replace("-thumb265x385", ""));
},
button: [4, "100%"],
insertImg: [
[".footer", 1], 2
],
go: 1,
customTitle: () => fun.geT(".recommended-info h3"),
category: "hcomic"
}, {
name: "松鼠症倉庫 ahri8.top",
reg: /\/readOnline\d\.php\?ID=\d+&host_id=\d+/,
include: "//div[@id='logo-group']//a[contains(text(),'松鼠症倉庫') or contains(text(),'松鼠症仓库')]",
imgs: () => Original_Image_List.map(e => HTTP_IMAGE + e.new_filename + "_w1500." + e.extension),
button: [4],
insertImg: ["#Big_Image", 2],
customTitle: () => fun.geT(".page-header").replace("線上閱讀", ""),
css: "#content>.col-lg-12,[id^=read_online_ads_area],#Big_Image~*{display:none!important}",
category: "hcomic"
}, {
name: "Caitlin.top",
reg: /caitlin\.top\/index\.php\?route=comic\/readOnline&comic_id=\d+/,
imgs: () => Image_List.map(e => location.protocol + HTTP_IMAGE + e.sort + "." + e.extension),
button: [4],
insertImg: ["#Big_Image", 2],
customTitle: () => fun.geT(".page-header"),
css: "#content>.col-lg-12,[id^=read_online_ads_area],#Big_Image~*{display:none!important}",
category: "hcomic"
}, {
name: "禁漫屋 https://jmwu.cc/ jmwu.vip m.jmwu.vip 88comic.vip",
reg: /(jmwu|88comic)\.\w+\/chapter\/[\w-]+\.html/,
init: () => {
fun.remove("//main/div[div[a[img]]]");
},
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.title(/ – White|-禁漫屋| - 禁漫屋|-\[| “/, 1),
category: "hcomic"
}, {
name: "Roku Hentai rokuhentai.com",
reg: /https:\/\/rokuhentai\.com\/\w+\/\d+$/,
imgs: ".site-reader__image",
button: [4],
insertImg: [".site-reader", 2],
css: ".site-reader--right-to-left,.site-reader--left-to-right{overflow-x:auto!important;overflow-y:auto!important}.site-reader{padding-bottom:0px!important}.site-reader{display:block!important;}.site-bottom-ad-slot{display:none!important}",
category: "hcomic"
}, {
name: "177 漫画/XXIAV寫真館 www.177pica.com www.177picyy.com www.xxiav.com",
reg: /www\.(177pica|177picyy|xxiav)\.com\/html\/\d+\/\d+\/\d+\.html/,
imgs: () => fun.getImg(".single-content img[data-lazy-src]", (fun.geT(".page-links>*:last-child", 2) || 1), 10),
button: [4],
insertImg: [".single-content", 2],
autoDownload: [0],
next: "a[rel=prev]",
prev: 1,
customTitle: () => fun.geT(".entry-title").replace(/\[\d+P\]$/i, ""),
category: "hcomic"
}, {
name: "18H 宅宅愛動漫 18h.animezilla.com",
reg: /18h\.animezilla\.com\/manga\/\d+/,
imgs: () => {
let max;
try {
max = fun.ge(".last").href.split("/").pop();
} catch (e) {
max = 1;
}
return fun.getImgO("#comic", max, "4", [null, null], 0, ".entry-title,.wp-pagenavi", 0);
},
button: [4],
insertImg: ["#page-current", 1],
customTitle: () => fun.geT("h1.entry-title").replace(/\s?\[\d+P\](\s?-\s?\d+\/\d+\s?)?/i, ""),
category: "hcomic"
}, {
name: "18 禁漫 www.18mh.cc",
reg: /www\.18mh\.cc\/index-look-name-/,
imgs: () => {
let url = fun.attr("img[data-url]", "data-url");
let m = url.match(/(^.+\/)(\d+)(\.\w{2,4})$/);
let path = m[1];
let start = m[2];
let ex = m[3];
let ps = fun.gae("select[onchange]>option").length;
let end = parseInt(start) + 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: "色漫网 www.cartoon18.com",
reg: /www\.cartoon18\.com\/story\/\d+\/full/,
imgs: "img[data-src]",
category: "hcomic"
}, {
name: "韓漫射 h-webtoon.com 绅士同人H漫 h-doujinshi.xyz",
reg: /(h-webtoon\.com|h-doujinshi\.xyz)\/.+\//,
init: "setTimeout(()=>{fun.gae('.g1-nav-single a').forEach(e=>{e.removeAttribute('target')})},2000)",
include: ".g1-content-narrow",
imgs: ".g1-content-narrow p img",
button: [4],
insertImg: [".g1-content-narrow", 2],
autoDownload: [0],
next: "#content .g1-teaser-next",
prev: "#content .g1-teaser-prev",
customTitle: () => fun.geT("h1.entry-title"),
css: "#simple-banner,.touchy-wrapper,.touchy-wrapper~*:not([id^='pv-']):not([class^='pv-']):not(.pagetual_tipsWords):not(.FullPictureLoadMsg):not(#FullPictureLoad):not(#FullPictureLoadOptions):not(.fancybox-container),.code-block,#secondary{display:none!important}",
category: "hcomic"
}, {
name: "18H漫画 18hmanga.click",
reg: /(18hmanga\.click)\/.+\//,
init: "setTimeout(()=>{fun.gae('.g1-nav-single a').forEach(e=>{e.removeAttribute('target')})},2000)",
include: ".g1-content-narrow",
imgs: ".g1-content-narrow p img",
autoDownload: [0],
next: "#content .g1-teaser-prev",
prev: "#content .g1-teaser-next",
customTitle: () => fun.geT("h1.entry-title"),
css: "#simple-banner,.touchy-wrapper,.touchy-wrapper~*:not([id^='pv-']):not([class^='pv-']):not(.pagetual_tipsWords):not(.FullPictureLoadMsg):not(#FullPictureLoad):not(#FullPictureLoadOptions):not(.fancybox-container),.code-block,#secondary{display:none!important}",
category: "hcomic"
}, {
name: "hitomi hitomi.la",
reg: /hitomi\.la\/reader\/\d+\.html/,
init: "setTimeout(()=>{$(document).unbind('keydown');$(document).unbind('click')},1000)",
imgs: async () => {
await fun.waitEle("#mobileImages .lillie", 11);
fun.ge("#comicImages").setAttribute("class", "fitVertical");
fun.ge("#mobileImages").setAttribute("class", "hidden");
return galleryinfo.files.map((e, i) => url_from_url_from_hash(galleryinfo["id"], our_galleryinfo[i], "webp", undefined, "a"));
},
button: [4],
insertImg: ["#comicImages", 2],
customTitle: () => fun.title("|", 1),
css: "body{overflow:unset!important}#FullPictureLoadEnd{color:rgb(255, 255, 255)}",
threading: 5,
category: "hcomic"
}, {
name: "Orzqwq List模式 orzqwq.com",
reg: /orzqwq\.com\/manga\/.+style=list/,
include: "//option[@selected and text()='List style']",
imgs: async () => {
fun.show(displayLanguage.str_04, 0);
await fun.waitEle(".img-responsive", 600);
fun.hide();
return [...fun.gae("img[data-src]")];
},
insertImg: [".reading-content", 2],
customTitle: () => fun.geT(".breadcrumb>li:nth-child(2)").trim(),
category: "hcomic"
}, {
name: "Orzqwq 分頁模式 orzqwq.com",
reg: /orzqwq\.com\/manga\/.+\/p\//,
include: "//option[@selected and text()='Paged style']",
imgs: async () => {
fun.show(displayLanguage.str_04, 0);
await fun.waitEle("#chapter_preloaded_images", 600);
fun.hide();
return chapter_preloaded_images;
},
insertImg: [".reading-content", 2],
customTitle: () => fun.geT(".breadcrumb>li:nth-child(2)").trim(),
category: "hcomic"
}, {
name: "Orzqwq 圖片清單頁聚集所有預覽縮圖 orzqwq.com",
reg: /orzqwq\.com\/manga\/[^/]+\/$/,
icon: 0,
key: 0,
init: () => {
fun.getNP(".chapter-images-list>.image-item", "li.active+li>a", null, ".pagination", 0, "data-src", 0);
},
category: "hcomic"
}, {
name: "HO5HO www.ho5ho.com",
reg: /www\.ho5ho\.com\/.+\/.+\/server.+\//,
include: "//script[contains(text(),'chapter_preloaded_images')]",
imgs: () => chapter_preloaded_images,
insertImg: [".reading-content", 2],
customTitle: () => fun.geT(".breadcrumb>li:nth-child(2)").trim(),
category: "hcomic"
}, {
name: "亚洲漫画走廊 asiacomics.com",
reg: /asiacomics\.com\/chapter\/\d+/,
imgs: "#enc_img img[data-original]",
button: [4],
insertImg: [".comicpage", 2],
autoDownload: [0],
next: "//a[text()='下一章']",
prev: "//a[text()='上一章']",
customTitle: () => fun.geT("h1.title"),
category: "hcomic"
}, {
name: "成人漫画 bad.news/mh",
reg: /bad\.news\/mh\/view\/id-\d+/,
imgs: ".img-responsive",
button: [4],
insertImg: ["//div[img[@class='img-responsive']]", 2],
threading: 4,
category: "hcomic"
}, {
name: "H漫画 mhdnf.xyz www.mhdnf.xyz mhqwe.xyz www.mhqwe.xyz",
reg: /https?:\/\/(www\.)?(mhdnf|mhqwe)\.xyz\/play\?linkId=\d+&bookId=\d+&path=\d+&key=.+/,
imgs: "#imgList>img:not([src*=QRCode])",
button: [4],
insertImg: ["#imgList", 2],
autoDownload: [0],
next: "//a[text()='下一話']",
prev: "//a[text()='上一話']",
customTitle: () => fun.attr("meta[name='apple-mobile-web-app-title']", "content"),
category: "hcomic"
}, {
name: "JComic jcomic.net",
reg: /https?:\/\/jcomic\.net\/page\/[^\/]+$/,
imgs: ".comic-view,.comic-thumb",
button: [4],
insertImg: ["//div[img[@class='img-responsive comic-thumb']]", 2],
threading: 10,
customTitle: () => fun.geT("//ol/li[2]/a"),
category: "hcomic"
}, {
name: "JComic jcomic.net",
reg: /https?:\/\/jcomic\.net\/page\/[^\/]+\/[0-9\.]+$/,
imgs: ".comic-view,.comic-thumb",
button: [4],
insertImg: ["//div[img[@class='img-responsive comic-thumb']]", 2],
autoDownload: [0],
next: () => {
let next = fun.ge("//a[button[text()='下一章']]");
if (next && next.href != location.href) {
return next.href;
} else {
return null;
}
},
prev: 1,
threading: 10,
customTitle: () => fun.geT("//ol/li[2]/a") + " - " + fun.geT("//ol/li[3]"),
category: "hcomic"
}, {
name: "一之涩漫画 1zse.com",
reg: /^https?:\/\/1zse\.com\/index\.php\/\d+\.html/,
imgs: () => {
let max = fun.ge("a.last").href.split("/").pop();
return fun.getImg(".context img", max, 7);
},
button: [4],
insertImg: [".context", 2],
autoDownload: [0],
next: ".post-previous a",
prev: ".post-next a",
customTitle: () => fun.geT("#content h1").replace(/\[\d+P\]/i, ""),
category: "hcomic"
}, {
name: "那露漫画 naluhd.com",
reg: /^https?:\/\/naluhd\.com\/index\.php\/\d+\.html/,
imgs: () => fun.getImgA(".article-content img", "a.post-page-numbers"),
button: [4],
insertImg: [".article-content", 2],
autoDownload: [0],
next: "//a[p[text()='上一篇'] and not(starts-with(@href,'java'))]",
prev: "//a[p[text()='下一篇'] and not(starts-with(@href,'java'))]",
customTitle: () => fun.geT(".article-title>a").replace(/\[\d+P\]/i, ""),
category: "hcomic"
}, {
name: "色色漫画 sesemanhua.com",
reg: /^https:\/\/sesemanhua\.com\/index\.php\/chapter\/\d+/,
imgs: ".rd-article-wr img",
button: [4],
insertImg: [".rd-article-wr", 2],
autoDownload: [0],
next: ".j-rd-next",
prev: ".j-rd-prev",
customTitle: () => fun.geT(".comic-title>a"),
category: "hcomic"
}, {
name: "韓漫天堂 18jin.top",
reg: /^https:\/\/18jin\.top\/index\.php\/chapter\/\d+/,
imgs: ".rd-article-wr img",
button: [4],
insertImg: [".rd-article-wr", 2],
autoDownload: [0],
next: ".j-rd-next",
prev: ".j-rd-prev",
customTitle: () => fun.geT(".j-comic-title") + " - " + fun.geT(".comic-title>a"),
category: "hcomic"
}, {
name: "琴瑟漫畫 sixcomic.com 琴瑟書庫 sixacg.com",
reg: /^https?:\/\/(sixcomic\.com|sixacg\.com)\/chapter\/\d+$/,
imgs: ".comicpage img:not([data-original*='qssk.top']),#cp_img img:not([data-original*='qssk.top'])",
button: [4],
insertImg: [".comicpage", 2],
autoDownload: [0],
next: "//a[@href and not(starts-with(@href,'java')) and text()='下一章']",
prev: "//a[@href and not(starts-with(@href,'java')) and text()='上一章']",
customTitle: () => fun.title(/免费阅读|在线阅读/, 1),
category: "hcomic"
}, {
name: "香香腐宅 boylove.cc boylove1.mobi",
reg: /^https:\/\/boylove\d?\.\w+\/home\/book\/capter\/id\/\d+/,
imgs: "img[data-original]",
button: [4],
insertImg: [".reader-cartoon-chapter", 2],
autoDownload: [0],
next: "a[data-value=next]",
prev: "a[data-value=prev]",
customTitle: () => fun.geT(".title a").trim(),
category: "hcomic"
}, {
name: "一耽女孩 yidan.in yidan.one yidan.app",
reg: /^https:\/\/yidan\.(in|one|app)\/#\/pages\/read\/read\?no=\d+&id=\d+(&episodesId=\d+)?/,
delay: 1000,
init: () => {
$("uni-view.last-bum").on("click", () => {
setTimeout(() => {
location.reload();
}, 300);
});
},
imgs: () => {
let m = siteUrl.split("&");
let no = m[0].match(/\d+$/)[0];
let mhid = m[1].match(/\d+/)[0];
return fetch(`${location.origin}/prod-api/app-api/vv/mh-episodes/get?jiNo=${no}&mhid=${mhid}`).then(res => res.json()).then(json => json.data.pics.split(",").map(e => location.origin + e));
},
button: [4],
insertImg: [".read-article", 2],
autoDownload: [0],
next: () => {
let next = fun.ge("//a[text()='继续看下一话']");
if (next) {
let m = siteUrl.split("&");
let no = parseInt(m[0].match(/\d+$/)[0]);
let mhid = m[1].match(/\d+/)[0];
let url = `https://yidan.in/#/pages/read/read?no=${no+=1}&id=${mhid}`;
return url;
} else {
return null;
}
},
prev: 1,
customTitle: () => fun.title(" - 一耽女孩_好看的一耽漫画官网").trim(),
css: ".page-pagination{display:none!important}",
category: "hcomic"
}, {
name: "久久漫画网 www.99hanman.top",
reg: /https:\/\/www\.99hanman\.top\/chapter\/\d+/,
include: ".rd-article-wr",
imgs: ".comiclist img",
button: [4],
insertImg: [".comiclist", 2],
autoDownload: [0],
next: "//a[text()='下一章' and @href]",
prev: "//a[text()='上一章' and @href]",
customTitle: () => fun.geT("h1.title"),
category: "hcomic"
}, {
name: "久久漫画网M www.99hanman.top",
reg: /https:\/\/www\.99hanman\.top\/chapter\/\d+/,
imgs: "#cp_img img",
insertImg: ["#cp_img", 2],
autoDownload: [0],
next: "//a[text()='下一章' and @href]",
prev: "//a[text()='上一章' and @href]",
customTitle: () => {
let code = fun.geT("//script[contains(text(),'bookInfo')]");
let bookInfo = code.match(/bookInfo\s?=\s?([^;]+)/g)[0];
bookInfo = fun.run(bookInfo);
return bookInfo.book_name + " - " + bookInfo.chapter_name;
},
category: "hcomic"
}, {
name: "嗨皮漫畫閱讀 https://m.happymh.com/manga/daiwangraoming",
enable: 0,
reg: /m\.happymh\.com\/reads/,
include: "#root",
xhr: async () => {
let lps = location.pathname.split("/");
let mangaCode = lps[2];
let id = lps[3];
let api = `https://m.happymh.com/v2.0/apis/manga/read?code=${mangaCode}&cid=${id}`;
let json = await fetch(api).then(res => res.json());
debug("\n此頁JSON資料\n", json);
siteJson = json;
},
init: async () => {
await siteData.xhr();
let fragment = new DocumentFragment();
let imgs = siteJson.data.scans.map(e => e.url);
imgs.forEach(url => {
let img = new Image();
img.src = url;
fragment.appendChild(img);
});
debug("\n圖片預讀\n", fragment);
if (await fun.waitEle("#page-area")) {
new IntersectionObserver((entries, observer) => {
if (entries[0].isIntersecting) {
observer.unobserve(entries[0].target);
let f = ge("footer>article");
let c1 = f.firstChild.cloneNode(true);
c1.firstChild.href = "/latest";
c1.firstChild.firstChild.innerText = "更新";
f.appendChild(c1);
let c2 = f.firstChild.cloneNode(true);
c2.firstChild.href = "/bookcase";
c2.firstChild.firstChild.innerText = "收藏";
f.appendChild(c2);
let p = gx("//a[span[text()='上一话' or text()='上一話'] and contains(@href,'reads')]");
if (p) {
p.classList.add("MuiButton-containedPrimary");
}
let n = gx("//a[span[text()='下一话' or text()='下一話'] and contains(@href,'readMore')]");
if (n) {
n.classList.remove("MuiButton-containedPrimary");
n.firstChild.innerText = "^_^感谢您的阅读~已经没有下一话了哦~";
}
}
}).observe(ge('#page-area'));
}
},
imgs: () => siteJson.data.scans.map(e => e.url),
referrerpolicy: "origin",
button: [4],
insertImg: ["//article[div[contains(@id,'imageLoader')]]", 3],
go: 1,
autoDownload: [0],
next: "//a[span[text()='下一話' or text()='下一话']]",
autoNext: true,
prev: "//a[span[text()='上一話' or text()='上一话']]",
customTitle: () => siteJson.data.manga_name + " - " + siteJson.data.chapter_name,
category: "comic"
}, {
name: "嗨皮漫畫更新頁,自動點擊載入更多,鏈接新分頁打開",
enable: 0,
icon: 0,
key: 0,
reg: /m\.happymh\.com\/latest/,
observerClick: ".more-div-btn",
openInNewTab: ".manga-cover>a:not([target=_blank])",
category: "comic"
}, {
name: "嗨皮漫畫展開目錄",
reg: /m\.happymh\.com\/manga\//,
enable: 0,
icon: 0,
key: 0,
autoClick: "#expandButton",
category: "comic"
}, {
name: "嗨皮漫畫,鏈接新分頁打開",
reg: /m\.happymh\.com\//,
enable: 0,
icon: 0,
key: 0,
openInNewTab: ".home-banner a:not([target=_blank]),.manga-rank a:not([target=_blank]),.manga-cover a:not([target=_blank])",
category: "comic"
}, {
name: "COLAMANHUA www.colamanga.com", //方向鍵上一章下一章、反反偵錯,下載需先手動觸發全部載入圖片,圖址如為blob函式會使用到canvas需要繪製過程會有點卡。
enable: 1,
reg: /www\.(colamanga|colamanhua)\.com\/manga-.+\.html$/,
init: async () => {
Function.prototype.constructor = () => {};
},
imgs: () => {
let blob = fun.ge(".mh_comicpic img[src^=blob]");
let imgs;
if (blob) {
imgs = fun.imgBlobArr(".mh_comicpic img[src^=blob]");
} else {
imgs = [...fun.gae(".mh_comicpic img[src]")];
}
return imgs;
},
scrollEle: [".mh_comicpic img", 600],
next: "//a[text()='下一章']",
autoNext: true,
prev: "//a[text()='上一章']",
customTitle: () => fun.title(" COLAMANGA", 1),
threading: 10,
css: ".mh_wrap{width:100%!important;min-width:100%!important}",
category: "comic"
}, {
name: "8Comic無限動漫 https://a.twobili.com/ReadComic/103/471/471_3_Q_atq24.html",
enable: 1,
reg: /(a|www)\.(comicabc|twobili)\.com\/(ReadComic|online)/,
imgs: () => {
let code = [...document.scripts].find(s => s.innerHTML.search(/ge\(e\)/) > -1).innerHTML;
let cM = code.match(/ge\([^.]+\.src\s?=\s?([^;]+)/);
let keyCode = cM[1];
let arr = [];
for (let i = 1; i <= ps; i++) {
let r = "(" + i + ")";
let src = location.protocol + fun.run(keyCode.replace(/\(pp?\)/g, r));
arr.push(src);
}
return arr;
},
button: [4],
insertImg: ["//td[img[@id='TheImg']]", 2],
go: 1,
autoDownload: [0],
next: "#nextvol:not([style])",
autoNext: true,
prev: "#prevvol",
customTitle: () => {
let t = document.title.split(" ")[0];
return `${t}-第${ch}集`;
},
css: "td[style^=width]{display:none!important}",
category: "comic"
}, {
name: "8Comic無限動漫 手機版 https://8.twobili.com/comic/insurance_103.html?ch=471",
enable: 1,
reg: /8\.twobili\.com\/comic\/insurance/,
init: () => {
fun.ge("#pageindex").parentNode.appendChild(fun.ge("#prevvol").cloneNode(true));
fun.ge('#pageindex').parentNode.appendChild(fun.ge("#nextvol").cloneNode(true));
let ul = fun.ge("#TheTable>ul");
let v1 = fun.ge(".view_tmenu").cloneNode(true);
let v2 = fun.gae(".view_menut")[1];
ul.appendChild(v2);
ul.appendChild(v1);
let b1 = fun.ge(".book_inc_title");
let b2 = fun.ge(".book_link_item");
ul.appendChild(b1);
ul.appendChild(b2);
},
button: [4],
imgs: () => {
let arr = [];
for (let i = 1; i <= ps; i++) {
let imgSrc = "https://img" + ss(c, 4, 2) + ".8comic.com/" + ss(c, 6, 1) + "/" + ti + "/" + ss(c, 0, 4) + "/" + nn([i]) + "_" + ss(c, mm([i]) + 10, 3, f) + ".jpg";
arr.push(imgSrc);
}
return arr;
},
button: [4],
insertImg: ["//li[img[@id='TheImg']]", 2],
go: 1,
autoDownload: [0],
next: "#nextvol:not([style])",
autoNext: true,
prev: "#prevvol",
customTitle: () => {
let t = document.title.split(" ")[0];
let n = fun.geT("#chapter");
return t + " - " + n;
},
css: ".pinch-zoom-container{height:auto !important;display:contents !important}.view_tmenu+div[style],#pagenum,[onclick^='j'],#pageindex,ico+a+.material-icons.right-logo{display:none !important}.view_menut a{width:33.3% !important;max-width:33.3% !important}",
category: "comic"
}, {
name: "Mangabz https://www.mangabz.com/m38701/",
enable: 0,
reg: /^https:\/\/(www\.)?mangabz\.com\/m\d+/,
include: ".container",
init: () => {
const hidetoolbar = () => {
var e = e || window.event;
if (e.wheelDelta < 0 || e.detail > 0) {
$(".top-bar").attr("style", "top: -74px;");
} else {
$(".top-bar").removeAttr("style");
}
};
document.addEventListener("wheel", hidetoolbar);
document.addEventListener("DOMMouseScroll", hidetoolbar);
const keyhidetoolbar = (e) => {
let key = window.event ? e.keyCode : e.which;
if (key == "34" || key == "32" || key == "40") {
$(".top-bar").attr("style", "top: -74px;");
} else {
$(".top-bar").removeAttr("style");
}
};
document.addEventListener("keydown", keyhidetoolbar);
},
imgs: () => {
if (!mkey) var mkey = "";
let resArr = [];
let fetchNum = 0;
for (let i = 1; i <= MANGABZ_IMAGE_COUNT; i++) {
let apiUrl = location.origin + MANGABZ_CURL + "chapterimage.ashx" + `?cid=${MANGABZ_CID}&page=${i}&key=${mkey}&_cid=${MANGABZ_CID}&_mid=${MANGABZ_MID}&_dt=${MANGABZ_VIEWSIGN_DT}&_sign=${MANGABZ_VIEWSIGN}`;
let res = fetch(apiUrl).then(res => res.text()).then(res => {
fun.show(`${displayLanguage.str_06}(${fetchNum+=1}/${MANGABZ_IMAGE_COUNT})`, 0);
return fun.run(res)[0];
});
resArr.push(res);
}
return Promise.all(resArr).then(arr => {
fun.hide();
return arr;
});
},
button: [4],
insertImg: ["#cp_img", 2],
go: 1,
autoDownload: [0],
next: "//a[img[contains(@src,'xiayizhang')]][starts-with(@href,'/m')]",
autoNext: true,
prev: "//a[img[contains(@src,'shangyizhang')]][starts-with(@href,'/m')]",
customTitle: () => fun.title("_", 2).replace("漫畫", ""),
css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}a[href^='j']{display:none !important}body{overflow:unset!important}",
category: "comic"
}, {
name: "Xmanhua https://xmanhua.com/m10344/",
enable: 0,
reg: /^https:\/\/(www\.)?xmanhua\.com\/m\d+/,
include: ".reader-bottom-page-list",
init: () => {
const showtoolbar = () => {
let t = fun.ge(".header.toolbar");
if (t) {
$(".header").removeClass("toolbar");
$(".header").removeAttr("style");
} else {
$(".header").addClass("toolbar");
$(".header").attr("style", "top: -64px;");
}
let b = fun.ge(".reader-bottom.toolbar");
if (b) {
$(".reader-bottom").removeClass("toolbar");
$(".reader-bottom").removeAttr("style");
} else {
$(".reader-bottom").addClass("toolbar");
$(".reader-bottom").attr("style", "bottom: -50px;");
}
};
document.addEventListener("click", showtoolbar);
const hidetoolbar = () => {
var e = e || window.event;
if (e.wheelDelta < 0 || e.detail > 0) {
$(".header").addClass("toolbar");
$(".header").attr("style", "top: -64px;");
$(".reader-bottom").addClass("toolbar");
$(".reader-bottom").attr("style", "bottom: -50px;");
} else {
$(".header").removeClass("toolbar");
$(".header").removeAttr("style");
$(".reader-bottom").removeClass("toolbar");
$(".reader-bottom").removeAttr("style");
}
};
document.addEventListener("wheel", hidetoolbar);
document.addEventListener("DOMMouseScroll", hidetoolbar);
const keyhidetoolbar = (e) => {
let key = window.event ? e.keyCode : e.which;
if (key == "34" || key == "32" || key == "40") {
$(".header").addClass("toolbar");
$(".header").attr("style", "top: -64px;");
$(".reader-bottom").addClass("toolbar");
$(".reader-bottom").attr("style", "bottom: -50px;");
} else {
$(".header").removeClass("toolbar");
$(".header").removeAttr("style");
$(".reader-bottom").removeClass("toolbar");
$(".reader-bottom").removeAttr("style");
}
};
document.addEventListener("keydown", keyhidetoolbar);
},
imgs: () => {
if (!mkey) var mkey = "";
let resArr = [];
let fetchnUm = 0;
for (let i = 1; i <= XMANHUA_IMAGE_COUNT; i++) {
let apiUrl = location.origin + XMANHUA_CURL + "chapterimage.ashx" + `?cid=${XMANHUA_CID}&page=${i}&key=${mkey}&_cid=${XMANHUA_CID}&_mid=${XMANHUA_MID}&_dt=${XMANHUA_VIEWSIGN_DT}&_sign=${XMANHUA_VIEWSIGN}`;
let res = fetch(apiUrl).then(res => res.text()).then(res => {
fun.show(`${displayLanguage.str_06}(${fetchnUm+=1}/${XMANHUA_IMAGE_COUNT})`, 0);
return fun.run(res)[0];
});
resArr.push(res);
}
return Promise.all(resArr).then(arr => {
fun.hide();
return arr;
});
},
button: [4],
insertImg: ["#cp_img", 2],
go: 1,
autoDownload: [0],
next: "//a[img[contains(@src,'reader-bottom-right-2')]][starts-with(@href,'/m')]",
autoNext: true,
prev: "//a[img[contains(@src,'reader-bottom-right-1')]][starts-with(@href,'/m')]",
customTitle: () => fun.title('_', 2).replace("漫畫", ""),
css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}.relative>a{display:none!important}.reader-img-con{padding:64px 0 50px !important;}",
category: "comic"
}, {
name: "DM5/極速 分頁模式 https://www.dm5.com/m755073/ https://hk.1kkk.com/ch1-1266817/",
enable: 0,
reg: /^https:\/\/(www|tel|en|cnc|hk|m)?\.?(dm5|1kkk)\.(com|cn)\/(m|ch|vol|other)[-_0-9p]+\//,
include: "#chapterpager",
imgs: () => {
if (!mkey) var mkey = "";
let resArr = [];
let fetchNum = 0;
for (let i = 1; i <= DM5_IMAGE_COUNT; i++) {
let apiUrl = location.origin + DM5_CURL + "chapterfun.ashx" + `?cid=${DM5_CID}&page=${i}&key=${mkey}&language=1>k=6&_cid=${DM5_CID}&_mid=${DM5_MID}&_dt=${DM5_VIEWSIGN_DT}&_sign=${DM5_VIEWSIGN}`;
let res = fetch(apiUrl).then(res => res.text()).then(res => {
fun.show(`${displayLanguage.str_06}(${fetchNum+=1}/${DM5_IMAGE_COUNT})`, 0);
return fun.run(res)[0];
});
resArr.push(res);
}
return Promise.all(resArr).then(arr => {
fun.hide();
return arr;
});
},
button: [4],
insertImg: ["#cp_img", 2],
go: 1,
autoDownload: [0],
next: "//a[text()='下一章']",
autoNext: true,
prev: "//a[text()='上一章']",
customTitle: () => fun.title("_", 2),
topButton: true,
css: "body{overflow:unset!important}",
category: "comic"
}, {
name: "DM5/極速 條漫模式 https://www.dm5.com/m1343377/ https://hk.1kkk.com/ch1-1343377/",
enable: 0,
reg: /^https:\/\/(www|tel|en|cnc|hk|m)?\.?(dm5|1kkk)\.(com|cn)\/(m|ch|vol|other)[-_0-9]+\//,
include: ["#barChapter"],
imgs: "#barChapter>img",
button: [4],
insertImg: ["#barChapter", 2],
go: 1,
autoDownload: [0],
next: "//a[text()='下一章']",
autoNext: true,
prev: "//a[text()='上一章']",
customTitle: () => fun.title("_", 2),
css: "body{overflow:unset!important}",
category: "comic"
}, {
name: "yymanhua https://www.yymanhua.com/",
enable: 0,
reg: /(www\.)?yymanhua\.com\/m\d+/,
include: ".reader-bottom-page-list",
init: () => {
const showtoolbar = () => {
let t = fun.ge(".header.toolbar");
if (t) {
$(".header").removeClass("toolbar");
$(".header").removeAttr("style");
} else {
$(".header").addClass("toolbar");
$(".header").attr("style", "top: -64px;")
}
let b = fun.ge(".reader-bottom.toolbar");
if (b) {
$(".reader-bottom").removeClass("toolbar");
$(".reader-bottom").removeAttr("style");
} else {
$(".reader-bottom").addClass("toolbar");
$(".reader-bottom").attr("style", "bottom: -50px;");
}
};
document.addEventListener("click", showtoolbar);
const hidetoolbar = () => {
var e = e || window.event;
if (e.wheelDelta < 0 || e.detail > 0) {
$(".header").addClass("toolbar");
$(".header").attr("style", "top: -64px;");
$(".reader-bottom").addClass("toolbar");
$(".reader-bottom").attr("style", "bottom: -50px;");
} else {
$(".header").removeClass("toolbar");
$(".header").removeAttr("style");
$(".reader-bottom").removeClass("toolbar");
$(".reader-bottom").removeAttr("style");
}
};
document.addEventListener("wheel", hidetoolbar);
document.addEventListener("DOMMouseScroll", hidetoolbar);
const keyhidetoolbar = (e) => {
let key = window.event ? e.keyCode : e.which;
if (key == "34" || key == "32" || key == "40") {
$(".header").addClass("toolbar");
$(".header").attr("style", "top: -64px;");
$(".reader-bottom").addClass("toolbar");
$(".reader-bottom").attr("style", "bottom: -50px;");
} else {
$(".header").removeClass("toolbar");
$(".header").removeAttr("style");
$(".reader-bottom").removeClass("toolbar");
$(".reader-bottom").removeAttr("style");
}
};
document.addEventListener("keydown", keyhidetoolbar);
},
imgs: () => {
if (!mkey) var mkey = "";
let resArr = [];
let fetchnUm = 0;
for (let i = 1; i <= YYMANHUA_IMAGE_COUNT; i++) {
let apiUrl = location.origin + YYMANHUA_CURL + "chapterimage.ashx" + `?cid=${YYMANHUA_CID}&page=${i}&key=${mkey}&_cid=${YYMANHUA_CID}&_mid=${YYMANHUA_MID}&_dt=${YYMANHUA_VIEWSIGN_DT}&_sign=${YYMANHUA_VIEWSIGN}`;
let res = fetch(apiUrl).then(res => res.text()).then(res => {
fun.show(`${displayLanguage.str_06}(${fetchnUm+=1}/${YYMANHUA_IMAGE_COUNT})`, 0);
return fun.run(res)[0];
});
resArr.push(res);
}
return Promise.all(resArr).then(arr => {
fun.hide();
return arr;
});
},
button: [4],
insertImg: ["#cp_img", 2],
go: 1,
autoDownload: [0],
next: "//a[img[contains(@src,'reader-bottom-right-2')]][starts-with(@href,'/m')]",
autoNext: true,
prev: "//a[img[contains(@src,'reader-bottom-right-1')]][starts-with(@href,'/m')]",
customTitle: () => fun.title("_", 2).replace("漫畫", ""),
css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}.relative>a{display:none!important}.reader-img-con{padding:64px 0 50px !important;}",
category: "comic"
}, {
name: "DM5/極速/Mangabz/Xmanhua/yymanhua/漫画人/奇漫屋/漫画星球(PC)/6 漫画/漫本 手機版 https://m.dm5.com/m755073/",
enable: 0,
reg: /(www|tel|en|cnc|hk|m)?\.?(dm5|1kkk|mangabz|xmanhua|yymanhua|manhuaren|qiman\d{1,2}|mhxqiu\d|6mh6\d|manben)\.(com|cn)\/(m|ch|vol|other)?[-_0-9]+\//,
delay: 300,
include: "//script[contains(text(),'newImgs')]",
init: () => {
if (fun.gae(".view-bottom-bar>li").length == 4) {
fun.css(".view-bottom-bar>li:nth-child(n+2):nth-child(-n+3){display:none!important}.view-bottom-bar li{width:50%!important}");
}
},
imgs: () => newImgs,
button: [4],
insertImg: ["#cp_img,.main_img,#comicContain,.comic-list", 2],
go: 1,
autoDownload: [0],
next: "//a[text()='下一章'] | //a[img[@alt='下一章']]",
autoNext: true,
prev: "//a[text()='上一章'] | //a[img[@alt='上一章']]",
customTitle: () => {
let host = location.hostname;
if (/dm5|manhuaren|1kkk|mangabz|xmanhua|yymanhua/.test(host)) {
return fun.title("_", 2);
} else if (/qiman|mhxqiu|6mh/.test(host)) {
return fun.title("_", 3);
} else if (/manben/.test(host)) {
if (fun.ge("#comicTitle")) {
return fun.geT("#chapter") + " " + fun.geT(".title-comicHeading");
} else {
return fun.title(" ", 2);
}
}
},
category: "comic"
}, {
name: "动漫之家M m.idmzj.com",
enable: 0,
reg: /m\.i?dmzj\.com\/view\/\d+\/\d+\.html/,
init: "$('body').unbind('keydown');",
imgs: () => {
let code = [...document.scripts].find(s => s.innerHTML.search(/initData/) > -1).innerHTML;
let arr = fun.run(code.match(/page_url.+(\[.+\])/)[1]);
return arr;
},
button: [4, "24%", 3],
insertImg: ["#commicBox", 2],
go: 1,
autoDownload: [0],
next: ".afterChapter",
autoNext: true,
prev: ".beforeChapter",
customTitle: () => fun.title("-", 1),
css: "#khdDown,.appTil,#m_r_bottom,#m_r_panelbox,.control_panel.alpha{display:none!important}",
category: "comic"
}, {
name: "漫画星球M m.mhxqiu2.com",
enable: 0,
reg: /m\.mhxqiu\d\.com\/\d+\/\d+\.html/,
imgs: ".main_img img",
autoDownload: [0],
next: "//a[p[text()='下一篇']][contains(@href,'html')]",
prev: "//a[p[text()='上一篇']][contains(@href,'html')]",
customTitle: () => {
let s = document.title.split("_");
return (s[1] + " - " + s[0]).replace(" - 漫画星球", "");
},
category: "comic"
}, {
name: "漫畫狗 dogemanga.com",
enable: 1,
reg: /dogemanga\.com\/p\/\w+/i,
init: () => {
fun.ge(".site-reader").setAttribute("class", "CustomPictureBox");
fun.addUrlHtml("https://dogemanga.com/", ".CustomPictureBox", 1, "首頁");
let url = siteData.next();
if (url) {
fun.addUrlHtml(url, ".CustomPictureBox", 1);
}
},
imgs: () => [...fun.gae(".site-reader__image")].map(e => e.dataset.pageImageUrl),
button: [4, "24%", 1],
insertImg: [".CustomPictureBox", 2],
go: 1,
autoDownload: [0],
next: () => {
let next = fun.ge("//select[@data-kind='publication']/option[@selected]/preceding-sibling::option[1]");
if (next) {
return next.value;
} else {
return null;
}
},
autoNext: true,
prev: 1,
customTitle: () => fun.title(" - 漫畫狗"),
threading: 1,
css: ".CustomPictureBox{height:auto!important}.fixed-bottom{display:none!important}",
category: "comic"
}, {
name: "白绒Yuri www.ponpomu.com",
enable: 1,
delay: 1000,
reg: /https:\/\/www\.ponpomu\.com\/topic\/\d+\/comic\//,
imgs: () => {
let ele = fun.ge(".comic-page-container data");
if (ele) {
return [...fun.gae(".comic-page-container data")].map(e => e.value);
} else {
return [...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]) + 1;
return s.join("/");
} else {
return null;
}
},
prev: 1,
customTitle: () => fun.geT(".comic-info").replace(/\n/, " ").replace("连载:", "-").replace("单行本: ", "").replace("完结: ", ""),
category: "comic"
}, {
name: "明日方舟泰拉记事社 terra-historicus.hypergryph.com",
enable: 1,
reg: /https:\/\/terra-historicus\.hypergryph\.com\/comic\/\d+\/episode\/\d+/,
imgs: () => {
let max = fun.geT(".HG_COMIC_READER_indicator>div:last-child");
let resArr = [];
let fetchNum = 0;
for (let i = 1; i <= max; i++) {
let res = fetch(`https://terra-historicus.hypergryph.com/api${location.pathname}/page?pageNum=${i}`).then(res => res.json()).then(json => {
fun.show(`${displayLanguage.str_06}${fetchNum+=1}/${max}`, 0);
return json.data.url;
});
resArr.push(res);
}
return Promise.all(resArr).then(data => {
fun.hide();
return data;
});
},
autoDownload: [0],
next: () => {
let next = fun.ge("//a[text()='下一话']") || fun.ge("//a[text()='下一张']");
if (next) {
return next.href;
} else {
return null;
}
},
prev: 1,
customTitle: async () => {
await fun.waitEle(".HG_COMIC_READER_episodeTitle");
return fun.geT(".HG_COMIC_READER_comicTitle") + " - " + fun.geT(".HG_COMIC_READER_episodeTitle");
},
category: "comic"
}, {
name: "Manhuagui看漫画M https://m.manhuagui.com/comic/17023/176171.html",
enable: 0,
reg: /m\.manhuagui\.com\/comic\/\d+\/\d+.html/,
imgs: () => {
let code = [...document.scripts].find(s => s.innerHTML.search(/x6c/) > -1).innerHTML.trim().slice(26);
let json = JSON.parse(fun.run(code).slice(11, -12));
let domain = "https://i.hamreus.com";
return json.images.map(e => `${domain+e}?e=${json.sl.e}&m=${json.sl.m}`);
},
button: [4],
insertImg: ["#manga", 2],
go: 1,
autoDownload: [0],
next: "//a[text()='下一章']",
autoNext: true,
prev: "//a[text()='上一章']",
customTitle: () => fun.geT("#mangaTitle"),
threading: 3,
css: ".action-list li{width:50% !important}#action>ul>li:nth-child(n+2):nth-child(-n+3),.manga-page,.clickforceads{display:none !important}",
category: "comic"
}, {
name: "Manhuagui看漫画M 点击查看下20条记录",
enable: 0,
reg: /m\.manhuagui\.com\/(update|list|rank|user)\//,
icon: 0,
key: 0,
observerClick: "#more:not([style*=none])>.more-go",
category: "comic"
}, {
name: "Manhuagui看漫画 www.manhuagui.com tw.manhuagui.com",
enable: 0,
reg: /(www|tw)\.manhuagui\.com\/comic\/\d+\/\d+.html/,
init: "$(document).unbind('keydown');",
imgs: () => {
let code = [...document.scripts].find(s => s.innerHTML.search(/x6c/) > -1).innerHTML.slice(26, -1);
let json = fun.run(fun.run(code).slice(11, -11));
let domain = "https://i.hamreus.com";
return json.files.map(e => `${domain+json.path+e}?e=${json.sl.e}&m=${json.sl.m}`);
},
button: [4],
insertImg: ["#tbBox", 2],
go: 1,
autoDownload: [0],
threading: 3,
next: "//a[text()='下一章']",
autoNext: true,
prev: "//a[text()='上一章']",
customTitle: () => fun.geT("h1>a") + " - " + fun.geT("h2"),
category: "comic"
}, {
name: "包子漫画 閱讀 https://www.kukuc.co/comic/chapter/yushenyitongshengji-ohyeonbain/0_2.html",
enable: 0,
reg: /\/comic\/chapter\/[^/]+\/\w+\.html/i,
include: "//title[contains(text(),'包子')]",
init: async () => {
document["onkeydown"] = null;
await fun.getNP(".comic-contain>div:not(.mobadsq)", "//a[contains(text(),'下一頁') or contains(text(),'下一页')]", null, ".comic-chapter>.next_chapter");
},
imgs: () => [...new Set([...fun.gae(".comic-contain amp-img")].map(e => e.getAttribute("src")))],
button: [4],
insertImg: [".comic-contain", 2],
go: 1,
autoDownload: [0],
next: "//div[@class='next_chapter']/a[contains(text(),'下一話') or contains(text(),'下一话')]",
autoNext: true,
prev: 1,
customTitle: () => fun.title(" - ", 3),
css: ".chapter-main.scroll-mode~*:not(.next_chapter):not(.bottom-bar){display:none!important}",
category: "comic"
}, {
name: "包子漫画 展開目錄",
enable: 0,
icon: 0,
key: 0,
reg: /\/comic\/[-\w]+$/i,
include: "//title[contains(text(),'包子')]",
autoClick: "#button_show_all_chatper",
category: "comic"
}, {
name: "包子漫画,鏈接新分頁打開",
enable: 0,
icon: 0,
key: 0,
reg: /(cn|tw|www)\.(baozimh|webmota|kukuc)\.(co|com)/,
openInNewTab: ".comics-card a:not([target=_blank]),.bookshelf-items a:not(.remove-img):not([target=_blank])",
category: "comic"
}, {
name: "Komiic komiic.com",
enable: 1,
reg: /komiic\.com\/comic\/\d+\/chapter\//,
imgs: async () => {
let chapterId = siteUrl.match(/chapter\/(\d+)\/images/)[1];
let body = {
operationName: "imagesByChapterId",
variables: {
chapterId: `${chapterId}`
},
query: "query imagesByChapterId($chapterId: ID!) {\n imagesByChapterId(chapterId: $chapterId) {\n id\n kid\n height\n width\n __typename\n }\n}\n"
};
let json = await fetch("/api/query", {
"headers": {
"content-type": "application/json"
},
"body": JSON.stringify(body),
"method": "POST"
}).then(res => res.json());
debug("\nimages JSON\n", json);
return json.data.imagesByChapterId.map(e => "https://komiic.com/api/image/" + e.kid);
},
autoDownload: [0],
next: async () => {
let mhId = siteUrl.match(/comic\/(\d+)/)[1];
let body = {
operationName: "chapterByComicId",
variables: {
comicId: `${mhId}`
},
query: "query chapterByComicId($comicId: ID!) {\n chaptersByComicId(comicId: $comicId) {\n id\n serial\n type\n dateCreated\n dateUpdated\n size\n __typename\n }\n}\n"
};
let json = await fetch("/api/query", {
"headers": {
"content-type": "application/json"
},
"body": JSON.stringify(body),
"method": "POST"
}).then(res => res.json());
debug("\nchapter JSON\n", json);
let chapterId = siteUrl.match(/chapter\/(\d+)\/images/)[1];
let chapters = json.data.chaptersByComicId;
let nextUrl;
for (let i in chapters) {
if (new RegExp(chapterId).test(chapters[i].id)) {
try {
let nextId = chapters[parseInt(i) + 1].id;
nextUrl = siteUrl.replace(new RegExp(`/${chapterId}/`), `/${nextId}/`).replace(/\?page=\d+/, "");
} catch (e) {
nextUrl = null;
}
break;
}
}
return nextUrl;
},
prev: 1,
customTitle: async () => {
await fun.delay(2000, 0);
return fun.geT("li.breadcrumbs__item:nth-child(3)>a").trim() + " - " + fun.geT("li.breadcrumbs__item:nth-child(5)>div").trim();
},
threading: 4,
category: "comic"
}, {
name: "LINE WEBTOON / 咚漫 www.webtoons.com www.dongmanmanhua.cn https://www.webtoons.com/zh-hant/time-slip/estatedeveloper/%E7%AC%AC1%E8%A9%B1/viewer?title_no=4354&episode_no=1",
enable: 0,
reg: /www\.(webtoons|dongmanmanhua)\.(com|cn)\/[^&]+&episode/,
imgs: "._images[data-url]",
insertImg: ["#_imageList", 2],
go: 1,
autoDownload: [0],
next: "//div[@class='episode_cont']//li[a[starts-with(@class,'on')]]/following-sibling::li[1]/a",
prev: "//div[@class='episode_cont']//li[a[starts-with(@class,'on')]]/preceding-sibling::li[1]/a",
customTitle: () => fun.title("|", 3).replace(/ - \d+/, "").replace("|", " - "),
category: "comic"
}, {
name: "LINE WEBTOON 目錄聚集所有章節",
enable: 0,
icon: 0,
key: 0,
reg: /www\.webtoons\.com\/.+\/list\?title_no=\d+/,
init: "fun.getNP('._episodeItem',\"//div[@class='paginate']/a[span[@class='on']]/following-sibling::a[1]\",null,'.paginate',0,null,0);",
category: "comic"
}, {
name: "動漫狂M",
enable: 0,
reg: /www\.cartoonmad\.(cc|com)\/m\/comic\/\d+\.html/,
init: async () => {
let url = await siteData.next();
if (url) {
fun.addUrlHtml(url, "//tr[td[a[@class='onpage']]]", 1);
}
},
imgs: () => {
let src = fun.ge("img[oncontextmenu]").src.match(/.+\//)[0];
let max = fun.ge(".onpage").parentNode.lastElementChild.previousElementSibling.innerText;
let arr = [];
for (let i = 1; i <= max; i++) {
let imgSrc = src + String(i).padStart(3, "0");
arr.push(imgSrc);
};
return arr;
},
button: [4],
insertImg: ["//td[a[img[@oncontextmenu]]]", 2],
go: 1,
autoDownload: [0],
next: async () => {
let lastPage = fun.ge(".onpage").parentNode.lastElementChild.previousElementSibling;
return await fun.fetchDoc(lastPage.href).then(async doc => {
let ele = fun.ge("body>table>tbody>tr:nth-child(3)>td>a", doc);
return await fun.fetchDoc(ele.href).then(doc => {
let next = fun.ge(".pages", doc);
if (next) {
return next.href;
} else {
return null;
}
});
});
},
autoNext: true,
prev: 1,
customTitle: () => fun.title(" - ", 2),
category: "comic"
}, {
name: "動漫狂 https://www.cartoonmad.com/comic/438700012046001.html",
enable: 0,
reg: /www\.cartoonmad\.com\/comic\/\d+\.html/,
init: "document.onkeydown=null;",
imgs: () => {
let src = fun.ge("img[onload]").src.match(/.+\//)[0];
let max = fun.gae("option[value]").length;
let arr = [];
for (let i = 1; i <= max; i++) {
let imgSrc = src + String(i).padStart(3, "0");
arr.push(imgSrc);
};
return arr;
},
button: [4],
insertImg: ["//td[a[img[@oncontextmenu]]]", 2],
go: 1,
autoDownload: [0],
next: "//td[@width='150' and a[img[@src='/image/rad.gif']]]/a",
autoNext: true,
prev: "//td[@width='150' and a[img[@src='/image/rad1.gif']]]/a",
customTitle: () => fun.title(" - ", 2),
category: "comic"
}, {
name: "動漫戲說 https://comic.acgn.cc/view-202.htm",
enable: 0,
reg: /comic\.acgn\.cc\/view/,
imgs: () => [...fun.gae(".pic[_src][id]")].map(e => e.getAttribute("_src")),
button: [4],
insertImg: ["#pic_list", 2],
go: 1,
autoDownload: [0],
next: ".display_right>a",
autoNext: true,
prev: ".display_left>a",
customTitle: () => fun.geT(".hotrmtexth1>a"),
css: ".btn_wrap{display:none!important}",
category: "comic"
}, {
name: "98漫畫網 www.98comic.com",
enable: 0,
reg: /www\.98comic\.com\/comic\/\d+\/\w+\.html$/,
imgs: () => cInfo.fs.map(e => "https://www.98comic.com/g.php?" + cInfo.cid + "/" + e),
button: [4],
insertImg: ["//td[img[@id='manga']]", 2],
go: 1,
autoDownload: [0],
next: ".nextC",
autoNext: true,
prev: ".prevC",
customTitle: () => cInfo.btitle + " - " + cInfo.ctitle,
css: ".bd_960_90{display:none!important}",
category: "comic"
}, {
name: "57漫画网 www.wuqimh.net m.wuqimh.net 国漫吧 www.guoman8.cc m.guoman8.cc",
enable: 0,
reg: /((www|m)\.wuqimh\.net)|(www|m)\.guoman8\.cc\/\d+\/\d+\.html$/,
imgs: () => cInfo.fs,
button: [4],
insertImg: ["//td[img[@id='manga']]", 2],
go: 1,
autoDownload: [0],
next: ".nextC",
autoNext: true,
prev: ".prevC",
customTitle: () => cInfo.btitle + " - " + cInfo.ctitle,
css: ".action-list li{width:50%!important}#action>ul>li:nth-child(n+2):nth-child(-n+3),.bd_960_90,body>section,#action~*:not(#pageNo),footer~*{display:none!important}",
category: "comic"
}, {
name: "亲亲漫画/古风漫画网 www.acgwd.com www.acgud.com m.acgqd.com www.gufengmh.com m.gufengmh.com",
enable: 0,
reg: /(www|m|w111)\.(acg(u|q|w)d|gufengmh|mhd100)\.com\/manhua\/\w+\/\d+\.html/,
init: () => {
if (/acg|mhd100/.test(location.host)) {
$("#images").unbind("click");
_0x5097 = null;
for (let i = 0; i <= 2; i++) {
clearInterval(i)
}
} else if (/gufengmh/.test(location.host)) {
$(document).unbind("keydown");
$(document).unbind("keyup");
}
},
imgs: () => chapterImages.map(e => SinConf.resHost[0].domain + "/" + chapterPath + e),
button: [4],
insertImg: ["#images", 2],
go: 1,
autoDownload: [0],
next: "//a[contains(text(),'下一章')]",
autoNext: true,
prev: "//a[contains(text(),'上一章')]",
customTitle: () => {
if (/(acg|mhd100)/.test(location.host)) {
return fun.title("_", 1);
} else if (/gufengmh/.test(location.host)) {
return fun.title("在线观看", 1);
} else {
return fun.title(" - ", 3);
}
},
css: ".img_land_prev,.img_land_next,#action li:nth-child(2),#action li:nth-child(3),.control_bottom~*,.chapter-view~*:not([id^='pv-']):not([class^='pv-']):not(.pagetual_tipsWords):not(.FullPictureLoadMsg):not(#FullPictureLoad):not(#FullPictureLoadOptions):not(.fancybox-container){display:none!important}#action li{width:50%!important}",
category: "comic"
}, {
name: "漫画456 www.manhua456.com",
enable: 0,
reg: /www\.manhua456\.com\/manhua\/\w+\/\d+\.html/,
delay: 1000,
init: "setTimeout(()=>{$(document).unbind('keyup');$(document).unbind('keydown')},4000)",
imgs: async () => {
await fun.waitEle("//script[contains(text(),'chapterImages')]");
return chapterImages.map(e => {
if (/^http/.test(e)) {
return e;
} else {
return SinConf.resHost1 + "/" + chapterPath + e;
}
});
},
button: [4],
insertImg: ["#images", 2],
go: 1,
next: "//a[text()='下一章']",
autoNext: true,
prev: "//a[text()='上一章']",
customTitle: () => fun.title(" - ", 3),
css: ".img_land_prev,.img_land_next{display:none!important}",
category: "comic"
}, {
name: "漫画456M m.manhua456.com",
enable: 0,
reg: /m\.manhua456\.com\/manhua\/\w+\/\d+\.html/,
delay: 300,
init: async () => {
await fun.waitEle("//script[contains(text(),'chapterImages')]");
$('#images').unbind('click');
},
imgs: async () => {
await fun.waitEle("//script[contains(text(),'chapterImages')]");
return chapterImages.map(e => {
if (/^http/.test(e)) {
return e;
} else {
return SinConf.resHost1 + "/" + chapterPath + e;
}
});
},
insertImg: ["#images", 2],
go: 1,
next: "//a[text()='下一章']",
autoNext: true,
prev: "//a[text()='上一章']",
customTitle: () => {
let s = pageTitle.split(" - ");
return s[1] + " - " + s[0];
},
css: ".img_land_prev,.img_land_next{display:none!important}",
category: "comic"
}, {
name: "漫画1234 www.ymh1234.com www.hmh1234.com",
enable: 0,
reg: /(www|m)\.\wmh1234\.com\/comic\/\d+\/\d+\.html/i,
init: "$(document).unbind('keydown');$(document).unbind('keyup');$('#images').unbind('click');",
imgs: async () => {
let url = await siteData.next();
if (location.hostname == "www.ymh1234.com") {
if (url) {
fun.addUrlHtml(url, "#images", 1);
}
}
return chapterImages.map(e => SinConf.resHost[0].domain + "/" + chapterPath + e);
},
button: [4],
insertImg: ["#images", 2],
go: 1,
autoDownload: [0],
next: () => {
if (nextChapterData.id > 0) {
return nextChapterData.url;
} else {
return null;
}
},
autoNext: true,
prev: 1,
customTitle: () => {
let s = pageTitle.split(" - ");
if (location.hostname == "m.ymh1234.com") {
return s[1] + " - " + s[0];
} else {
return s[0];
}
},
category: "comic"
}, {
name: "90漫画 www.90mh.com www.90mh.org",
enable: 0,
reg: /www\.90mh\.(com|org)\/manhua\/\w+\/\d+\.html/i,
imgs: () => chapterImages.map(e => SinConf.resHost[0].domain + "/" + chapterPath + e),
insertImg: ["#images", 2],
go: 1,
autoDownload: [0],
next: ".nextC",
autoNext: true,
prev: ".prevC",
customTitle: () => fun.title(" - ", 3),
category: "comic"
}, {
name: "90漫画M wap.90mh.com m.90mh.org",
enable: 0,
reg: /(wap|m)\.90mh\.(com|org)\/manhua\/\w+\/\d+\.html/i,
init: () => {
let url = siteData.next();
if (url) {
fun.addUrlHtml(url, "#chapter-image", 1);
}
},
imgs: () => fun.getImg("#chapter-image img", fun.geT("#k_total"), 5),
insertImg: ["#chapter-image", 2],
go: 1,
autoDownload: [0],
next: () => {
let next = fun.ge("//a[text()='下一章'][contains(@href,'html')]");
if (next) {
return next.href;
} else {
return null;
}
},
autoNext: true,
prev: 1,
customTitle: () => fun.title("在线", 1),
css: ".a-90mh{display:none!important}",
category: "comic"
}, {
name: "优酷漫画 www.ykmh.com",
enable: 0,
reg: /www\.ykmh\.com\/manhua\/\w+\/\d+\.html/i,
init: "$(document).unbind('keydown');$(document).unbind('keyup');",
imgs: () => chapterImages.map(e => SinConf.resHost[0].domain + e),
button: [4],
insertImg: ["#images", 2],
go: 1,
autoDownload: [0],
next: ".next>a",
autoNext: true,
prev: ".pre>a",
customTitle: () => fun.title(" - ", 3),
css: ".img_land_prev,.img_land_next{display:none!important}",
category: "comic"
}, {
name: "优酷漫画M h5.ykmh.com",
enable: 0,
reg: /h5\.ykmh\.com\/manhua\/\w+\/\d+\.html/i,
init: "$('#images').unbind('click');",
imgs: () => chapterImages.map(e => SinConf.resHost[0].domain + e),
button: [4],
insertImg: ["#images", 2],
go: 1,
autoDownload: [0],
next: "//a[text()='下一章'][contains(@href,'html')]",
autoNext: true,
prev: "//a[text()='上一章'][contains(@href,'html')]",
customTitle: () => {
let s = pageTitle.split(" - ");
return s[1] + " - " + s[0];
},
css: ".letchepter>div,.letchepter>section,#FullPictureLoad~*{display:none!important}",
category: "comic"
}, {
name: "漫画芯M m.mhxin.com",
enable: 0,
reg: /(m|coco)\.mhxin\.com\/manhua\/\w+\/\d+\.html/i,
imgs: () => {
let max = fun.geT(".image-content p").match(/\/(\d+)/)[1];
return fun.getImg("#manga-image", max, 5);
},
button: [4],
insertImg: ["#images", 2],
go: 1,
autoDownload: [0],
next: () => {
let code = [...document.scripts].find(s => s.innerHTML.search(/下一章/) > -1).innerHTML;
let url = code.match(/<li><a href="(.+)">下一章/)[1];
if (/html$/.test(url)) {
return url;
} else {
return null;
}
},
autoNext: true,
prev: 1,
customTitle: () => fun.title("在线", 1),
css: ".action-list li{width:50% !important}div[style*='text-align: left;'],.UnderPage~*:not([id^='pv-']):not([class^='pv-']):not(.pagetual_tipsWords):not(.FullPictureLoadMsg):not(#FullPictureLoad):not(#FullPictureLoadOptions):not(.fancybox-container),.action-list>ul>li:nth-child(n+2):nth-child(-n+3){display:none!important}body{padding:0!important}",
category: "comic"
}, {
name: "最漫画M / 拼拼漫画M m.zuimh.com m.pinmh.com",
enable: 0,
reg: /(m\.zuimh\.com|m.pinmh.com)\/manhua\/\w+\/\d+\.html/i,
imgs: () => {
let max = fun.geT(".image-content p").match(/\/(\d+)/)[1];
return fun.getImg("#image", max, 5);
},
insertImg: ["#images", 2],
go: 1,
autoDownload: [0],
next: "//a[text()='下一章'][contains(@href,'html')]",
autoNext: true,
prev: "//a[text()='上一章'][contains(@href,'html')]",
customTitle: () => fun.title("在线", 1),
css: "body{padding:0!important}div[style*='text-align'],.UnderPage~*:not([id^='pv-']):not([class^='pv-']):not(.pagetual_tipsWords):not(.FullPictureLoadMsg):not(#FullPictureLoad):not(#FullPictureLoadOptions):not(.fancybox-container){display:none!important}",
category: "comic"
}, {
name: "零点漫画M m.0dmh.com",
enable: 0,
reg: /(m\.0dmh\.com)\/manhua\/\w+\/\d+\.html/i,
imgs: () => {
let max = Math.ceil(fun.geT("#images p").match(/\/(\d+)/)[1] / 3);
return fun.getImg("#images img", max, 5);
},
insertImg: ["#images", 2],
go: 1,
autoDownload: [0],
next: "//a[text()='下一章'][contains(@href,'html')]",
autoNext: true,
prev: "//a[text()='上一章'][contains(@href,'html')]",
customTitle: () => fun.title("-零点漫画").trim(),
css: ".action-list li{width:50% !important}div[style*='text-align'],.action-list>ul>li:nth-child(n+2):nth-child(-n+3){display:none!important}",
category: "comic"
}, {
name: "漫画吧M / 漫画连M m.dmhua8.com m.100mhl.com",
enable: 0,
reg: /(m\.dmhua8\.com|m\.100mhl\.com)\/manhua\/\w+\/\d+\.html/i,
imgs: () => {
let num = fun.geT("#images p").match(/\/(\d+)/)[1];
let max = Math.ceil(num / 5);
return fun.getImg("#images img", max, 5);
},
insertImg: ["#images", 2],
go: 1,
autoDownload: [0],
next: () => {
try {
let code = [...document.scripts].find(s => s.innerHTML.search(/下一章/) > -1).innerHTML;
let url = code.match(/<li><a href="(.+)">下一章/)[1];
if (/html$/.test(url)) {
return url;
} else {
return null;
}
} catch (e) {
let next = fun.ge("//a[text()='下一章'][contains(@href,'html')]");
if (next) {
return next.href;
} else {
return null;
}
}
},
autoNext: true,
prev: 1,
customTitle: () => {
if (location.hostname == "m.dmhua8.com") {
let s = document.title.split("_");
return (s[1] + " - " + s[0]).replace("漫画", "");
} else if (location.hostname == "m.100mhl.com") {
return document.title.replace("-漫画连", "");
}
},
css: "#addMoney,#images~div[style*=blur],div[style*='text-align: left;']{display:none!important}",
category: "comic"
}, {
name: "蔷薇漫画M/爱米推漫画M/下拉式漫画M/奇妙漫画M/冰氪漫画M/狗狗漫画M/奇奇漫画M/悠闲漫画M/不卡漫画M/多熙漫画M m.qwmanhua.com m.imitui.com m.xlsmh.com m.qmiaomh.com m.icekr.com m.gougoumh.com m.qimhua.com m.yxtun.com m.bukamh.com m.duoximh.com",
enable: 0,
reg: /(m\.qwmanhua\.com|m\.imitui\.com|m\.xlsmh\.com|m\.qmiaomh\.com|m\.icekr\.com|m\.gougoumh\.com|m\.qimhua\.com|m\.yxtun\.com|m\.bukamh\.com|m\.duoximh\.com)\/manhua\/\w+\/\d+\.html/i,
imgs: () => {
let imgs = [...fun.gae("#images img:not([src*=loading]),#scroll-image img")];
fun.remove("#scroll-image");
return imgs;
},
button: [4],
insertImg: ["#images", 2],
go: 1,
autoDownload: [0],
next: () => {
try {
if (nextChapterData.id > 0) {
return nextChapterData.url;
} else {
return null;
}
} catch (e) {
let next = fun.ge("//a[text()='下一章 > '][contains(@href,'html')]");
if (next) {
return next.href;
} else {
return null;
}
}
},
autoNext: true,
prev: 1,
customTitle: () => {
let host = location.hostname;
if (/xlsmh|qmiaomh|gougoumh|qimhua|yxtun|bukamh|duoximh/.test(host)) {
return fun.geT("#panel-title span,.title3 span").replace(">", " - ");
} else {
return fun.title("在线", 1);
}
},
css: "body{padding:0!important}.UnderPage~*:not([id^='pv-']):not([class^='pv-']):not(.pagetual_tipsWords):not(.FullPictureLoadMsg):not(#FullPictureLoad):not(#FullPictureLoadOptions):not(.fancybox-container),.bottom~*:not([id^='pv-']):not([class^='pv-']):not(.pagetual_tipsWords):not(.FullPictureLoadMsg):not(#FullPictureLoad):not(#FullPictureLoadOptions):not(.fancybox-container),div[style*='text-align: left;']{display:none!important}",
category: "comic"
}, {
name: "前未漫画/漫画芯/蔷薇漫画/最漫画/爱米推漫画/下拉式漫画/漫画吧/漫画连/拼拼漫画/零点漫画/雪儿漫画/狗狗漫画/奇奇漫画/悠闲漫画/不卡漫画/多熙漫画 www.qianmh.com www.mhxin.com www.qwmanhua.com www.zuimh.com www.imitui.com imitui.com www.xlsmh.com www.dmhua8.com www.100mhl.com www.pinmh.com www.0dmh.com www.xuermh.com www.gougoumh.com www.qimhua.com www.yxtun.com www.bukamh.com www.duoximh.com",
enable: 0,
reg: /www\.(mhxin|qianmh|qwmanhua|zuimh|imitui|xlsmh|dmhua8|100mhl|pinmh|0dmh|xuermh|gougoumh|qimhua|yxtun|bukamh|duoximh)\.com\/manhua\/\w+\/\d+\.html/i,
init: "try{$(document).unbind('keydown');$(document).unbind('keyup')}catch(e){}",
imgs: () => chapterImages,
button: [4],
insertImg: ["#images,#imagesOld", 2],
go: 1,
autoDownload: [0],
next: ".next>a,a.next,a.nextC",
autoNext: true,
prev: ".pre>a,a.prev,a.prevC",
autoClick: "#chapter-pagination:not(.active),#mode_pagination",
customTitle: () => {
let host = location.hostname;
if (/mhxin|qwmanhua|pinmh/.test(host)) {
return fun.geT(".head_title").replace("-", " -");
} else if (/qianmh|xlsmh|100mhl|0dmh|xuermh|gougoumh|qimhua|bukamh|duoximh/.test(host)) {
return fun.geT("h1").trim();
} else if (/zuimh|imitui|dmhua|yxtun/.test(host)) {
return fun.geT(".title h1") + " - " + fun.geT(".title h2");
}
},
css: "#qTcms_picID{display:none!important}",
category: "comic"
}, {
name: "雪儿漫画M m.xuermh.com",
enable: 0,
reg: /m\.xuermh\.com\/manhua\/\w+\/\d+\.html/i,
init: async () => {
let a = fun.ge(".erPag a");
let img = fun.ge(".erPag a img:last-child");
a.outerHTML = img.outerHTML;
await fun.getNP(".erPag mip-link img:not([style*=position])", "//mip-link[text()='下一页'][contains(@href,'-')] | //a[text()='下一页'][contains(@href,'-')]", null, "#action", 0, null, 0);
},
imgs: () => [...fun.gae(".erPag mip-link img:not([style*=position])")],
button: [4],
insertImg: [".erPag", 2],
go: 1,
autoDownload: [0],
next: "//a[text()='下一章']",
autoNext: true,
prev: "//a[text()='上一章']",
customTitle: () => fun.geT("h1").replace(">", " - ").trim(),
css: "div[style*='text-align: left;'],#action li:nth-child(2),#action li:nth-child(3),span.right{display:none!important}#action li{width:50%!important}",
category: "comic"
}, {
name: "来漫画 www.laimanhua8.com",
enable: 0,
reg: /www\.laimanhua\d?\.(net|com)\/kanmanhua\/\w+\/\d+\.html/i,
imgs: () => {
let imgData = base64_decode(picTree).split("$qingtiandy$");
let host = getpicdamin();
return imgData.map(e => host + e);
},
button: [4],
insertImg: ["#pic-list", 2],
go: 1,
autoDownload: [0],
next: ".btn-next[href^=j]",
autoNext: true,
prev: ".btn-prev",
customTitle: () => fun.title(",", 1).replace("漫画", ""),
css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}",
category: "comic"
}, {
name: "来漫画M m.laimanhua8.com",
enable: 0,
reg: /m\.laimanhua8\.com\/kanmanhua\/\w+\/\d+\.html/i,
imgs: () => mhInfo.images.map(e => realurl + mhInfo.path + e),
button: [4],
insertImg: ["#manga", 2],
go: 1,
autoDownload: [0],
next: "//a[text()='下一章']",
autoNext: true,
prev: "//a[text()='上一章']",
customTitle: () => fun.geT("#mangaTitle"),
css: "#jusha1{display:none!important}",
category: "comic"
}, {
name: "奇妙漫画 www.qmiaomh.com",
enable: 0,
reg: /www\.qmiaomh\.com\/manhua\/\w+\/\d+\.html/i,
imgs: () => {
let arr = [];
chapterImages.forEach(e => {
let imgSrc;
if (e.indexOf("http") != -1) {
imgSrc = e;
} else {
imgSrc = SinConf.resHost[0].domain + e;
}
arr.push(imgSrc);
});
return arr;
},
insertImg: ["#images", 2],
go: 1,
autoDownload: [0],
next: "a.next",
autoNext: true,
prev: "a.prev",
customTitle: () => fun.title(" - ", 1),
category: "comic"
}, {
name: "漫客栈 www.mkzhan.com",
enable: 0,
reg: /www\.mkzhan\.com\/\d+\/\d+\.html/i,
init: async () => {
let lps = location.pathname.split("/");
let comic_id = lps[1];
let chapter_id = lps[2].match(/\d+/)[0];
let apiUrl = `https://comic.mkzcdn.com/chapter/content/v1/?chapter_id=${chapter_id}&comic_id=${comic_id}&format=1&quality=1&type=1`;
siteJson = await fetch(apiUrl).then(res => res.json());
debug("\n此頁JSON資料\n", siteJson);
},
imgs: () => siteJson.data.page.map(e => e.image),
insertImg: ["#pages-tpl", 1],
go: 1,
autoDownload: [0],
next: ".rd-aside a.j-rd-next",
autoNext: true,
prev: ".rd-aside a.j-rd-prev",
autoClick: "//div[@class='rd-aside__item j-rd-mod'][span[text()='卷轴']]",
customTitle: () => fun.title(" - ", 1),
category: "comic"
}, {
name: "漫画屋 www.mhua5.com www.mhw1.com www.manhw.com www.360mh.cc www.mhzj54.com www.bingmh.com www.manshiduo.net mh.manhw.com comics.veryim.com www.38manhua.com 797mh.com",
enable: 0,
reg: /www\.(mhua5|mhw\d|manhw|360mh)\.(com|cc)\/(chapter.+\.html|index\.php\/chapter\/\d+)|www\.mhzj54\.com\/chapter\/\d+$|www\.bingmh\.com\/chapter\/\d+\.html$|www\.manshiduo\.net\/chapter_\d+\.html$|mh\.manhw\.com\/index\.php\/chapter\/\d+$|comics\.veryim\.com\/\w+\/\d+\/\d+\.html$|(www\.38manhua\.com|797mh\.com)\/chapter_\d+\.html$/i,
include: ".rd-article-wr",
init: () => {
fun.gae("img[data-original],img[data-src]").forEach(e => {
new Image().src = e.dataset.original || e.dataset.src;
});
document.onkeydown = null;
},
imgs: "img[data-original]:not([data-original*='/template/pc/default/']),.lazy-read:not([data-original*='/template/pc/default/']),img[data-src]",
button: [4],
insertImg: [".rd-article-wr", 3],
go: 1,
autoDownload: [0],
next: ".btn--next-chapter,.rd-aside a.j-rd-next",
autoNext: true,
prev: ".rd-aside a.j-rd-prev",
autoClick: "//div[@class='rd-aside__item j-rd-mod'][span[text()='卷轴']]",
customTitle: () => {
if (/www\.mhua5\.com|www\.mhw\d\.com/.test(location.host)) {
return fun.title(" - 漫画屋").replace("-", " - ");
} else if (/www\.manhw\.com|mh\.manhw\.com/.test(location.host)) {
return fun.attr("meta[name=description]", "content").split(" - 漫画屋")[0].replace("当前阅读的是", "").replace("的", " - ");
} else if (/www\.360mh\.cc|www\.38manhua\.com|797mh\.com/.test(location.host)) {
return fun.geT(".j-comic-title") + " - " + fun.geT(".last-crumb");
} else {
return fun.title(/下拉|在线/, 1).replace("-", " - ").replace(/漫画|\[\d+P\]/i, "");
}
},
css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}",
category: "comic"
}, {
name: "漫画屋M www.mhua5.com www.manhw.com www.360mh.cc www.mhzj54.com www.bingmh.com www.manshiduo.net m.mkzhan.com mh.manhw.com www.mhw1.com www.38manhua.com 797mh.com",
enable: 0,
reg: /(www\.(mhua5|manhw)\.com|mh\.manhw\.com)\/(chapter.+\.html|index\.php\/chapter\/\d+)|(www\.360mh\.cc|www\.mhw\d\.com)\/chapter-\d+.html|www\.mhzj54\.com\/chapter\/\d+$|www\.bingmh\.com\/chapter\/\d+\.html$|www\.manshiduo\.net\/chapter_\d+\.html$|m\.mkzhan\.com\/\d+\/\d+.html|(www\.38manhua\.com|797mh\.com)\/chapter_\d+\.html$/i,
imgs: ".comic-page img,#cp_img img[data-original]",
autoDownload: [0],
next: async () => {
if (/www\.mhua5\.com|www\.360mh\.cc|www\.bingmh\.com|www\.mhw\d\.com|www\.38manhua\.com/.test(location.host)) {
let next = fun.attr(".next-chapter", "_href");
if (next !== "") {
return location.origin + next;
} else {
return 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;
if (next !== "" || next != 0) {
return location.origin + next;
} else {
return null;
}
} else if (/www\.mhzj54\.com/.test(location.host)) {
let next = fun.attr(".next-chapter", "_href");
if (next !== "") {
return next;
} else {
return null;
}
} else if (/www\.manshiduo\.net|www\.manhw\.com|mh\.manhw\.com/.test(location.host)) {
let next = fun.attr(".next-chapter", "_href");
if (next !== "") {
return location.origin + next;
} else {
return null;
}
} else if (/797mh\.com/.test(location.host)) {
let next = fun.attr(".prev-chapter", "_href");
if (next !== "") {
return location.origin + next;
} else {
return null;
}
} else {
let next = fun.ge("//a[text()='下一章']");
if (next) {
return next.href;
} else {
return null;
}
}
},
autoNext: true,
prev: 1,
customTitle: () => {
if (/www\.mhua5\.com|www\.manhw\.com|mh\.manhw\.com/.test(location.host)) {
return fun.title(" - 漫画屋").replace("-", " - ");
} else if (/m\.mkzhan\.com/.test(location.host)) {
return fun.title(" - 漫客栈").trim();
} else if (/www\.360mh\.cc|www\.mhw\d\.com|www\.38manhua\.com|797mh\.com/.test(location.host)) {
return shareArr[0].match(/《([^》]+)/)[1] + " - " + fun.geT(".comic-name");
} else if (/www\.bingmh\.com/.test(location.host)) {
return fun.geT("title+title").split("在线")[0].replace("-", " - ").trim();
} else {
return fun.title("下拉", 1).trim().replace("-", " - ");
}
},
css: "body>ins,#mainView>.read,.chapter-end .read,#chapter1,#chapter3,.cnt-4,.comic-list a,.chapter-end>a,div[style^=height]{display:none!important}",
category: "comic"
}, {
name: "爱国漫 www.aiguoman.com",
enable: 0,
reg: /www\.aiguoman\.com\/chapter\/.+\.html/i,
imgs: ".main-item>img",
autoDownload: [0],
next: ".J_next_eposide_btn",
prev: ".J_prev_eposide_btn",
customTitle: () => fun.geT(".cartoon-title>a:first-child") + " - " + fun.geT(".cartoon-title>a:last-child"),
category: "comic"
}, {
name: "爱国漫M m.aiguoman.com",
enable: 0,
reg: /m\.aiguoman\.com\/chapter\/.+\.html/i,
imgs: ".lazy-image[data-original]",
autoDownload: [0],
next: "//a[text()='下一章'][contains(@href,'html')]",
prev: "//a[text()='上一章'][contains(@href,'html')]",
customTitle: () => document.title.split("免费")[0].replace("漫画", ""),
category: "comic"
}, {
name: "新新漫画 www.77mh.xyz",
enable: 0,
reg: /(www|m)\.77mh\.[a-z]{2,3}\/\d+\/\d+\.html/i,
init: "try{$(document).unbind('keydown');$(document).unbind('keyup')}catch(e){}",
imgs: async () => {
await fun.delay(1000);
let imgData = msg.split("|");
let arr = [];
for (let i in imgData) {
let imgSrc;
if (location.hostname.indexOf("m.77mh") != -1) {
imgSrc = ImgSvrList + imgData[i];
} else {
imgSrc = img_qianz + imgData[i];
}
arr.push(imgSrc);
}
return arr;
},
button: [4],
insertImg: ["#comicImg,.mg-co", 2],
go: 1,
autoDownload: [0],
next: "//a[contains(text(),'下一章')]",
autoNext: true,
prev: "//a[contains(text(),'上一章')]",
customTitle: () => fun.title(" - ", 3),
category: "comic"
}, {
name: "漫漫聚/KuKu动漫 www.manmanju.com manhua.kukudm.com",
enable: 1,
reg: /(a|b|www|manhua)\.(manmanju|i?kukudm)\.com\/comiclist\/\d+\/\d+\/1\.htm/i,
include: "td img",
comicListUrl: () => {
let comicId = location.href.split("/")[4];
let comicListUrl;
if (/(www|a|b)\.manmanju\.com/.test(location.origin)) {
comicListUrl = `http://www.manmanju.com/comiclist/${comicId}/index.htm`;
} else {
comicListUrl = `http://manhua.kukudm.com/comiclist/${comicId}/index.htm`;
}
return comicListUrl;
},
init: async () => {
let cUrl = siteData.comicListUrl();
let url = await siteData.next();
if (url) {
fun.addUrlHtml(url, "body", 2);
fun.addUrlHtml(cUrl, "body", 2, "目錄");
} else {
if (/manmanju/.test(location.origin)) {
fun.addUrlHtml(cUrl, "body", 2, "目錄");
fun.addUrlHtml("http://www.manmanju.com/", "body", 2, "首頁");
} else {
fun.addUrlHtml(cUrl, "body", 2, "目錄");
fun.addUrlHtml("https://manhua.kukudm.com/", "body", 2, "首頁");
}
}
},
imgs: () => fun.getKukudmSrc(),
button: [4],
insertImg: ["//td[input]", 2],
go: 1,
autoDownload: [0],
next: () => {
let chapterId = location.href.split("/")[5];
let host;
if (/www\.manmanju\.com|manhua\.kukudm\.com/.test(location.origin)) {
host = 1;
} else if (/a\.manmanju\.com|a\.ikukudm\.com/.test(location.origin)) {
host = 2;
} else if (/b\.manmanju\.com|b\.ikukudm\.com/.test(location.origin)) {
host = 3;
}
let nextXPath = `//dd[a[contains(@href,'${chapterId}')]]/following-sibling::dd[1]/a[${host}]`;
return fun.fetchDoc(siteData.comicListUrl()).then(doc => {
let next = fun.ge(nextXPath, doc);
if (next) {
return next.href;
} else {
return null;
}
})
},
autoNext: true,
prev: 1,
css: "body>table:nth-child(1),body>table:nth-child(3){display:none!important}body>table:nth-child(2),body>table:nth-child(2)>tbody>tr>td{width:100%!important;}body{scrollbar-width:none;-ms-overflow-style:none;overflow-x:hidden;overflow-y:auto}",
category: "comic"
}, {
name: "漫漫聚M/KuKu动漫M m.manmanju.com m.ikuku.cc s1.m.ikkdm.com s2.m.ikkdm.com 1pc570gfrd9z.ihhmh.com s2.wap.ikukudm.com s3.wap.ikukudm.com mh123.dypro.xyz",
enable: 1,
reg: /(m\.manmanju\.com|\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");
if (nextDivEle) {
bottomEle.innerHTML = fun.ge("div", bottomEle).outerHTML + fun.ge("p", bottomEle).outerHTML;
} else {
bottomEle(".bottom").innerHTML = fun.ge("p", bottomEle).outerHTML;
}
}, 500);
},
imgs: () => {
fun.remove("//a[img] | //ul[center[li]]");
fun.remove(".bottom .subNav~div[style*=height],.bottom .pageLine,.bottom .subNav");
return fun.getKukudmSrc();
},
button: [4],
insertImg: [".imgBox", 2],
go: 1,
autoDownload: [0],
next: () => {
let comicListUrl = fun.ge(".subNav a").href;
let chapterId = location.href.split("/")[5];
let nextXPath = `//li[a[contains(@href,'${chapterId}')]]/preceding-sibling::li[1]/a`;
return fun.fetchDoc(comicListUrl).then(doc => {
let next = fun.ge(nextXPath, doc);
if (next) {
return next.href;
} else {
return null;
}
})
},
autoNext: true,
prev: 1,
customTitle: () => fun.title("在线", 1),
css: ".imgBox{margin-bottom:0px!important}.subNav{border-top:1px solid #dcdcde}",
category: "comic"
}, {
name: "仙漫网 www.gaonaojin.com",
enable: 0,
reg: /www\.gaonaojin\.com\/\w+\/\d+\.html/i,
imgs: () => picdata.map(e => imgDomain + e),
button: [4],
insertImg: [".comicpage", 2],
go: 1,
autoDownload: [0],
next: "//li[a[@class='active']]/preceding-sibling::li[1]/a",
autoNext: true,
prev: "//li[a[@class='active']]/following-sibling::li[1]/a",
customTitle: () => fun.geT("h1.title").replace(/\(\d+\/\d+\)/, "").trim(),
category: "comic"
}, {
name: "仙漫网M m.gaonaojin.com",
enable: 0,
reg: /m\.gaonaojin\.com\/\w+\/\d+\.html/i,
imgs: () => {
let code = [...document.scripts].find(s => s.innerHTML.search(/eval/) > -1).innerHTML.match(/eval.+\)\)/)[0].slice(4);
let imgData = fun.run(fun.run(code).match(/picdata[^;]+/)[0]);
return imgData.map(e => "https://res.xiaoqinre.com/" + e);
},
button: [4],
insertImg: ["#cp_img", 2],
go: 1,
autoDownload: [0],
next: ".btn.next",
autoNext: true,
prev: ".btn.prev",
customTitle: () => fun.title("免费", 1),
category: "comic"
}, {
name: "漫画牛 manhua666.cc www.manhua666.cc 漫画台 manhuatai.org www.manhuatai.org",
enable: 0,
reg: /manhua666\.\w+\/\w+\/\d+\.html|manhuatai\.org\/manhua\/\d+\/\d+\.html/i,
imgs: () => [...fun.doc(imgs.join("")).images],
button: [4],
insertImg: ["#content", 2],
go: 1,
autoDownload: [0],
next: "a[rel=next][href$=html],#next_url",
autoNext: true,
prev: "a[rel=prev][href$=html],#prev_url",
customTitle: () => {
let s = fun.geT(".info-title,.con_top").split(/\s?>/);
return (s[2] + s[3]).trim();
},
category: "comic"
}, {
name: "大树漫画 www.dashumanhua.com",
enable: 0,
reg: /www\.dashumanhua\.com\/comic\/\w+\/.+\.html/i,
imgs: () => {
let code = [...document.scripts].find(s => s.innerHTML.search(/picTree/) > -1).innerHTML;
let m = code.match(/eval.+\)\)/)[0].slice(4);
return fun.run(fun.run(m).slice(12, -1));
},
button: [4],
insertImg: ["#pic-list", 2],
go: 1,
autoDownload: [0],
next: "//a[text()='下一话' and not(contains(@href,'--1'))]",
autoNext: true,
prev: "//a[text()='上一话' and not(contains(@href,'--1'))]",
customTitle: () => fun.title(/\(/, 1),
category: "comic"
}, {
name: "GODA漫画 cocomanga.org godamanga.art",
enable: 0,
reg: /https?:\/\/(cocomanga\.org|godamanga\.art)\/manga\/[a-z0-9-_]+\/[a-z0-9-_]+(\/|\.html)$/i,
delay: 300,
imgs: "//img[@decoding and @layout] | //img[@decoding and contains(@class,'img_content_jpg')]",
insertImg: ["//div[div[div[div[div[img[@decoding and @layout]]]]]] | //div[div[div[div[div[img[@decoding and contains(@class,'img_content_jpg')]]]]]]", 2],
autoDownload: [0],
next: "//a[span[text()='下一话']] | //a[span[text()='NEXT']]",
prev: "//a[span[text()='上一话']] | //a[span[text()='PREV']]",
customTitle: () => fun.geT("h1"),
category: "comic"
}, {
name: "GODA漫畫 godamanga.com cn.godamanga.site gd.godamanga.art cn.godamanga.art cn.godamanga.com 包子漫畫 baozimh.org bz.godamanga.art cn.baozimh.org",
enable: 0,
reg: /https?:\/\/((www|gd|bz|cn)\.)(baozimh|godamanga)\.(art|com|org)\/manga\/[a-z0-9-_]+\/[a-z0-9-_]+/i,
init: async () => {
try {
let script = "//script[contains(text(),'currentManga')]";
await fun.waitEle(script);
let code = fun.geT(script);
let id = code.match(/\\"id\\":(\d+)/)[1];
let api = `https://papi.mgsearcher.com/api/chapters/${id}?fields[0]=chapter_img&encodeValuesOnly=true`;
siteJson = await fetch(api, {
"headers": {
"Authorization": "Bearer b69efef9280150ba3c29ebd02f1dd08b78d9d76a646fea85442c8f806f0037512d3bfab40a27528769b52373f9857edae1b8d74a3198c60f583f223bcccd8fde586cbc8420570a34570b62d2bef66c6aa82da8a3fd0c3dd2dedb18b8ea276f55d56151fe72317f2f38c9f888475f7433e24edebd7775c4aafa98ec9694789da9"
}
}).then(res => res.json());
debug("\n此頁JSON資料\n", siteJson);
} catch (e) {}
},
imgs: async () => {
await fun.waitEle(".touch-manipulation");
try {
if (siteJson.data == null) {
return [];
} else {
return siteJson.data.attributes.chapter_img.map(e => e.url);
}
} catch (e) {
return [...fun.gae(".touch-manipulation img")];
}
},
//insertImg: [".touch-manipulation", 2],
autoDownload: [0],
next: () => {
let next = fun.ge("//a[button[text()='下一話' or text()='下一话']]");
if (next) {
return next.href;
} else {
return null;
}
},
prev: 1,
customTitle: () => fun.geT("ol.inline-flex>li:nth-child(2) a") + " - " + fun.geT("ol.inline-flex>li:nth-child(3) a"),
category: "comic"
}, {
name: "漫畫屋 mh5.tw",
enable: 0,
reg: /mh5\.tw\/(series|seriesvip)-\w+-\d+-\d+/i,
imgs: () => {
let max;
if (/seriesvip/.test(location.href)) {
max = fun.geT("a.cur~a:last-child") - 2;
} else {
max = fun.geT("a.cur~a:last-child") - 1;
}
return fun.getImgIframe(".ptview>img[alt]:not([style])", max, 13, [null, null], ".setnmh-pagedos", 0, 0);
},
insertImg: [".ptview", 1, 0],
autoDownload: [0],
next: "//a[text()='下一話']",
prev: "//a[text()='上一話']",
customTitle: () => {
let ele = fun.ge("h2");
if (ele) {
return fun.geT("h1") + " - " + fun.geT("h2");
} else {
return fun.geT(".setnmh-bookname>a:nth-child(5)") + " - " + fun.geT(".setnmh-bookname>a:nth-child(7)");
}
},
css: ".ptview>img{width:100%!important;height:auto!important;max-width:1000px!important;border:none!important;box-shadow:none!important;padding:0!important;margin:0 auto!important}",
category: "comic"
}, {
name: "七夕漫画 www.qiximh2.com",
enable: 0,
reg: /www\.qiximh\d+\.com\/\d+\/\d+\.html/i,
imgs: ".main_img img",
insertImg: [".main_img", 2],
go: 1,
autoDownload: [0],
next: "//a[img[@alt='下一章'] and contains(@href,'html')]",
autoNext: true,
prev: "//a[img[@alt='上一章'] and contains(@href,'html')]",
customTitle: () => fun.title("_", 3),
category: "comic"
}, {
name: "七夕漫画M m.qiximh2.com",
enable: 0,
reg: /m\.qiximh\d+\.com\/\d+\/\d+\.html/i,
imgs: ".main_img img",
insertImg: [".main_img", 2],
go: 1,
autoDownload: [0],
next: "//a[p[text()='下一篇'] and contains(@href,'html')]",
autoNext: true,
prev: "//a[p[text()='上一篇'] and contains(@href,'html')]",
customTitle: () => {
let s = document.title.replace(" - 七夕漫画", "").split("_");
return s[1] + " - " + s[0];
},
css: ".ad_js{display:none!important}",
category: "comic"
}, {
name: "爱漫之家 www.17fuman.com www2.17fuman.com www.fumanhua-1.com www.fumanhua-2.com www.fumanhua-3.com www2.fumanhua-1.com m.fumanhua-1.com m.fumanhua44.com m.fumanhua66.com m.fumanhua77.com m1.fumanhua-1.com m1.fumanhua44.com m1.fumanhua66.com m1.fumanhua77.com",
enable: 0,
reg: /(www|m)\d?\.(17fuman|fumanhua-?\d+)\.com\/\w+\/\d+\/\d+\.html/i,
init: "document.onkeydown=null",
imgs: () => base64_decode(qTcms_S_m_murl_e).split("$qingtiandy$").map(e => qTcms_m_weburl + e),
insertImg: ["//td[img[@id='qTcms_pic']]", 2],
go: 1,
autoDownload: [0],
next: "#k_Pic_nextArr",
autoNext: true,
prev: "#k_Pic_backArr",
customTitle: () => fun.title(' - ', 3).replace("漫画", ""),
css: ".bd_980_90{display:none!important}",
category: "comic"
}, {
name: "73漫画 www.73mh.net",
enable: 0,
reg: /www\.73mh\.net\/mh\/\w+\//i,
imgs: ".v_con_box img",
insertImg: ["section .v_con_box", 2],
go: 1,
autoDownload: [0],
next: "//a[text()='下一话']",
autoNext: true,
prev: "//a[text()='上一话']",
customTitle: () => fun.geT(".p_select>h2") + " - " + fun.geT(".v-page>span"),
category: "comic"
}, {
name: "漫画160 www.mh160.cc",
enable: 0,
reg: /www\.mh160\.cc\/kanmanhua\/\w+\/\d+\.html/i,
init: "document.onkeydown=null",
imgs: () => base64_decode(qTcms_S_m_murl_e).split("$qingtiandy$").map(e => f_qTcms_Pic_curUrl_realpic(e)),
button: [4],
insertImg: ["//td[//img[@onclick]]", 2],
go: 1,
autoDownload: [0],
next: "#k_Pic_nextArr",
autoNext: true,
prev: "#k_Pic_backArr",
customTitle: () => qTcms_S_m_name + " - " + qTcms_S_m_playm,
category: "comic"
}, {
name: "733 动漫 www.733.so",
enable: 0,
reg: /www\.733\.so\/mh\/\d+\/\d+\/1\.html/i,
imgs: () => [...fun.doc(temp_pic_all).images],
insertImg: ["#pic_box p", 2],
go: 1,
autoDownload: [0],
next: "//a[text()='下一话']",
autoNext: true,
prev: "//a[text()='上一话']",
customTitle: () => fun.geT(".p_select>h2") + " - " + fun.geT(".v-page .ispubu"),
category: "comic"
}, {
name: "733 动漫M m.733.so",
enable: 0,
reg: /m\.733\.so\/mh\/\d+\/\d+\/\d+\.html/i,
imgs: () => [...fun.doc(temp_pic_all).images],
insertImg: [".select_con", 2],
go: 1,
autoDownload: [0],
next: "//a[text()='下一话' and contains(@href,'html')]",
autoNext: true,
prev: "//a[text()='上一话' and contains(@href,'html')]",
customTitle: () => {
let s = document.title.split("-");
return s[1] + " - " + s[0];
},
category: "comic"
}, {
name: "漫画160M m.mh160.cc",
enable: 0,
reg: /m\.mh160\.cc\/kanmanhua\/\w+\/\d+\.html/i,
imgs: () => base64_decode(qTcms_S_m_murl_e).split("$qingtiandy$").map(e => f_qTcms_Pic_curUrl_realpic(e)),
button: [4],
insertImg: [".UnderPage", 2],
go: 1,
autoDownload: [0],
next: "#k_Pic_nextArr",
autoNext: true,
prev: "#k_Pic_backArr",
customTitle: () => qTcms_S_m_name + " - " + qTcms_S_m_playm,
category: "comic"
}, {
name: "漫画库 www.mhko.net",
enable: 0,
reg: /www\.mhko\.net\/comic\/\d+\/\d+\.html/i,
init: () => {
document.onkeydown = null;
let url = siteData.next();
if (url) {
fun.addUrlHtml(url, ".tbCenter", 1);
}
},
imgs: () => {
try {
return base64_decode(qTcms_S_m_murl_e).split("$qingtiandy$");
} catch (e) {
return window.atob(qTcms_S_m_murl_e).split("$qingtiandy$");
}
},
button: [4],
insertImg: ["//td[img[@id='qTcms_pic']]", 2],
go: 1,
autoDownload: [0],
next: () => {
if (qTcms_Pic_nextArr !== "") {
return location.origin + qTcms_Pic_nextArr;
} else {
return null;
}
},
autoNext: true,
prev: 1,
customTitle: () => qTcms_S_m_name + " - " + qTcms_S_m_playm,
css: ".iFloat,#mypic_k0{display:none!important}",
category: "comic"
}, {
name: "笨狗漫画 www.bengou.co m.bengou.co",
enable: 0,
reg: /(www|m)\.bengou\.co\/\w+\/\w+\/\d+\.html/i,
init: () => {
document.onkeydown = null;
},
imgs: () => base64_decode(qTcms_S_m_murl_e).split("$qingtiandy$").map(e => f_qTcms_Pic_curUrl_realpic(e)),
insertImg: ["//td[img[@id='qTcms_pic']]", 2],
go: 1,
autoDownload: [0],
next: () => {
if (qTcms_Pic_nextArr !== "") {
return location.origin + qTcms_Pic_nextArr;
} else {
return null;
}
},
autoNext: true,
prev: 1,
customTitle: () => qTcms_S_m_name + " - " + qTcms_S_m_playm,
css: ".action-list li{width:50% !important}#mypic_k0,.action-list>ul>li:nth-child(n+2):nth-child(-n+3){display:none!important}",
category: "comic"
}, {
name: "星辰漫画网 www.xcmh.com m.xcmh.com",
enable: 1,
reg: /(www|m)\.xcmh\.com\/\w+\/\w+\/\d+\.html/i,
init: () => {
document.onkeydown = null;
},
imgs: () => base64_decode(qTcms_S_m_murl_e).split("$qingtiandy$").map(e => location.origin + f_qTcms_Pic_curUrl_realpic(e)),
insertImg: ["//td[img[@id='qTcms_pic']]", 2],
go: 1,
autoDownload: [0],
next: () => {
if (qTcms_Pic_nextArr !== "") {
return location.origin + qTcms_Pic_nextArr;
} else {
return null;
}
},
autoNext: true,
prev: 1,
customTitle: () => qTcms_S_m_name + " - " + qTcms_S_m_playm,
css: "#mypic_k0{display:none!important}",
category: "comic"
}, {
name: "酷酷屋 www.kukuwumh.com m.kukuwumh.com",
enable: 0,
reg: /(www|m)\.kukuwumh\.com\/manhua\/\w+\/\d+\.html/,
init: "document.onkeydown=null",
imgs: () => base64_decode(qTcms_S_m_murl_e).split("$qingtiandy$"),
insertImg: ["//td[//img[@onclick]]", 2],
go: 1,
autoDownload: [0],
next: "#k_Pic_nextArr",
autoNext: true,
prev: "#k_Pic_backArr",
customTitle: () => {
if (/www\.kukuwumh\.com/.test(location.origin)) {
return fun.geT("#skin~h1") + " - " + fun.geT("#skin~h2");
} else {
let s = document.title.split(" - ");
return (s[1] + " - " + s[0]).replace("漫画", "");
}
},
category: "comic"
}, {
name: "木马漫画 www.omyschool.com",
enable: 0,
reg: /www\.omyschool\.com\/article_detail\/\d+\/\d+\/.+\/.+\//i,
imgs: "#imgs amp-img",
button: [4],
insertImg: ["#imgs", 2],
go: 1,
autoDownload: [0],
next: ".nav_button.next",
autoNext: true,
prev: ".nav_button.prev",
customTitle: () => fun.geT("//a/span[@property and not(i)]") + " - " + fun.geT("//li/span[@property and not(i)]"),
category: "comic"
}, {
name: "砂之船动漫家 www.szcdmj.com",
enable: 0,
reg: /www\.szcdmj\.com\/szcchapter\/\d+/i,
include: ".comiclist",
imgs: async () => {
await fun.getNP(".comicpage>div", "//a[@href and text()='下一页']", null, ".fanye");
return [...fun.gae("img.lazy")];
},
button: [4],
insertImg: [".comiclist", 2],
go: 1,
autoDownload: [0],
next: "//a[text()='下一话']",
autoNext: true,
prev: "//a[text()='上一话']",
customTitle: () => fun.geT("h1.title"),
category: "comic"
}, {
name: "砂之船动漫家M www.szcdmj.com",
enable: 0,
reg: /www\.szcdmj\.com\/szcchapter\/\d+/i,
include: "#cp_img",
imgs: async () => {
await fun.getNP("#cp_img>img[data-original]", "//a[@href and text()='下一页']", null, ".view-bottom-bar");
return [...fun.gae("#cp_img>img[data-original]")];
},
insertImg: ["#cp_img", 2],
go: 1,
autoDownload: [0],
next: "//a[text()='下一话']",
autoNext: true,
prev: "//a[text()='上一话']",
customTitle: () => bookInfo.book_name + " - " + bookInfo.chapter_name,
category: "comic"
}, {
name: "雪人漫画 www.xuerenmanhua.com",
enable: 0,
reg: /www\.xuerenmanhua\.com\/chapter\/\d+/i,
include: ".comiclist",
imgs: ".comiclist img",
button: [4],
insertImg: [".comicpage", 2],
go: 1,
autoDownload: [0],
next: "//a[text()='下一章']",
autoNext: true,
prev: "//a[text()='上一章']",
customTitle: () => fun.geT("h1.title"),
category: "comic"
}, {
name: "雪人漫画M www.xuerenmanhua.com",
enable: 0,
reg: /www\.xuerenmanhua\.com\/chapter\/\d+/i,
imgs: "#cp_img>img[data-original]",
button: [4],
insertImg: ["#cp_img", 2],
go: 1,
autoDownload: [0],
next: "//a[text()='下一章']",
autoNext: true,
prev: "//a[text()='上一章']",
customTitle: () => bookInfo.book_name + " - " + bookInfo.chapter_name,
category: "comic"
}, {
name: "好漫6 www.haoman6.com",
enable: 0,
reg: /www\.haoman6\.com\/chapter\/\d+/,
imgs: "img[data-ecp]",
insertImg: [".rd-article-wr", 2],
go: 1,
autoDownload: [0],
next: ".j-rd-next",
autoNext: true,
prev: ".j-rd-prev",
customTitle: () => fun.geT(".j-comic-title").replace("(最新在线)", "") + " - " + fun.geT(".last-crumb"),
category: "comic"
}, {
name: "好漫8 haoman8.com",
enable: 0,
reg: /haoman8\.com\/comic\/\d+\/\d+/,
imgs: "img[data-echo]",
insertImg: ["#reader-scroll", 2],
go: 1,
autoDownload: [0],
next: "#js_pageNextBtn",
autoNext: true,
prev: "#js_pagePrevBtn",
customTitle: () => fun.geT("#crumbComicLink") + " - " + fun.geT("#js_headChapterName"),
category: "comic"
}, {
name: "拷貝漫畫 www.copymanga.site copymanga.site www.mangacopy.com mangacopy.com",
enable: 1,
reg: /(www\.)?(copymanga\.site|mangacopy\.com)\/comic\/\w+\/chapter\/.+/,
delay: 300,
init: async () => {
document[_0x1f93("0x1b")][_0x1f93("0x27")] = null;
$(document).unbind("click");
$(document).unbind("keydown");
$(document).unbind("keyup");
const hidetoolbar = () => {
var e = e || window.event;
if (e.wheelDelta < 0 || e.detail > 0) {
$("h4.header").attr("style", "top: -30px;");
$("div.footer").attr("style", "bottom: -41px;");
} else {
$("h4.header").removeAttr("style");
$("div.footer").removeAttr("style");
}
};
document.addEventListener("wheel", hidetoolbar);
document.addEventListener("DOMMouseScroll", hidetoolbar);
const keyhidetoolbar = (e) => {
let key = window.event ? e.keyCode : e.which;
if (key == "34" || key == "32" || key == "40") {
$("h4.header").attr("style", "top: -30px;");
$("div.footer").attr("style", "bottom: -41px;");
} else {
$("h4.header").removeAttr("style");
$("div.footer").removeAttr("style");
}
};
document.addEventListener("keydown", keyhidetoolbar);
let api;
if (/mangacopy/.test(location.origin)) {
api = location.href.replace(/.*?(?=\/comic\/)/, "https://api.mangacopy.com/api/v3");
} else {
api = location.href.replace(/.*?(?=\/comic\/)/, "https://api.copymanga.site/api/v3");
}
let json = await fetch(api).then(res => res.json());
siteJson = json;
debug("\n此頁JSON資料\n", json);
},
button: [4],
imgs: () => siteJson.results.chapter.contents.map(e => e.url),
insertImg: [".comicContent-list", 2],
go: 1,
autoDownload: [0],
next: "//a[text()='下一話'][starts-with(@href,'/comic/')]",
autoNext: true,
prev: "//a[text()='上一話'][starts-with(@href,'/comic/')]",
customTitle: () => siteJson.results.comic.name + " - " + siteJson.results.chapter.name,
topButton: true,
css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}.header+div[style],.comicContainerAds{display:none!important}",
category: "comic"
}, {
name: "拷貝漫畫M www.copymanga.site copymanga.site www.mangacopy.com mangacopy.com",
enable: 1,
reg: /(www\.)?copymanga\.site\/h5\/comicContent\/\w+\/.+/,
xhr: () => {
let s = location.href.split("/").slice(-2);
let api;
if (/mangacopy/.test(location.origin)) {
api = `https://api.mangacopy.com/api/v3/comic/${s[0]}/chapter/${s[1]}`;
} else {
api = `https://api.copymanga.site/api/v3/comic/${s[0]}/chapter/${s[1]}`;
}
return new Promise(resolve => {
_GM_xmlhttpRequest({
method: "GET",
url: api,
responseType: "json",
headers: {
"Referer": `https://${location.hostname}/comic/${s[0]}/chapter/${s[1]}`,
"User-Agent": PcUa
},
onload: data => {
resolve(data.response);
}
});
});
},
init: async () => {
siteJson = await siteData.xhr();
debug("\n此頁JSON資料\n", siteJson);
const addHtml = (url, text) => {
let str = `<div style="padding: 10px 0; text-align: center;"><a href="${url}"style="width: 100%;font-size: 26px;line-height: 50px;height: 50px;text-align: center;">${text}</a></div>`;
fun.ge(".comicContentPopupImageList").insertAdjacentHTML("afterend", str);
};
let s = location.href.split("/").slice(-2);
let url = `https://${location.hostname}/h5/details/comic/${s[0]}`;
addHtml(`https://${location.hostname}/h5/index`, "首頁");
addHtml(url, "目錄");
let nUrl = siteData.next();
if (nUrl) {
addHtml(nUrl, "點選進入下一話");
}
},
imgs: () => siteJson.results.chapter.contents.map(e => e.url),
button: [4],
insertImg: [".comicContentPopupImageList", 2],
go: 1,
next: () => {
let next = siteJson.results.chapter.next;
if (next) {
return location.href.replace(/[\w-]+$/, "") + next;
} else {
return null;
}
},
customTitle: () => siteJson.results.comic.name + " - " + siteJson.results.chapter.name,
css: ".comicFixed{display:none!important}",
category: "comic"
}, {
name: "二次元動漫 www.2animx.com",
enable: 0,
reg: /www\.2animx\.com\/index-look-name-.+/,
init: "$(document).unbind('click');",
imgs: () => fun.getImgO("#ComicPic", $("#total").val(), 20, [null, null], 0, "div.b,.e>p", 0),
button: [4],
insertImg: ["#img_ad_img", 1],
autoDownload: [0],
next: ".n.zhangjie",
autoNext: true,
prev: ".p.zhangjie",
customTitle: () => fun.geT(".e>p").replace(/(\d+P) - 第 \d+ \/ \d+ 頁/, ""),
topButton: true,
css: ".c>*:not(.n.zhangjie):not(.p.zhangjie){display:none!important;}#ComicPic{display:block!important;margin: 0 auto !important;}",
category: "comic"
}, {
name: "酷漫屋 www.kumw9.com m.kumw9.com",
enable: 0,
reg: /(www|m)\.kumw\d\.com\/\d+\/\d+\.html/,
imgs: ".main_img img",
button: [4],
insertImg: [".main_img", 2],
go: 1,
autoDownload: [0],
next: "//a[img[@alt='下一章']] | //a[i[@class='i-rd-next'] and contains(@href,'html')]",
autoNext: true,
prev: "//a[img[@alt='上一章']] | //a[i[@class='i-rd-prev'] and contains(@href,'html')]",
customTitle: () => {
try {
return fun.geT(".chaptitle").replace(">", "-");
} catch (e) {
let s = document.title.replace(" - 酷漫屋", "").split("_");
return s[1] + " - " + s[0];
}
},
category: "comic"
}, {
name: "速漫库 qumanku.com www.sumanku.com",
enable: 0,
reg: /https?:\/\/(www.)?\w+manku\.com\/\w+\/\w+\.html/i,
imgs: ".main_img img",
button: [4],
insertImg: [".main_img", 2],
go: 1,
autoDownload: [0],
next: "//a[span[text()='下一章']]",
autoNext: true,
prev: "//a[span[text()='上一章']]",
customTitle: () => fun.attr("meta[itemprop=mhname]", "content") + " - " + fun.geT(".chaptitle"),
category: "comic"
}, {
name: "漫画DB www.manhuadb.com",
enable: 0,
reg: /www\.manhuadb\.com\/manhua\/\d+\/\w+\.html$/,
imgs: async () => {
return img_data_arr.map(e => {
if (is_webp && e.img_webp) {
return img_host + img_pre + e.img_webp;
} else {
return img_host + img_pre + e.img;
}
});
},
button: [4],
insertImg: ["#all", 2],
go: 1,
autoDownload: [0],
next: async () => {
return fetch("https://www.manhuadb.com/book/goNumPage", {
"headers": {
"content-type": "application/x-www-form-urlencoded; charset=UTF-8"
},
"body": `ccid=${p_ccid}&id=${p_id}&num=${parseInt(vg_r_data.data("num")) + 1}&d=${p_d}&type=next`,
"method": "POST"
}).then(res => res.json()).then(json => {
if (json.state == 0) {
return null;
} else {
return location.origin + json.url;
}
});
},
autoNext: true,
prev: "//a[text()='上集']",
customTitle: () => fun.title("-漫画DB"),
category: "comic"
}, {
name: "快岸漫画 kanbook.net",
enable: 0,
reg: /kanbook\.net\/comic\/\d+\/\d+/,
delay: 1000,
init: "$(document).unbind('keydown');$(document).unbind('keyup');",
imgs: () => {
let arr = [];
if (is_refresh == 0) {
for (let i = 0; i < pageNum; i++) {
arr.push(Gm.getImgUrl(comic_id + "/" + version_id + "/" + part_id + "/" + my_sha2(x_tokens[i])));
}
} else {
for (let i = 0; i < data.url.length; i++) {
arr.push(Gm.getImgUrl(data.url[i]));
}
}
return arr;
},
button: [4],
insertImg: ["#all", 2],
go: 1,
autoDownload: [0],
next: "//a[text()='下一章' and not(starts-with(@href,'javascript'))]",
autoNext: true,
prev: "//a[text()='上一章' and not(starts-with(@href,'javascript'))]",
customTitle: () => fun.geT("h2.h2>a") + " - " + fun.geT("span.h4:nth-child(5)"),
//threading: 4,
css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}",
category: "comic"
}, {
name: "快看漫画 www.kuaikanmanhua.com",
enable: 0,
reg: /www\.kuaikanmanhua\.com\/web\/comic\/\d+\//,
imgs: ".imgList img[data-src]",
insertImg: [".imgList", 2],
autoDownload: [0],
next: "//a[text()='下一话']",
prev: "//a[text()='上一话']",
customTitle: () => fun.geT("h3.title"),
category: "comic"
}, {
name: "腾讯漫画 ac.qq.com",
enable: 0,
reg: /ac\.qq\.com\/ComicView\/index\/id\/\d+\/cid\/\d+/,
imgs: () => {
let nonce = [...document.scripts].find(s => s.innerHTML.search(/^\s+window\[/) > -1).innerHTML.match(/\s*window.*?=(.*?)?;/)[1];
nonce = fun.run(nonce);
const data = DATA.split("");
nonce = nonce.match(/\d+[a-z]+/gi);
let n = nonce.length;
let locate = null;
let str = "";
while (n--) {
locate = parseInt(nonce[n]) & 255;
str = nonce[n].replace(/\d+/g, "");
data.splice(locate, str.length);
}
const base64 = data.join("");
const json = JSON.parse(window.atob(base64));
return json.picture.map(e => e.url);
},
autoDownload: [0],
next: "#nextChapter",
prev: "#prevChapter",
customTitle: () => fun.geT("#chapter") + " - " + fun.geT(".title-comicHeading"),
category: "comic"
}, {
name: "哔哩哔哩漫画 manga.bilibili.com",
enable: 1,
reg: /manga\.bilibili\.com\/mc\d+\/\d+\?from=manga_detail/,
init: () => {
setTimeout(() => {
fun.ge(".load-next-btn").addEventListener("click", () => {
setTimeout(() => {
location.reload();
}, 500)
})
}, 1000)
},
imgs: async () => {
let ep_id = siteUrl.split("/").pop().match(/\d+/)[0];
let headers = {
"content-type": "application/json;charset=UTF-8"
};
let imgsRes = await fetch("/twirp/comic.v1.Comic/GetImageIndex?device=pc&platform=web", {
"headers": headers,
"body": JSON.stringify({
ep_id: `${ep_id}`
}),
"method": "POST"
}).then(res => res.json()).then(json => json.data.images.map(e => e.path));
return fetch("/twirp/comic.v1.Comic/ImageToken?device=pc&platform=web", {
"headers": headers,
"body": JSON.stringify({
urls: JSON.stringify(imgsRes)
}),
"method": "POST"
}).then(res => res.json()).then(json => json.data.map(e => `${e.url}?token=${e.token}`));
},
insertImg: [".image-list", 2],
next: ".load-next-btn",
prev: 1,
customTitle: async () => {
await fun.delay(1500, 0);
return fun.geT(".manga-title") + " - " + fun.geT(".episode");
},
css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}",
category: "comic"
}, {
name: "看漫画 www.kanman.com",
enable: 0,
reg: /www\.kanman\.com\/\d+\/[\w-]+\.html/,
imgs: () => {
let s = location.pathname.split("/");
let comic_id = s[1];
let chapter_newid = s[2].replace(".html", "");
let api = `/api/getchapterinfov2?product_id=1&productname=kmh&platformname=pc&comic_id=${comic_id}&chapter_newid=${chapter_newid}&isWebp=1&quality=middle`;
return fetch(api).then(res => res.json()).then(json => json.data.current_chapter.chapter_img_list);
},
customTitle: async () => {
await fun.delay(1500, 0);
return fun.geT('#crumbComicLink') + " - " + fun.geT('.chapter-title').trim();
},
category: "comic"
}, {
name: "漫蛙 manwa.me", //方向鍵上一章下一章、清除擋廣告警告、向下滾動隱藏工具列、反反偵錯,,下載需先手動觸發全部載入圖片,函式使用到canvas需要繪製過程會有點卡。
enable: 1,
reg: /manwa\.me\/chapter\/\d+(\?img_host=\d)?$/,
init: async () => {
Function.prototype.constructor = () => {};
//await fun.scrollEles(".img-content img", 200);
fun.css(".ad-area{opacity:0!important;}#cp_img>.two-ad-area:nth-child(1)>.ad-area,#cp_img>.two-ad-area:nth-child(2){display:none!important}");
fun.remove(".ad-area,body>div[id]", 5000);
const hidetoolbar = () => {
var e = e || window.event;
if (e.wheelDelta < 0 || e.detail > 0) {
$(".view-fix-top-bar").attr("style", "top: -60px;");
$(".view-fix-bottom-bar").attr("style", "bottom: -60px;");
$(".detail-comment-fix-bottom").hide("fast");
} else {
$(".view-fix-top-bar").attr("style", "top: 0px;");
$(".view-fix-bottom-bar").attr("style", "bottom: 0px;");
$(".detail-comment-fix-bottom").show("fast");
}
};
document.addEventListener("wheel", hidetoolbar);
document.addEventListener("DOMMouseScroll", hidetoolbar);
const keyhidetoolbar = (e) => {
let key = window.event ? e.keyCode : e.which;
if (key == "34" || key == "32" || key == "40") {
$(".view-fix-top-bar").attr("style", "top: -60px;");
$(".view-fix-bottom-bar").attr("style", "bottom: -60px;");
$(".detail-comment-fix-bottom").hide("fast");
} else {
$(".view-fix-top-bar").attr("style", "top: 0px;");
$(".view-fix-bottom-bar").attr("style", "bottom: 0px;");
$(".detail-comment-fix-bottom").show("fast");
}
};
document.addEventListener("keydown", keyhidetoolbar);
if (("ontouchstart" in window) || (navigator.maxTouchPoints > 0) || (navigator.msMaxTouchPoints > 0)) {
let startY, moveY, Y;
$("body").on("touchstart", (e) => {
startY = e.originalEvent.changedTouches[0].pageY;
});
$("body").on("touchmove", (e) => {
moveY = e.originalEvent.changedTouches[0].pageY;
Y = moveY - startY;
if (Y < 0) {
$(".view-fix-top-bar").attr("style", "top: -60px;");
$(".view-fix-bottom-bar").attr("style", "bottom: -60px;");
$(".detail-comment-fix-bottom").hide("fast");
} else if (Y > 0) {
$(".view-fix-top-bar").attr("style", "top: 0px;");
$(".view-fix-bottom-bar").attr("style", "bottom: 0px;");
$(".detail-comment-fix-bottom").show("fast");
}
});
}
},
imgs: () => fun.imgBlobArr(".content-img[src^=blob]"),
next: ".view-fix-bottom-bar-item-menu-next",
prev: ".view-fix-bottom-bar-item-menu-prev",
customTitle: () => fun.title("在线阅读", 1),
css: "body{padding-bottom:0px!important}",
category: "comic"
}, {
name: "漫蛙選目錄展開全部章節 manwa.me",
enable: 1,
icon: 0,
key: 0,
reg: /manwa\.me\/book\/\d+$/,
init: "Function.prototype.constructor=()=>{};titleSelect(this,'#chapter_indexes');charpterMore(this);",
category: "comic"
}, {
name: "漫蛙自動載入更多 manwa.me",
enable: 1,
icon: 0,
key: 0,
reg: /manwa\.me\/update$/,
init: "Function.prototype.constructor=()=>{};",
observerClick: "#loadMore",
category: "comic"
}, {
name: "開車漫画 18p.fun",
enable: 1,
reg: /^https?:\/\/(www\.)?(18p|gohaveababy|imynest|healthway|beforeout)\.[a-z]{2,5}\/(ForInject\/|Article\/|content\/)/,
imgs: async () => {
await fun.waitEle("//script[contains(text(),'_curChap')]");
if (location.hostname != "18p.fun") {
location.replace("https://18p.fun/ForInject/Chapter/?id=" + $_curChap.id);
await fun.delay(3000, 0);
}
await fun.getNP("img[data-src].lazy:not(.demo-lazy)", "//a[@data-url and contains(text(),'下一頁')] | //a[@data-url and contains(text(),'下一章')]", null, "div[class^=picnext]");
return [...fun.gae("img[data-src].lazy:not(.demo-lazy)")];
},
insertImg: ["div[class^=pictures]", 3],
fetch: 1,
css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}",
category: "comic"
}, {
name: "開車漫画 18p.fun",
enable: 0,
icon: 0,
key: 0,
reg: /^https:\/\/18p\.fun\//,
include: ".loadmore>button",
init: () => {
const setImgSrc = () => gae("img.lazy[src$=svg]").forEach(img => {
img.src = img.dataset.src;
});
setImgSrc();
new MutationObserver(() => {
setImgSrc()
}).observe(document.body, {
childList: true,
subtree: true
});
},
observerClick: ".loadmore>button",
openInNewTab: "#itemlist li>a:not([target=_blank])",
css: ".page{display:none!important}.loadmore{display:block!important}",
category: "comic"
}, {
name: "风之动漫 www.fffdm.com",
enable: 1,
reg: /(www\.fffdm\.com|manhua\.fffdm\.com)\/(manhua\/)?\d+\/[^/]+\/$/i,
init: async () => {
let s = location.pathname.split("/").slice(-3);
let mhId = s[0];
let mhcId = s[1];
let api = `https://${location.hostname}/api/manhua/${mhId}/${mhcId}`;
let json = await fetch(api).then(res => res.json());
debug("\n此頁JSON資料\n", json);
siteJson = json;
let url = await siteData.next();
if (url) {
let text = `<div style="padding: 36px 0; text-align: center;"><a href="${url}"style="font-size: 26px;line-height: 50px;height: 50px;text-align: center;">點選進入下一話</a></div>`;
fun.ge("#mh").insertAdjacentHTML("afterend", text);
fun.ge("#mh+div").addEventListener("click", () => {
setTimeout(() => {
location.reload();
}, 200)
});
}
},
imgs: async () => {
let hostArr = ["https://p5.fffdm.live/", "https://p6.fffdm.live/", "https://p1.fffdm.live/"];
let firstPic = siteJson.cont[0];
let testArr = hostArr.map(e => e + firstPic);
let ok = false;
let host;
for (let i in testArr) {
let obj = await fun.checkImgStatus(testArr[i]);
console.log(`確認圖片[${i}]`, obj);
if (obj.ok) {
ok = true;
host = hostArr[i];
break;
}
}
if (ok) {
return siteJson.cont.map(e => host + e);
} else {
return [];
}
},
insertImg: ["#mh", 2],
go: 1,
next: () => {
let comicListUrl = location.href.replace(/[\w-]+\/$/i, "");
let chapter = location.href.match(/[\w-]+\/$/)[0];
let nextXPath = `//div[@id='content']/li[a[@href='${chapter}']]/preceding-sibling::li[1]/a`;
return fun.fetchDoc(comicListUrl).then(doc => {
let next = fun.ge(nextXPath, doc);
if (next) {
return comicListUrl + next.getAttribute("href");
} else {
return null;
}
})
},
autoNext: true,
prev: 1,
customTitle: () => fun.title("第1页", 1),
category: "comic"
}, {
name: "大古漫画 www.dgmanhua.com",
enable: 1,
reg: /www\.(dgmanhua|dagumanhua)\.\w+\/manhua\/\d+\/\d+\.html$/i,
init: async () => {
document.onkeydown = null;
document.onkeyup = null;
let url = await siteData.next();
if (url) {
fun.addUrlHtml(url, ".mh_list", 1);
}
},
imgs: () => fun.getImg(".mh_list img", fun.ge("//script[contains(text(),'totalpage')]").innerHTML.match(/totalpage\s?=\s?(\d+)/)[1], 9),
button: [4],
insertImg: [".mh_list", 2],
go: 1,
next: () => {
let comicListUrl = location.href.replace(/\d+\.html$/, "");
let chapter = location.pathname;
let nextXPath = `//li[a[@href='${chapter}']]/preceding-sibling::li[1]/a`;
return fun.fetchDoc(comicListUrl).then(doc => {
let next = fun.ge(nextXPath, doc);
if (next) {
return location.origin + next.getAttribute("href");
} else {
return null;
}
})
},
autoNext: true,
prev: 1,
customTitle: () => fun.geT(".mh_cont>h1"),
category: "comic"
}, {
name: "大古漫画M m.dgmanhua.com",
enable: 1,
reg: /m\.(dgmanhua|dagumanhua)\.\w+\/manhua\/\d+\/\d+\.html$/i,
init: async () => {
let content = fun.ge("#content,.content");
if (content) {
content.innerHTML = fun.ge("img", content).outerHTML;
}
let url = await siteData.next();
if (url) {
fun.addUrlHtml(url, "#content,.content", 1);
}
},
imgs: async () => {
await fun.getNP("#content img,.content img", "//a[@href and text()='下一页']", null, ".pager,.cpages", 0, null, 0);
return [...fun.gae("#content img,.content img")];
},
button: [4],
insertImg: ["#content,.content", 1],
msg: 0,
next: () => {
let comicListUrl = location.href.replace(/\d+\.html$/, "");
let chapter = location.pathname;
let nextXPath = `//li[a[@href='${chapter}']]/preceding-sibling::li[1]/a`;
return fun.fetchDoc(comicListUrl).then(doc => {
let next = fun.ge(nextXPath, doc);
if (next) {
return location.origin + next.getAttribute("href");
} else {
return null;
}
})
},
//next: "//a[@href and text()='下一章']",
autoNext: true,
prev: "//a[@href and text()='上一章']",
customTitle: () => fun.geT("#bookname") + " - " + fun.geT(".headline"),
css: "#content~a,.content~a,.apjg,.pager a:nth-child(n+2):nth-child(-n+3){display:none!important}.pager a{width:44%!important}#content,.content{width:100%}",
category: "comic"
}, {
name: "大古漫画M m.dgmanhua.com loadMore",
enable: 1,
icon: 0,
key: 0,
reg: /m\.(dgmanhua|dagumanhua)\.\w+\/manhua\//i,
include: "//div[text()='点击加载更多']",
observerClick: "//div[text()='点击加载更多']",
category: "comic"
}, {
name: "哈哈漫画 www.hahacomic.com",
enable: 0,
reg: /^https:\/\/www\.hahacomic\.com\/manhua\/\d+\/\d+\.html/,
imgs: "img[data-original]",
button: [4],
insertImg: [".chapter-images", 2],
go: 1,
autoDownload: [0],
autoNext: true,
next: "//a[label[text()='下一章'] and not(starts-with(@href,'java'))]",
prev: "//a[label[text()='上一章'] and not(starts-with(@href,'java'))]",
category: "comic"
}, {
name: "哈哈漫画 www.hahacomic.com 分類自動翻頁",
enable: 1,
reg: /^https:\/\/www\.hahacomic\.com\/manhua\/list\.html/,
icon: 0,
key: 0,
autoPager: {
ele: ".mdui-col-lg-2",
observer: ".mdui-col-lg-2",
next: () => {
let next = fun.ge("span.current+a", doc);
if (next) {
let num = next.getAttribute("href").match(/\d+/)[0];
return location.href.replace(/\?page=\d+/, "") + "?page=" + num;
} else {
return null;
}
},
re: ".pages",
history: 1
},
openInNewTab: ".mdui-col-lg-2>a",
category: "autoPager"
}, {
name: "爱看漫画 www.qt1588.com m.qt1588.com",
enable: 0,
reg: /^https:\/\/(www|m)\.qt1588\.com\/comic\/[0-9_]+\.html/,
imgs: ".chapter-content img,.hide-scrollbars img",
button: [4],
insertImg: [".chapter-content,.hide-scrollbars", 2],
go: 1,
autoDownload: [0],
next: "//span[starts-with(@class,'next-chapter')]/a[contains(@href,'html')] | //a[p[text()='下一话'] and contains(@href,'html')]",
autoNext: true,
prev: "//span[starts-with(@class,'prev-chapter')]/a[contains(@href,'html')] | //a[p[text()='上一话'] and contains(@href,'html')]",
customTitle: () => fun.title("-在线", 1),
category: "comic"
}, {
name: "漫畫類 自動展開目錄",
enable: 1,
icon: 0,
key: 0,
reg: /((mangabz|xmanhua|dm5|1kkk|qiman\d+|mhxqiu\d|6mh\d+|manben|mkzhan|xianmanwang|qiximh\d|kumw\d)\.com\/[\w-]+\/$)|(m\.dmzj\.com|m\.ymh1234\.com)\/(info|comic)\/\d+\.html$|(acgud|manhua456|mhxin|qwmanhua|zuimh|imitui|xlsmh|dmhua8|pinmh|qmiaomh|dashumanhua|kukuwumh|mh160|szcdmj|haoman6)\.(com|cc)\/(comic|manhua|manga|kanmanhua|szcbook)\/[\w-]+\/?$|www\.mhua5\.com\/[\w-]+\.html|m\.aiguoman\.com\/comic\/\w+|(www|m)\.77mh\.\w+\/colist_\d+\.html|www\.manhw\.com\/index\.php\/comic\/\w+$/,
init: async () => {
if (location.hostname == "m.acgud.com") {
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: "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 自動簽到",
icon: 0,
key: 0,
reg: /^https?:\/\/94i\.in\//,
autoClick: "#pper_a:not([style='display: none;'])",
category: "none"
}, {
name: "Supjav 立即顯示影片縮圖",
icon: 0,
key: 0,
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 自動跳轉",
icon: 0,
key: 0,
reg: /^https?:\/\/ouo\./,
init: async () => {
let ele = "#btn-main:not(.disabled)";
if (await fun.waitEle(ele)) {
fun.ge(ele).click();
//elementClick(fun.ge(ele));
}
},
category: "none"
}, {
name: "cuty.io 自動跳轉",
icon: 0,
key: 0,
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();
//elementClick(fun.ge(ele));
}
},
category: "none"
}, {
name: "m.4khd.com 自動跳轉",
icon: 0,
key: 0,
reg: /^https?:\/\/m\.4khd\.com\//,
init: () => {
location.href = fun.ge("//a[text()='GET LINK']").href;
},
category: "none"
}, {
name: "4kup.net 自動跳轉",
icon: 0,
key: 0,
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();
//elementClick(fun.ge(eleArr[i]));
await fun.delay(200);
}
},
category: "none"
}, {
name: "MediaFire 自動下載",
icon: 0,
key: 0,
reg: /^https?:\/\/www\.mediafire\.com\//,
autoClick: ".download_link:not(.started) #downloadButton",
category: "none"
}, {
name: "anonfiles 自動下載",
icon: 0,
key: 0,
reg: /^https?:\/\/anonfiles\.com\//,
autoClick: ["#download-url"],
category: "none"
}, {
name: "letsupload 自動下載",
icon: 0,
key: 0,
reg: /^https?:\/\/letsupload\.cc\//,
autoClick: ["#download-url"],
category: "none"
}, {
name: "stfly.me 半自動跳轉",
icon: 0,
key: 0,
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();
//elementClick(fun.ge(".btn-captcha:not(.disable)"));
}, 3000);
}
},
category: "none"
}, {
name: "link1s 自動跳轉",
icon: 0,
key: 0,
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();
//elementClick(fun.ge("//button[@onclick='link1sgo()'] | //a[@id='link1s'] | //a[text()='Get Link']"));
}
},
category: "none"
}, {
name: "網址清單新分頁開啟",
icon: 0,
key: 0,
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",
icon: 0,
key: 0,
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",
reg: /^https?:\/\/\w+\.hathitrust\.org\/cgi\/pt\?id=/,
imgs: () => {
return fun.imgBlobArr(".image>img");
//return fun.imgBlobArr(".image>img", 2);
//return fun.imgBlobArr(".image>img", 2, "image/png");
},
category: "none"
}, {
name: "測試2 test2",
enable: 0,
reg: /www.htmleaf.com|idoitmyself.xyz/,
init: async () => {
await fun.delay(4000, 0);
/*
html2canvas(document.querySelector("canvas")).then(canvas => {
let base64Url = canvas.toDataURL("image/jpeg");
console.log("base64Url", base64Url);
});
*/
},
category: "none"
}, {
name: "Civitai models civitai.com",
reg: /^https:\/\/civitai\.com\/models\/\d+/,
delay: 2000,
init: async () => {
await fun.waitEle(".mantine-u0eh0m");
let div = document.createElement("div");
div.className = "imgBox";
let x = fun.ge(".mantine-u0eh0m");
x.parentNode.insertBefore(div, x.nextSibling);
fun.CivitAiAutoShowNSFW();
},
imgs: () => [...fun.gae(".mantine-116dglk .mantine-7aj0so")].map(e => e.src.replace(/\/width=\d+\//, "/").replace("transcode=true,width=450", "transcode=true")),
repeat: 1,
button: [4],
insertImg: [".imgBox", 3],
go: 1,
fetch: 1,
customTitle: () => fun.geT(".mantine-Title-root").replace(/\|\s/, "").replace(/\//g, "-") + " - " + fun.geT(".mantine-z8ikjj"),
openInNewTab: "a[href]:not([target=_blank])",
observerTitle: true,
category: "AI"
}, {
name: "Civitai posts civitai.com",
reg: /^https:\/\/civitai\.com\/posts\/\d+/,
delay: 2000,
init: () => {
fun.CivitAiAutoShowNSFW();
},
imgs: async () => {
await fun.waitEle("a[rel='nofollow noindex'] img,video[src]");
await fun.delay(200, 0);
return [...fun.gae("a[rel='nofollow noindex'] img,video[src]")].map(e => e.src.replace(/\/width=\d+\//, "/").replace("transcode=true,width=450", "transcode=true"));
},
repeat: 1,
button: [4],
insertImg: [
[".mantine-Stack-root", 0], 2
],
go: 1,
fetch: 1,
openInNewTab: "a[href]:not([target=_blank])",
category: "AI"
}, {
name: "CivitAi Auto Show NSFW civitai.com",
reg: /^https:\/\/civitai\.com\//,
delay: 2000,
icon: 0,
key: 0,
init: () => {
fun.CivitAiAutoShowNSFW();
},
openInNewTab: "a[href]:not([target=_blank])",
category: "AI"
}];
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: "建議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中鍵:捲動至第一張大圖\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: "取消縮放"
};
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: "建议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中键:卷动至第一张大图\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: "取消缩放"
};
break;
default:
displayLanguage = {
str_01: "Get Element...",
str_02: "Get Element ",
str_03: "Get timed out",
str_04: "Wait Element...",
str_05: "Get Data...",
str_06: "Get Data ",
str_07: "Confirm login status",
str_08: "Get preview thumbnail",
str_09: "Get Element...",
str_10: "whether to copy link to clipboard?",
str_11: "Copied",
str_12: "Only link can be copied",
str_13: "Please enter the number of pictures",
str_14: "Get next page...",
str_15: "Get next page end",
str_16: "Get Element...",
str_17: "Get Element ",
str_18: "All pictures gathered",
str_19: "element does not exist",
str_20: "No pictures",
str_21: "Delay",
str_22: "ms",
str_23: "No. ",
str_24: "P download ",
str_25: "completed",
str_26: "error",
str_27: "download failed",
str_28: "P No compression",
str_29: "It is recommended to F5 to re-download",
str_30: "Image extension error",
str_31: "Compression progress: ",
str_32: "Countdown ",
str_33: " sec",
str_34: "JS Go to next page",
str_35: "Next page clicked",
str_36: "Automatic download completed",
str_37: "No next page element",
str_38: "return to previous page",
str_39: "Previous page clicked",
str_40: "No previous page element",
str_41: "Cancelled",
str_42: "Cancelled",
str_43: "Download failed data is empty",
str_44: "No picture element",
str_45: "Image URL copied ",
str_46: "About to scroll...",
str_47: "left click:Download and compress\nmiddle click:Scroll to first picture\nleft click:Copy image URL and title or aggregate images",
str_48: "Downloading & compressing, please try again later!",
str_49: "Get Pictureing Please try again later!",
str_50: "Please enter selector:\nexample:img#TheImg OR //img[@id='TheImg']",
str_51: "Please enter a custom zip file folder name",
str_52: "Number of pictures",
str_53: "Picture drawing...",
str_54: "403,Not logged in to website?",
str_55: "Download Loading...",
str_56: "Check picture statusing...",
str_57: "AutoPager Loading...",
str_58: "Reached the last page",
str_59: "no main element",
str_60: "Image zoom",
str_61: "Cancel zoom"
};
break;
}
//console.log("\ndisplayLanguage\n", displayLanguage);
let _GM_xmlhttpRequest;
if (typeof GM_xmlhttpRequest != "undefined") {
_GM_xmlhttpRequest = GM_xmlhttpRequest;
} else if (typeof GM != "undefined" && typeof GM.xmlHttpRequest != "undefined") {
_GM_xmlhttpRequest = GM.xmlHttpRequest;
}
const fun = {
getImg: async (img, maxPage = 1, mode = 1, rText = [null, null]) => {
if (fun.ge(".FullPictureLoadImage")) return [...fun.gae(".FullPictureLoadImage")];
fetching = true;
fun.show(displayLanguage.str_01, 0);
let imgsArray = [];
let fetchNum = 0;
const html = url => fetch(url).then(res => {
if (res.status > 400) {
debug(`\nfun.getImg()連線錯誤碼:${res.status}\n`, url);
}
return res.arrayBuffer()
}).then(buffer => {
debug(`\nfun.getImg() URL`, url);
const decoder = new TextDecoder(document.characterSet || document.charset || document.inputEncoding);
const htmlText = decoder.decode(buffer);
/*
let doc = fun.doc(htmlText);
let imgs = [...doc.images];
for (let i in imgs) {
let check = fun.checkImgSrc(imgs[i], rText);
if (check.ok) {
new Image().src = check.src;
}
}
*/
fun.show(`${displayLanguage.str_02}${fetchNum+=1}/${maxPage}`, 0);
return htmlText;
}).catch(error => {
debug(`\nfun.getImg() > fetch()出錯:\n${decodeURI(url)}`, error);
});
const resArr = [];
resArr.push(html(siteUrl));
if (maxPage > 1) {
for (let i = 2; i <= maxPage; i++) {
if (mode === 1) {
//【.html ==> .html?page=2】第一頁 ==> 第二頁
//【 ==> ?page=2】第一頁 ==> 第二頁
resArr.push(html(siteUrl.replace(/\?page=\d+$/, "") + "?page=" + i));
} else if (mode === 2) {
//【.html ==> /2.html】 第一頁 ==> 第二頁
resArr.push(html(siteUrl.slice(0, -5) + "/" + i + ".html"));
} else if (mode === 3) {
//【.html ==> _1.html】 第一頁 ==> 第二頁
//resArr.push(html(siteUrl.replace(/(_\d+)?\.html$/, "") + "_" + (i - 1) + ".html"));
resArr.push(html(siteUrl.replace(/\.html$/, "") + "_" + (i - 1) + ".html"));
} else if (mode === 4) {
//【/ ==> /2/】 第一頁 ==> 第二頁
resArr.push(html(siteUrl.slice(0, -1) + "/" + i + "/"));
} else if (mode === "4") {
//【 ==> /2】 第一頁 ==> 第二頁
resArr.push(html(siteUrl + "/" + i));
} else if (mode === 5) {
//【.html ==> -2.html】 第一頁 ==> 第二頁
resArr.push(html(siteUrl.replace(/\.html$/, "") + "-" + i + ".html"));
} else if (mode === "5") {
//【-1.html ==> -2.html】 第一頁 ==> 第二頁
resArr.push(html(siteUrl.replace(/(-\d+)?\.html$/, "") + "-" + i + ".html"));
} else if (mode === 6) {
//【?p=1 ==> ?p=2】 第一頁 ==> 第二頁
resArr.push(html(siteUrl.replace(/\?p=\d+$/, "") + "?p=" + i));
} else if (mode === 7) {
//【/1 ==> /2】 第一頁 ==> 第二頁
//【.html ==> .html/2】 第一頁 ==> 第二頁
resArr.push(html(siteUrl.replace(/\/\d+$/, "") + "/" + i));
} else if (mode === 8) {
//【 ==> &page=1】 第一頁 ==> 第二頁
resArr.push(html(siteUrl.replace(/&page=\d+$/, "") + "&page=" + (i - 1)));
} else if (mode === "8") {
//【 ==> &page=2】 第一頁 ==> 第二頁
resArr.push(html(siteUrl.replace(/&page=\d+$/, "") + "&page=" + i));
} else if (mode === 9) {
//【.html ==> _2.html】 第一頁 ==> 第二頁
resArr.push(html(siteUrl.replace(/(_\d+)?\.html$/, "") + "_" + i + ".html"));
} else if (mode === 10) {
//【.html ==> .html/2】 第一頁 ==> 第二頁
resArr.push(html(siteUrl.replace(/\.html(\/\d+)?$/, "") + ".html/" + i));
} else if (mode === 11) {
//【/ ==> /2.html】 第一頁 ==> 第二頁
//【/1.html ==> /2.html】 第一頁 ==> 第二頁
resArr.push(html(siteUrl.replace(/\/(\d+\.html)?$/, "") + "/" + i + ".html"));
} else if (mode === 12) {
//【/ ==> /2.htm】 第一頁 ==> 第二頁
//【/1.htm ==> /2.htm】 第一頁 ==> 第二頁
resArr.push(html(siteUrl.replace(/\/(\d+\.htm)?$/, "") + "/" + i + ".htm"));
} else if (mode === 13) {
//【-1-* ==> -2-*】 第一頁 ==> 第二頁
resArr.push(html(siteUrl.replace(/-\d+-[^-]+$/, "") + "-" + i));
} else if (mode === 14) {
//【/1/ ==> /2/】 第一頁 ==> 第二頁
resArr.push(html(siteUrl.replace(/\/\d+\/$/, "") + "/" + i + "/"));
} else if (mode === 15) {
//【/index.html ==> /index_2.html】 第一頁 ==> 第二頁
resArr.push(html(siteUrl.replace(/\/(index(_\d+)?\.html)?$/, "") + "/index_" + i + ".html"));
} else if (mode === 16) {
//【 ==> /2#list】 第一頁 ==> 第二頁
resArr.push(html(siteUrl.replace(/\/(index(_\d+)?\.html)?$/, "") + "/" + i + "#list"));
} else if (mode === 17) {
//【.htm ==> _2.htm】 第一頁 ==> 第二頁
resArr.push(html(siteUrl.replace(/(_\d+)?\.htm$/, "") + "_" + i + ".htm"));
} else if (mode === 18) {
//【/ ==> /page/2/】 第一頁 ==> 第二頁
resArr.push(html(siteUrl.replace(/\/(page\/\d+\/)?$/, "") + "/page/" + i + "/"));
} else if (mode === 19) {
//【-1 ==> -2】 第一頁 ==> 第二頁
resArr.push(html(siteUrl.replace(/-\d+$/, "") + "-" + i));
} else if (mode === 20) {
//【 ==> -p-2】 第一頁 ==> 第二頁
resArr.push(html(siteUrl.replace(/-p-\d+$/, "") + "-p-" + i));
}
}
}
await Promise.all(resArr).then(htmls => {
fetching = false;
fun.hide();
for (let i = 0; i < htmls.length; i++) {
let doc = fun.doc(htmls[i]);
let imgs = [...fun.gae(img, doc)];
debug(`\nfun.getImg() DOM${i}`, doc);
for (let p = 0; p < imgs.length; p++) {
let check = fun.checkImgSrc(imgs[p], rText);
if (check.ok) {
imgsArray.push(decodeURI(check.src));
continue;
} else {
debug(`\nfun.getImg() imgs[${p}]錯誤`, imgs[p]);
continue;
}
}
}
});
debug("\nfun.getImg() 聚集的所有IMG", imgsArray);
return imgsArray;
},
getImgO: async (img, maxPage = 1, mode = 1, rText = [null, null], time = 200, replaceElement = null, msg = 1) => {
if (fun.ge(".FullPictureLoadImage")) return [...fun.gae(".FullPictureLoadImage")];
fetching = true;
if (msg == 1) fun.show(displayLanguage.str_01, 0);
let imgsArray = [];
let fetchNum = 0;
const html = async (url, id = 1) => {
await fun.delay(time, 0);
return fetch(url).then(async res => {
debug(`\nfun.getImgO() URL`, url);
if (res.status === 403) {
fun.show(displayLanguage.str_54, 3000);
}
return res.arrayBuffer();
}).then(buffer => {
const decoder = new TextDecoder(document.characterSet || document.charset || document.inputEncoding);
const htmlText = decoder.decode(buffer);
let doc = fun.doc(htmlText);
[...fun.gae(img, doc)].forEach(ele => {
let check = fun.checkImgSrc(ele);
if (ele.tagName == "IMG" && check.ok) {
ele.src = check.src;
}
if (id == 1) {
let targetEle = [...fun.gae(img)].pop();
targetEle.parentNode.insertBefore(ele.cloneNode(true), targetEle.nextSibling);
}
});
if (typeof replaceElement == "string") {
fun.gae(".invisible", doc).forEach(ele => {
ele.classList.remove("invisible");
});
let currentPageEles = [...fun.gae(replaceElement)];
let nextPageEles = [...fun.gae(replaceElement, doc)];
if (currentPageEles.length === nextPageEles.length) {
for (let i in currentPageEles) {
currentPageEles[i].outerHTML = nextPageEles[i].outerHTML;
}
}
}
if (msg == 1) fun.show(`${displayLanguage.str_02}${fetchNum+=1}/${maxPage}`, 0);
return htmlText;
}).catch(error => {
debug(`\nfun.getImgO() > fetch()出錯:\n${decodeURI(url)}`, error);
});
};
const resArr = [];
resArr.push(html(siteUrl, 0));
if (maxPage > 1) {
for (let i = 2; i <= maxPage; i++) {
if (mode === 1) {
//【.html ==> .html?page=2】第一頁 ==> 第二頁
//【 ==> ?page=2】第一頁 ==> 第二頁
resArr.push(await html(siteUrl.replace(/\?page=\d+$/, "") + "?page=" + i));
} else if (mode === 2) {
//【.html ==> /2.html】 第一頁 ==> 第二頁
resArr.push(await html(siteUrl.slice(0, -5) + "/" + i + ".html"));
} else if (mode === 3) {
//【.html ==> _1.html】 第一頁 ==> 第二頁
resArr.push(await html(siteUrl.replace(/(_\d+)?\.html$/, "") + "_" + (i - 1) + ".html"));
} else if (mode === 4) {
//【/ ==> /2/】 第一頁 ==> 第二頁
resArr.push(await html(siteUrl.slice(0, -1) + "/" + i + "/"));
} else if (mode === "4") {
//【 ==> /2】 第一頁 ==> 第二頁
resArr.push(await html(siteUrl + "/" + i));
} else if (mode === 5) {
//【.html ==> -2.html】 第一頁 ==> 第二頁
resArr.push(await html(siteUrl.replace(/\.html$/, "") + "-" + i + ".html"));
} else if (mode === "5") {
//【-1.html ==> -2.html】 第一頁 ==> 第二頁
resArr.push(await html(siteUrl.replace(/(-\d+)?\.html$/, "") + "-" + i + ".html"));
} else if (mode === 6) {
//【?p=1 ==> ?p=2】 第一頁 ==> 第二頁
resArr.push(await html(siteUrl.replace(/\?p=\d+$/, "") + "?p=" + i));
} else if (mode === 7) {
//【/1 ==> /2】 第一頁 ==> 第二頁
//【.html ==> .html/2】 第一頁 ==> 第二頁
resArr.push(await html(siteUrl.replace(/\/\d+$/, "") + "/" + i));
} else if (mode === 8) {
//【 ==> &page=1】 第一頁 ==> 第二頁
resArr.push(await html(siteUrl.replace(/&page=\d+$/, "") + "&page=" + (i - 1)));
} else if (mode === "8") {
//【 ==> &page=2】 第一頁 ==> 第二頁
resArr.push(await html(siteUrl.replace(/&page=\d+$/, "") + "&page=" + i));
} else if (mode === 9) {
//【.html ==> _2.html】 第一頁 ==> 第二頁
resArr.push(await html(siteUrl.replace(/(_\d+)?\.html$/, "") + "_" + i + ".html"));
} else if (mode === 10) {
//【.html ==> .html/2】 第一頁 ==> 第二頁
resArr.push(await html(siteUrl.replace(/\.html(\/\d+)?$/, "") + ".html/" + i));
} else if (mode === 11) {
//【/ ==> /2.html】 第一頁 ==> 第二頁
//【/1.html ==> /2.html】 第一頁 ==> 第二頁
resArr.push(await html(siteUrl.replace(/\/(\d+\.html)?$/, "") + "/" + i + ".html"));
} else if (mode === 12) {
//【/ ==> /2.htm】 第一頁 ==> 第二頁
//【/1.htm ==> /2.htm】 第一頁 ==> 第二頁
resArr.push(await html(siteUrl.replace(/\/(\d+\.htm)?$/, "") + "/" + i + ".htm"));
} else if (mode === 13) {
//【-1-* ==> -2-*】 第一頁 ==> 第二頁
resArr.push(await html(siteUrl.replace(/-\d+-[^-]+$/, "") + "-" + i));
} else if (mode === 14) {
//【/1/ ==> /2/】 第一頁 ==> 第二頁
resArr.push(await html(siteUrl.replace(/\/\d+\/$/, "") + "/" + i + "/"));
} else if (mode === 15) {
//【/index.html ==> /index_2.html】 第一頁 ==> 第二頁
resArr.push(await html(siteUrl.replace(/\/(index(_\d+)?\.html)?$/, "") + "/index_" + i + ".html"));
} else if (mode === 16) {
//【 ==> /2#list】 第一頁 ==> 第二頁
resArr.push(await html(siteUrl.replace(/\/(index(_\d+)?\.html)?$/, "") + "/" + i + "#list"));
} else if (mode === 17) {
//【.htm ==> _2.htm】 第一頁 ==> 第二頁
resArr.push(await html(siteUrl.replace(/(_\d+)?\.htm$/, "") + "_" + i + ".htm"));
} else if (mode === 18) {
//【/ ==> /page/2/】 第一頁 ==> 第二頁
resArr.push(await html(siteUrl.replace(/\/(page\/\d+\/)?$/, "") + "/page/" + i + "/"));
} else if (mode === 19) {
//【-1 ==> -2】 第一頁 ==> 第二頁
resArr.push(await html(siteUrl.replace(/-\d+$/, "") + "-" + i));
} else if (mode === 20) {
//【 ==> -p-2】 第一頁 ==> 第二頁
resArr.push(await html(siteUrl.replace(/-p-\d+$/, "") + "-p-" + i));
}
}
}
await Promise.all(resArr).then(htmls => {
fetching = false;
fun.hide();
for (let i = 0; i < htmls.length; i++) {
let doc = fun.doc(htmls[i]);
let imgs = [...fun.gae(img, doc)];
debug(`\nfun.getImgO() DOM${i}`, doc);
for (let p = 0; p < imgs.length; p++) {
let check = fun.checkImgSrc(imgs[p], rText);
if (check.ok) {
imgsArray.push(decodeURI(check.src));
continue;
} else {
debug(`\nfun.getImgO() imgs[${p}]錯誤`, imgs[p]);
continue;
}
}
}
});
debug("\nfun.getImgO() 聚集的所有IMG", imgsArray);
return imgsArray;
},
getImgIframe: async (img, maxPage = 1, mode = 1, rText = [null, null], paginationEle = null, time = 500, showMsg = 1) => {
if (fun.ge(".FullPictureLoadImage")) return [...fun.gae(".FullPictureLoadImage")];
fetching = true;
if (showMsg == 1) fun.show(displayLanguage.str_01, 0);
let imgsArray = [];
let fetchNum = 0;
const html = (url, id = 0) => fetch(url).then(res => res.arrayBuffer()).then(buffer => {
debug(`\nfun.getImgIframe() URL`, url);
const decoder = new TextDecoder(document.characterSet || document.charset || document.inputEncoding);
const htmlText = decoder.decode(buffer);
return htmlText;
}).then(async res => {
await new Promise(async resolve => {
const iframe = document.createElement('iframe');
iframe.id = "CustomPictureDownload" + id;
iframe.style.display = "none";
iframe.srcdoc = res;
document.body.appendChild(iframe);
iframe.onload = async () => {
let doc = iframe.contentDocument || iframe.contentWindow.document;
if (!doc) {
debug("fun.getImgIframe() 不支援此網站")
return [];
}
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);
if (await fun.waitEle(img, 400, doc)) {
debug("iframeDoc" + id, doc);
[...fun.gae(img, doc)].forEach(ele => {
imgsArray.push(ele);
if (paginationEle) {
fun.gae(paginationEle).forEach(pag => {
pag.innerHTML = fun.ge(paginationEle, doc).innerHTML;
});
}
targetEle.parentNode.insertBefore(ele.cloneNode(true), targetEle.nextSibling);
load.remove();
});
} else {
load.remove();
fun.show(displayLanguage.str_03, 0);
return [];
}
resolve();
load.remove();
iframe.remove();
};
});
if (showMsg == 1) fun.show(`${displayLanguage.str_02}${fetchNum+=1}/${maxPage}`, 0);
}).catch(error => {
debug(`\nfun.getImg() > fetch()出錯:\n${decodeURI(url)}`, error);
});
await fun.waitEle(img);
[...fun.gae(img)].forEach(ele => {
imgsArray.push(ele);
});
if (maxPage > 1) {
for (let i = 2; i <= maxPage; i++) {
if (mode === 1) {
//【.html ==> .html?page=2】第一頁 ==> 第二頁
//【 ==> ?page=2】第一頁 ==> 第二頁
await html(siteUrl.replace(/\?page=\d+$/, "") + "?page=" + i, i);
} else if (mode === 2) {
//【.html ==> /2.html】 第一頁 ==> 第二頁
await html(siteUrl.slice(0, -5) + "/" + i + ".html", i);
} else if (mode === 3) {
//【.html ==> _1.html】 第一頁 ==> 第二頁
await html(siteUrl.replace(/(_\d+)?\.html$/, "") + "_" + (i - 1) + ".html", i);
} else if (mode === 4) {
//【/ ==> /2/】 第一頁 ==> 第二頁
await html(siteUrl.slice(0, -1) + "/" + i + "/", i);
} else if (mode === "4") {
//【 ==> /2】 第一頁 ==> 第二頁
await html(siteUrl + "/" + i);
} else if (mode === 5) {
//【.html ==> -2.html】 第一頁 ==> 第二頁
await html(siteUrl.replace(/\.html$/, "") + "-" + i + ".html");
} else if (mode === "5") {
//【-1.html ==> -2.html】 第一頁 ==> 第二頁
await html(siteUrl.replace(/(-\d+)?\.html$/, "") + "-" + i + ".html");
} else if (mode === 6) {
//【?p=1 ==> ?p=2】 第一頁 ==> 第二頁
await html(siteUrl.replace(/\?p=\d+$/, "") + "?p=" + i, i);
} else if (mode === 7) {
//【/1 ==> /2】 第一頁 ==> 第二頁
//【.html ==> .html/2】 第一頁 ==> 第二頁
await html(siteUrl.replace(/\/\d+$/, "") + "/" + i, i);
} else if (mode === 8) {
//【 ==> &page=1】 第一頁 ==> 第二頁
await html(siteUrl.replace(/&page=\d+$/, "") + "&page=" + (i - 1), i);
} else if (mode === "8") {
//【 ==> &page=2】 第一頁 ==> 第二頁
await html(siteUrl.replace(/&page=\d+$/, "") + "&page=" + i, i);
} else if (mode === 9) {
//【.html ==> _2.html】 第一頁 ==> 第二頁
await html(siteUrl.replace(/(_\d+)?\.html$/, "") + "_" + i + ".html", i);
} else if (mode === 10) {
//【.html ==> .html/2】 第一頁 ==> 第二頁
await html(siteUrl.replace(/\.html(\/\d+)?$/, "") + ".html/" + i, i);
} else if (mode === 11) {
//【/ ==> /2.html】 第一頁 ==> 第二頁
//【/1.html ==> /2.html】 第一頁 ==> 第二頁
await html(siteUrl.replace(/\/(\d+\.html)?$/, "") + "/" + i + ".html", i);
} else if (mode === 12) {
//【/ ==> /2.htm】 第一頁 ==> 第二頁
//【/1.htm ==> /2.htm】 第一頁 ==> 第二頁
await html(siteUrl.replace(/\/(\d+\.htm)?$/, "") + "/" + i + ".htm", i);
} else if (mode === 13) {
//【-1-* ==> -2-*】 第一頁 ==> 第二頁
await html(siteUrl.replace(/-\d+-[^-]+$/, "") + "-" + i, i);
} else if (mode === 14) {
//【/1/ ==> /2/】 第一頁 ==> 第二頁
await html(siteUrl.replace(/\/\d+\/$/, "") + "/" + i + "/");
} else if (mode === 15) {
//【/index.html ==> /index_2.html】 第一頁 ==> 第二頁
await html(siteUrl.replace(/\/(index(_\d+)?\.html)?$/, "") + "/index_" + i + ".html");
} else if (mode === 16) {
//【 ==> /2#list】 第一頁 ==> 第二頁
await html(siteUrl.replace(/\/(index(_\d+)?\.html)?$/, "") + "/" + i + "#list");
} else if (mode === 17) {
//【.htm ==> _2.htm】 第一頁 ==> 第二頁
await html(siteUrl.replace(/(_\d+)?\.htm$/, "") + "_" + i + ".htm");
} else if (mode === 18) {
//【/ ==> /page/2/】 第一頁 ==> 第二頁
await html(siteUrl.replace(/\/(page\/\d+\/)?$/, "") + "/page/" + i + "/");
} else if (mode === 19) {
//【-1 ==> -2】 第一頁 ==> 第二頁
await html(siteUrl.replace(/-\d+$/, "") + "-" + i);
} else if (mode === 20) {
//【 ==> -p-2】 第一頁 ==> 第二頁
await html(siteUrl.replace(/-p-\d+$/, "") + "-p-" + i);
}
}
}
debug("\nfun.getImgiframe() 聚集的所有IMG", imgsArray);
fetching = false;
return imgsArray;
},
getImgA: async (img, link, mode = 0, rText = [null, null], showMsg = 1) => { //從指定的所有鏈接抓圖片
if (fun.ge(".FullPictureLoadImage")) return [...fun.gae(".FullPictureLoadImage")];
fetching = true;
if (showMsg == 1) fun.show(displayLanguage.str_01, 0);
let links, linksNum;
if (typeof link == "function") {
links = await link();
linksNum = links.length;
} else if (typeof link == "object") {
links = link;
linksNum = links.length;
} else if (typeof link == "string") {
links = [...fun.gae(link)];
linksNum = parseInt(links.length) + 1;
} else {
debug("\nfun.getImgA() link參數錯誤");
return;
}
debug("\nfun.getImgA() links", links);
let imgsArray = [];
let fetchNum = 0;
const html = url => fetch(url).then(res => {
if (res.status > 400) {
debug(`\nfun.getImgA()連線錯誤碼:${res.status}\n`, url);
}
return res.arrayBuffer()
}).then(buffer => {
if (showMsg == 1) fun.show(`${displayLanguage.str_02}${fetchNum+=1}/${linksNum}`, 0);
const decoder = new TextDecoder(document.characterSet || document.charset || document.inputEncoding);
const htmlText = decoder.decode(buffer);
return htmlText;
}).catch(error => {
debug(`\nfun.getImgA fetch()出錯:\n${decodeURI(url)}`, error);
});
const resArr = [];
if (typeof link != "object") resArr.push(html(siteUrl));
for (let i = 0; i < links.length; i++) {
if (mode == 0) {
if (links[i].tagName == "A") {
resArr.push(html(links[i].href));
} else if (/^http/.test(links[i])) {
resArr.push(html(links[i]));
}
} else if (mode >= 100) {
if (links[i].tagName == "A") {
await fun.delay(mode, 0);
resArr.push(html(links[i].href));
} else if (/^http/.test(links[i])) {
await fun.delay(mode, 0);
resArr.push(html(links[i]));
}
} else if (mode == 1) {
let res;
if (links[i].tagName == "A") {
res = await html(links[i].href);
} else if (/^http/.test(links[i])) {
res = await html(links[i]);
}
resArr.push(res);
let doc = fun.doc(res);
debug(`\nfun.getImgA()單線程模式 DOM\n${links[i].href}`, doc);
let imgs = [...fun.gae(img, doc)];
let imgHtml = "";
for (let p = 0; p < imgs.length; p++) {
let imgSrc;
let check = fun.checkImgSrc(imgs[p], rText);
if (check.ok) {
imgSrc = check.src;
/*
let blob = await GMGetData(imgSrc);
let objectURL = await URL.createObjectURL(blob.blob);
imgSrc = objectURL;
*/
debug("\nfun.getImgA() 單線程模式imgSrc", imgSrc);
} else {
debug("\nfun.getImgA() 單線程模式出錯", imgs[p]);
continue;
}
imgHtml += `<img class="FullPictureLoadImage" src="${imgSrc}">`;
}
links[i].outerHTML = imgHtml;
}
}
await Promise.all(resArr).then(htmls => {
fetching = false;
fun.hide();
for (let i = 0; i < htmls.length; i++) {
let doc = fun.doc(htmls[i]);
if (mode != 1) debug(`\nfun.getImgA() DOM${i}`, doc);
let imgs = [...fun.gae(img, doc)];
for (let p = 0; p < imgs.length; p++) {
let check = fun.checkImgSrc(imgs[p], rText);
if (check.ok) {
imgsArray.push(check.src);
} else {
debug("\nfun.getImgA() PromiseAll出錯", imgs[p]);
continue;
}
}
}
});
debug("\nfun.getImgA 聚集的所有IMG", imgsArray);
return imgsArray;
},
checkImgSrc: (ele, rText = [null, null]) => {
let imgSrc;
let check = fun.checkDataset(ele);
if (ele.tagName == "IMG" && check.ok || ele.tagName == "DIV" && check.ok || ele.tagName == "A" && check.ok) {
imgSrc = check.src;
if (/^\/\//.test(imgSrc)) imgSrc = location.protocol + imgSrc;
if (/^\/\w+/.test(imgSrc)) imgSrc = location.origin + imgSrc;
if (!/^(http|blob)/.test(imgSrc) && /^\w+/.test(imgSrc)) imgSrc = location.origin + "/" + imgSrc;
if (rText[0]) imgSrc = imgSrc.replace(rText[0], rText[1]);
return {
ok: true,
src: imgSrc
};
} else if (ele.tagName == "IMG" || ele.tagName == "AMP-IMG") {
if (ele.tagName == "IMG") imgSrc = ele.src;
if (ele.tagName == "AMP-IMG") imgSrc = ele.getAttribute('src');
if (/^\/\//.test(imgSrc)) imgSrc = location.protocol + imgSrc;
if (rText[0]) imgSrc = imgSrc.replace(rText[0], rText[1]);
return {
ok: true,
src: imgSrc
};
} else if (ele.tagName == "A") {
imgSrc = ele.href;
if (rText[0]) imgSrc = imgSrc.replace(rText[0], rText[1]);
return {
ok: true,
src: imgSrc
};
} else if (/^(http|blob|\/\/)/.test(ele)) {
imgSrc = ele;
if (/^\/\//.test(ele)) imgSrc = location.protocol + imgSrc;
if (rText[0]) imgSrc = imgSrc.replace(rText[0], rText[1]);
return {
ok: true,
src: imgSrc
};
}
return {
ok: false
};
},
checkDataset: ele => {
if (ele.tagName == "IMG" || ele.tagName == "DIV" || ele.tagName == "A") {
const setArr = ["data-src", "data-original", "data-url", "data-thumb", "data-echo", "data-ecp", "data-lazyload-src", "data-lazy-src", "data-lazy", "lazysrc", "data-lazyload", "file", "zoomfile", "data-lbwps-srcsmall", "original", "mydatasrc", "ess-data", "data-cfsrc", "data-pin-media"];
for (let i = 0; i < setArr.length; i++) {
let imgSrc = ele.getAttribute(setArr[i]);
if (imgSrc) {
return {
ok: true,
src: imgSrc.trim()
};
}
}
}
return {
ok: false
};
},
getNP: async (picsEle, nextLinkEle, lastEle = null, replaceElement = null, time = 0, dataset = null, mag = 1) => {
//翻頁模式聚集所有圖片或是預覽縮圖然後fun.getImgA()
//用在規則init,fun.getNP(picsEle, nextLinkEle, lastEle, replaceElement, time);
if (fun.ge(".FullPictureLoadImage")) return;
fetching = true;
let nextlink = "";
if (mag == 1) fun.show(displayLanguage.str_14, 0);
const getNextPagePics = async url => {
await fetch(url).then(res => res.arrayBuffer()).then(buffer => {
const decoder = new TextDecoder(document.characterSet || document.charset || document.inputEncoding);
const htmlText = decoder.decode(buffer);
return htmlText;
}).then(async htmlText => {
let doc = fun.doc(htmlText);
if (dataset) {
fun.gae(`img[${dataset}],a[${dataset}],div[${dataset}]`, doc).forEach(e => {
if (e.tagName == "IMG") {
e.src = e.getAttribute(dataset);
} else if (e.tagName == "A" || e.tagName == "DIV") {
let url = e.getAttribute(dataset);
e.style.backgroundImage = `url(${url})`;
}
});
}
debug(`\nfun.getNP() > getNextPagePics() DOM\n${decodeURI(url)}`, doc);
let eles = fun.gae(picsEle, doc);
let nextPage = fun.ge(nextLinkEle, doc);
let lastPage = null;
if (lastEle) lastPage = fun.ge(lastEle, doc);
let fragment = new DocumentFragment();
eles.forEach(ele => {
fragment.appendChild(ele.cloneNode(true));
});
let targetEle = [...fun.gae(picsEle)].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) {
debug("\nfun.getNP() 替換頁碼調錯誤\n", error);
}
}
}
}
if (lastPage) {
fetching = false;
if (mag == 1) fun.show(displayLanguage.str_15);
return;
}
if (nextPage) {
await fun.delay(time, 0);
if (nextPage.dataset.url) {
if (!/^http/.test(nextPage.dataset.url)) return;
nextlink = nextPage.dataset.url;
} else {
try {
nextlink = nextPage.href;
let nh = nextPage.host;
let lh = location.host;
if (nh != lh) {
nextlink = nextlink.replace(nh, lh);
}
} catch (e) {
nextlink = nextPage.getAttribute("href");
}
}
if (url == nextlink) {
fetching = false;
if (mag == 1) fun.show(displayLanguage.str_15);
return;
}
await getNextPagePics(nextlink);
} else {
fetching = false;
if (mag == 1) fun.show(displayLanguage.str_15);
return;
}
});
};
let next = fun.ge(nextLinkEle);
if (next) {
await fun.delay(time, 0);
if (next.dataset.url) {
if (!/^http/.test(next.dataset.url)) return;
nextlink = next.dataset.url;
} else {
nextlink = next.href;
let nh = next.host;
let lh = location.host;
if (nh != lh) {
nextlink = nextlink.replace(nh, lh);
}
}
await getNextPagePics(nextlink);
} else {
fetching = false;
if (mag == 1) fun.show(displayLanguage.str_15);
return;
}
},
autoPager: async () => {
let url = await fun.getNextLink();
if (!url) {
autoPager = false;
fun.show(displayLanguage.str_58, 3000);
return;
}
fun.addLoading();
if (siteData.autoPager.mode == 1) {
doc = await fun.iframeDoc(url, (siteData.autoPager.waitEle || siteData.autoPager.ele));
} else {
try {
doc = await fun.fetchDoc(url);
} catch (e) {
doc = await fun.xhrDoc(url);
}
}
debug(`\nfun.autoPager()\n${url}\n`, doc);
if (siteData.autoPager.stop) {
let check;
try {
check = await siteData.autoPager.stop();
} catch (error) {
debug("\nsiteData.autoPager.stop() 函式錯誤\n", error);
check = false;
}
if (check) {
autoPager = false;
fun.removeLoading();
fun.show(displayLanguage.str_58, 3000);
return;
}
}
if (siteData.autoPager.script) {
let scripts = [...fun.gae(siteData.autoPager.script, doc)];
for (let i in scripts) {
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 in eles) {
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();
}
let newEle, tE;
if (typeof siteData.autoPager.ele === "function" && siteData.autoPager.pos || typeof siteData.autoPager.ele === "string") {
if (typeof siteData.autoPager.ele === "function") {
newEle = await siteData.autoPager.ele();
}
if (typeof siteData.autoPager.ele === "string") {
let nextEle = fun.ge(siteData.autoPager.ele, doc);
if (!nextEle) {
fun.removeLoading();
fun.show(displayLanguage.str_59, 3000);
return;
}
tE = [...fun.gae(siteData.autoPager.ele)].pop();
newEle = [...fun.gae(siteData.autoPager.ele, doc)];
}
let fragment = new DocumentFragment();
if (siteData.autoPager.showTitle !== 0) {
let add = true;
let titleText = null;
if (typeof siteData.autoPager.title === "function") {
try {
titleText = await siteData.autoPager.title();
if (typeof titleText === "object") {
if (titleText.ok) {
titleText = titleText.text;
} else {
add = false;
}
}
} catch (error) {
debug("\nsiteData.autoPager.title() 函式錯誤\n", error);
}
}
if (add) {
fragment.appendChild(await fun.titleUrlEle(url, (titleText || doc.title)));
}
}
newEle.forEach(e => {
fragment.appendChild(e.cloneNode(true));
});
newEle = null;
if (siteData.autoPager.pos) {
if (siteData.autoPager.pos[1] === 0) { //元素裡面
tE = fun.ga(siteData.autoPager.pos[0], doc);
tE.appendChild(fragment);
} else if (siteData.autoPager.pos[1] === 1) { //元素之前
tE = fun.ga(siteData.autoPager.pos[0], doc);
tE.parentNode.insertBefore(fragment, tE);
} else if (siteData.autoPager.pos[1] === 2) { //元素之後
tE.parentNode.insertBefore(fragment, tE.nextSibling);
}
} else {
tE.parentNode.insertBefore(fragment, tE.nextSibling);
}
} else if (typeof siteData.autoPager.ele === "function") {
await siteData.autoPager.ele();
}
if (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;
}
}
}
if (typeof siteData.autoPager.aF === "function") {
await siteData.autoPager.aF();
}
fun.removeLoading();
if (siteData.autoPager.history == 1) {
fun.addHistory(doc.title, url);
}
if (siteData.autoPager.observer) {
await fun.delay(siteData.autoPager.sleep || 1000, 0);
let ele = [...fun.gae(siteData.autoPager.observer)].pop();
fun.nextObserver.observe(ele);
}
},
iframeDoc: async (url, ele) => {
return await new Promise(async resolve => {
const iframe = document.createElement("iframe");
iframe.id = "autoPagerIframe";
iframe.style.display = "none";
iframe.src = url;
document.body.appendChild(iframe);
iframe.onload = async () => {
let doc = iframe.contentDocument || iframe.contentWindow.document;
if (!doc) {
resolve(fun.doc("none"));
}
fun.delay(siteData.autoPager.loadTime || 200);
if (typeof ele === "string") {
await fun.waitEle(ele, 600, doc);
}
resolve(doc);
iframe.remove();
};
});
},
nextObserver: new IntersectionObserver((entries, observer) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
observer.unobserve(entry.target);
fun.autoPager();
}
});
}),
getNextLink: async () => {
if (typeof siteData.autoPager.next === "function") {
let nextcode = await siteData.autoPager.next();
if (nextLink === nextcode) {
return null;
}
nextLink = nextcode;
} else if (typeof siteData.autoPager.next === "string") {
let nextEle = fun.ge(siteData.autoPager.next, doc);
try {
if (nextLink === nextEle.href) {
return null;
}
} catch (error) {
debug("\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) {
if (siteData.autoPager.http == "https") {
nextLink = nextLink.replace("http:", "https:");
} else if (siteData.autoPager.http == "http") {
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);
return div;
},
addLoading: () => {
if (siteData.autoPager.loading === "msg") {
fun.show(displayLanguage.str_57, 0);
} else {
try {
let img = new Image();
img.className = "autoPagerLoading";
img.src = autoPagerLoading;
let tE;
if (siteData.autoPager.pos) {
if (siteData.autoPager.pos[1] === 0) { //元素裡面
tE = fun.ga(siteData.autoPager.pos[0], doc);
tE.appendChild(img);
} else if (siteData.autoPager.pos[1] === 1) { //元素之前
tE = fun.ga(siteData.autoPager.pos[0], doc);
tE.parentNode.insertBefore(img, tE);
} else if (siteData.autoPager.pos[1] === 2) { //元素之後
tE.parentNode.insertBefore(img, tE.nextSibling);
}
} else {
tE = [...fun.gae(siteData.autoPager.ele)].pop();
tE.parentNode.insertBefore(img, tE.nextSibling);
}
} catch (e) {
fun.show(displayLanguage.str_57, 0);
}
}
},
removeLoading: () => {
if (siteData.autoPager.loading === "msg") {
fun.hide();
} else {
try {
fun.ge(".autoPagerLoading").remove();
} catch (e) {
fun.hide();
}
}
},
addHistory: (title, url) => {
history.pushState(null, title, url);
document.title = title;
},
getEle: async (links, elements, targetEle, removeEles = null) => {
if (fun.ge(".FullPictureLoadImage")) return;
fetching = true;
let resArr = [];
let xhrNum = 0;
fun.show(displayLanguage.str_16, 0);
for (let i in links) {
let res = fun.xhrDoc(links[i]).then(doc => {
debug(`\nfun.getEle() URL`, links[i]);
fun.show(`${displayLanguage.str_17}${xhrNum+=1}/${links.length}`, 0);
debug(`fun.getEle()\n${decodeURI(links[i])}\n`, doc);
return [...fun.gae(elements, doc)];
});
resArr.push(res);
}
await Promise.all(resArr).then(arr => arr.flat()).then(eles => {
fetching = false;
fun.hide();
let ele;
let fragment = new DocumentFragment();
eles.forEach(e => {
fragment.appendChild(e.cloneNode(true));
});
if (typeof targetEle == "object") {
ele = fun.ge(targetEle[0]);
if (targetEle[1] == 0) ele.appendChild(fragment);
else if (targetEle[1] == 1) ele.parentNode.insertBefore(fragment, ele);
else if (targetEle[1] == 2) ele.parentNode.insertBefore(fragment, ele.nextSibling);
} else if (typeof targetEle == "string") {
ele = fun.ge(targetEle);
ele.innerHTML = "";
ele.appendChild(fragment);
}
if (removeEles) {
fun.remove(removeEles);
}
})
},
insertImg: (imgsArray, ele, mode = 1) => {
let srcArr = [];
for (let i = 0; i < imgsArray.length; i++) {
let check = fun.checkImgSrc(imgsArray[i]);
if (check.ok) {
srcArr.push(check.src);
} else {
debug("\nfun.insertImg(imgsArray) 格式錯誤!", imgsArray[i]);
continue;
}
}
srcArr = [...new Set(srcArr)];
let fragment = new DocumentFragment();
if (siteData.button) {
if (typeof siteData.button[2] === "number") {
for (let i = 0; i < siteData.button[2]; i++) {
let br = document.createElement("br");
fragment.appendChild(br);
}
}
let width = "24%";
if (typeof siteData.button[1] === "string") {
width = siteData.button[1];
}
let btn0 = document.createElement("button");
btn0.id = "FullPictureLoadOptionsBtn";
btn0.style.width = width;
btn0.style.height = "24px";
btn0.innerText = "腳本選項(*)";
$(btn0).on("click", (event) => {
event.preventDefault();
$("#FullPictureLoadOptions").removeAttr("style");
});
fragment.appendChild(btn0);
let btn1 = document.createElement("button");
btn1.id = "FullPictureLoadToggleImgModeBtn";
btn1.style.width = width;
btn1.style.height = "24px";
btn1.innerText = "切換模式(5)";
$(btn1).on("click", (event) => {
event.preventDefault();
toggleImgMode();
});
fragment.appendChild(btn1);
let btn2 = document.createElement("button");
btn2.id = "FullPictureLoadToggleZoomeBtn";
btn2.style.width = width;
btn2.style.height = "24px";
btn2.innerText = "比例縮放(-)";
$(btn2).on("click", (event) => {
event.preventDefault();
toggleZoom();
});
fragment.appendChild(btn2);
let btn3 = document.createElement("button");
btn3.id = "FullPictureLoadCancelZoomBtn";
btn3.style.width = width;
btn3.style.height = "24px";
btn3.innerText = "取消縮放(+)";
$(btn3).on("click", (event) => {
event.preventDefault();
cancelZoom();
});
fragment.appendChild(btn3);
}
let numP = srcArr.length;
for (let i = 0; i < srcArr.length; i++) {
if (/\.mp4$|\.webm$/.test(srcArr[i])) {
numP--;
continue;
}
let a = document.createElement("a");
//a.className = "fancybox-pic";
//a.rel = "group";
a.dataset.fancybox = "gallery";
a.dataset.thumb = srcArr[i];
a.href = srcArr[i];
let img = new Image();
img.alt = `no.${parseInt(i) + 1}`;
img.className = "FullPictureLoadImage";
if (siteData.referrerpolicy) {
img.setAttribute("referrerpolicy", siteData.referrerpolicy);
}
if (options.zoom <= 10 && options.zoom > 0) {
img.style.width = `${options.zoom * 10}%`;
img.style.height = "auto";
}
if (mode == 2 || mode == 3) {
img.src = loading_bak;
img.dataset.src = srcArr[i];
fun.imagesObserver.observe(img);
} else {
img.src = srcArr[i];
img.onerror = error => {
if (errorNum > 50) return;
errorNum += 1;
setTimeout(() => {
debug(`\nfun.insertImg()重新載入出錯的圖片:\n${error.target.src}`);
error.target.src = error.target.src;
}, 1000);
};
}
a.appendChild(img);
fragment.appendChild(a);
if (i == srcArr.length - 1) {
let end = document.createElement("p");
end.id = "FullPictureLoadEnd";
end.innerText = `${displayLanguage.str_52}:${numP}P`;
fragment.appendChild(end);
}
}
const picPreload = async _srcArr => {
const loadImg = async (src, index) => {
await new Promise(resolve => {
let temp = new Image();
temp.src = src;
temp.onload = () => {
resolve();
temp = null;
};
temp.onerror = error => {
if (errorNum > 50) return;
errorNum += 1;
resolve();
setTimeout(() => {
debug(`\n圖片全載Lazyloading預讀重新載入出錯的圖片:\n${src}\n`, loadImg(src.replace("-scaled", ""), index));
}, 1000);
temp = null;
};
});
};
debug("\n圖片全載Lazyloading開始預讀");
for (let src = 0; src < _srcArr.length; src++) {
if (/\.mp4$|\.webm$/.test(_srcArr[src])) {
numP--;
continue;
}
await loadImg(_srcArr[src], src);
if (src == _srcArr.length - 1) debug("\n圖片全載Lazyloading預讀結束");
}
};
if (srcArr.length > 0) {
if (siteData.insertImg[1] == 2 || siteData.insertImg[1] == 3) {
picPreload(srcArr);
}
let thisEle;
if (typeof ele == "object") {
thisEle = fun.ge(ele[0]);
if (ele[1] == 0) {
thisEle.appendChild(fragment);
thisEle.style.textAlign = "center";
thisEle.style.display = "block";
} else if (ele[1] == 1) {
thisEle.parentNode.insertBefore(fragment, thisEle);
thisEle.parentNode.style.textAlign = "center";
thisEle.parentNode.style.display = "block";
} else if (ele[1] == 2) {
thisEle.parentNode.insertBefore(fragment, thisEle.nextSibling);
thisEle.parentNode.style.textAlign = "center";
thisEle.parentNode.style.display = "block";
}
if (typeof ele[2] != "undefined") {
fun.remove(ele[2]);
}
if (siteData.msg != 0 && siteData.category != "comic") fun.show(displayLanguage.str_18);
if (siteData.go == 1) goToNo1Img();
} else if (typeof ele == "string") {
thisEle = fun.ge(ele);
thisEle.innerHTML = "";
thisEle.appendChild(fragment);
thisEle.style.textAlign = "center";
thisEle.style.display = "block";
if (siteData.msg != 0 && siteData.category != "comic") fun.show(displayLanguage.str_18);
if (siteData.go == 1) goToNo1Img();
} else {
fun.show(displayLanguage.str_19, 3000);
debug("\nfun.insertImg() ele參數錯誤,或用來定位插入的元素不存在。");
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 (imgsNum > 0 && viewMode == 0) {
imgsNum -= 1;
imgs[imgsNum].scrollIntoView();
}
} else if (event.key == "ArrowDown") {
event.preventDefault();
if (imgsNum < imgs.length && viewMode == 0) {
imgsNum += 1;
try {
imgs[imgsNum].scrollIntoView();
} catch (e) {
imgsNum = 0;
imgs[0].scrollIntoView();
fun.show("返回開頭了");
}
}
} else {
imgsNum = 0 - 1;
}
});
//$( ".fancybox-pic" ).fancybox();
} else {
fun.show(displayLanguage.str_20);
}
},
immediateInsertImg: async () => {
let selector = siteData.imgs;
//debug("\nfun.immediateInsertImg() selector\n", selector);
await fun.delay(siteData.insertImg[2] || 200);
fetching = true;
let imgs;
let imgSrcArray = [];
if (fun.ge(".FullPictureLoadImage")) {
imgs = [...fun.gae(".FullPictureLoadImage")];
}
if (typeof selector == "function") {
imgs = await selector();
} else if (/^js;/.test(selector)) {
imgs = await new Function("siteData", "fun", '"use strict";' + selector.slice(3))(siteData, fun);
debug("\nfun.immediateInsertImg() JSimgs:", imgs);
} else {
imgs = [...fun.gae(selector)];
debug("\nfun.immediateInsertImg() selectorImgs:", imgs);
}
fetching = false;
imgs = imgs.filter(item => item);
if (imgs.length > 0) {
for (let i = 0; i < imgs.length; i++) {
let check = fun.checkImgSrc(imgs[i]);
if (check.ok) {
imgSrcArray.push(check.src);
} else {
debug("\nfun.immediateInsertImg() imgsArray 格式錯誤!", imgs[i]);
continue;
}
}
} else {
fun.show(displayLanguage.str_20, 3000);
debug("\nfun.immediateInsertImg() 沒有圖片元素");
return;
}
imgSrcArray = [...new Set(imgSrcArray)];
globalImgArray = imgSrcArray;
fun.insertImg(globalImgArray, siteData.insertImg[0], siteData.insertImg[1]);
imgSrcArray = null;
},
ge: (e, d) => {
if (/^\//.test(e)) {
return (d || document).evaluate(e, (d || document), null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
} else {
return (d || document).querySelector(e);
}
},
gae: (e, d) => {
if (/^\//.test(e)) {
let nodes = [];
let results = (d || document).evaluate(e, (d || document), null, XPathResult.ANY_TYPE, null);
let node;
while (node = results.iterateNext()) {
nodes.push(node);
}
return nodes;
} else {
return (d || document).querySelectorAll(e);
}
},
geT: (ele, mode = 1) => {
try {
if (mode == 1) {
return fun.ge(ele).innerText;
} else if (mode == 2) {
return fun.ge(ele).previousElementSibling.innerText;
} else if (mode == 3) {
return fun.ge(ele).previousElementSibling.previousElementSibling.innerText;
}
} catch (e) {
debug("\nfun.geT() ERROR\n", e);
return null;
}
},
attr: (ele, attr) => fun.ge(ele).getAttribute(attr),
run: code => new Function("return " + code)(),
doc: str => new DOMParser().parseFromString(str, 'text/html'),
xml: str => new DOMParser().parseFromString(str, 'text/xml'),
title: (str, mode = 0) => {
let split = document.title.replace(/漫画|\s-\s(漫本|奇漫屋|漫画星球|6漫画)|\[\d+p(\d+v)?\]/gi, "").split(str);
if (mode == 0) {
try {
return document.title.replace(str, "").trim();
} catch (error) {
debug("\nfun.title() ERROR", error);
return document.title;
}
} else if (mode == 1) {
try {
return split[0].replace(/,$/g, "").replace(/,/g, " ").trim();
} catch (error) {
debug("\nfun.title() ERROR", error);
return document.title;
}
} else if (mode == 2) {
try {
return (split[0] + str + split[1]).replace(/,$/g, "").replace(/,/g, " ").trim();
} catch (error) {
debug("\nfun.title() ERROR", error);
return document.title;
}
} else if (mode == 3) {
try {
return (split[1] + str + split[0]).replace(/,$/g, "").replace(/,/g, " ").trim();
} catch (error) {
debug("\nfun.title ERROR", error);
return document.title;
}
}
},
show: (text, time = 1000) => {
let msg = fun.ge(".FullPictureLoadMsg");
if (fun.ge(".FullPictureLoadMsg[style]")) {
msg.removeAttribute('style');
}
msg.innerText = text;
if (time > 0) {
setTimeout(() => {
fun.hide();
}, time);
}
},
hide: () => {
if (!fun.ge(".FullPictureLoadMsg[style]")) {
let msg = fun.ge(".FullPictureLoadMsg");
msg.innerText = "none";
msg.style = "display:none";
}
},
imagesObserver: new IntersectionObserver((entries, observer) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
observer.unobserve(entry.target);
let realSrc = entry.target.dataset.src,
nE = entry.target.nextElementSibling;
if (realSrc) {
entry.target.src = realSrc;
entry.target.onload = () => {
entry.target.classList.remove("error");
};
entry.target.onerror = (error) => {
if (errorNum > 50) return;
errorNum += 1;
error.target.dataset.src = error.target.dataset.src.replace("-scaled", "");
error.target.src = loading_bak;
error.target.classList.add("error");
setTimeout(() => {
debug(`\nimagesObserver重新載入出錯圖片:\n${realSrc}`);
error.target.src = realSrc.replace("-scaled", "");
}, 1000);
};
}
if (nE && nE.tagName == 'IMG' && nE.dataset.src) {
nE.src = nE.dataset.src;
}
}
});
}),
addFullPictureLoadMsg: () => {
let div = document.createElement("div");
div.className = "FullPictureLoadMsg";
div.style = "display:none";
div.innerText = "none";
document.body.appendChild(div);
},
css: css => {
let style = document.createElement("style");
style.type = "text/css";
style.className = "FullPictureLoadStyle";
style.innerHTML = css;
document.head.appendChild(style);
},
script: async (code, src = 0, pos = 0) => {
let script = document.createElement("script");
script.className = "FullPictureLoadScript";
if (src == 0) {
script.type = "text/javascript";
script.innerHTML = code;
}
if (src == 0 && pos == 0) {
return script;
} else if (pos == 1) {
if (src == 1) {
await new Promise(resolve => {
script.src = code;
document.body.appendChild(script);
script.onload = () => {
resolve();
}
});
} else {
document.body.appendChild(script);
}
}
},
delay: async (time, msg = 1) => {
if (time > 200 && msg == 1) fun.show(`${displayLanguage.str_21}${time}${displayLanguage.str_22}...`, time);
await new Promise(resolve => {
setTimeout(resolve, time);
});
},
waitEle: async (ele, max = 200, doc = document) => {
let loopNum = 0;
return await new Promise(resolve => {
let loop = setInterval(() => {
loopNum += 1;
if (!!fun.ge(ele, doc) === true) {
clearInterval(loop);
resolve(true);
}
if (loopNum >= max) {
clearInterval(loop);
debug(`fun.waitEle()達循環上限,沒有出現"${ele}"元素。`);
resolve(false);
}
}, 100);
});
},
checkImgStatus: (src, msg = null) => {
fun.show(msg || displayLanguage.str_56, 0);
return new Promise(resolve => {
let temp = new Image();
temp.src = src;
temp.onload = () => {
fun.hide();
resolve({
ok: true,
src: src,
width: temp.width,
height: temp.height
});
}
temp.onerror = () => {
fun.hide();
resolve({
ok: false,
src: src
});
}
});
},
checkDownloadThread: () => {
return new Promise(resolve => {
let loop = setInterval(() => {
if (currentDownloadThread <= options.threading) {
clearInterval(loop);
resolve();
}
}, 50);
});
},
xhr: (url, type = "text", referer = location.href, ua = navigator.userAgent) => {
return new Promise((resolve, reject) => {
_GM_xmlhttpRequest({
method: "GET",
url: url,
responseType: type,
headers: {
"Referer": referer,
"User-Agent": ua
},
onload: data => {
if (data.status > 400) {
debug(`\nfun.xhr()連線錯誤碼:${data.status}\n`, url);
}
resolve(data.response);
},
onerror: error => {
reject(error);
}
});
});
},
xhrDoc: (url, referer = location.href, ua = navigator.userAgent) => {
return new Promise((resolve, reject) => {
_GM_xmlhttpRequest({
method: "GET",
url: url,
responseType: "arraybuffer",
headers: {
"Referer": referer,
"User-Agent": ua
},
onload: data => {
if (data.status > 400) {
debug(`\nfun.xhrDoc()連線錯誤碼:${data.status}\n`, url);
}
let decoder = new TextDecoder(document.characterSet || document.charset || document.inputEncoding);
let htmlText = decoder.decode(data.response);
let doc = fun.doc(htmlText);
resolve(doc);
},
onerror: error => {
reject(error);
}
});
});
},
fetchDoc: url => {
return fetch(url).then(res => {
if (res.status > 400) {
debug(`\nfun.fetchDoc()連線錯誤碼:${res.status}\n`, url);
}
return res.arrayBuffer();
}).then(buffer => {
const decoder = new TextDecoder(document.characterSet || document.charset || document.inputEncoding);
const htmlText = decoder.decode(buffer);
return fun.doc(htmlText);
});
},
getKukudmSrc: async () => {
let timeId = setTimeout(() => {
location.reload();
}, 10000);
fun.show(displayLanguage.str_05, 0);
let max;
try {
max = fun.geT("//td[input]").match(/共(\d+)/)[1];
} catch (e) {
max = fun.geT(".bottom .subNav").match(/\/(\d+)/)[1];
}
let links = [];
let url = location.href.replace(/1\.htm$/, "");
for (let i = 1; i <= max; i++) {
links.push(url + i + ".htm");
}
let resArr = [];
let fetchNum = 0;
for (let i in links) {
let res = fun.fetchDoc(links[i]).then(doc => {
fun.show(`${displayLanguage.str_06}${fetchNum+=1}/${links.length}`, 0);
let script = [...doc.scripts].find(s => s.innerText.search(/document\.write/) > -1).innerText;
let arr = script.split("'><");
let pathArr1, pathArr2;
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;
}
let host1 = fun.run(pathArr1[0].split("+")[1]);
let host2 = fun.run(pathArr2[0].split("+")[1]);
pathArr1[0] = pathArr1[0].match(/\w+$/)[0];
pathArr2[0] = pathArr2[0].match(/\w+$/)[0];
let src1 = host1 + pathArr1.join("/");
let src2 = host2 + pathArr2.join("/");
return {
src1: src1,
src2: src2
};
});
resArr.push(res);
}
let allSrc = await Promise.all(resArr).then(arr => {
clearTimeout(timeId);
fun.hide();
return arr;
});
debug("\nfun.getKukudmSrc() > allSrc\n", allSrc);
try {
let obj = await fun.checkImgStatus(allSrc[0].src1);
if (obj.ok) {
return allSrc.map(e => e.src1);
} else {
return allSrc.map(e => e.src2);
}
} catch (e) {
return [];
}
},
remove: (ele, time = 0) => {
setTimeout(() => {
[...fun.gae(ele)].forEach(e => {
e.remove()
});
}, time);
},
addUrlHtml: (url, ele, pos, text = "點選進入下一話") => {
let _pos;
switch (pos) {
case 0:
_pos = "beforebegin"; //在元素之前。
break;
case 1:
_pos = "afterend"; //在元素之後。
break;
case 2:
_pos = "beforeend"; //在元素裡面,最後一個子元素之後。
break;
case 3:
_pos = "afterbegin"; //在元素裡面,第一個子元素之前。
break;
}
let html = `<div style="padding: 20px 0; text-align: center;"><a href="${url}"style="font-size: 26px;line-height: 50px;height: 50px;text-align: center;">${text}</a></div>`;
fun.ge(ele).insertAdjacentHTML(_pos, html);
},
dataURLtoBlobURL: dataurl => {
let arr = dataurl.split(","),
mime = arr[0].match(/:(.*?);/)[1],
bstr = atob(arr[1]),
n = bstr.length,
u8arr = new Uint8Array(n);
while (n--) {
u8arr[n] = bstr.charCodeAt(n);
}
return URL.createObjectURL(new Blob([u8arr], {
type: mime
}));
},
imgSrcToDataURL: (src, type = "image/jpeg") => {
//沒啥屁用...
return new Promise((resolve, reject) => {
let canvas = document.createElement("canvas");
let ctx = canvas.getContext("2d");
let img = new Image();
img.src = src;
img.setAttribute("crossOrigin", "anonymous");
img.onload = () => {
canvas.height = img.height;
canvas.width = img.width;
ctx.drawImage(img, 0, 0);
let dataURL = canvas.toDataURL(type); //到這裡會錯誤
resolve(dataURL);
};
img.onerror = error => {
reject(error);
}
});
},
imgToBlobURL: (img, mode = 1, type = "image/jpeg") => {
let canvas = document.createElement("canvas");
if (mode == 1) {
canvas.width = img.naturalWidth;
canvas.height = img.naturalHeight;
} else if (mode == 2) {
canvas.width = img.width;
canvas.height = img.height;
} else {
return img;
}
canvas.getContext("2d").drawImage(img, 0, 0);
let dataUrl = canvas.toDataURL(type);
return fun.dataURLtoBlobURL(dataUrl);
},
imgBlobArr: async (ele, mode = 1, type = "image/jpeg") => {
let imgs;
fun.show(displayLanguage.str_53, 0);
await fun.delay(200, 0);
imgs = [...fun.gae(ele)].map(e => fun.imgToBlobURL(e, mode, type));
fun.hide();
return imgs;
},
blobToDataURL: blob => {
return new Promise(resolve => {
const reader = new FileReader();
reader.onload = () => {
resolve(reader.result);
}
reader.readAsDataURL(blob);
});
},
scrollEles: async (ele, ms = 100) => {
let eles = [...fun.gae(ele)];
for (let i in eles) {
eles[i].scrollIntoView({
behavior: "smooth",
block: "end"
});
await fun.delay(ms, 0);
}
/*
window.scrollTo({
top: 0
});
*/
},
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();
}
};
const debug = (str, obj = "", title = "debug") => {
console.log(
`%c[Custom Picture Download] ${title}:`,
"background-color: #C9FFC9;",
str, obj
);
};
const ge = css => document.querySelector(css);
const gae = css => document.querySelectorAll(css);
const gx = xpath => document.evaluate(xpath, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
const gax = xpath => {
let nodes = [];
let results = document.evaluate(xpath, document, null, XPathResult.ANY_TYPE, null);
let node;
while (node = results.iterateNext()) {
nodes.push(node);
}
return nodes;
};
const getNum = i => {
let n = parseInt(i) + 1;
let picNum = String(n).padStart(4, "0");
return picNum;
};
const showMsg = (text, time = 1000) => {
ge(".FullPictureLoadMsg").removeAttribute("style");
ge(".FullPictureLoadMsg").innerText = text;
setTimeout(() => {
ge(".FullPictureLoadMsg").innerText = "none";
ge(".FullPictureLoadMsg").style = "display:none";
}, time);
};
const getDataMsg = (text, picNum, imgsNum) => {
if (picNum != "none") {
fun.show(`${displayLanguage.str_23}${downloadNum += 1}/${imgsNum}${displayLanguage.str_24}${text}`, 0);
}
};
const getReferer = srcUrl => {
let referer;
if (siteData.referer == "src") {
referer = srcUrl;
} else if (typeof siteData.referer == "string" || siteData.referer === "") {
referer = siteData.referer;
} else {
referer = location.href;
}
return referer
};
const fetchData = (srcUrl, picNum = "none", imgsNum = "none") => {
currentDownloadThread++
return fetch(srcUrl, {
referrer: getReferer(srcUrl)
}).then(res => res.blob()).then(blob => {
currentDownloadThread--
getDataMsg(displayLanguage.str_25, picNum, imgsNum);
return {
blob: blob,
picNum: picNum
};
}).catch(error => {
currentDownloadThread--
debug(`fetchData() Error: ${error}`);
});
};
const GMGetData = (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({
blob: blob,
picNum: picNum
});
getDataMsg(displayLanguage.str_25, picNum, imgsNum);
} else if (/^image|^video/.test(blob.type)) {
resolve({
blob: blob,
picNum: picNum
});
getDataMsg(displayLanguage.str_25, picNum, imgsNum);
} else {
let htmlText = "none";
let doc = "none";
if (blob.type == "text/html") {
htmlText = blob.text();
doc = fun.doc(htmlText);
}
resolve({
htmlText: htmlText,
doc: doc,
blob: blob,
error: "下載錯誤",
picNum: picNum,
src: srcUrl
});
getDataMsg(displayLanguage.str_26, picNum, imgsNum);
}
},
onerror: error => {
currentDownloadThread--
resolve({
error: "下載錯誤",
picNum: picNum,
src: srcUrl
});
getDataMsg(displayLanguage.str_26, picNum, imgsNum);
}
});
});
};
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 getImgs = async selector => {
fetching = true;
let imgs;
if (ge(".FullPictureLoadImage") && siteData.repeat != 1) {
imgs = [...gae(".FullPictureLoadImage:not(.small)")];
} else if (typeof selector == "function") {
imgs = await selector();
} else if (!selector || selector === "") {
showMsg(displayLanguage.str_41);
return;
} else if (selector.length < 3) {
showMsg(displayLanguage.str_42);
return;
} else if (/^js;/.test(selector)) {
imgs = await new Function("siteData", "fun", '"use strict";' + selector.slice(3))(siteData, fun);
debug("\ngetImgs(selector) JSimgs:", imgs);
} else if (/^\//.test(selector)) {
imgs = [...gax(selector)];
} else {
imgs = [...gae(selector)];
}
imgs = imgs.filter(item => item); //去除空、無用
fetching = false;
return imgs;
};
let countdownTime1, countdownTime2;
const imgZipDownload = async () => {
if (downloading) {
alert(displayLanguage.str_48);
return;
}
if (fetching) {
alert(displayLanguage.str_49);
return;
}
if (ge("#FullPictureLoadOptions:not([style])")) {
return;
}
let selector, titleText;
if (fastDownload) {
if (typeof siteData.imgs == "function") {
selector = siteData.imgs;
} else {
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) {
if (typeof siteData.imgs == "function") {
selector = siteData.imgs;
} else {
selector = await prompt(displayLanguage.str_50, options.default);
}
titleText = await prompt(displayLanguage.str_51, (customTitle || document.title.replace(/\[\d+p(\d+v)?\]|【\d+P】/i, "").replace(/[\/\?<>\\:\*\|":]/g, " ").trim()));
} else if (siteData.autoDownload) {
if (siteData.autoDownload[0] == 1 || options.autoDownload == 1) {
selector = siteData.imgs;
titleText = (customTitle || document.title.replace(/\[\d+p(\d+v)?\]|【\d+P】/i, "").replace(/[\/\?<>\\:\*\|":]/g, " ").trim());
} else {
debug("未開啟自動下載");
return;
}
}
}
let imgs = await getImgs(selector);
globalImgArray = imgs;
downloading = true;
if (imgs.length > 0 && titleText != null && titleText != "") {
debug("\nimgZipDownload():", imgs);
const imgsNum = imgs.length;
let title = titleText;
const zip = new JSZip();
const zipFolder = zip.folder(`${title} [${imgsNum}P]`);
fun.show(displayLanguage.str_55, 0);
for (let i = 0; i < imgs.length; i++) {
let n = parseInt(i) + 1;
let picNum = getNum(i);
let promiseBlob;
let imgSrc;
let check = fun.checkImgSrc(imgs[i]);
if (check.ok) {
imgSrc = check.src;
} else {
debug("\nimgZipDownload() imgs 格式錯誤!", imgs[i]);
continue;
}
await fun.checkDownloadThread();
if (siteData.fetch == 1) {
promiseBlob = fetchData(imgSrc, picNum, imgsNum);
} else {
promiseBlob = GMGetData(imgSrc, picNum, imgsNum);
}
promiseBlobArray.push(promiseBlob);
}
debug("\nPromiseBlobArray:", promiseBlobArray);
Promise.all(promiseBlobArray).then(async data => {
debug("\nPromiseAllData:", data);
let blobDataArray = data.filter(item => item.blob); //成功下載
let errorDataArray = data.filter(item => item.error); //下載錯誤
debug("\nNewDataArray:", blobDataArray);
debug("\nErrorDataArray:", errorDataArray);
if (errorDataArray.length > 0) {
options.autoDownload = 0;
let jsonStr = JSON.stringify(options);
localStorage.setItem("FullPictureLoadOptions", jsonStr);
downloadNum = 0;
downloading = false;
fun.show(`${displayLanguage.str_27}${errorDataArray.length}${displayLanguage.str_28}`, 3000);
setTimeout(() => {
fun.show(displayLanguage.str_29, 0);
}, 3100);
return;
}
if (blobDataArray.length > 0) {
for (let i = 0; i < blobDataArray.length; i++) {
let n = parseInt(i) + 1;
let ex;
let type = blobDataArray[i].blob.type;
try {
if (type == "application/octet-stream") {
ex = "webp";
} else if (type == "binary/octet-stream") {
ex = "jpg";
} else {
ex = type.split("/")[1].match(/\w+/)[0];
}
} catch (e) {
if (/^image/.test(type)) {
ex = "jpg";
} else {
debug("\nimgZipDownload() PromiseAll blob資料格式錯誤", blobDataArray);
fun.show(displayLanguage.str_30, 0);
return;
}
}
let fileName = `${blobDataArray[i].picNum}P.${ex}`;
if (options.zip) {
//console.log(`第${n}/${blobDataArray.length}張,檔案名:${fileName},大小:${parseInt(blobDataArray[i].blob.size / 1024)} Kb`);
zipFolder.file(fileName, blobDataArray[i].blob, {
binary: true
});
} else {
saveData(blobDataArray[i].blob, title + "_" + fileName);
await fun.delay(100, 0);
if (i === blobDataArray.length - 1) {
promiseBlobArray = [];
downloadNum = 0;
downloading = false;
fun.hide();
}
}
}
if (options.zip) {
zip.generateAsync({
type: "blob"
}, (metadata) => {
fun.show(displayLanguage.str_31 + metadata.percent.toFixed(2) + " %", 0);
}).then(async data => {
debug("\nZIP壓縮檔數據:", data);
saveData(data, `${title} [${imgsNum}P].${options.file_extension}`);
promiseBlobArray = [];
downloadNum = 0;
downloading = false;
fun.hide();
let autoDownload = siteData.autoDownload;
let next = siteData.next;
if (next && autoDownload) {
let ele;
if (typeof next === "function") {
ele = await next();
} else {
ele = fun.ge(next);
}
if (ele && siteData.autoDownload[0] == 1 || ele && options.autoDownload == 1) {
let max = siteData.autoDownload[1] || options.autoDownloadCountdown;
let countdownNum = max;
fun.show(`${displayLanguage.str_32}${max}${displayLanguage.str_33}`, 0);
for (let i = 1; i < max; i++) {
countdownTime1 = setTimeout(() => {
fun.show(`${displayLanguage.str_32}${countdownNum-=1}${displayLanguage.str_33}`, 0);
}, i * 1000);
}
countdownTime2 = setTimeout(() => {
if (typeof next === "function") {
fun.show(displayLanguage.str_34);
location.href = ele;
} else {
ele.click();
fun.show(displayLanguage.str_35);
}
}, max * 1000);
} else if (!ele && siteData.autoDownload[0] == 1 || !ele && options.autoDownload == 1) {
fun.show(displayLanguage.str_36, 0);
options.autoDownload = 0;
let jsonStr = JSON.stringify(options);
localStorage.setItem("FullPictureLoadOptions", jsonStr);
}
}
});
}
} else {
promiseBlobArray = [];
downloadNum = 0;
downloading = false;
showMsg(displayLanguage.str_43);
}
});
} else {
downloading = false;
showMsg(displayLanguage.str_41);
}
};
const copyImgSrcText = async () => {
if (downloading) {
alert(displayLanguage.str_48);
return;
}
if (fetching) {
alert(displayLanguage.str_49);
return;
}
if (ge("#FullPictureLoadOptions:not([style])")) {
return;
}
let selector;
if (typeof siteData.imgs == "function") {
selector = siteData.imgs;
} else {
selector = await prompt(displayLanguage.str_50, options.default);
}
let imgs = await getImgs(selector);
let imgSrcArray = [];
if (siteData.insertImg) {
debug("\n右鍵 insertImg():", imgs);
} else {
debug("\nCopyImgSrcText():", imgs);
}
if (imgs.length > 0) {
for (let i = 0; i < imgs.length; i++) {
let imgSrc;
let check = fun.checkImgSrc(imgs[i]);
if (check.ok) {
imgSrc = check.src;
} else {
debug(`\ncopyImgSrcText() imgs[${i}] 格式錯誤!`, imgs[i]);
continue;
}
imgSrcArray.push(imgSrc);
}
} else {
showMsg(displayLanguage.str_44);
return;
}
imgSrcArray = [...new Set(imgSrcArray)];
globalImgArray = imgSrcArray;
if ((!fun.ge(".FullPictureLoadImage") && siteData.insertImg) || siteData.repeat == 1) {
fun.insertImg(globalImgArray, siteData.insertImg[0], siteData.insertImg[1]);
showMsg("已聚集全部圖片");
return;
}
imgSrcArray.push(customTitle || document.title);
debug("\ncopyImgSrcText() imgSrcArray:", imgSrcArray);
let str = imgSrcArray.join("\n");
console.log(str);
copyToClipboard(str);
showMsg(`${displayLanguage.str_45}(${imgSrcArray.length - 1})`);
imgSrcArray = null;
};
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;
/*if (ge("#FullPictureLoadOptionsBtn")) {
ele = ge("#FullPictureLoadOptionsBtn");
} else */
if (ge("#FullPictureLoadImgBox:not([style*=none])")) {
ele = ge(".FullPictureLoadImage.small");
} else {
ele = ge(".FullPictureLoadImage");
}
if (ele) {
if (time != 0) showMsg(displayLanguage.str_46);
setTimeout(() => {
ele.scrollIntoView({
behavior: "smooth"
});
}, time);
}
};
const autoScrollEles = () => {
if (ge("#FullPictureLoadOptions:not([style])")) {
return;
}
let arr = siteData.scrollEle;
if (arr) {
fun.scrollEles(arr[0], arr[1]);
}
};
const toggleZoom = () => {
if (ge("#FullPictureLoadOptions:not([style])")) {
return;
}
if (!fetching && options.zoom <= 10 && ge(".FullPictureLoadImage:not(.small)")) {
if (options.zoom == 0) {
options.zoom = 10;
} else {
options.zoom = options.zoom -= 1;
}
if (options.zoom == 0) {
cancelZoom();
}
ge("#FullPictureLoadOptionsZoom").value = options.zoom;
let jsonStr = JSON.stringify(options);
localStorage.setItem("FullPictureLoadOptions", jsonStr);
if (options.zoom > 0) {
[...gae(".FullPictureLoadImage:not(.small)")].forEach(img => {
img.style.width = `${options.zoom * 10}%`;
});
fun.show(`${displayLanguage.str_60} ${options.zoom * 10}%`);
}
}
};
let viewMode = 0;
let column;
const toggleImgMode = async () => {
if (ge("#FullPictureLoadOptions:not([style])")) {
return;
}
if ([...gae(".FullPictureLoadImage")].length < 1) {
fun.show("請先手動插入圖片");
return;
}
if (ge(".FullPictureLoadImage:not(.small):not([style])")) {
if (ge("#FullPictureLoadImgBox")) {
ge("#FullPictureLoadImgBox").style.display = "block";
[...gae(".FullPictureLoadImage:not(.small),#FullPictureLoadEnd")].forEach(e => {
e.setAttribute("style", "display:none!important;");
})
viewMode = 1;
fun.show("並排模式");
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;
if (hasTouchEvents()) {
width = "24%";
} else {
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 => { //取得目前圖片網址的陣列
if (e.dataset.src) {
return e.dataset.src;
} else {
return e.src;
}
});
let srcArr2 = srcArr1.map((item, index, arr) => { //圖片網址陣列單雙對換用於漫畫式閱讀
if (parseInt(index) % 2 == 0) { //圖片網址陣列裡的單數張
if ((parseInt(index) + 1) == arr.length) {
return arr[index]; //最後一張是單數張則返回此圖片網址
} else {
return arr[parseInt(index) + 1]; //是單數則返回後一個
}
} else { //圖片網址陣列裡的雙數張
return arr[parseInt(index) - 1]; //是雙數則返回前一個
}
});
let srcArr;
if (siteData.category == "comic" || (options.column == 2 && siteData.category == "hcomic")) {
srcArr = srcArr2; //漫畫類用單雙對換的圖片網址並排後閱讀順序會是右至左跟漫畫書一樣
} else {
srcArr = srcArr1; //閱讀順序左至右
}
srcArr.forEach(e => {
let img = new Image();
img.className = "FullPictureLoadImage small";
img.src = loading_bak;
img.dataset.src = e;
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";
if (siteData.category == "comic" || (options.column == 2 && siteData.category == "hcomic")) {
item.style.verticalAlign = "middle";
//item.style.maxHeight = "99vh";
} else {
item.style.verticalAlign = "top";
}
item.style.padding = "0.1%";
item.style.border = "1px solid #a0a0a0";
item.appendChild(img);
imgBox.appendChild(item);
});
let tE = [...gae(".FullPictureLoadImage:not(.small)")].pop();
tE.parentNode.insertBefore(imgBox, tE.nextSibling);
tE.parentNode.style.textAlign = "center";
tE.parentNode.style.display = "block";
[...gae(".FullPictureLoadImage:not(.small),#FullPictureLoadEnd")].forEach(e => {
e.setAttribute("style", "display:none!important;");
});
viewMode = 1;
fun.show("並排模式");
let imgs = [...gae("#FullPictureLoadImgBox>div")];
let imgsNum = 0;
if (imgs[0].nextSibling && siteData.category == "comic") {
await fun.checkImgStatus(imgs[0].nextSibling.querySelector("img").dataset.src, "Wait Loading...");
if (imgs[0].offsetHeight < imgs[0].nextSibling.offsetHeight) {
imgs[0].style.height = (imgs[0].nextSibling.offsetHeight) + "px";
let img = imgs[0].querySelector("img");
await fun.checkImgStatus(img.dataset.src, "Wait Loading...");
let num = (imgs[0].offsetHeight - img.height) / 2;
img.style.marginTop = `${num}px`;
}
/*
let optionsBtn = ge("#FullPictureLoadOptionsBtn");
if (optionsBtn) {
optionsBtn.scrollIntoView();
} else {
imgs[0].scrollIntoView();
}
*/
imgs[0].scrollIntoView();
}
document.addEventListener("keydown", async event => {
if (ge("#FullPictureLoadOptions:not([style])")) {
return;
}
if (event.key == "ArrowUp") {
event.preventDefault();
if (imgsNum > 0 && viewMode == 1) {
imgsNum -= column;
imgs[imgsNum].scrollIntoView();
}
} else if (event.key == "ArrowDown") {
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) + 1}張(左)高:${imgs[imgsNum].offsetHeight}\n第${parseInt(imgsNum) + 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) + 1}張(左)高:${imgs[imgsNum].offsetHeight}\n第${parseInt(imgsNum) + 2}張(右)高:${imgs[imgsNum].nextSibling.offsetHeight}`);
img.style.marginTop = `${num}px`;
}
} else if (siteData.category == "comic") {
imgs[imgsNum].src = imgs[imgsNum].dataset.src;
await fun.checkImgStatus(imgs[imgsNum].dataset.src, "Wait Loading...");
}
imgs[imgsNum].scrollIntoView();
} catch (e) {
if (siteData.autoNext && siteData.next && siteData.insertImg) {
if (typeof siteData.next === "string") {
let next = fun.ge(siteData.next);
if (next) {
fun.show("前往下一集", 3000);
//next.click();
elementClick(next);
} else {
imgsNum = 0 - column;
fun.show("已是最後下一集", 3000);
}
} else if (typeof siteData.next === "function") {
let next = await siteData.next();
if (next) {
fun.show("前往下一集", 3000);
location.href = next;
} else {
imgsNum = 0;
fun.show("已是最後下一集", 3000);
}
}
} else {
imgsNum = 0;
imgs[0].scrollIntoView();
fun.show("返回開頭了");
}
}
}
} else {
imgsNum = 0 - column;
}
});
} else if (ge(".FullPictureLoadImage.small")) {
ge("#FullPictureLoadImgBox").style.display = "none";
$(".FullPictureLoadImage:not(.small),#FullPictureLoadEnd").removeAttr("style");
viewMode = 0;
fun.show("原始模式");
} else {
fun.show("請先取消圖片縮放");
}
};
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);
$(".FullPictureLoadImage:not(.small)").removeAttr("style");
fun.show(displayLanguage.str_61);
}
};
const addFullPictureLoadButton = () => {
let img = new Image();
img.id = "FullPictureLoad";
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", () => {
imgZipDownload();
});
img.addEventListener("mousedown", (event) => {
if (event.button == 1) {
event.preventDefault();
goToNo1Img(0);
}
if (event.button == 2) {
event.preventDefault();
copyImgSrcText();
}
});
document.body.appendChild(img);
};
const hasTouchEvents = () => {
if (("ontouchstart" in window) || (navigator.maxTouchPoints > 0) || (navigator.msMaxTouchPoints > 0)) {
return true;
}
return false;
};
const elementClick = ele => {
const dispatchTouchEvent = (_ele, type) => {
let touchEvent = document.createEvent("UIEvent");
touchEvent.initUIEvent(type, true, true);
touchEvent.touches = [{
clientX: 1,
clientY: 1
}];
_ele.dispatchEvent(touchEvent);
};
if (hasTouchEvents()) {
dispatchTouchEvent(ele, "touchstart");
dispatchTouchEvent(ele, "touchend");
}
ele.click();
/*
if (hasTouchEvents()) {
ele.dispatchEvent(new Event("touchstart"));
ele.dispatchEvent(new Event("touchend"));
//ele.click();
debug("\nelementClick touch事件式點擊\n", ele);
} else {
//ele.dispatchEvent(new Event("click"));
ele.click();
debug("\nelementClick click事件式點擊\n", ele);
}
*/
};
const addReturnTopButton = () => {
let a = document.createElement("a");
a.href = "javascript:void(0);";
a.setAttribute("onclick", "window.scrollTo({top:0,behavior:'smooth'});");
let img = new Image();
img.src = "data:image/png;base64,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";
img.className = "FullPictureLoadImageReturnTop";
a.appendChild(img);
document.body.appendChild(a);
};
const nsfw1Data = customData.filter(item => item.category == "nsfw1"); //列出寫真站
const nsfw2Data = customData.filter(item => item.category == "nsfw2"); //列出老司機站
const comicData = customData.filter(item => item.category == "comic"); //列出普漫站
const hcomicData = customData.filter(item => item.category == "hcomic"); //列出H漫站
const AIData = customData.filter(item => item.category == "AI"); //列出AI繪圖站
const autoPagerData = customData.filter(item => item.category == "autoPager"); //列出自動翻頁
const noneData = customData.filter(item => item.category == "none"); //列出未分類
const FullPictureLoadOptionsMain = document.createElement("div");
FullPictureLoadOptionsMain.id = "FullPictureLoadOptions";
FullPictureLoadOptionsMain.style.display = "none";
const FullPictureLoadOptionsMainHtmlSrt = `
<div style="width: 100%;">
<p><font color="black">Full Picture Load 選項</font></p>
</div>
<div style="width: 100%;">
<p><font color="black">左下圖示 ( 0:關、1:開 ) PS:優先級別低於內置規則</font></p>
<input id="FullPictureLoadOptionsIcon">
</div>
<div style="width: 100%;">
<p><font color="black">當前網站最大下載線程數 ( 1 ~ 32 ) PS:優先級別低於內置規則</font></p>
<input id="FullPictureLoadOptionsThreading">
</div>
<div style="width: 100%;">
<p><font color="black">壓縮打包 ( true:壓縮、false:不壓縮 (不能全自動下載) )</font></p>
<input id="FullPictureLoadOptionsZip">
</div>
<div style="width: 100%;">
<p><font color="black">壓縮檔副檔名 ( zip 或 cbz )</font></p>
<input id="FullPictureLoadOptionsExtension">
</div>
<div style="width: 100%;">
<p><font color="black">自動下載 (1:開、0:關) </font><font color="red">快捷鍵 [ ctrl + . ] 開始或取消</font></p>
<input id="FullPictureLoadOptionsAutoDownload">
</div>
<div style="width: 100%;">
<p><font color="black">自動下載倒數秒數 PS:優先級別低於內置規則</font></p>
<input id="FullPictureLoadOptionsCountdown">
</div>
<div style="width: 100%; display: none;">
<p><font color="black">當前漫畫站規則 ( 0:維持關閉、1:啟用 )</font></p>
<input id="FullPictureLoadOptionsComic">
</div>
<div style="width: 100%;">
<p><font color="black">移動裝置雙擊前往下一頁 ( true:開、false:關 )</font></p>
<input id="FullPictureLoadOptionsDouble">
</div>
<div style="width: 100%;">
<p><font color="black">當前網站圖片縮放比例 ( 0 ~ 10 ) 10 = 100%、5 = 50%、0 = auto</font></p>
<input id="FullPictureLoadOptionsZoom">
</div>
<div style="width: 100%;">
<p><font color="black">當前網站圖片並排模式顯示數量 ( 2 ~ 6 ) comic類固定為 ( 2 )</font></p>
<input id="FullPictureLoadOptionsColumn">
<p><font color="black">PS:comic類並排後為右至左的漫讀模式 hcomic類也設定為2將套用</font></p>
</div>
<button id="FullPictureLoadOptionsCancelBtn"><font color="black">取消 (Esc)</font></button>
<button id="FullPictureLoadOptionsResetBtn"><font color="black">重置設定</font></button>
<button id="FullPictureLoadOptionsSaveBtn"><font color="black">保存設定</font></button>
`;
FullPictureLoadOptionsMain.innerHTML = FullPictureLoadOptionsMainHtmlSrt;
document.body.appendChild(FullPictureLoadOptionsMain);
const setValue = () => {
ge("#FullPictureLoadOptionsIcon").value = options.icon;
ge("#FullPictureLoadOptionsThreading").value = options.threading;
ge("#FullPictureLoadOptionsZip").value = options.zip;
ge("#FullPictureLoadOptionsExtension").value = options.file_extension;
ge("#FullPictureLoadOptionsAutoDownload").value = options.autoDownload;
ge("#FullPictureLoadOptionsCountdown").value = options.autoDownloadCountdown;
ge("#FullPictureLoadOptionsComic").value = options.comic;
ge("#FullPictureLoadOptionsDouble").value = options.doubleTouchNext;
ge("#FullPictureLoadOptionsZoom").value = options.zoom;
if (siteData.category == "comic") {
ge("#FullPictureLoadOptionsColumn").value = 2;
} else {
ge("#FullPictureLoadOptionsColumn").value = options.column;
}
};
$("#FullPictureLoadOptionsCancelBtn").on("click", (event) => {
event.preventDefault();
$("#FullPictureLoadOptions").hide();
});
$("#FullPictureLoadOptionsResetBtn").on("click", (event) => {
event.preventDefault();
localStorage.removeItem("FullPictureLoadOptions");
location.reload();
});
$("#FullPictureLoadOptionsSaveBtn").on("click", (event) => {
event.preventDefault();
options.icon = ge("#FullPictureLoadOptionsIcon").value;
options.threading = ge("#FullPictureLoadOptionsThreading").value;
options.zip = ge("#FullPictureLoadOptionsZip").value;
options.file_extension = ge("#FullPictureLoadOptionsExtension").value;
options.comic = ge("#FullPictureLoadOptionsComic").value;
options.autoDownload = ge("#FullPictureLoadOptionsAutoDownload").value;
options.autoDownloadCountdown = ge("#FullPictureLoadOptionsCountdown").value;
options.doubleTouchNext = ge("#FullPictureLoadOptionsDouble").value;
options.zoom = ge("#FullPictureLoadOptionsZoom").value;
options.column = ge("#FullPictureLoadOptionsColumn").value;
let jsonStr = JSON.stringify(options);
localStorage.setItem("FullPictureLoadOptions", jsonStr);
location.reload();
});
const style = `
.FullPictureLoadImageReturnTop {
position: fixed;
right: 10px;
bottom: 80px;
width: 53px !important;
height: 53px !important;
z-index: 99;
opacity: 0.6;
}
#FullPictureLoadOptions {
text-align: center;
width: auto !important;
max-width: 400px !important;
height: auto !important;
position: fixed !important;
top: 10%;
left: 50%;
margin-left: -190px;
border: 1px solid #a0a0a0 !important;
border-radius: 3px !important;
box-shadow: -2px 2px 5px rgb(0 0 0 / 30%) !important;
background-color: #FAFAFB;
z-index: 2147483647 !important;
}
#FullPictureLoadOptions * {
font: unset !important;
font-family: Arial, sans-serif !important;
font-size: 12px !important;
float: none !important;
line-height: 18px !important;
margin-bottom: 1px !important;
padding: 1px 4px !important;
width: auto;
}
#FullPictureLoadOptions button {
width: 114px;
margin-left: 2px;
margin-right: 2px;
margin-bottom: 4px !important;
display: inline-block;
border: 1px solid #a0a0a0 !important;
background-color: transparent !important;
}
#FullPictureLoadOptions input {
color: #000000 !important;
height: 20px !important;
width: 360px !important;
border: 1px solid #a0a0a0 !important;
background-color: transparent !important;
}
#FullPictureLoadOptions p {
text-align: center !important;
margin-block-start: 0px !important;
margin-block-end: 0px !important;
margin-inline-start: 0px !important;
margin-inline-end: 0px !important;
}
#FullPictureLoad {
width: 32px !important;
height: 32px !important;
position: fixed !important;
bottom: 20px !important;
left: 20px !important;
border-radius: unset !important;
z-index: 2147483647 !important;
opacity: 0.8 !important;
display: block !important;
}
.FullPictureLoadMsg {
font-family: Arial, sans-serif !important;
font-size: 26px;
font-weight: bold;
text-align: center;
line-height: 50px;
color: #ffffff;
width: 340px;
height: 50px;
top: 30%;
left: 50%;
margin-left: -170px;
padding: 0px !important;
background-color: #000;
border: 1px solid #303030;
border-radius: 10px;
position: fixed;
z-index: 2147483647;
opacity: 0.7;
}
.FullPictureLoadImage:not(.small) {
width: auto;
height: auto;
max-width: 100%;
display: block !important;
opacity: 1 !important;
border: none !important;
border-radius: unset !important;
padding: 0 !important;
margin: 0 auto !important;
}
.FullPictureLoadImage.small {
width: auto;
height: auto;
max-width: 100%;
max-height: 100% !important;
min-height: 50x !important;
display: block !important;
opacity: 1 !important;
border: none !important;
border-radius: unset !important;
padding: 0 !important;
margin: auto;
}
#FullPictureLoadImgBox {
display: block;
opacity: 1 !important;
border: none !important;
border-radius: unset !important;
padding: 0 !important;
margin: 0 auto !important;
}
.FullPictureLoadImage[src*="i.imgur.com"] {
min-height: 400px !important;
}
#FullPictureLoadEnd {
font-size: 20px;
height: 30px;
width: 100%;
line-height: 30px;
text-align: center;
margin: 5px auto !important;
}
#FullPictureLoadEnd~*:not(.row):not(.text-center):not(.link-d):not(#myrating):not(.gallery-a):not(.pagination):not(div[class^=picnext]) {
display: none !important;
}
.FullPictureLoadLoading {
font-size: 20px;
text-align: center;
height: 30px;
line-height: 30px;
margin: 5px auto !important;
border: none !important;
}
#FullPictureLoad~*:not([id^='pv-']):not([class^='pv-']):not(.pagetual_tipsWords):not(.fancybox-container) {
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 a:-webkit-any-link {
font-family: Arial, sans-serif !important;
color: black;
}
.autoPagerLoading {
width: auto;
height: auto;
display: block !important;
opacity: 1 !important;
border: none !important;
border-radius: unset !important;
padding: 0 !important;
margin: 20px auto !important;
}
#FullPictureLoadOptionsBtn,
#FullPictureLoadToggleImgModeBtn,
#FullPictureLoadToggleZoomeBtn,
#FullPictureLoadCancelZoomBtn {
padding: 1px !important;
margin-top: 10px !important;
margin-bottom: 6px !important;
appearance: auto;
text-rendering: auto;
color: buttontext;
letter-spacing: normal;
word-spacing: normal;
line-height: normal;
font-size: 14px !important;
text-transform: none;
text-indent: 0px;
text-shadow: none;
display: inline-block;
text-align: center;
align-items: flex-start;
cursor: default;
box-sizing: border-box;
background-color: buttonface;
border: 1px solid #a0a0a0 !important;
}
.viewer-open:not(.fancybox-active) {
overflow: unset !important;
padding-right: 0px !important;
}
`;
let showOptions = false;
for (let i = 0; i < customData.length; i++) {
let check = null;
if (typeof customData[i].reg === "object") {
check = customData[i].reg.test(siteUrl);
} else if (typeof customData[i].reg === "function") {
check = await customData[i].reg();
}
if (check) {
let category = customData[i].category;
if (category === "comic" && customData[i].enable === 0) {
showOptions = true;
$("#FullPictureLoadOptions>div:nth-child(8)").show();
}
let delay = customData[i].delay;
if (delay) {
await fun.delay(delay, 0);
}
options.enable = 1;
if (customData[i].enable == 0) {
if (options.comic == 1 && category === "comic") {
showOptions = true;
debug("\n漫畫類預設關閉的此站規則已開啟");
} else {
//showOptions = true;
options.enable = 0;
debug("\n此規則禁用", customData[i]);
continue;
}
}
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];
showOptions = true;
if (!ge(".FullPictureLoadMsg")) fun.addFullPictureLoadMsg();
if (!ge(".FullPictureLoadStyle")) fun.css(style);
if (!siteData.autoPager) {
const fancyBoxCssHtml = `<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fancyapps/[email protected]/dist/jquery.fancybox.min.css">`;
document.head.insertAdjacentHTML("beforeend", fancyBoxCssHtml);
}
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 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();
}
}
let titleCode = customData[i].customTitle;
if (titleCode) {
const getTitle = async () => {
if (typeof titleCode == "string") {
customTitle = await new Function("siteData", "fun", '"use strict";' + titleCode)(siteData, fun);
} else if (typeof titleCode == "function") {
customTitle = await titleCode();
}
}
await getTitle();
debug(`\n自定義標題:${customTitle}`);
if (customData[i].observerTitle) {
new MutationObserver(async () => {
await getTitle();
debug(`\n自定義標題:${customTitle}`);
}).observe(document.body, {
childList: true,
subtree: true
});
}
}
let next = customData[i].next;
if (next) {
let link;
if (typeof next === "function") {
link = await next();
} else if (typeof next === "string") {
link = fun.ge(next);
}
debug("\n圖片全載NEXT\n", link);
const callback = () => {
if (typeof next === "function") {
fun.show(displayLanguage.str_34, 0);
if (/^http/.test(link)) {
location.href = link;
} else {
fun.show(displayLanguage.str_37);
}
} else if (typeof next === "string") {
if (link) {
//link.click();
elementClick(link);
fun.show(displayLanguage.str_35);
} else {
fun.show(displayLanguage.str_37);
}
}
};
if (hasTouchEvents() && options.doubleTouchNext) {
document.addEventListener("dblclick", () => {
callback();
});
}
document.addEventListener("keydown", (event) => {
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) => {
let key = window.event ? event.keyCode : event.which;
if (key == 37) {
event.preventDefault();
let ele = fun.ge(prev);
if (ele) {
//ele.click();
elementClick(ele);
fun.show(displayLanguage.str_39);
} else {
fun.show(displayLanguage.str_40);
}
}
});
} else if (prev == 1) {
document.addEventListener("keydown", (event) => {
let key = window.event ? event.keyCode : event.which;
if (key == 37) {
event.preventDefault();
fun.show(displayLanguage.str_38);
history.back();
}
});
}
let autoClick = customData[i].autoClick;
if (autoClick) {
if (typeof autoClick == "object") {
setTimeout(() => {
let ele = fun.ge(autoClick[0]);
if (ele) {
elementClick(ele);
debug(`\n圖片全載autoClick("${autoClick}")`, ele);
}
}, autoClick[1] || 1000);
} else if (typeof autoClick == "string") {
let ele = fun.ge(autoClick);
if (ele) {
elementClick(ele);
debug(`\n圖片全載autoClick("${autoClick}")`, ele);
}
}
}
let observerClick = customData[i].observerClick;
if (observerClick) {
let ele = fun.ge(observerClick);
if (ele) {
const observer = new IntersectionObserver((entries, observer) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
observer.unobserve(entry.target);
elementClick(entry.target);
debug(`\n圖片全載observerClick("${observerClick}")`, entry.target);
setTimeout(async () => {
if (await fun.waitEle(observerClick, 30)) {
observer.observe(fun.ge(observerClick));
}
}, 1000);
}
});
});
setTimeout(() => {
observer.observe(ele);
}, 1000)
}
}
let loadMore = customData[i].loadMore;
if (loadMore) {
const callback = () => {
if (window.innerHeight + window.pageYOffset >= document.body.offsetHeight - 200) {
document.removeEventListener("scroll", callback);
let ele = fun.ge(loadMore);
if (ele) {
elementClick(ele);
debug(`圖片全載loadMore("${loadMore}")`);
}
setTimeout(async () => {
if (await fun.waitEle(loadMore, 30)) {
document.addEventListener("scroll", callback);
}
}, 1000);
};
};
document.addEventListener("scroll", callback);
}
if (siteData.autoPager) {
if (siteData.autoPager.observer) {
let ele = [...fun.gae(siteData.autoPager.observer)].pop();
if (ele) {
fun.nextObserver.observe(ele);
}
} else {
const callback = async () => {
if (window.innerHeight + window.pageYOffset >= document.body.offsetHeight - (siteData.autoPager.bottom || 1000)) {
document.removeEventListener("scroll", callback);
if (autoPager) {
await fun.autoPager();
await fun.delay(siteData.autoPager.sleep || 1000, 0);
document.addEventListener("scroll", callback);
}
};
};
document.addEventListener("scroll", callback);
}
}
let openInNewTab = customData[i].openInNewTab;
if (openInNewTab) {
const _openInNewTab = () => fun.gae(openInNewTab).forEach(a => {
a.setAttribute("target", "_blank");
});
_openInNewTab();
new MutationObserver(() => {
_openInNewTab();
}).observe(document.body, {
childList: true,
subtree: true
});
}
let autoDownload = siteData.autoDownload;
if (autoDownload) {
if (autoDownload[0] == 1 || options.autoDownload == 1) imgZipDownload();
}
let insertImg = customData[i].insertImg;
if (insertImg) {
if (autoDownload) {
if (autoDownload[0] == 1 || options.autoDownload == 1) break;
}
if (insertImg[1] == 1 || insertImg[1] == 2) {
fun.immediateInsertImg();
}
}
let button = customData[i].topButton;
if (button) addReturnTopButton();
break;
}
}
setValue();
if (siteData.reg) {
debug("\n列出此站資料", siteData);
debug(`\n列出規則總數(${customData.length})`);
debug("\n列出NSFW規則", nsfw1Data);
debug("\n列出NSFW+規則", nsfw2Data);
debug("\n列出COMIC規則", comicData);
debug("\n列出HCOMIC規則", hcomicData);
debug("\n列出AI繪圖規則", AIData);
debug("\n列出自動翻頁規則", autoPagerData);
debug("\n列出未分類規則", noneData);
}
if (showOptions) {
//debug("\n圖片全載開啟了GM選單?\n", showOptions);
const registerMenu = () => {
try {
GM_registerMenuCommand("設定", () => {
$("#FullPictureLoadOptions").removeAttr("style");
});
} catch (e) {
try {
GM.registerMenuCommand("設定", () => {
$("#FullPictureLoadOptions").removeAttr("style");
});
} catch (e) {}
}
}
registerMenu();
}
if (!ge(".FullPictureLoadStyle")) fun.css(style);
let autoDownload = siteData.autoDownload;
if (hasTouchEvents() || !autoDownload) {
$("#FullPictureLoadOptions>div:nth-child(n+6):nth-child(-n+7)").hide();
}
if (!hasTouchEvents()) {
$("#FullPictureLoadOptions>div:nth-child(9)").hide();
}
if (autoDownload) {
document.addEventListener("keydown", async event => {
if (ge("#FullPictureLoadOptions:not([style])")) {
return;
}
if (event.ctrlKey && event.key == ".") {
if (options.autoDownload == 0) {
fun.show("即將開始自動下載!!!", 0);
options.autoDownload = 1;
let jsonStr = JSON.stringify(options);
localStorage.setItem("FullPictureLoadOptions", jsonStr);
setTimeout(() => {
location.reload();
}, 2000);
} else {
options.autoDownload = 0;
let jsonStr = JSON.stringify(options);
localStorage.setItem("FullPictureLoadOptions", jsonStr);
let endTid = setTimeout(() => {});
for (let i = 0; i <= endTid; i++) {
clearTimeout(i);
}
fun.show("已停止自動下載!!!", 0);
location.reload();
}
}
});
}
if (hasTouchEvents() && siteData.insertImg) {
let timeId;
if (siteData.insertImg[1] == 0 || siteData.insertImg[1] == 3) {
document.addEventListener("touchstart", event => {
//debug("\nTouchEvent\n", event);
if (event.target.tagName == "IMG" && event.target.id != "FullPictureLoad") {
timeId = setTimeout(() => {
copyImgSrcText();
}, 500);
}
});
document.addEventListener("touchmove", event => {
clearTimeout(timeId);
});
document.addEventListener("touchend", event => {
//debug("\nTouchEvent\n", event);
clearTimeout(timeId);
});
}
}
if (options.enable == 1) {
if (!ge(".FullPictureLoadMsg")) fun.addFullPictureLoadMsg();
if (!ge(".FullPictureLoadStyle")) fun.css(style);
if (siteData.key != 0) {
document.addEventListener("keydown", event => {
switch (event.keyCode) {
case 96: //數字鍵0
fastDownload = false;
imgZipDownload();
break;
case 97: //數字鍵1
copyImgSrcText();
break;
case 98: //數字鍵2
goToNo1Img(0);
break;
case 99: //數字鍵3
fastDownload = true;
imgZipDownload();
break;
case 100: //數字鍵4
autoScrollEles();
break;
case 101: //數字鍵5
toggleImgMode();
break;
case 109: //數字鍵-
toggleZoom();
break;
case 107: //數字鍵+
cancelZoom();
break;
case 106: //數字鍵*
$("#FullPictureLoadOptions").removeAttr("style");
break;
case 27: //Esc
$("#FullPictureLoadOptions").hide();
break;
case 111: //數字鍵/
if (ge("#FullPictureLoadOptions:not([style])")) {
return;
}
fun.show("初始化設定");
localStorage.removeItem("FullPictureLoadOptions"); //重置當前網站的用戶設定恢復為預設選項
setTimeout(() => {
location.reload();
}, 1000);
break;
}
});
}
if (siteData.icon == 0) {
return;
} else if (options.icon == 1 || siteData.icon == 1) addFullPictureLoadButton();
}
})();