52pojie 吾爱破解功能增强

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

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

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

(function () {
    // 设置信息对象
    const settings = {
        hoursCount: GM_getValue('hours_count', 24),
        clickHide: GM_getValue('click_hide', false),
        sortOrder: GM_getValue('sort_order', 'default'),
        layLoad: GM_getValue('lay_load', false),
    };

    // 获取当前时间
    const nowTime = new Date();
    // 计算时间范围(毫秒)
    const hideSpace = settings.hoursCount * 60 * 60 * 1000;

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

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

        if (settings.clickHide) {
            $(event.currentTarget).hide();
        }
    }

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

    // 处理公共样式
    function commonDeal() {
        // 添加自定义CSS样式
        const style = document.createElement('style');
        style.type = 'text/css';
        style.textContent = `
            .tl table { table-layout: auto }
        `;
        const head = document.querySelector('head');
        head.appendChild(style);

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

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

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

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

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

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

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

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

    // 处理特定页面的逻辑
    function otherDeal() {
        // 帖子详情页
        if (currentLink.includes("viewthread") || currentLink.includes("thread-")) {
            detailDeal();
        }
        // 悬赏列表页
        if (currentLink.includes("forumdisplay") || currentLink.includes("guide") || currentLink.includes("forum-")) {
            createTimeIn = 'em span';
            listDeal();
            if (settings.sortOrder === 'reply_asc') {
                // 按回复数升序排列
                $('.bm_c table tbody').sort(function (a, b) {
                    const replyA = parseInt($('.num a', a).text());
                    const replyB = parseInt($('.num a', b).text());
                    return replyA - replyB;
                }).appendTo('.bm_c table');
            } else if (settings.sortOrder === 'reply_desc') {
                // 按回复数降序排列
                $('.bm_c table tbody').sort(function (a, b) {
                    const replyA = parseInt($('.num a', a).text());
                    const replyB = parseInt($('.num a', b).text());
                    return replyB - replyA;
                }).appendTo('.bm_c table');
            } else if (settings.sortOrder === 'click_asc') {
                // 按点击数升序排列
                $('.bm_c table tbody').sort(function (a, b) {
                    const clickA = parseInt($('.num em', a).text());
                    const clickB = parseInt($('.num em', b).text());
                    return clickA - clickB;
                }).appendTo('.bm_c table');
            } else if (settings.sortOrder === 'click_desc') {
                // 按点击数降序排列
                $('.bm_c table tbody').sort(function (a, b) {
                    const clickA = parseInt($('.num em', a).text());
                    const clickB = parseInt($('.num em', b).text());
                    return clickB - clickA;
                }).appendTo('.bm_c table');
            } else if (settings.sortOrder === '52coin') {
                // 按点击数降序排列
                $('.bm_c table tbody').sort(function (a, b) {
                    const clickA = parseInt($('.xi1 .xw1', a).text()) || 0;
                    const clickB = parseInt($('.xi1 .xw1', b).text()) || 0;
                    return clickB - clickA;
                }).appendTo('.bm_c table');
            }
            // 在排序后重新设置序号
            if (settings.sortOrder === 'reply_asc' || settings.sortOrder === 'reply_desc' || settings.sortOrder === 'click_asc' || settings.sortOrder === 'click_desc' || settings.sortOrder === '52coin') {
                renumberList();
            }
        }
    }

    // 注册菜单选项
    GM_registerMenuCommand(`开启/关闭查看后帖子隐藏:${settings.clickHide}`, function () {
        settings.clickHide = !settings.clickHide;
        const message = settings.clickHide ? "已开启查看后帖子隐藏" : "已关闭查看后帖子隐藏";
        createAutoCloseModal(message, 2000);
        GM_setValue('click_hide', settings.clickHide);
        location.reload();
    });

    GM_registerMenuCommand(`设置新帖子的时间范围:${settings.hoursCount}`, function () {
        const hours = prompt('请输入新帖子的时间范围(小时)', settings.hoursCount);
        if (hours !== null) {
            settings.hoursCount = parseInt(hours);
            GM_setValue('hours_count', settings.hoursCount);
            let hideSpace = settings.hoursCount * 60 * 60 * 1000;
            location.reload();
            createAutoCloseModal('已设置时间范围为'+settings.hoursCount+'小时内', 2000);
        }
    });

    GM_registerMenuCommand(`开启/关闭延迟加载(默认5s,加载5页):${settings.layLoad}`, function () {
        settings.layLoad = !settings.layLoad;
        GM_setValue('lay_load', settings.layLoad);
        const message = settings.layLoad ? "已开启自动加载" : "已关闭自动加载";
        createAutoCloseModal(message, 2000);
    });

    // 添加排序菜单选项
    GM_registerMenuCommand(`按回复数升序排列: ${settings.sortOrder === 'reply_asc'}`, function () {
        settings.sortOrder = 'reply_asc';
        GM_setValue('sort_order', settings.sortOrder);
        createAutoCloseModal("已设为回复数升序", 2000);
        location.reload();
    });

    GM_registerMenuCommand(`按回复数降序排列: ${settings.sortOrder === 'reply_desc'}`, function () {
        settings.sortOrder = 'reply_desc';
        GM_setValue('sort_order', settings.sortOrder);
        createAutoCloseModal("已设为回复数降序", 2000);
        location.reload();
    });

    GM_registerMenuCommand(`按点击数升序排列: ${settings.sortOrder === 'click_asc'}`, function () {
        settings.sortOrder = 'click_asc';
        GM_setValue('sort_order', settings.sortOrder);
        createAutoCloseModal("已设为点击数升序", 2000);
        location.reload();
    });

    GM_registerMenuCommand(`按点击数降序排列: ${settings.sortOrder === 'click_desc'}`, function () {
        settings.sortOrder = 'click_desc';
        GM_setValue('sort_order', settings.sortOrder);
        createAutoCloseModal("已设为点击数升序", 2000);
        location.reload();
    });

    GM_registerMenuCommand(`按吾爱币降序排列: ${settings.sortOrder === '52coin'}`, function () {
        settings.sortOrder = '52coin';
        GM_setValue('sort_order', settings.sortOrder);
        createAutoCloseModal("已设为吾爱币降序", 2000);
        location.reload();
    });

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

    // 主函数,调用所有处理逻辑
    function main() {
        // 通用样式处理
        commonDeal();
        if (currentLink.includes("forumdisplay") || currentLink.includes("guide") || currentLink.includes("forum-")) {
            if (settings.layLoad) {
                // 延迟加载
                createAutoCloseModal("延迟加载中,请耐心等待……", 3000);
                // 记录开始时间
                const startTime = new Date().getTime();
                const intervalId = setInterval(function () {
                    $('#autopbn').click();
                    if (new Date().getTime() - startTime >= 3000) {
                        clearInterval(intervalId); // 停止循环
                    }
                }, 800);
                setTimeout(function () {
                    otherDeal(); // 执行主函数
                    createAutoCloseModal("完成", 1000);
                }, 5000);
            } else {
                otherDeal();
            }
        } else {
            otherDeal();
        }
    }

    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();
    });

})();