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