自动无缝翻页

自动无缝翻页,目前支持:所有「Discuz!、Flarum」论坛、豆瓣、微博、千图网、3DM、游侠网、游民星空、423Down、APPHOT、不死鸟、亿破姐、小众软件、微当下载、落尘之木、异次元软件、老殁殁漂遥、异星软件空间、古风漫画网、RARBG、PubMed、AfreecaTV、AlphaCoders、FitGirl Repacks...

目前為 2021-08-05 提交的版本,檢視 最新版本

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name         自动无缝翻页
// @version      1.4.3
// @author       X.I.U
// @description  自动无缝翻页,目前支持:所有「Discuz!、Flarum」论坛、豆瓣、微博、千图网、3DM、游侠网、游民星空、423Down、APPHOT、不死鸟、亿破姐、小众软件、微当下载、落尘之木、异次元软件、老殁殁漂遥、异星软件空间、古风漫画网、RARBG、PubMed、AfreecaTV、AlphaCoders、FitGirl Repacks...
// @match        *://*/*
// @connect      www.gamersky.com
// @icon         https://i.loli.net/2021/03/07/rdijeYm83pznxWq.png
// @grant        GM_xmlhttpRequest
// @grant        GM_registerMenuCommand
// @grant        GM_openInTab
// @grant        GM_getValue
// @grant        GM_setValue
// @license      GPL-3.0 License
// @run-at       document-end
// @namespace    https://github.com/XIU2/UserScript
// @supportURL   https://github.com/XIU2/UserScript
// @homepageURL  https://github.com/XIU2/UserScript
// ==/UserScript==

