52pojie 吾爱破解功能增强

功能:1. 筛选最近的帖子 2. 回复数/点击数升降序显示 3. 点击过的帖子显隐 样式:1. 去除无用信息显示 2. 给最近列表项帖子添加序号 3. 高热帖加亮 现存问题:新帖这一个的排序不生效

目前为 2023-11-04 提交的版本。查看 最新版本

// ==UserScript==
// @name        52pojie 吾爱破解功能增强
// @description  功能:1. 筛选最近的帖子 2. 回复数/点击数升降序显示 3. 点击过的帖子显隐 样式:1. 去除无用信息显示 2. 给最近列表项帖子添加序号 3. 高热帖加亮 现存问题:新帖这一个的排序不生效
// @author     cjcchester
// @namespace     cjcchester.com
// @match       https://www.52pojie.cn/*
// @version     0.2.0
// @require     https://cdn.staticfile.org/jquery/1.12.1/jquery.min.js
// @grant       GM_getValue
// @grant       GM_setValue
// @grant       GM_registerMenuCommand
// ==/UserScript==

/*
功能:
1. 筛选最近的帖子
2. 回复数/点击数升降序显示
3. 点击过的帖子显隐

样式:
1. 去除无用信息显示
2. 给最近列表项帖子添加序号
3. 高热帖加亮

现存问题:新帖这一个的排序不生效
*/

