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