Greasy Fork

Greasy Fork is available in English.

什么值得买SMZDM - 自动签到、翻页

值得买自动签到、自动无缝翻页

当前为 2021-02-23 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         什么值得买SMZDM - 自动签到、翻页
// @version      1.1
// @author       Siukei
// @description  值得买自动签到、自动无缝翻页
// @match        *://*.smzdm.com/*
// @icon         https://www.smzdm.com/favicon.ico
// @grant        GM_xmlhttpRequest
// @grant        GM_registerMenuCommand
// @grant        GM_unregisterMenuCommand
// @grant        GM_openInTab
// @grant        GM_getValue
// @grant        GM_setValue
// @grant        GM_notification
// @license      GPL-3.0 License
// @run-at       document-end
// @namespace    https://www.smzdm.com
// ==/UserScript==

(function () {
    // 默认 ID 为 0
    var curSite = {
        SiteTypeID: 1,
        pager: {
            nextLink: '//*[@id="commentTabBlockNew"]/ul[2]/li[@class="pagedown"]/a[@href]',
            pageElement: 'css;div#commentTabBlockNew > ul > li[id^="li_comment_"]',
            HT_insert: ['css;ul.comment_listBox', 2],
            replaceE: '//*[@id="commentTabBlockNew"]/ul[2]',
        }
        , pageUrl: '' // 下一页url
    };

    pageLoading();

    // 自动翻页
    function pageLoading() {
        if (window.location.href.indexOf('smzdm.com/p/') == -1) {
            return;
        }
        if (curSite.SiteTypeID > 0) {
            commentShowAll();
            // 删除无效信息
            let comments = document.querySelectorAll('li.comment_list');
            for (var i = 0; i < comments.length; i++) {
                let comment = comments[i];
                if (!checkContent(comment)) {
                    comment.remove();
                }
            }
            windowScroll(function (direction, e) {
                if (direction === "down") { // 下滑才准备翻页
                    let page = document.querySelector('#commentTabBlockNew > ul.pagination');
                     if (isInViewPortOfOne(page)) {               
                        ShowPager.loadMorePage();
                     }
                }
            });
        }
    }

    //判断元素是否出现在窗口内
    function isInViewPortOfOne(el) {
        // viewHeight 获取显示内容窗口的尺寸 兼容所有浏览器写法
        let viewHeight = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight
        //获取翻页区域在整个页面的位置
        let offsetTop = el.offsetTop
        //获取当前最顶层显示内容在整个页面的位置
        let scrollTop = document.documentElement.scrollTop
        //通过当前翻页所在高度-顶层内容高度,得出还有多少高度可到达翻页区域
        let pageTop = offsetTop - scrollTop
        //如果pageTop<=窗口尺寸,表示已经出现在窗口可视区域
        // console.log(`====offsetTop:${offsetTop}, scrollTop:${scrollTop}, clientHeight:${viewHeight}`);        
        // 这里有个+100是为了提前触发自动翻页,避免看到页码才翻页导致的加载延迟问题
        return pageTop <= viewHeight + 420
    }


    // 滚动条事件
    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);
        }, 500)
    }

    //自动展开隐藏评论
    function commentShowAll() {
        let showAll = document.querySelectorAll('.comment_showAll a');
        for (var i = 0; i < showAll.length; i++) {
            showAll[i].click();
        }
    }

    function checkContent(comment) {
        let span = comment.querySelector('div.comment_conWrap > div.comment_con > p > span');
        let cont = span.textContent;
        return cont.indexOf('此用户') == -1 && cont.indexOf('我参与了') == -1;
    }

    var ShowPager = { // 修改自 http://greasyfork.icu/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);
                // console.log(curPageEle);
                var url = this.getFullHref(curPageEle);
                // console.log(`${url}, ${curPageEle}, ${curSite.pageUrl}`);
                if (url === '') return;
                if (curSite.pageUrl === url) return;// 不会重复加载相同的页面                
                curSite.pageUrl = url;
                // console.log(url);
                // 读取下一页的数据
                // curSite.pager.startFilter && curSite.pager.startFilter();                
                GM_xmlhttpRequest({
                    url: url,
                    method: "GET",
                    timeout: 5000,
                    onload: function (response) {
                        try {
                            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) {
                                let addTo = "beforeend";
                                // 插入新页面元素
                                pageElems.forEach(function (one) {
                                    if (checkContent(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);
                                }
                                commentShowAll();
                            }
                        } 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);
    }


    autoSign();

    //自动签到
    function autoSign() {
        let checkinStr = 'smzdm_checkin';
        let now = new Date().getDate();
        // 首页,主动点击按钮
        if (/www\.smzdm\.com(\/|)$/.test(window.location.href)) {
            var btn = document.getElementsByClassName('J_punch')[0];
            if (/签到(得|领|拿)积分/.test(btn.text)) {
                btn.click();
                GM_setValue(checkinStr, now);
            }
        } else {
            let checkin = GM_getValue(checkinStr);
            if (checkin == now) {
                return;
            }
            // 非首页,内嵌脚本签到
            var url = 'https://zhiyou.smzdm.com/user/checkin/jsonp_checkin'
            var embed_script = document.createElement('script');
            embed_script.setAttribute('src', url);
            // 把script标签加入head,此时调用开始
            document.getElementsByTagName('head')[0].appendChild(embed_script);
            GM_setValue(checkinStr, now);
        }
    }
})();