(function () {
    // 设置查看小时以内的新帖子的时间范围(默认24小时)
    var hours_count = GM_getValue('hours_count', 24);
    // 是否点击查看过的帖子后隐藏(默认关闭)
    var click_hide = GM_getValue('click_hide', false);
    // 排序方式(默认不排序)
    var sort_order = GM_getValue('sort_order', 'default');
    // 是否延迟加载(默认不延迟)
    var lay_load = GM_getValue('lay_load',false);
    // 获取当前时间
    var now_time = new Date();
    // 计算时间范围(毫秒)
    var hide_space = hours_count * 60 * 60 * 1000;

    // 使用jQuery的noConflict模式,以避免冲突
    var jq = jQuery.noConflict();

    // 从函数中提取注释文本
    function extractComment(f) {
        return f.toString().split('\n').slice(1, -1).join('\n');
    }

    // 处理链接点击事件
    function onLinkClick(obj) {
        var id = obj.currentTarget.id;
        localStorage.setItem(id, 1); // 标记链接被点击

        if (click_hide) {
            jq(obj.currentTarget).hide();
        }
    }

    // 在排序后重新设置序号
    function renumberList() {
        var counter = 0;
        jq('.bm_c table tbody:visible').each(function () {
            counter++;
            jq(this).find('td:first').text(counter);
        });
    }

    function commonDeal() {
        // 自定义CSS样式
        var style = document.createElement('style');
        style.type = 'text/css';
        style.textContent = extractComment(function () { /*
                .tl table { table-layout: auto }
            */
        });
        var head = document.querySelector('head');
        head.appendChild(style);

        // 隐藏部分页面元素 免责声明、版权声明
        jq('.bm_c.cl.pbn,.res-footer-note,.wp.vw50_kfc_f,#ft').hide();
    }

    // 处理帖子详情页的元素
    function detailDeal() {
        // 移除每个回答中的吾爱提示、图片;发布回复的吾爱头像、吾爱提示
        jq('.vw50_kfc_pb,.sign,.avatar.avtm,.ptm.pnpost span,.vw50_kfc_pt').remove();
        // 只保留类名为姓名和个人信息
        jq('.pls.cl.favatar').children().not('.pi, .pil.cl.credit-list').remove();
        // 只保留个人信息中吾爱币这一项
        jq('.pil.cl.credit-list').children().not('.cr-ext2').remove();
        jq('.t_fsz').css('min-height', 'auto');
    }

    // 处理悬赏帖子列表的主要逻辑
    function listDeal() {
        var counter = 0; // 初始化序号计数器

        jq('.bm_c table tbody').each(function () {
            var dateText = jq('em span', this).text(); // 获取日期文本
            var create_time = Date.parse(new Date(dateText));
            var num = jq('.num a', this).text();

            // 检查帖子的创建时间是否在时间范围内
            if ((now_time - create_time) < hide_space) {
                counter++; // 帖子在时间范围内,增加计数器
                // 根据帖子回复数量设置背景颜色
                var bgColor = num > 1000 ? '#FFEBEB' : (num > 500 ? '#FFCDCD' : (num > 200 ? '#FFEBEB' : ''));
                jq(this).css('background', bgColor);
            } else {
                jq(this).hide();
            }

            var id = this.id;
            if (id) {
                if (localStorage.getItem(id) > 0) {
                    jq(this).hide();
                } else {
                    jq(this).click(onLinkClick);
                }
            }

            // 创建一个序号元素并添加到列表项开头
            var sequenceElement = document.createElement('td');
            // sequenceElement.textContent = counter;
            sequenceElement.style.fontWeight = 'bold';
            sequenceElement.style.padding = '0 10px';
            jq('td.icn', this).before(sequenceElement);
        });

        if (counter == 0) {
            createAutoCloseModal("帖子太旧了,全部都不在时间范围内,您可以换调整时间或者看看其他页", 3000);
        }else{
            // createAutoCloseModal("counter"+counter, 1000);
        }
    }

    // 注册菜单选项
    GM_registerMenuCommand('开启/关闭查看后帖子隐藏:' + click_hide, function () {
        click_hide = !click_hide;
        GM_setValue('click_hide', click_hide);
    });
    GM_registerMenuCommand('设置新帖子的时间范围:' + hours_count, function () {
        var hours = prompt('请输入新帖子的时间范围(小时)', hours_count);
        if (hours !== null) {
            hours_count = parseInt(hours);
            GM_setValue('hours_count', hours_count);
            hide_space = hours_count * 60 * 60 * 1000;
        }
    });
    GM_registerMenuCommand('开启/关闭延迟加载(默认5s,加载5页):'+lay_load, function () {
        lay_load = !lay_load;
        if(lay_load == true){createAutoCloseModal("已开启自动加载", 2000);}
        else{createAutoCloseModal("已关闭自动加载", 2000);}
        GM_setValue('lay_load', lay_load);
    });
    GM_registerMenuCommand('按回复数升序排列'+(temp=sort_order=='reply_asc'?': true':'false'), function () {
        sort_order = 'reply_asc';
        createAutoCloseModal("已设为回复数升序", 2000);
        GM_setValue('sort_order', sort_order);
        location.reload(); // 刷新页面以应用排序
    });
    var temp = '';
    GM_registerMenuCommand('按回复数降序排列'+(temp=sort_order=='reply_desc'?': true':'false'), function () {
        sort_order = 'reply_desc';
        createAutoCloseModal("已设为回复数降序", 2000);
        GM_setValue('sort_order', sort_order);
        location.reload(); // 刷新页面以应用排序
    });
    GM_registerMenuCommand('按点击数升序排列'+(temp=sort_order=='click_asc'?': true':'false'), function () {
        sort_order = 'click_asc';
        createAutoCloseModal("已设为点击数升序", 2000);
        GM_setValue('sort_order', sort_order);
        location.reload(); // 刷新页面以应用排序
    });
    GM_registerMenuCommand('按点击数降序排列'+(temp=sort_order=='click_desc'?': true':'false'), function () {
        sort_order = 'click_desc';
        createAutoCloseModal("已设为点击数降序", 2000);
        GM_setValue('sort_order', sort_order);
        location.reload(); // 刷新页面以应用排序
    });

    var createTimeIn; // 创建时间定位元素地址
    var curLink = window.location.href; // 当前页面地址

    // 主函数,调用所有
    function otherDeal() {
        // 帖子详情页
        if (curLink.includes("viewthread") || curLink.includes("thread-")) {
            detailDeal();
        }
        // 悬赏列表页
        if (curLink.includes("forumdisplay") || curLink.includes("guide")) {
            createTimeIn = 'em span';
            listDeal();
            if (sort_order === 'reply_asc') {
                // 按回复数升序排列
                jq('.bm_c table tbody').sort(function (a, b) {
                    var replyA = parseInt(jq('.num a', a).text());
                    var replyB = parseInt(jq('.num a', b).text());
                    return replyA - replyB;
                }).appendTo('#threadlisttableid');
            } else if (sort_order === 'reply_desc') {
                // 按回复数降序排列
                jq('.bm_c table tbody').sort(function (a, b) {
                    var replyA = parseInt(jq('.num a', a).text());
                    var replyB = parseInt(jq('.num a', b).text());
                    return replyB - replyA;
                }).appendTo('#threadlisttableid');
            } else if (sort_order === 'click_asc') {
                // 按点击数升序排列
                jq('.bm_c table tbody').sort(function (a, b) {
                    var clickA = parseInt(jq('.num em', a).text());
                    var clickB = parseInt(jq('.num em', b).text());
                    return clickA - clickB;
                }).appendTo('#threadlisttableid');
            } else if (sort_order === 'click_desc') {
                // 按点击数降序排列
                jq('.bm_c table tbody').sort(function (a, b) {
                    var clickA = parseInt(jq('.num em', a).text());
                    var clickB = parseInt(jq('.num em', b).text());
                    return clickB - clickA;
                }).appendTo('#threadlisttableid');
            }
            // 在排序后重新设置序号
            if (sort_order === 'reply_asc' || sort_order === 'reply_desc' || sort_order === 'click_asc' || sort_order === 'click_desc') {
                renumberList();
            }
        }
    }

    function main(){
        // 通用样式处理
        commonDeal();
        if (curLink.includes("forumdisplay") || curLink.includes("guide")) {
            if(GM_getValue('lay_load') == true){
                // 延迟加载
                createAutoCloseModal("延迟加载中,请耐心等待……", 3000);
                // 记录开始时间
                const startTime = new Date().getTime();
                const intervalId = setInterval(function () {
                    // 执行你的代码片段
                    jq('#autopbn').click();
                    if (new Date().getTime() - startTime >= 3000) {
                        clearInterval(intervalId); // 停止循环
                    }
                }, 800);
                setTimeout(function () {
                    otherDeal(); // 执行主函数
                    createAutoCloseModal("完成", 1000);
                }, 5000);
            }else{
                otherDeal();
                // createAutoCloseModal("完成", 1000);
            }
        }
    }

    main(); // 调用主函数

    function createAutoCloseModal(message, timeout) {
        var modal = document.createElement("div");
        modal.style.position = "fixed";
        modal.style.top = "50%";
        modal.style.left = "50%";
        modal.style.transform = "translate(-50%, -50%)";
        modal.style.backgroundColor = "rgba(0, 0, 0, 0.7)";
        modal.style.color = "white";
        modal.style.padding = "20px";
        modal.style.borderRadius = "5px";
        modal.style.zIndex = "1000";
        modal.innerText = message;
        document.body.appendChild(modal);

        setTimeout(function () {
            document.body.removeChild(modal);
        }, timeout);
    }



    // 在地址栏变化时重新执行脚本
    window.addEventListener('popstate', function (event) {
        main();
    });
    // 监听所有AJAX请求
    /*XMLHttpRequest.prototype.originalOpen = XMLHttpRequest.prototype.open;
    XMLHttpRequest.prototype.open = function () {
        var url = arguments[1]; // 获取请求的URL
        if (url.includes('page')) {
            this.addEventListener('load', function () {
                // 在请求完成后执行以下代码
                if (this.status === 200) {
                    // 处理新数据
                    console.info('下一页请求完成!');
                    main(); // 处理新数据的主要函数
                }
            });
        }
        this.originalOpen.apply(this, arguments);
    };*/
})();