自动无缝翻页

⭐无缝加载 下一页内容 至网页底部(类似瀑布流,无限滚动,无需手动点击下一页)⭐,目前支持:【所有「Discuz!、Flarum、phpBB、MyBB、Xiuno、XenForo、NexusPHP...」论坛】【百度、谷歌(Google)、必应(Bing)、搜狗、微信、360、Yahoo、Yandex 等搜索引擎...】、贴吧、豆瓣、知乎、NGA、V2EX、起点中文、千图网、千库网、Pixabay、Pixiv、3DM、游侠网、游民星空、NexusMods、Steam 创意工坊、CS.RIN.RU、RuTracker、BT之家、萌番组、动漫花园、樱花动漫、爱恋动漫、AGE 动漫、Nyaa、SrkBT、RARBG、SubHD、423Down、不死鸟、扩展迷、小众软件、【动漫狂、动漫屋、漫画猫、漫画屋、漫画 DB、HiComic、Mangabz、Xmanhua 等漫画网站...】、PubMed、Z-Library、GreasyFork、Github、StackOverflow(以上仅一小部分常见网站,更多的写不下了...

< Feedback op 自动无缝翻页

Recensie: Goed - het script werkt zoals het hoort

§
Geplaatst: 11-02-2022

https://www.xiurenb.net/
这个网站 之前已经支持自动翻页了的 但是希望能直接一下子翻到底 就是不需要鼠标滚动到底部才显示, 这样可以方便直接保存图片。 希望大神能弄个这个功能,或者告诉我怎么改下代码

X.I.UMaker
§
Geplaatst: 12-02-2022

不会添加这个功能,而且改代码的话也不是改一两行就能实现的。
不过你可以进去网页 1 秒后,直接把滚动条拉到底,然后脚本就会一直加载下一页(滚动条低于触发线就会一直触发),直到最后一页。

§
Geplaatst: 13-02-2022

不会添加这个功能,而且改代码的话也不是改一两行就能实现的。

不过你可以进去网页 1 秒后,直接把滚动条拉到底,然后脚本就会一直加载下一页(滚动条低于触发线就会一直触发),直到最后一页。

拉到底之后它会不停的向上动,还是要一次一次的拉才行。我看了下代码触发翻页是这个scrollD 但是我自己改了这个值好像没什么作用呢,比如改到9000之类的 也能少拉几次。

xiurenji: {
host: /\.xiuren[a-z]+\./,
functionS: function() {insStyle('img[src$=".gif"]:not([src*="logo"]) {display: none !important;}');
if (indexOF('.html') && !indexOF('/index')) {
curSite = DBSite.xiurenji;
} else if (indexOF('search')) {
curSite = DBSite.xiurenji_search;
} else {
curSite = DBSite.xiurenji_list;
}},
pager: {
type: 1,
nextL: '//div[@class="page"]/a[text()="下页"]',
pageE: 'css;div.content > p > *',
replaceE: 'css;.page',
scrollD: 1500
}
}, // xiurenji - 图片页
xiurenji_list: {
pager: {
type: 1,
nextL: '//div[@class="page"]/a[text()="下页"]',
pageE: 'css;li.i_list',
replaceE: 'css;.page',
scrollD: 1000
}
}, // xiurenji - 分类页
xiurenji_search: {
pager: {
type: 1,
nextL: 'css;.page > a.current+a',
pageE: 'css;.node > *',
replaceE: 'css;.page',
scrollD: 700
}
}, // xiurenji - 搜索页

§
Geplaatst: 16-02-2022

大神能给指导一下嘛

X.I.UMaker
§
Geplaatst: 16-02-2022

如果要改动代码实现你要的功能,那么其他所有网站规则都会受影响,这意味着你修改后,这个脚本就只适用于这个网站了。
如果你要采集保存这网站的图片,何必这么多此一举呢。。。
就是另写一个针对性的脚本,都比改来改去的更快更好。

X.I.UMaker
§
Geplaatst: 16-02-2022

我直接复制了一份脚本,精简到只支持这个网站的图片页,打开网页后每隔 500 毫秒就会翻页一次。

如果这个网站改域名了,那你只需要改一下脚本开头的域名即可。

这个新脚本会和 [自动无缝翻页] 冲突,记得在 [自动无缝翻页] 菜单选项中禁用这个网站,或者你打开该网站图片页时,点一下左下角的页码按钮暂停翻页,以避免两个脚本冲突。

我只帮你到这里了,其他需求、改动什么的后续你自己研究吧。

// ==UserScript==
// @name         自动无缝翻页 - xiuren
// @version      1.0.0
// @author       X.I.U
// @description  给 @丝情画意 临时写的
// @match        https://www.xiurenb.net/*
// @grant        GM_xmlhttpRequest
// @license      GPL-3.0 License
// @run-at       document-end
// @namespace    xiuren
// ==/UserScript==

(function() {
    'use strict';
    var curSite = {SiteTypeID: 0}, SiteType, pausePage = true, lp = location.pathname,
        DBSite = {
            xiurenji: {
                functionS: function() {insStyle('img[src$=".gif"]:not([src*="logo"]) {display: none !important;}');if (location.pathname.indexOf('.html') > -1 && location.pathname.indexOf('/index') === -1) {curSite = DBSite.xiurenji;}},
                pager: {
                    type: 1,
                    nextL: '//div[@class="page"]/a[text()="下页"]',
                    pageE: 'css;div.content > p > *',
                    replaceE: 'css;.page',
                    scrollD: 1500
                }
            } //            xiurenji - 图片页
        }


    DBSite.xiurenji.functionS()
    // 插入 Style CSS 样式
    if (curSite.style) insStyle(curSite.style)
    curSite.pageUrl = ''; // 下一页URL
    let timer = setInterval(function(){ // 每 500 毫秒翻页一次
        if (pausePage === false) {
            clearInterval(timer); // 取消定时器
        } else {
            checkURL(getPageElems); // 继续循环翻页
        }
    }, 500);


    // --------------------------------------------------------


    // 翻页类型 1/3
    function getPageElems(url) {
        GM_xmlhttpRequest({
            url: url,
            method: 'GET',
            overrideMimeType: 'text/html; charset=' + document.charset,
            headers: {
                'Referer': location.href
            },
            timeout: 10000,
            onload: function (response) {
                try {
                    //console.log('最终 URL:' + response.finalUrl, '返回内容:' + response.responseText)
                    processElems(createDocumentByString(response.responseText));
                } catch (e) {
                    console.log(e);
                }
            }
        });
    }


    // XHR 后处理结果,插入、替换元素等(适用于翻页类型 1/3/6)
    function processElems(response) {
        if (!curSite.pager.insertP) {curSite.pager.insertP = [curSite.pager.pageE, 5]}
        let pageElems = getAll(curSite.pager.pageE, response, response), toElement;
        if (curSite.pager.insertP[1] === 5) { // 插入 pageE 列表最后一个元素的后面
            toElement = getAll(curSite.pager.insertP[0]).pop();
        } else {
            toElement = getOne(curSite.pager.insertP[0]);
        }

        if (pageElems.length > 0 && toElement) {
            // 插入位置
            let addTo = getAddTo(curSite.pager.insertP[1]);

            // 插入新页面元素
            if (curSite.pager.insertP[1] === 2 || curSite.pager.insertP[1] === 4 || curSite.pager.insertP[1] === 5) pageElems.reverse(); // 插入到 [元素内头部]、[目标本身后面] 时,需要反转顺序
            pageElems.forEach(function (one) {toElement.insertAdjacentElement(addTo, one);});

            // 替换待替换元素
            if (curSite.pager.replaceE) replaceElems(response);
        }
    }
    // 通用型获取下一页地址(从 元素 中获取页码)
    function getNextE(css) {
        if (!css) css = curSite.pager.nextL;
        let next = getOne(css)
        if (next && next.nodeType === 1 && next.href && next.href.slice(0,4) === 'http' && next.href != curSite.pageUrl) {
            if (curSite.pager.forceHTTPS && location.protocol === 'https:') {
                curSite.pageUrl = next.href.replace(/^http:/,'https:');
            } else {
                curSite.pageUrl = next.href;
            }
            //console.log(curSite.pageUrl)
            return true
        }
        pausePage = false;
        return false
    }
    // 检查 URL
    function checkURL(func) {
        if (typeof curSite.pager.nextL == 'function') {
            let tempUrl = curSite.pager.nextL();
            if (!tempUrl || (tempUrl && tempUrl.slice(0,4) != 'http') || tempUrl === curSite.pageUrl ) {pausePage = false; return};
            curSite.pageUrl = tempUrl;
            func(curSite.pageUrl);
        } else if (getNextE()) {
            func(curSite.pageUrl);
        }
        //console.log(curSite.pageUrl);
    }
    // 替换元素
    function replaceElems(pageElems, o = curSite.pager.replaceE, r = curSite.pager.replaceE) {
        let oriE = getAll(o),
            repE = getAll(r, pageElems, pageElems);
        //console.log(oriE, repE)
        if (oriE.length != 0 && repE.length != 0 && oriE.length === repE.length) {
            for (let i = 0; i < oriE.length; i++) {
                oriE[i].outerHTML = repE[i].outerHTML;
            }
            return true
        }
        return false
    }
    // 插入 <Style>
    function insStyle(style) {
        document.documentElement.appendChild(document.createElement('style')).textContent = style;
    }


    // 获取元素(CSS/Xpath)来自:https://github.com/machsix/Super-preloader
    function getCSS(css, contextNode = document) {
        return contextNode.querySelector(css);
    }
    function getAllCSS(css, contextNode = document) {
        return [].slice.call(contextNode.querySelectorAll(css));
    }
    function getXpath(xpath, contextNode, doc = document) {
        contextNode = contextNode || doc;
        try {
            const result = doc.evaluate(xpath, contextNode, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null);
            // 应该总是返回一个元素节点
            return result.singleNodeValue && result.singleNodeValue.nodeType === 1 && result.singleNodeValue;
        } catch (err) {
            throw new Error(`无效 Xpath: ${xpath}`);
        }
    }
    function getAllXpath(xpath, contextNode, doc = document) {
        contextNode = contextNode || doc;
        const result = [];
        try {
            const query = doc.evaluate(xpath, contextNode, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
            for (let i = 0; i < query.snapshotLength; i++) {
                const node = query.snapshotItem(i);
                // 如果是 Element 节点
                if (node.nodeType === 1) result.push(node);
            }
        } catch (err) {
            throw new Error(`无效 Xpath: ${xpath}`);
        }
        return result;
    }
    function getOne(selector, contextNode = undefined, doc = document) {
        if (!selector) return;
        contextNode = contextNode || doc;
        if (selector.search(/^css;/i) === 0) {
            return getCSS(selector.slice(4), contextNode);
        } else {
            return getXpath(selector, contextNode, doc);
        }
    }
    function getAll(selector, contextNode = undefined, doc = document) {
        if (!selector) return [];
        contextNode = contextNode || doc;
        if (selector.search(/^css;/i) === 0) {
            return getAllCSS(selector.slice(4), contextNode);
        } else {
            return getAllXpath(selector, contextNode, doc);
        }
    }
    function createDocumentByString(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(),
                    n = r.createContextualFragment(e);
                r.selectNodeContents(document.body);
                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 的字符串');
    }
    // 插入位置
    function getAddTo(num) {
        switch (num) {
            case 1:
                return 'beforebegin'; break;
            case 2:
                return 'afterbegin'; break;
            case 3:
            case 6:
                return 'beforeend'; break;
            case 4:
            case 5:
                return 'afterend'; break;
        }
    }
})();
§
Geplaatst: 18-02-2022

大神费心了 但是只能翻到第二页就不动了 = =!

X.I.UMaker
§
Geplaatst: 18-02-2022
Bijgewerkt: 18-02-2022

我随便点了几个图片页,都能正常翻页,可以明显看到滚动条变化,以及顶部的页码元素变化。
Edge、Chrome 都测试正常,脚本没问题。
脚本以外的问题,我不会去管,毕竟这个脚本只是临时给你写的,没有精力去一直提供帮助。

§
Geplaatst: 18-02-2022

我随便点了几个图片页,都能正常翻页,可以明显看到滚动条变化,以及顶部的页码元素变化。

Edge、Chrome 都测试正常,脚本没问题。

脚本以外的问题,我不会去管,毕竟这个脚本只是临时给你写的,没有精力去一直提供帮助。

恩 好的 再次感谢大神的回复 (‐^▽^‐)

Reactie plaatsen

Log in om antwoord te geven.