(function() {
    'use strict';
    var webType, curSite = {SiteTypeID: 0};
    // 目前支持的网站
    const websiteList = ['movie.douban.com', 'weibo.com', 'www.58pic.com',
                         'www.3dmgame.com', 'www.ali213.net', 'gl.ali213.net', 'www.gamersky.com',
                         'www.423down.com', 'apphot.cc', 'iao.su', 'www.ypojie.com', 'www.appinn.com', 'www.weidown.com', 'www.luochenzhimu.com', 'www.iplaysoft.com', 'www.mpyit.com', 'www.yxssp.com',
                         'www.gufengmh8.com',
                         'rarbgprx.org',
                         'pubmed.ncbi.nlm.nih.gov',
                         'www.afreecatv.com',
                         'art.alphacoders.com', 'wall.alphacoders.com', 'avatars.alphacoders.com', 'mobile.alphacoders.com',
                         'fitgirl-repacks.site'];

    if (GM_getValue('menu_disable') == null){GM_setValue('menu_disable', [])};
    if (GM_getValue('menu_discuz_thread_page') == null){GM_setValue('menu_discuz_thread_page', true)};
    // 注册脚本菜单
    if (menu_disable('check')) { // 当前网站是否已存在禁用列表中
        GM_registerMenuCommand('❎ 已禁用 (点击对当前网站启用)', function(){menu_disable('del')});
        return
    } else {
        if (websiteList.indexOf(location.host) > -1) {
            webType = 1 // 其他网站
        } else if (document.querySelector('meta[name="author"][content*="Discuz!"], meta[name="generator"][content*="Discuz!"]') || document.getElementById('ft') && document.getElementById('ft').textContent.indexOf('Discuz!') > -1) {
            webType = 2 // 所有 Discuz! 论坛
        } else if (document.getElementById('flarum-loading')) {
            webType = 3 // 所有 Flarum 论坛
        } else {
            GM_registerMenuCommand('❌ 当前网站暂不支持 [点击申请支持]', function () {window.GM_openInTab('https://github.com/XIU2/UserScript#xiu2userscript', {active: true,insert: true,setParent: true});window.GM_openInTab('https://greasyfork.org/zh-CN/scripts/419215/feedback', {active: true,insert: true,setParent: true});});
            return
        }
        GM_registerMenuCommand('✅ 已启用 (点击对当前网站禁用)', function(){menu_disable('add')});
        if (webType === 2) {
            GM_registerMenuCommand(`${GM_getValue('menu_discuz_thread_page')?'✅':'❎'} 帖子内自动翻页 (仅 Discuz! 论坛)`, function(){menu_switch(GM_getValue('menu_discuz_thread_page'), 'menu_discuz_thread_page', 'Discuz! 论坛帖子内翻页')});
        }
    }
    GM_registerMenuCommand('💬 反馈 & 欢迎申请支持', function () {window.GM_openInTab('https://github.com/XIU2/UserScript#xiu2userscript', {active: true,insert: true,setParent: true});window.GM_openInTab('https://greasyfork.org/zh-CN/scripts/419215/feedback', {active: true,insert: true,setParent: true});});


    /*
    自动翻页规则
    type:
      1 = 脚本实现自动无缝翻页
      2 = 网站自带了自动无缝翻页功能,只需要点击下一页按钮即可
          nextText: 按钮文本,只有按钮文本为该文本时才会点击按钮加载下一页,避免一瞬间加载太多次下一页
          intervals: 点击间隔时间,对于没有按钮文字变化的按钮,可以手动指定间隔时间,单位:ms
      3 = 依靠元素距离可视区域底部的距离来触发翻页
      4 = 针对部分简单动态加载的网站
    HT_insert:
      1 = 插入该元素本身的前面;
      2 = 插入该元素当中,第一个子元素前面;
      3 = 插入该元素当中,最后一个子元素后面;
      4 = 插入该元素本身的后面;
    scrollDelta:数值越大,滚动条触发点越靠上(越早开始翻页),一般是访问网页速度越慢,该值就需要越大(如果 Type = 3,则相反)
    function:
      before = 插入前执行函数;
      after = 插入后执行函数;
      parameter = 参数
    */
    let DBSite = {
        discuz_forum: {
            SiteTypeID: 0,
            pager: {
                type: 2,
                nextLink: '#autopbn',
                nextText: '下一页 »',
                scrollDelta: 1000
            }
        },
        discuz_thread: {
            SiteTypeID: 0,
            pager: {
                type: 1,
                nextLink: '//a[@class="nxt"][@href]',
                pageElement: 'css;div#postlist > div[id^="post_"]',
                HT_insert: ['css;div#postlist', 3],
                replaceE: 'css;div.pg',
                scrollDelta: 1000
            }
        },
        discuz_search: {
            SiteTypeID: 0,
            pager: {
                type: 1,
                nextLink: '//a[@class="nxt"][@href]',
                pageElement: 'css;div#threadlist > ul',
                HT_insert: ['css;div#threadlist', 3],
                replaceE: 'css;div.pg',
                scrollDelta: 1000
            }
        },
        discuz_guide: {
            SiteTypeID: 0,
            pager: {
                type: 1,
                nextLink: '//a[@class="nxt"][@href]',
                pageElement: 'css;div#threadlist div.bm_c table > tbody',
                HT_insert: ['css;div#threadlist div.bm_c table', 3],
                replaceE: 'css;div.pg',
                scrollDelta: 1000
            }
        },
        discuz_youspace: {
            SiteTypeID: 0,
            pager: {
                type: 1,
                nextLink: '//a[@class="nxt"][@href]',
                pageElement: 'css;tbody > tr:not(.th)',
                HT_insert: ['css;tbody', 3],
                replaceE: 'css;div.pg',
                scrollDelta: 1000
            }
        },
        discuz_collection: {
            SiteTypeID: 0,
            pager: {
                type: 1,
                nextLink: '//a[@class="nxt"][@href]',
                pageElement: 'css;div#ct div.bm_c table > tbody',
                HT_insert: ['css;div#ct div.bm_c table', 3],
                replaceE: 'css;div.pg',
                scrollDelta: 1000
            }
        },
        flarum: {
            SiteTypeID: 0,
            pager: {
                type: 2,
                nextLink: '.DiscussionList-loadMore > button[title]',
                scrollDelta: 1000
            }
        },
        dux: {
            SiteTypeID: 0,
            pager: {
                type: 1,
                nextLink: '//li[@class="next-page"]/a[@href]',
                pageElement: 'css;.content > article',
                HT_insert: ['css;.content > .pagination', 1],
                replaceE: 'css;.content > .pagination',
                scrollDelta: 1000
            },
            function: {
                before: dux_beforeFunction
            }
        },
        douban_subject_comments: {
            SiteTypeID: 0,
            pager: {
                type: 1,
                nextLink: '//a[@class="next"][@href]',
                pageElement: 'css;#comments > .comment-item',
                HT_insert: ['css;#paginator', 1],
                replaceE: 'css;#paginator',
                scrollDelta: 1000
            }
        },
        douban_subject_reviews: {
            SiteTypeID: 0,
            pager: {
                type: 1,
                nextLink: '//link[@rel="next"][@href]',
                pageElement: 'css;.review-list > div',
                HT_insert: ['css;.review-list', 3],
                replaceE: 'css;.paginator',
                scrollDelta: 1000
            }
        },
        douban_subject_episode: {
            SiteTypeID: 0,
            pager: {
                type: 1,
                nextLink: '//link[@rel="next"][@href]',
                pageElement: 'css;#comments > div',
                HT_insert: ['css;#comments', 3],
                replaceE: 'css;.paginator',
                scrollDelta: 1000
            }
        },
        weibo_comment: {
            SiteTypeID: 0,
            pager: {
                type: 2,
                nextLink: 'a[action-type="click_more_comment"]',
                nextText: '查看更多c',
                scrollDelta: 1000
            }
        },
        _58pic: {
            SiteTypeID: 0,
            pager: {
                type: 1,
                nextLink: '//div[contains(@class,"page-box")]//a[text()="下一页"][@href]',
                pageElement: 'css;.pic-box > .qtw-card',
                HT_insert: ['css;.pic-box', 3],
                replaceE: 'css;.page-box',
                scrollDelta: 2000
            },
            function: {
                before: _58pic_beforeFunction
            }
        },
        _58pic_c: {
            SiteTypeID: 0,
            pager: {
                type: 1,
                nextLink: '//div[contains(@class,"page-box")]//a[text()="下一页"][@href]',
                pageElement: 'css;.list-box > .qtw-card',
                HT_insert: ['css;.list-box', 3],
                replaceE: 'css;.page-box',
                scrollDelta: 4000
            },
            function: {
                before: _58pic_beforeFunction
            }
        },
        _3dmgame: {
            SiteTypeID: 0,
            pager: {
                type: 3,
                nextLink: '//li[@class="next"]/a[@href]',
                pageElement: 'css;.news_warp_center > *',
                HT_insert: ['css;.news_warp_center', 3],
                replaceE: 'css;.pagewrap',
                scrollElement: '.pagewrap',
                scrollDelta: 400
            }
        },
        ali213_www: {
            SiteTypeID: 0,
            pager: {
                type: 3,
                nextLink: '//a[@id="after_this_page"][@href]',
                pageElement: 'css;#Content >*:not(.news_ding):not(.page_fenye)',
                HT_insert: ['css;.page_fenye', 1],
                replaceE: 'css;.page_fenye',
                scrollElement: '.page_fenye',
                scrollDelta: 400
            }
        },
        ali213_gl: {
            SiteTypeID: 0,
            pager: {
                type: 3,
                nextLink: '//a[@class="next n"][@href]',
                pageElement: 'css;.c-detail >*',
                HT_insert: ['css;.c-detail', 3],
                replaceE: 'css;.page_fenye',
                scrollElement: '.page_fenye',
                scrollDelta: 400
            }
        },
        gamersky_ent: {
            SiteTypeID: 0,
            pager: {
                type: 3,
                nextLink: '//div[@class="page_css"]/a[text()="下一页"][@href]',
                pageElement: 'css;.Mid2L_con > *:not(.gs_nc_editor):not(.pagecss):not(.page_css):not(.gs_ccs_solve):not(.post_ding)',
                HT_insert: ['css;.page_css', 1],
                replaceE: 'css;.page_css',
                scrollElement: '.page_css',
                scrollDelta: 100
            }
        },
        gamersky_gl: {
            SiteTypeID: 0,
            pager: {
                type: 3,
                nextLink: '//div[@class="page_css"]/a[text()="下一页"][@href]',
                pageElement: 'css;.Mid2L_con > *:not(.gs_nc_editor):not(.pagecss):not(.gs_ccs_solve):not(.post_ding)',
                HT_insert: ['css;.gs_nc_editor', 1],
                replaceE: 'css;.page_css',
                scrollElement: '.pagecss',
                scrollDelta: -1000
            },
            function: {
                before: gamersky_gl_beforeFunction
            }
        },
        _423down: {
            SiteTypeID: 0,
            pager: {
                type: 1,
                nextLink: '//div[@class="paging"]//a[contains(text(),"下一页")][@href]',
                pageElement: 'css;div.content-wrap ul.excerpt > li',
                HT_insert: ['css;div.content-wrap ul.excerpt', 3],
                replaceE: 'css;div.paging',
                scrollDelta: 1500
            }
        },
        iao_su: {
            SiteTypeID: 0,
            pager: {
                type: 1,
                nextLink: '//li[@class="btn btn-primary next"]//a[@href]',
                pageElement: 'css;#index > article, #archive > article',
                HT_insert: ['css;ol.page-navigator', 1],
                replaceE: 'css;ol.page-navigator',
                scrollDelta: 800
            },
            function: {
                before: iao_su_beforeFunction
            }
        },
        appinn: {
            SiteTypeID: 0,
            pager: {
                type: 1,
                nextLink: '//a[@class="next page-numbers"][@href]',
                pageElement: 'css;section#latest-posts > article',
                HT_insert: ['css;nav.navigation.pagination', 1],
                replaceE: 'css;div.nav-links',
                scrollDelta: 1500
            }
        },
        weidown: {
            SiteTypeID: 0,
            pager: {
                type: 1,
                nextLink: '//a[@class="nextpage"][@href]',
                pageElement: 'css;.articleWrapper > .itemArticle, .articleWrapper > .richTextItem.search',
                HT_insert: ['css;.articleWrapper', 3],
                replaceE: 'css;#pageGroup',
                scrollDelta: 1500
            }
        },
        weidown_search: {
            SiteTypeID: 0,
            pager: {
                type: 1,
                nextLink: '//a[@class="nextpage"][@href]',
                pageElement: 'css;.articleListWrapper > .richTextItem.search',
                HT_insert: ['css;#pageGroup', 1],
                replaceE: 'css;#pageGroup',
                scrollDelta: 700
            }
        },
        weidown_special: {
            SiteTypeID: 0,
            pager: {
                type: 1,
                nextLink: '//a[@class="nextpage"][@href]',
                pageElement: 'css;.special > .item',
                HT_insert: ['css;.special', 3],
                replaceE: 'css;#pageGroup',
                scrollDelta: 700
            }
        },
        iplaysoft_postslist: {
            SiteTypeID: 0,
            pager: {
                type: 1,
                nextLink: '//div[@class="pagenavi"]//a[@title="下一页"][@href]',
                pageElement: 'css;#postlist > div.entry',
                HT_insert: ['css;#postlist > .pagenavi-button', 1],
                replaceE: 'css;.pagenavi-button, .pagenavi',
                scrollDelta: 1200
            },
            function: {
                before: iplaysoft_postslist_beforeFunction
            }
        },
        iplaysoft_postcomments: {
            SiteTypeID: 0,
            pager: {
                type: 2,
                nextLink: '#loadHistoryComments',
                nextText: '展开后面',
                scrollDelta: 1200
            }
        },
        mpyit: {
            SiteTypeID: 0,
            pager: {
                type: 1,
                nextLink: '//a[@class="page-numbers"][@title="下一页"][@href]',
                pageElement: 'css;#post > div[id^="post-"]',
                HT_insert: ['css;#post > #pagenavi', 1],
                replaceE: 'css;#post > #pagenavi',
                scrollDelta: 1700
            }
        },
        mpyit_category: {
            SiteTypeID: 0,
            pager: {
                type: 1,
                nextLink: '//a[@class="page-numbers"][@title="下一页"][@href]',
                pageElement: 'css;#content > div[class^="entry_box"]',
                HT_insert: ['css;#content > #pagenavi', 1],
                replaceE: 'css;#content > #pagenavi',
                scrollDelta: 1700
            }
        },
        yxssp: {
            SiteTypeID: 0,
            pager: {
                type: 1,
                nextLink: '//div[@class="page-nav td-pb-padding-side"]/a[last()][@href]',
                pageElement: 'css;.td-modules-container.td-module-number4 > div',
                HT_insert: ['css;.td-modules-container.td-module-number4', 3],
                replaceE: 'css;.page-nav.td-pb-padding-side',
                scrollDelta: 1000
            }
        },
        rarbgprx: {
            SiteTypeID: 0,
            pager: {
                type: 1,
                nextLink: '(//a[@title="next page"])[1][@href]',
                pageElement: 'css;table.lista2t tr.lista2',
                HT_insert: ['css;table.lista2t > tbody', 3],
                replaceE: 'css;#pager_links',
                scrollDelta: 900
            }
        },
        pubmed_postslist: {
            SiteTypeID: 0,
            pager: {
                type: 2,
                nextLink: 'button.load-button.next-page',
                nextText: 'Show more',
                scrollDelta: 1500
            }
        },
        afreecatv: {
            SiteTypeID: 0,
            pager: {
                type: 2,
                nextLink: '.btn-more > button',
                intervals: 2000,
                scrollDelta: 1000
            }
        },
        alphacoders_art: {
            SiteTypeID: 0,
            pager: {
                type: 1,
                nextLink: '//a[@id="next_page"][@href]',
                pageElement: 'css;.container-masonry > div',
                HT_insert: ['css;.container-masonry', 3],
                replaceE: '//div[@class="hidden-xs hidden-sm"]/..',
                scrollDelta: 1000
            },
            function: {
                before: alphacoders_art_beforeFunction
            }
        },
        alphacoders_wall: {
            SiteTypeID: 0,
            pager: {
                type: 1,
                nextLink: '//a[@id="next_page"][@href]',
                pageElement: 'css;.thumb-container-big, .avatar-thumb, .thumb-element',
                HT_insert: ['css;.thumb-container-big:nth-last-child(1), .avatar-thumb:nth-last-child(1), .thumb-element:nth-last-child(1)', 4],
                replaceE: '//div[@class="hidden-xs hidden-sm"]/..',
                scrollDelta: 1000
            }
        },
        fitgirl: {
            SiteTypeID: 0,
            pager: {
                type: 1,
                nextLink: '//a[@class="next page-numbers"][@href]',
                pageElement: 'css;article[id^="post-"]',
                HT_insert: ['css;nav.navigation.paging-navigation', 1],
                replaceE: 'css;nav.navigation.paging-navigation',
                scrollDelta: 2000
            }
        },
        gufengmh8: {
            SiteTypeID: 0,
            pager: {
                type: 4,
                pageElement: 'css;body > script:first-child',
                HT_insert: ['css;#images', 3],
                intervals: 5000,
                functionNext: gufengmh8_functionNext,
                functionAdd: gufengmh8_functionAdd,
                scrollDelta: 2333
            }
        }
    };
    // 生成 SiteTypeID
    generateID();

    // 用于脚本判断(针对部分特殊的网站)
    const SiteType = {
        GAMERSKY_GL: DBSite.gamersky_gl.SiteTypeID
    };


    // < 其他网站 >
    if (webType === 1) {
        switch (location.host) {
            case 'apphot.cc': //                  < APPHOT >
            case 'www.ypojie.com': //             < 亿破姐 >
            case 'www.luochenzhimu.com': //       < 落尘之木 >
                if (location.pathname.indexOf('.html') === -1) curSite = DBSite.dux;
                if (location.host === 'apphot.cc') curSite.pager.scrollDelta = 1600; // 对于速度慢的网站,需要增加翻页敏感度
                break;
                // 以上几个都是 WordPress 的 DUX 主题
            case 'movie.douban.com': //           < 豆瓣评论 >
                if (location.pathname.indexOf('/subject') > -1 && location.pathname.indexOf('/comments') > -1) { //        短评
                    curSite = DBSite.douban_subject_comments;
                } else if (location.pathname.indexOf('/subject') > -1 && location.pathname.indexOf('/reviews') > -1) { //  影评
                    curSite = DBSite.douban_subject_reviews;
                } else if(location.pathname.indexOf('/subject') > -1 && location.pathname.indexOf('/episode') > -1) { //   电视剧每集评论
                    curSite = DBSite.douban_subject_episode;
                }
                break;
            case 'weibo.com': //                  < 微博评论 >
                curSite = DBSite.weibo_comment;
                break;
            case 'www.58pic.com': //              < 千图网 >
                if (location.pathname.indexOf('/tupian/') > -1) {
                    curSite = DBSite._58pic;
                } else if (location.pathname.indexOf('/c/') > -1) {
                    curSite = DBSite._58pic_c;
                }
                break;
            case 'www.3dmgame.com': //            < 3DM >
                curSite = DBSite._3dmgame;
                break;
            case 'www.ali213.net': //             < 游侠网 >
                curSite = DBSite.ali213_www;
                break;
            case 'gl.ali213.net': //              < 游侠网 - 攻略页 >
                curSite = DBSite.ali213_gl;
                document.lastElementChild.appendChild(document.createElement('style')).textContent = `.n_show_b {display: none !important;}` // 隐藏部分碍事元素
                break;
            case 'www.gamersky.com': //           < 游民星空 >
                if (location.pathname.indexOf('/ent/') > -1) {
                    curSite = DBSite.gamersky_ent;
                } else {
                    curSite = DBSite.gamersky_gl;
                }
                break;
            case 'www.423down.com': //            < 423down >
                if (location.pathname.indexOf('.html') === -1) curSite = DBSite._423down;
                break;
            case 'iao.su': //                     < 不死鸟 >
                curSite = DBSite.iao_su;
                break;
            case 'www.appinn.com': //             < 小众软件 >
                curSite = DBSite.appinn;
                break;
            case 'www.weidown.com': //            < 微当下载 >
                if (location.pathname.indexOf('/search/') > -1) {
                    curSite = DBSite.weidown_search;
                } else if (location.pathname.indexOf('/special/') > -1) {
                    curSite = DBSite.weidown_special;
                } else {
                    curSite = DBSite.weidown;
                }
                break;
            case 'www.iplaysoft.com': //          < 异次元软件 >
                if (location.pathname.indexOf('.html') > -1 || location.pathname.indexOf('/p/') > -1) { // 文章内
                    curSite = DBSite.iplaysoft_postcomments;
                } else { // 其他页面
                    curSite = DBSite.iplaysoft_postslist;
                }
                break;
            case 'www.mpyit.com': //              < 老殁殁漂遥 >
                if (location.pathname === '/' && !location.search) {
                    curSite = DBSite.mpyit;
                } else if (location.pathname.indexOf('/category/') > -1 || location.search.indexOf('?s=') > -1) {
                    curSite = DBSite.mpyit_category;
                }
                break;
            case 'www.yxssp.com': //              < 异星软件空间 >
                curSite = DBSite.yxssp;
                break;
            case 'www.gufengmh8.com': //          < 古风漫画网 >
                curSite = DBSite.gufengmh8;
                break;
            case 'rarbgprx.org': //               < RARBG >
                curSite = DBSite.rarbgprx;
                break;
            case 'pubmed.ncbi.nlm.nih.gov': //    < 国外学术网站 >
                curSite = DBSite.pubmed_postslist;
                break;
            case 'www.afreecatv.com': //          < 直播网站 >
                curSite = DBSite.afreecatv;
                break;
            case 'art.alphacoders.com': //        < 壁纸网站 >
                curSite = DBSite.alphacoders_art;
                setTimeout(alphacoders_art_beforeFunction_0, 1000);
                break;
            case 'wall.alphacoders.com':
            case 'avatars.alphacoders.com':
            case 'mobile.alphacoders.com':
                curSite = DBSite.alphacoders_wall;
                break;
            case 'fitgirl-repacks.site': //       < 游戏下载网站 >
                curSite = DBSite.fitgirl;
                break;
        }
        // < 所有 Discuz!论坛 >
    } else if (webType === 2) {
        if (location.pathname.indexOf('.html') > -1) { //                   判断是不是静态网页(.html 结尾)
            if (location.pathname.indexOf('forum') > -1) { //               各版块帖子列表
                if (document.getElementById('autopbn')) { //                判断是否有 [下一页] 按钮
                    curSite = DBSite.discuz_forum;
                } else {
                    curSite = DBSite.discuz_guide;
                }
            } else if (location.pathname.indexOf('thread') > -1) { //       帖子内
                if (GM_getValue('menu_discuz_thread_page')) {
                    curSite = DBSite.discuz_thread;
                    hidePgbtn(); //                                         隐藏帖子内的 [下一页] 按钮
                }
            } else if(location.pathname.indexOf('search') > -1) { //        搜索结果
                curSite = DBSite.discuz_search;
            }
        } else {
            if (location.search.indexOf('mod=forumdisplay') > -1) { //      各版块帖子列表
                if (document.getElementById('autopbn')) { //                判断是否有 [下一页] 按钮
                    curSite = DBSite.discuz_forum;
                } else {
                    curSite = DBSite.discuz_guide;
                }
            } else if (location.search.indexOf('mod=viewthread') > -1) { // 帖子内
                if (GM_getValue('menu_discuz_thread_page')) {
                    curSite = DBSite.discuz_thread;
                    hidePgbtn(); //                                         隐藏帖子内的 [下一页] 按钮
                }
            } else if (location.search.indexOf('mod=guide') > -1) { //      导读帖子列表
                curSite = DBSite.discuz_guide;
            } else if(location.search.indexOf('mod=space') > -1 && location.search.indexOf('&view=me') > -1) { // 别人的主题/回复
                curSite = DBSite.discuz_youspace;
            } else if (location.search.indexOf('mod=collection') > -1) { // 淘贴列表
                curSite = DBSite.discuz_collection;
            } else if (location.pathname.indexOf('search') > -1) { //       搜索结果
                curSite = DBSite.discuz_search;
            } else { //                                                     考虑到部分论坛的部分板块帖子列表 URL 是自定义的
                curSite = DBSite.discuz_forum;
            }
        }
        // < 所有 Flarum 论坛 >
    } else if (webType === 3) {
        curSite = DBSite.flarum;
    }


    curSite.pageUrl = ''; // 下一页URL
    pageLoading(); // 自动无缝翻页


    // 自动无缝翻页
    function pageLoading() {
        if (curSite.SiteTypeID > 0) {
            windowScroll(function (direction, e) {
                if (direction === 'down') { // 下滑才准备翻页
                    let scrollTop = document.documentElement.scrollTop || window.pageYOffset || document.body.scrollTop,
                        scrollHeight = window.innerHeight || document.documentElement.clientHeight,
                        scrollDelta = curSite.pager.scrollDelta;
                    if (curSite.pager.type === 3) { // 翻页类型 3
                        let scrollElement = document.querySelector(curSite.pager.scrollElement);
                        //console.log(scrollElement.offsetTop - (scrollTop + scrollHeight), scrollDelta, curSite.SiteTypeID)
                        if (scrollElement.offsetTop - (scrollTop + scrollHeight) <= scrollDelta) {
                            if (curSite.SiteTypeID === SiteType.GAMERSKY_GL) curSite.pager.scrollDelta -= 800 // 游民星空 gl 的比较奇葩,需要特殊处理下
                            ShowPager.loadMorePage();
                        }
                    } else {
                        if (document.documentElement.scrollHeight <= scrollHeight + scrollTop + scrollDelta) {
                            if (curSite.pager.type === 2) { // 翻页类型 2
                                if (curSite.SiteTypeID > 0) { // 如果指定了间隔时间,那么就依靠这个判断时间到了没有~
                                    let autopbn = document.querySelector(curSite.pager.nextLink);
                                    if (autopbn) { // 寻找下一页链接
                                        if (!curSite.pager.nextText) { // 如果没有指定 nextText 就直接点击
                                            autopbn.click();
                                        } else if (autopbn.textContent.indexOf(curSite.pager.nextText) > -1){ // 如果指定了 nextText 就需要判断后再点击(避免已经在加载了,还重复点击)
                                            autopbn.click();
                                        }
                                        // 对于没有按钮文字变化的按钮,可以手动指定间隔时间
                                        if (curSite.pager.intervals) {
                                            let _SiteTypeID = curSite.SiteTypeID;
                                            curSite.SiteTypeID = 0;
                                            setTimeout(function(){curSite.SiteTypeID = _SiteTypeID;}, curSite.pager.intervals)
                                        }
                                    }
                                }
                            } else if (curSite.pager.type === 1) { // 翻页类型 1
                                ShowPager.loadMorePage();
                            } else if (curSite.pager.type === 4) { // 翻页类型 4
                                if (curSite.SiteTypeID > 0) {
                                    curSite.pager.functionNext();
                                    if (curSite.pager.intervals) {
                                        let _SiteTypeID = curSite.SiteTypeID;
                                        curSite.SiteTypeID = 0;
                                        setTimeout(function(){curSite.SiteTypeID = _SiteTypeID;}, curSite.pager.intervals)
                                    }
                                }
                            }
                        }
                    }
                }
            });
        }
    }


    /*function getElementToPageTop(el) {
        if(el.parentElement) {
            return getElementToPageTop(el.parentElement) + el.offsetTop
        }
        return el.offsetTop
    }*/


    // 隐藏帖子内的 [下一页] 按钮(Discuz! 论坛)
    function hidePgbtn() {
        let style_hidePgbtn = document.createElement('style');
        style_hidePgbtn.innerHTML = `.pgbtn {display: none;}`;
        document.head.appendChild(style_hidePgbtn);
    }


    // dux 的插入前函数(加载图片)
    function dux_beforeFunction(pageElems) {
        pageElems.forEach(function (one) {
            let now = one.querySelector('img.thumb[data-src]')
            if (now) {
                now.setAttribute('src', now.dataset.src)
            }
        });
        return pageElems
    }


    // 58pic 的插入前函数(加载图片)
    function _58pic_beforeFunction(pageElems) {
        let is_one = document.querySelector('.qtw-card.place-box.is-one');
        if (is_one && is_one.style.display != 'none') {
            is_one.setAttribute('style', 'display: none;')
        }
        pageElems.forEach(function (one) {
            let now = one.querySelector('img.lazy')
            if (now && now.getAttribute('src') != now.dataset.original) {
                now.setAttribute('src', now.dataset.original)
                now.setAttribute('style', 'display: block;')
            }
        });
        return pageElems
    }


    // 游民星空攻略 的插入前函数(移除下一页底部的 "更多相关内容请关注:xxx" 文字)
    function gamersky_gl_beforeFunction(pageElems) {
        pageElems.forEach(function (one) {
            if (one.tagName === 'P' && one.textContent.indexOf('更多相关内容请关注') > -1) {
                one.style.display = 'none';
            }
        });
        return pageElems
    }


    // iao.su 的插入前函数(加载图片)
    function iao_su_beforeFunction(pageElems) {
        pageElems.forEach(function (one) {
            let now = one.getElementsByClassName('post-card')[0]
            if (now) {
                now.getElementsByClassName('blog-background')[0].style.backgroundImage = 'url("' + now.getElementsByTagName('script')[0].textContent.split("'")[1] + '")';
                //now.getElementsByClassName('blog-background')[0].style.backgroundImage = 'url("' + RegExp("(?<=loadBannerDirect\\(').*(?=', '',)").exec(now.getElementsByTagName('script')[0].textContent)[0]; + '")';
            }
        });
        return pageElems
    }


    // iplaysoft 的插入前函数(加载图片)
    function iplaysoft_postslist_beforeFunction(pageElems) {
        pageElems.forEach(function (one) {
            let now = one.querySelector('img.lazyload')
            if (now && !now.src) {
                now.setAttribute('src', now.dataset.src)
                now.setAttribute('srcset', now.dataset.src)
                now.setAttribute('class', 'lazyloaded')
            }
        });
        return pageElems
    }


    // alphacoders_art 的插入前函数(图片结构调整)
    function alphacoders_art_beforeFunction(pageElems) {
        pageElems.forEach(function (one) {
            one.setAttribute('style','float: left');
        });
        return pageElems
    }
    // alphacoders_art(图片结构调整)
    function alphacoders_art_beforeFunction_0() {
        let pageElems1 = document.querySelectorAll('.container-masonry > div')
        document.querySelector('.container-masonry').style.height = 'auto'
        pageElems1.forEach(function (one) {
            one.setAttribute('style','float: left');
        });
    }


    // gufengmh8
    function gufengmh8_functionNext() {
        if (curSite.pageUrl) { // 如果已经有下一页的 URL 则直接获取
            getPageElems(curSite.pageUrl)
        } else {
            let pageElems = document.querySelector(curSite.pager.pageElement.replace('css;', '')); // 寻找数据所在元素
            if (pageElems) {
                let comicUrl, nextId;
                pageElems.textContent.split(';').forEach(function (one){ // 分号 ; 分割为数组并遍历
                    //console.log(one)
                    if (one.indexOf('comicUrl') > -1) { // 下一页 URL 前半部分
                        comicUrl = one.split('"')[1];
                    } else if (one.indexOf('nextChapterData') > -1) { // 下一页 URL 的后半部分 ID
                        nextId = one.split('"id":')[1].split(',')[0];
                    }
                })
                if (comicUrl && nextId && nextId != 'null') { // 组合到一起就是下一页 URL
                    curSite.pageUrl = comicUrl + nextId + '.html'
                    //console.log(curSite.pageUrl)
                    getPageElems(curSite.pageUrl); // 访问下一页 URL 获取
                }
            }
        }
    }

    // gufengmh8
    function gufengmh8_functionAdd(pageElems) {
        if (pageElems) {
            curSite.pageUrl = ''; // 留空后,下一页 URL 依然交给 gufengmh8_function 函数获取(方便点)
            pageElems = pageElems[0];
            //console.log(pageElems)
            let chapterImages, chapterPath;
            //console.log(pageElems.textContent)
            document.querySelector(curSite.pager.pageElement.replace('css;', '')).innerText = pageElems.textContent; // 将当前网页内的数据所在元素内容改为刚刚获取的下一页数据内容,以便循环获取下一页 URL(gufengmh8_function 函数)
            pageElems.textContent.split(';').forEach(function (one){ // 分号 ; 分割为数组并遍历
                //console.log(one)
                if (one.indexOf('chapterImages') > -1) { // 图片文件名数组
                    chapterImages = one.replace(/^.+\[/, '').replace(']', '').replaceAll('"', '').split(',')
                } else if (one.indexOf('chapterPath') > -1) { // 图片文件路径
                    chapterPath = one.split('"')[1];
                } else if (one.indexOf('pageTitle') > -1) { // 网页标题
                    window.document.title = one.split('"')[1]; // 修改当前网页标题为下一页的标题
                }
            })
            if (chapterImages && chapterPath) {
                let _img = '';
                chapterImages.forEach(function (one2){ // 遍历图片文件名数组,组合为 img 标签
                    _img += '<img src="https://res.xiaoqinre.com/' + chapterPath + one2 + '" data-index="0" style="display: inline-block;">'
                    //console.log('https://res.xiaoqinre.com/' + chapterPath + one2)
                })
                document.querySelector(curSite.pager.HT_insert[0].replace('css;', '')).insertAdjacentHTML(addTo(curSite.pager.HT_insert[1]), _img); // 将 img 标签插入到网页中

            }
        }
    }


    // 启用/禁用 (当前网站)
    function menu_disable(type) {
        switch(type) {
            case 'check':
                if(check()) return true
                return false
                break;
            case 'add':
                add();
                break;
            case 'del':
                del();
                break;
        }

        function check() { // 存在返回真,不存在返回假
            let list = GM_getValue('menu_disable'); // 读取网站列表
            if (list.indexOf(location.host) === -1) return false // 不存在返回假
            return true
        }

        function add() {
            if (check()) return
            let list = GM_getValue('menu_disable'); // 读取网站列表
            list.push(location.host); // 追加网站域名
            GM_setValue('menu_disable', list); // 写入配置
            location.reload(); // 刷新网页
        }

        function del() {
            if (!check()) return
            let list = GM_getValue('menu_disable'), // 读取网站列表
            index = list.indexOf(location.host);
            list.splice(index, 1); // 删除网站域名
            GM_setValue('menu_disable', list); // 写入配置
            location.reload(); // 刷新网页
        }
    }


    // 菜单开关
    function menu_switch(menu_status, Name, Tips) {
        if (menu_status === true){
            GM_setValue(`${Name}`, false);
        }else{
            GM_setValue(`${Name}`, true);
        }
        location.reload();
    };


    // 生成 ID
    function generateID() {
        let num = 0
        for (let val in DBSite) {
            DBSite[val].SiteTypeID = num = num + 1;
        }
    }


    // 类型 4 专用
    function getPageElems(url) {
        GM_xmlhttpRequest({
                    url: url,
                    method: 'GET',
                    timeout: 5000,
                    onload: function (response) {
                        try {
                            //console.log(`${response.responseText}`)
                            var newBody = ShowPager.createDocumentByString(response.responseText);
                            let pageElems = getAllElements(curSite.pager.pageElement, newBody, newBody);
                            if (pageElems.length >= 0) {
                                curSite.pager.functionAdd(pageElems)
                            }
                        } catch (e) {
                            console.log(e);
                        }
                    }
                });
    }


    // 插入位置
    function addTo(num) {
        switch (num) {
            case 1:
                return 'beforebegin'
                break;
            case 2:
                return 'afterbegin'
                break;
            case 3:
                return 'beforeend'
                break;
            case 4:
                return 'afterend'
                break;
        }
    }


    // 滚动条事件
    function windowScroll(fn1) {
        var beforeScrollTop = document.documentElement.scrollTop,
            fn = fn1 || function () {};
        setTimeout(function () { // 延时执行,避免刚载入到页面就触发翻页事件
            window.addEventListener("scroll", function (e) {
                var afterScrollTop = document.documentElement.scrollTop,
                    delta = afterScrollTop - beforeScrollTop;
                if (delta == 0) return false;
                fn(delta > 0 ? "down" : "up", e);
                beforeScrollTop = afterScrollTop;
            }, false);
        }, 1000)
    }


    var ShowPager = { // 修改自 https://greasyfork.org/scripts/14178
        getFullHref: function (e) {
            if(e == null) return '';
            "string" != typeof e && (e = e.getAttribute("href"));
            var t = this.getFullHref.a;
            return t || (this.getFullHref.a = t = document.createElement("a")), t.href = e, t.href;
        },
        createDocumentByString: function (e) {
            if (e) {
                if ("HTML" !== document.documentElement.nodeName) return (new DOMParser).parseFromString(e, "application/xhtml+xml");
                var t;
                try {
                    t = (new DOMParser).parseFromString(e, "text/html");
                } catch (e) {
                }
                if (t) return t;
                if (document.implementation.createHTMLDocument) t = document.implementation.createHTMLDocument("ADocument"); else try {
                    (t = document.cloneNode(!1)).appendChild(t.importNode(document.documentElement, !1)),
                        t.documentElement.appendChild(t.createElement("head")), t.documentElement.appendChild(t.createElement("body"));
                } catch (e) {
                }
                if (t) {
                    var r = document.createRange();
                    r.selectNodeContents(document.body);
                    var n = r.createContextualFragment(e);
                    t.body.appendChild(n);
                    for (var a, o = {
                        TITLE: !0,
                        META: !0,
                        LINK: !0,
                        STYLE: !0,
                        BASE: !0
                    }, i = t.body, s = i.childNodes, c = s.length - 1; c >= 0; c--) o[(a = s[c]).nodeName] && i.removeChild(a);
                    return t;
                }
            } else console.error("没有找到要转成DOM的字符串");
        },
        loadMorePage: function () {
            if (curSite.pager) {
                let curPageEle = getElementByXpath(curSite.pager.nextLink);
                var url = this.getFullHref(curPageEle);
                //console.log(`${url} ${curPageEle} ${curSite.pageUrl}`);
                if (url === '') return;
                if (curSite.pageUrl === url) return;// 避免重复加载相同的页面
                curSite.pageUrl = url;
                // 读取下一页的数据
                curSite.pager.startFilter && curSite.pager.startFilter();
                GM_xmlhttpRequest({
                    url: url,
                    method: 'GET',
                    timeout: 5000,
                    onload: function (response) {
                        try {
                            //console.log(`${response.responseText}`)
                            var newBody = ShowPager.createDocumentByString(response.responseText);
                            let pageElems = getAllElements(curSite.pager.pageElement, newBody, newBody);
                            let toElement = getAllElements(curSite.pager.HT_insert[0])[0];
                            if (pageElems.length >= 0) {
                                // 如果有插入前函数就执行函数
                                if (curSite.function && curSite.function.before) {
                                    if (curSite.function.parameter) { // 如果指定了参数
                                        pageElems = curSite.function.before(curSite.function.parameter);
                                    } else {
                                        pageElems = curSite.function.before(pageElems);
                                    }
                                }
                                // 插入位置
                                let addTo = addTo(curSite.pager.HT_insert[1]);
                                // 插入新页面元素
                                pageElems.forEach(function (one) {
                                    toElement.insertAdjacentElement(addTo, one);
                                });
                                // 替换待替换元素
                                try {
                                    let oriE = getAllElements(curSite.pager.replaceE);
                                    let repE = getAllElements(curSite.pager.replaceE, newBody, newBody);
                                    if (oriE.length === repE.length) {
                                        for (var i = 0; i < oriE.length; i++) {
                                            oriE[i].outerHTML = repE[i].outerHTML;
                                        }
                                    }
                                } catch (e) {
                                    console.log(e);
                                }
                                // 如果有插入后函数就执行函数
                                if (curSite.function && curSite.function.after) {
                                    if (curSite.function.parameter) { // 如果指定了参数
                                        curSite.function.after(curSite.function.parameter);
                                    }else{
                                        curSite.function.after();
                                    }
                                }
                            }
                        } catch (e) {
                            console.log(e);
                        }
                    }
                });
            }
        },
    };


    function getElementByXpath(e, t, r) {
      r = r || document, t = t || r;
      try {
        return r.evaluate(e, t, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
      } catch (t) {
        return void console.error("无效的xpath");
      }
    }


    function getAllElements(e, t, r, n, o) {
      let getAllElementsByXpath = function(e, t, r) {
        return r = r || document, t = t || r, r.evaluate(e, t, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
      }

      var i, s = [];
      if (!e) return s;
      if (r = r || document, n = n || window, o = o || void 0, t = t || r, "string" == typeof e) i = 0 === e.search(/^css;/i) ? function getAllElementsByCSS(e, t) {
        return (t || document).querySelectorAll(e);
      }(e.slice(4), t) : getAllElementsByXpath(e, t, r); else {
        if (!(i = e(r, n, o))) return s;
        if (i.nodeType) return s[0] = i, s;
      }
      return function makeArray(e) {
        var t, r, n, o = [];
        if (e.pop) {
          for (t = 0, r = e.length; t < r; t++) (n = e[t]) && (n.nodeType ? o.push(n) : o = o.concat(makeArray(n)));
          return a()(o);
        }
        if (e.item) {
          for (t = e.length; t;) o[--t] = e[t];
          return o;
        }
        if (e.iterateNext) {
          for (t = e.snapshotLength; t;) o[--t] = e.snapshotItem(t);
          return o;
        }
      }(i);
    }
})();