// ==UserScript==
// @name 小草简洁助手
// @namespace http://tampermonkey.net/
// @version 3.01
// @description 为小草榴社区、1024、cl进行一些外科手术操作·回家不迷路,草榴最新地址 ·帖子内快速切换上下帖 ·预加载下一帖 ·限制页面宽度为1080 ·等比例无缝看图 ·图片查看模式 ·使用手机版面 ·帖子精简对于游客身份无关的内容·图片批量下载功能
// @match *://*/htm_data/*
// @match http*://*/htm_data/*.html
// @match http*://*/htm_mob/*.html
// @match http*://*/read.php*
// @match http*://*/personal.php*
// @match http*://*/post.php*
// @match http*://*/thread0806.php*
// @match http*://*.163.com*/*
// @run-at document-end
// @connect get.xunfs.com
// @grant GM_setValue
// @grant GM_getValue
// @grant GM_registerMenuCommand
// @grant GM_xmlhttpRequest
// @grant GM_addStyle
// ==/UserScript==
(function() {
'use strict';
var links = [];
// 配置项定义
const configItems = [
{ id: 'enableGoHome', label: '回家不迷路,进入163.com,右下角有神秘入口', default: true },
{ id: 'enableNavigationButton', label: '上下帖导航', default: true },
{ id: 'enablePreloadnextpage', label: '预加载下一帖', default: true },
{ id: 'limitPageWidth', label: '限制页面宽度为1080', default: true },
{ id: 'enableSeamlessView', label: '等比例无缝看图', default: true },
{ id: 'enableImagePreview', label: '图片查看模式', default: true },
{ id: 'enableMobilePage', label: '使用手机版面', default: true },
{ id: 'enableClearPage', label: '手机版帖子简洁', default: true },
{ id: 'enableDownloadPic', label: '帖子批量图片下载(仅适用于安卓手机端)', default: false },
{ id: 'compressAnnounce', label: '版块公告折叠', default: true } // 移出子项作为主项
];
// 手机版帖子简洁子设置项
const clearPageSubItems = [
{ id: 'clearPage_removeAds', label: '移除广告', default: true },
{ id: 'clearPage_removeAvatars', label: '移除头像', default: true },
{ id: 'clearPage_singleLineInfo', label: '单行用户信息', default: true },
{ id: 'clearPage_removeQuickReply', label: '移除快速回复', default: true } // 新增子项
];
// 初始化设置值
var enableGoHome = GM_getValue('enableGoHome', true);
var enableNavigationButton = GM_getValue('enableNavigationButton', true);
var enablePreloadnextpage = GM_getValue('enablePreloadnextpage', true);
var limitPageWidth = GM_getValue('limitPageWidth', true);
var enableSeamlessView = GM_getValue('enableSeamlessView', true);
var enableImagePreview = GM_getValue('enableImagePreview', true);
var enableMobilePage = GM_getValue('enableMobilePage', true);
var enableClearPage = GM_getValue('enableClearPage', true);
var enableDownloadPic = GM_getValue('enableDownloadPic', true);
var blockUserPosts = GM_getValue('blockUserPosts', true);
// 初始化子设置项(确保所有子设置项都有值)
clearPageSubItems.forEach(item => {
GM_getValue(item.id, item.default); // 确保有默认值
});
function createButtonContainer() {
var buttonContainer = document.createElement('div');
buttonContainer.style.position = 'fixed';
buttonContainer.style.width = '100%';
buttonContainer.style.bottom = '10px';
buttonContainer.style.left = '0';
buttonContainer.style.right = '0';
buttonContainer.style.display = 'flex';
buttonContainer.style.justifyContent = 'center';
buttonContainer.style.zIndex = '9999';
document.body.appendChild(buttonContainer);
return buttonContainer;
}
function createButton(text, action) {
var button = document.createElement('button');
button.innerHTML = text;
button.style.height = '25px';
button.style.margin = '0 10px';
button.style.backgroundColor = '#0F7884';
button.style.border = 'none';
button.style.color = 'white'
button.style.textAlign = 'center';
button.style.textDecoration = 'none';
button.style.fontSize = '14px';
button.style.borderRadius = '4px';
button.style.cursor = 'pointer';
button.addEventListener('click', action);
return button;
}
// 注册(不可用)菜单命令
GM_registerMenuCommand('小草简洁助手 设置', showSettingsWindow);
// 显示设置窗口
function showSettingsWindow() {
const existingWindow = document.getElementById('settingsWindow');
if (existingWindow) {
existingWindow.style.display = 'block';
return;
}
createSettingsWindow();
}
// 创建设置窗口
function createSettingsWindow() {
const settingsWindow = document.createElement('div');
settingsWindow.id = 'settingsWindow';
Object.assign(settingsWindow.style, {
position: 'fixed',
top: '50%',
left: '50%',
transform: 'translate(-50%, -50%)',
width: '90%', // 改为百分比宽度
maxWidth: '350px', // 最大宽度限制
maxHeight: '80vh',
backgroundColor: '#fff',
border: '1px solid #ccc',
boxShadow: '0 0 10px rgba(0, 0, 0, 0.2)',
padding: '10px', // 减少内边距
zIndex: '9999',
overflowY: 'auto',
borderRadius: '8px',
fontSize: '14px' // 缩小字体
});
// 标题(缩小字号)
const title = document.createElement('h3');
title.textContent = '小草简洁助手 设置';
title.style.margin = '0 0 10px 0';
title.style.fontSize = '16px';
title.style.color = '#333';
settingsWindow.appendChild(title);
// 创建配置项复选框(紧凑布局)
configItems.forEach(item => {
const checkbox = createCompactCheckbox(item.id, item.label, GM_getValue(item.id, item.default));
settingsWindow.appendChild(checkbox);
// 如果是手机版帖子简洁选项,添加子选项
if (item.id === 'enableClearPage') {
const subOptions = document.createElement('div');
subOptions.style.marginLeft = '10px';
subOptions.style.marginBottom = '5px';
subOptions.style.borderLeft = '2px solid #eee';
subOptions.style.paddingLeft = '8px';
clearPageSubItems.forEach(subItem => {
const subCheckbox = createCompactCheckbox(subItem.id, subItem.label, GM_getValue(subItem.id, subItem.default));
subOptions.appendChild(subCheckbox);
});
settingsWindow.appendChild(subOptions);
}
});
// 屏蔽用户区域
const blockSection = document.createElement('div');
blockSection.style.marginTop = '15px';
const blockHeader = document.createElement('div');
blockHeader.style.fontWeight = 'bold';
blockHeader.textContent = '屏蔽设置';
blockSection.appendChild(blockHeader);
const blockCheckbox = createCompactCheckbox('blockUserPosts', '屏蔽指定用户帖子', GM_getValue('blockUserPosts', false));
blockSection.appendChild(blockCheckbox);
const blockedUsersInput = document.createElement('textarea');
Object.assign(blockedUsersInput.style, {
width: '100%',
minHeight: '80px',
marginTop: '10px',
padding: '8px',
border: '1px solid #ddd',
borderRadius: '4px',
resize: 'vertical'
});
blockedUsersInput.placeholder = '输入要屏蔽的用户名,多个用户名用逗号分隔';
blockedUsersInput.value = GM_getValue('blockedUsers', []).join(', ');
blockSection.appendChild(blockedUsersInput);
settingsWindow.appendChild(blockSection);
// 按钮区域
const buttonContainer = document.createElement('div');
buttonContainer.style.display = 'flex';
buttonContainer.style.justifyContent = 'space-between';
buttonContainer.style.marginTop = '20px';
const saveButton = createButton('保存', () => {
saveSettings(settingsWindow, blockedUsersInput);
});
saveButton.style.flex = '1';
saveButton.style.margin = '0 5px';
const cancelButton = createButton('取消', () => {
settingsWindow.style.display = 'none';
});
cancelButton.style.flex = '1';
cancelButton.style.margin = '0 5px';
const feedbackButton = createButton('反馈', () => {
window.open('https://gf.qytechs.cn/zh-CN/scripts/466480-%E5%B0%8F%E8%8D%89%E7%AE%80%E6%B4%81%E5%8A%A9%E6%89%8B/feedback', '_blank');
});
feedbackButton.style.backgroundColor = '#2196F3';
feedbackButton.style.flex = '1';
feedbackButton.style.margin = '0 5px';
buttonContainer.appendChild(saveButton);
buttonContainer.appendChild(cancelButton);
buttonContainer.appendChild(feedbackButton);
settingsWindow.appendChild(buttonContainer);
// 成功提示
const successLabel = document.createElement('div');
successLabel.id = 'successLabel';
successLabel.textContent = '保存成功,刷新页面生效!';
Object.assign(successLabel.style, {
display: 'none',
color: '#4CAF50',
marginTop: '10px',
textAlign: 'center',
fontWeight: 'bold'
});
settingsWindow.appendChild(successLabel);
// 添加关闭按钮
const closeButton = document.createElement('span');
closeButton.textContent = '×';
Object.assign(closeButton.style, {
position: 'absolute',
top: '10px',
right: '15px',
fontSize: '20px',
cursor: 'pointer',
color: '#888'
});
closeButton.addEventListener('click', () => {
settingsWindow.style.display = 'none';
});
settingsWindow.appendChild(closeButton);
document.body.appendChild(settingsWindow);
}
// 创建紧凑型复选框
function createCompactCheckbox(id, label, checked) {
const container = document.createElement('div');
container.style.marginBottom = '1px'; // 减少间距
container.style.display = 'flex';
container.style.alignItems = 'center';
const checkbox = document.createElement('input');
checkbox.type = 'checkbox';
checkbox.id = id;
checkbox.checked = checked;
checkbox.style.marginRight = '6px';
checkbox.style.transform = 'scale(0.9)'; // 缩小复选框
const labelElement = document.createElement('label');
labelElement.htmlFor = id;
labelElement.textContent = label;
labelElement.style.cursor = 'pointer';
labelElement.style.userSelect = 'none';
labelElement.style.fontSize = '13px'; // 缩小标签字体
labelElement.style.lineHeight = '1.3'; // 紧凑行高
container.appendChild(checkbox);
container.appendChild(labelElement);
return container;
}
// 保存设置
function saveSettings(settingsWindow, blockedUsersInput) {
// 保存主配置项
configItems.forEach(item => {
const value = document.getElementById(item.id).checked;
GM_setValue(item.id, value);
});
// 保存子配置项
clearPageSubItems.forEach(subItem => {
const subValue = document.getElementById(subItem.id).checked;
GM_setValue(subItem.id, subValue);
});
// 保存屏蔽设置
GM_setValue('blockUserPosts', document.getElementById('blockUserPosts').checked);
const blockedUsernames = blockedUsersInput.value
.split(',')
.map(name => name.trim())
.filter(name => name !== '');
GM_setValue('blockedUsers', blockedUsernames);
// 显示成功消息
const successLabel = document.getElementById('successLabel');
successLabel.style.display = 'block';
setTimeout(() => {
settingsWindow.style.display = 'none';
successLabel.style.display = 'none';
}, 2000);
}
// 导航按钮
if (enableNavigationButton) {
var currentfid = 0;
var page = 0;
function getHrefLinks(){
if (window.location.href.includes('/thread0806.php?fid=')) {
currentfid = getFidFromURL(window.location.href);
page = getCurrentPageFromURL(window.location.href);
localStorage.setItem('currentPage', page);
//console.log("page"+page);
// 获取所有主题链接
//var threadLinks = document.querySelectorAll('a[href^="htm_mob"]');
var threadLinks = document.querySelectorAll('div.list.t_one a[href^="/htm_mob"]');//2025-2-2 根据新版页面做调整
//console.log(threadLinks);
// 提取链接并存储到数组
for (var i = 0; i < threadLinks.length; i++) {
links.push(threadLinks[i].href);
}
// 存储链接数组到本地存储
localStorage.setItem('threadLinks', JSON.stringify(links));
} else if (window.location.href.includes('/htm_mob/')) {
// 从页面中提取 fid 值
var headerDiv = document.getElementById('header');
var fidButton = headerDiv.querySelector('input[value="<"]');
if (fidButton) {
var onclickAttribute = fidButton.getAttribute('onclick');
var fid = extractFidValue(onclickAttribute);
// 创建当前版块的变量 currentfid 进行保存
currentfid = fid;
//console.log("currentfid"+currentfid);
}
// 获取本地存储中的链接数组
links = JSON.parse(localStorage.getItem('threadLinks')) || [];
// 获取本地存储中的帖子列表值
page = parseInt(localStorage.getItem('currentPage')) || 1;
}
}
//↓↓↓↓↓↓↓↓↓↓↓↓↓导航按钮相关函数↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
// 从 URL 中获取 fid 值
function getFidFromURL(url) {
var fidRegex = /fid=(\d+)/;
var matches = url.match(fidRegex);
if (matches && matches.length > 1) {
return matches[1];
}
return null;
}
// 从 URL 中获取当前页码page值
function getCurrentPageFromURL(url) {
var pageRegex = /page=(\d+)/;
var matches = url.match(pageRegex);
if (matches && matches.length > 1) {
return parseInt(matches[1]);
}
return 1;
}
// 提取 fid 值的辅助函数
function extractFidValue(onclickAttribute) {
var startIndex = onclickAttribute.indexOf('fid=') + 4;
var endIndex = onclickAttribute.indexOf("'", startIndex);
return onclickAttribute.substring(startIndex, endIndex);
}
// 获取主题链接的函数
function getThreadLinks(fid, page, callback) {
var url = window.location.origin + '/thread0806.php?fid=' + fid + '&search=&page=' + page;
GM_xmlhttpRequest({
method: 'GET',
url: url,
onload: function(response) {
var html = response.responseText;
var doc = new DOMParser().parseFromString(html, 'text/html');
var threadDivs = doc.querySelectorAll('div.list.t_one'); // 选择具有特定 class 属性的 div 元素
var newLinks = [];
for (var i = 0; i < threadDivs.length; i++) {
var link = threadDivs[i].querySelector('a[href^="htm_mob"]'); // 在每个 div 元素中查找匹配的 a 元素
if (link) {
var href = link.getAttribute('href'); // 获取 href 属性的值
var fullLink = window.location.origin + '/' + href; // 拼接完整链接
newLinks.push(fullLink);
}
}
callback(newLinks);
}
});
}
//↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑导航按钮相关函数↑↑↑↑↑↑↑↑↑↑↑
// 导航到上一篇帖子
function navigateToPreviousPost() {
var currentURL = window.location.href;
var currentIndex = links.indexOf(currentURL);
if (currentIndex !== -1 && currentIndex > 0) {
var previousURL = links[currentIndex - 1];
window.location.href = previousURL;
} else {
var previousPage = page - 1;
getThreadLinks(currentfid, previousPage, function(newLinks) {
var tempLinks = links.slice(); // 创建链接数组的副本
// 去除重复的链接
newLinks.forEach(function(link) {
if (!tempLinks.includes(link)) {
tempLinks.push(link);
}
});
links = tempLinks;
if (links.length > 0) {
var lastLinkIndex = links.length - 1;
window.location.href = links[lastLinkIndex];
// 将新的链接数组和更新后的page值存储在本地存储中
localStorage.setItem('threadLinks', JSON.stringify(links));
localStorage.setItem('currentPage', previousPage);
}
});
}
}
// 导航到下一篇帖子
function navigateToNextPost() {
var currentURL = window.location.href;
var currentIndex = links.indexOf(currentURL);
if (currentIndex !== -1 && currentIndex < links.length - 1) {
var nextURL = links[currentIndex + 1];
window.location.href = nextURL;
} else {
var nextPage = page + 1;
getThreadLinks(currentfid, nextPage, function(newLinks) {
var tempLinks = [];
// 去除与当前链接数组重复的链接
newLinks.forEach(function(link) {
if (!links.includes(link)) {
tempLinks.push(link);
}
});
links = tempLinks;
if (links.length > 0) {
window.location.href = links[0];
// 将新的链接数组和更新后的page值存储在本地存储中
localStorage.setItem('threadLinks', JSON.stringify(links));
localStorage.setItem('currentPage', nextPage);
}
});
}
}
getHrefLinks();
if(window.location.href.includes('/htm_mob/') ){//|| window.location.href.includes('/htm_data/')){
var buttonContainer = createButtonContainer();
var previousButton = createButton('上一帖', navigateToPreviousPost);
buttonContainer.appendChild(previousButton);
var nextButton = createButton('下一帖', navigateToNextPost);
buttonContainer.appendChild(nextButton);
}
}
// 预加载下一帖图片功能(WebView兼容版)
if (enablePreloadnextpage && links.length > 1) {
//↓↓↓↓↓↓↓↓↓↓↓↓↓预加载下一帖图片功能↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
// 提取图片链接
function extractImageLinks(html) {
try {
// 更简单的图片链接提取方法
var imageLinks = [];
var tmpDiv = document.createElement('div');
tmpDiv.innerHTML = html;
// 同时匹配ess-data和普通src
var images = tmpDiv.querySelectorAll('img[ess-data], img[src]');
images.forEach(function(img) {
var link = img.getAttribute('ess-data') || img.getAttribute('src');
if (link && !imageLinks.includes(link)) {
imageLinks.push(link);
}
});
return imageLinks;
} catch (e) {
console.error("提取图片链接出错:", e);
return [];
}
}
// 创建并显示图片容器(带淡入淡出效果)
function displayImageLinks(imageLinks) {
if (!imageLinks || imageLinks.length === 0) {
if (nextButton) nextButton.textContent = '下一帖,无图片可预加载';
return;
}
// 移除现有容器
var existingContainer = document.getElementById('image-preload-container');
if (existingContainer) document.body.removeChild(existingContainer);
// 创建容器 - 添加淡入淡出效果
var imageContainer = document.createElement('div');
imageContainer.id = 'image-preload-container';
imageContainer.style.position = 'fixed';
imageContainer.style.bottom = '60px';
imageContainer.style.left = '5%';
imageContainer.style.width = '90%';
imageContainer.style.height = '50px';
imageContainer.style.backgroundColor = 'rgba(0,0,0,0.7)';
imageContainer.style.overflowX = 'auto';
imageContainer.style.whiteSpace = 'nowrap';
imageContainer.style.zIndex = '99999';
imageContainer.style.borderRadius = '5px';
imageContainer.style.opacity = '0'; // 初始完全透明
imageContainer.style.transition = 'opacity 0.5s ease'; // 添加过渡效果
imageContainer.style.display = 'block'; // 保持显示但透明
// 添加图片
var loadedCount = 0;
var totalCount = imageLinks.length;
function updateStatus() {
loadedCount++;
if (loadedCount === totalCount) {
// 全部加载完成,开始淡入
imageContainer.style.opacity = '1';
// 2秒后开始淡出
setTimeout(function() {
imageContainer.style.opacity = '0';
// 淡出动画完成后完全隐藏
setTimeout(function() {
imageContainer.style.display = 'none';
}, 500); // 匹配过渡时间
}, 2000); // 显示2秒
if (nextButton) {
nextButton.textContent = '下一帖(' + loadedCount + '图)';
}
} else if (nextButton) {
nextButton.textContent = '下一帖(加载中' + loadedCount + '/' + totalCount + ')';
}
}
imageLinks.forEach(function(link) {
var img = new Image();
img.src = link;
img.style.height = '45px';
img.style.margin = '2px';
img.style.verticalAlign = 'middle';
img.onload = function() {
imageContainer.appendChild(img);
updateStatus();
};
img.onerror = function() {
updateStatus();
};
});
document.body.appendChild(imageContainer);
// 保留点击立即隐藏功能
imageContainer.addEventListener('click', function() {
this.style.opacity = '0';
setTimeout(() => {
this.style.display = 'none';
}, 500);
});
}
//↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑预加载下一帖图片功能↑↑↑↑↑↑↑↑↑↑↑
// 获取当前页面的 URL
var currentURL = window.location.href;
var currentIndex = links.indexOf(currentURL);
if (enableNavigationButton && currentIndex !== -1 && currentIndex < links.length - 1) {
var nextURL = links[currentIndex + 1];
// 立即更新按钮状态
if (nextButton) nextButton.textContent = '下一帖(预加载中...)';
// 使用更可靠的请求方式
var xhr = new XMLHttpRequest();
xhr.open('GET', nextURL, true);
xhr.timeout = 10000; // 10秒超时
var timeoutTimer = setTimeout(function() {
xhr.abort();
if (nextButton) nextButton.textContent = '下一帖(超时)';
}, 15000);
xhr.onload = function() {
clearTimeout(timeoutTimer);
if (xhr.status === 200) {
try {
var imageLinks = extractImageLinks(xhr.responseText);
displayImageLinks(imageLinks);
} catch (e) {
console.error("处理错误:", e);
if (nextButton) nextButton.textContent = '下一帖(处理错误)';
}
} else {
if (nextButton) nextButton.textContent = '下一帖(加载失败)';
}
};
xhr.onerror = function() {
clearTimeout(timeoutTimer);
if (nextButton) nextButton.textContent = '下一帖(请求错误)';
};
xhr.ontimeout = function() {
if (nextButton) nextButton.textContent = '下一帖(超时)';
};
try {
xhr.send();
} catch (e) {
if (nextButton) nextButton.textContent = '下一帖(发送错误)';
}
}
}
// 回家不迷路
if (enableGoHome && window.location.href.includes('163.com')) {
// 创建一个悬浮按钮
const button = document.createElement('button');
button.style.position = 'fixed';
button.style.bottom = '40px';
button.style.height = '50px';
button.style.right = '30px';
button.style.backgroundColor = '#0F7884';
button.style.zIndex = '999';
button.style.border = 'none';
button.style.color = 'white'
button.style.textAlign = 'center';
button.style.textDecoration = 'none';
button.innerText = '☞神秘入口☜';
document.body.appendChild(button);
// 给按钮添加点击事件监听器
button.addEventListener('click', function() {
// 创建POST请求的payload
const payload = 'a=get18&system=android&v=2.2.7';
// 发起POST请求
GM_xmlhttpRequest({
method: 'POST',
url: 'https://get.xunfs.com/app/listapp.php',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
},
data: payload,
responseType: 'text',
onload: function(response) {
// 解析响应中的JSON数据
const responseData = JSON.parse(response.responseText);
// 提取所需的URL
const url1 = responseData.url1;
const url2 = responseData.url2;
const url3 = responseData.url3;
// 创建一个悬浮div来显示URL
const urlDiv = document.createElement('div');
urlDiv.style.position = 'fixed';
urlDiv.style.bottom = '100px';
urlDiv.style.right = '20px';
urlDiv.style.zIndex = '999';
urlDiv.style.backgroundColor = '#fff';
urlDiv.style.padding = '20px';
urlDiv.style.border = '1px solid #ccc';
// 生成URL的内容
const urlsContent = `
最新地址为:
<br>地址1: <a href="https://${url1}/mobile.php?ismobile=yes" target="_bank" style="text-decoration: underline; color: blue;">${url1}</a>
<br>地址2: <a href="https://${url2}/mobile.php?ismobile=yes" style="text-decoration: underline; color: blue;">${url2}</a>
<br>地址3: <a href="https://${url3}/mobile.php?ismobile=yes" style="text-decoration: underline; color: blue;">${url3}</a>
<br>
<br>进入论坛主页后,请手动在页面底下,切换为手机版页面,即能享受脚本最佳效果!!!
`;
// 设置URL的内容到div中
urlDiv.innerHTML = urlsContent;
// 将div添加到文档中
document.body.appendChild(urlDiv);
// 为URL添加点击事件监听器
/* const urlLinks = urlDiv.querySelectorAll('a');
urlLinks.forEach(function(link) {
link.addEventListener('click', function(event) {
event.preventDefault();
const url = this.getAttribute('data-url');
copyToClipboard(url);
window.location.href = url;
});
});
*/
// 复制文本到剪贴板的函数
function copyToClipboard(text) {
const tempInput = document.createElement('input');
tempInput.value = text;
document.body.appendChild(tempInput);
tempInput.select();
document.execCommand('copy');
document.body.removeChild(tempInput);
showAlert(text + ' 复制成功');
}
// 显示提示信息并在一段时间后隐藏
function showAlert(message) {
const alertDiv = document.createElement('div');
alertDiv.style.position = 'fixed';
alertDiv.style.bottom = '80px';
alertDiv.style.right = '20px';
alertDiv.style.zIndex = '9999';
alertDiv.style.backgroundColor = '#fff';
alertDiv.style.padding = '10px';
alertDiv.style.border = '1px solid #ccc';
alertDiv.innerText = message;
document.body.appendChild(alertDiv);
setTimeout(function() {
document.body.removeChild(alertDiv);
}, 2000);
}
},
onerror: function(error) {
console.error('POST请求失败:', error);
}
});
});
}
// 限制页面宽度为1080
if (limitPageWidth) {
var browserWidth = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
var targetWidth = Math.min(browserWidth, 1080);
document.body.style.maxWidth = targetWidth + 'px';
document.body.style.margin = '0 auto';
}
// 添加使用手机版页面功能的代码
if (enableMobilePage) {
var url = window.location.href;
var regex = /\/htm_data\//;
if (regex.test(url)) {
window.location.href = url.replace(regex, '/htm_mob/');
}
// if (window.location.href.includes('/thread0806.php?fid')){
// alert("test1");
// var domain = window.location.hostname;
// console.log(domain);
// window.location.href = 'https://' + domain + '/mobile.php?ismobile=yes';
// }
}
// 帖子页面简洁功能
if (enableClearPage && (window.location.href.includes('/htm_mob/') || window.location.href.includes('read.php'))) {
setTimeout(function() {
if (GM_getValue('clearPage_removeAds', true)) {
// 通用广告选择器
const adSelector = '.ad, .ads, .advertising, .advertisement, .ad-banner, .ad-container, .ad-frame, .ad-leaderboard, .ad-slot, .ad-wrapper, .banner-ad, .google-ads, .f_one, .sponsored, .ftad-ct, .tpc_icon.fl';
const ads = document.querySelectorAll(adSelector);
ads.forEach(ad => {
// 如果是 .tpc_icon.fl,检查是否包含 AD 文本
if (ad.classList.contains('tpc_icon') && ad.classList.contains('fl')) {
const span = ad.querySelector('span');
if (span && span.textContent.trim() === 'AD') {
ad.remove();
}
} else {
// 其他广告直接移除
ad.remove();
}
});
}
// 移除头像和其他元素
if (GM_getValue('clearPage_removeAvatars', true)) {
const targetSelector = '.tpc_face,.tpc_icon.fl,.post_comm_face,.post_comm_face_svg,.tpc_rp_btn,.fr,div.t,.t_like,.h.guide,div.line:nth-child(3)';
const targets = document.querySelectorAll(targetSelector);
targets.forEach(target => target.remove());
}
// 单行用户信息
if (GM_getValue('clearPage_singleLineInfo', true)) {
const mainDiv = document.getElementById('main');
if (mainDiv) {
const tpcDivs = mainDiv.getElementsByClassName('tpc_detail f10 fl');
for (let i = 0; i < tpcDivs.length; i++) {
const div = tpcDivs[i];
const brTags = div.getElementsByTagName('br');
for (let j = brTags.length - 1; j >= 0; j--) {
const br = brTags[j];
br.parentNode.replaceChild(document.createTextNode(' '), br);
}
}
}
}
// 移除快速回复功能
if (GM_getValue('clearPage_removeQuickReply', true)) {
const quickReplyForm = document.querySelector('form[name="FORM"]');
if (quickReplyForm && quickReplyForm.querySelector('a[name="reply"]')) {
quickReplyForm.remove();
}
}
}, 500);
}
// 版块公告折叠功能
if (GM_getValue('clearPage_compressAnnounce', true) && (window.location.href.includes('thread0806.php?fid='))) {
setTimeout(function() {
// 找到所有包含"版塊公告"的tpc_cont元素
const announceContainers = document.querySelectorAll('.tpc_cont');
announceContainers.forEach(container => {
if (container.textContent.includes('版塊公告')) {
// 保存原始内容
const originalContent = container.innerHTML;
// 创建折叠容器
const collapseWrapper = document.createElement('div');
collapseWrapper.className = 'announce-collapse-wrapper';
Object.assign(collapseWrapper.style, {
margin: '10px 0',
border: '1px solid #e0e0e0',
borderRadius: '4px',
overflow: 'hidden'
});
// 创建标题栏(可点击)
const collapseHeader = document.createElement('div');
collapseHeader.textContent = '版块公告 ▼';
Object.assign(collapseHeader.style, {
padding: '8px 12px',
backgroundColor: '#f8f8f8',
fontWeight: 'bold',
cursor: 'pointer',
userSelect: 'none',
borderBottom: '1px solid #e0e0e0'
});
// 创建内容区域(初始折叠)
const collapseContent = document.createElement('div');
collapseContent.innerHTML = originalContent;
Object.assign(collapseContent.style, {
padding: '12px',
fontSize: '13px',
lineHeight: '1.5',
display: 'none', // 初始隐藏
backgroundColor: '#fff'
});
// 优化内容样式
const style = document.createElement('style');
style.textContent = `
.announce-collapse-wrapper .tpc_cont {
padding: 0 !important;
margin: 0 !important;
}
.announce-collapse-wrapper br {
margin-bottom: 8px;
display: block;
content: "";
}
`;
document.head.appendChild(style);
// 点击标题切换折叠状态
collapseHeader.addEventListener('click', function() {
if (collapseContent.style.display === 'none') {
collapseContent.style.display = 'block';
this.textContent = '版块公告 ▲';
} else {
collapseContent.style.display = 'none';
this.textContent = '版块公告 ▼';
}
});
// 组装元素
collapseWrapper.appendChild(collapseHeader);
collapseWrapper.appendChild(collapseContent);
// 替换原始元素
container.replaceWith(collapseWrapper);
}
});
}, 1000); // 延迟1秒执行
}
// 等比例无缝看图
if (enableSeamlessView && window.location.href.includes('/htm_mob/')) {
// 延迟执行函数
function delayedExecution() {
// 获取tpc_cont元素
var tpcCont = document.querySelector('div.tpc_cont');
if (tpcCont) {
// 获取tpc_cont元素下的所有子节点
var childNodes = tpcCont.childNodes;
// 遍历子节点
for (var i = childNodes.length - 1; i >= 0; i--) {
var node = childNodes[i];
// 如果节点是图片或视频元素
if (node.nodeType === Node.ELEMENT_NODE && (node.nodeName === 'IMG' || node.nodeName === 'VIDEO')) {
// 最大化尺寸
node.style.width = '100%';
node.style.height = 'auto';
}
// 判断节点名称是否为br
if (node.nodeType === Node.ELEMENT_NODE && node.nodeName === 'BR') {
var nextNode = node.nextSibling;
// 判断br标签下的内容是否为文本节点
if (nextNode && nextNode.nodeType === Node.TEXT_NODE) {
// 如果br标签下的内容是文本节点,则保留br标签
continue;
} else {
// 删除br标签
tpcCont.removeChild(node);
continue;
}
}
}
// 删除整个div下的所有
tpcCont.innerHTML = tpcCont.innerHTML.replace(/ /g, '');
}
}
// 延迟3秒后执行函数
setTimeout(delayedExecution, 2000);
}
// 图片查看模式
if (enableImagePreview && window.location.href.includes('/htm_mob/')) {
function ImagePreview() {
// 获取当前浏览器的宽度
var browserWidth = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
// 定义要限制的图片的目标宽度(最大为1080px)
var targetWidth = Math.min(browserWidth, 1080);
// 获取所有图片元素
var imgs = document.querySelectorAll('.tpc_cont img');
// 遍历所有图片元素
for (var i = 0; i < imgs.length; i++) {
var img = imgs[i];
// 添加点击事件,点击图片时进入查看模式
img.addEventListener('click', function (e) {
// 删除原图片的链接
this.removeAttribute('href');
// 阻止事件冒泡
e.stopPropagation();
// 获取该div下的所有图片元素
var div = this.parentNode;
var imgs = div.querySelectorAll('img');
// 创建一个div用于显示所有图片
var container = document.createElement('div');
container.style.position = 'fixed';
container.style.top = '0';
container.style.left = '0';
container.style.width = '100%';
container.style.height = '100%';
container.style.backgroundColor = 'rgba(0, 0, 0, 0.8)';
container.style.zIndex = '9999';
container.style.overflow = 'auto';
// 遍历所有图片元素,将它们拼接到一起
var imgContainer = document.createElement('div');
imgContainer.style.width = targetWidth + 'px'; // 设置图片容器宽度与目标宽度一致
imgContainer.style.margin = '0 auto'; // 设置图片容器居中
for (var i = 0; i < imgs.length; i++) {
var img = imgs[i];
var src = img.getAttribute('src');
var imgEl = document.createElement('img');
imgEl.setAttribute('src', src);
imgEl.style.width = '100%'; // 设置图片宽度为100%(等比例缩放)
imgEl.style.height = 'auto'; // 设置图片高度为auto(根据宽度等比例缩放)
imgEl.style.display = 'block'; // 修改样式,使图片单列显示
imgContainer.appendChild(imgEl);
}
container.appendChild(imgContainer);
// 添加关闭按钮
var closeBtn = document.createElement('div');
closeBtn.style.position = 'absolute';
closeBtn.style.top = '10px';
closeBtn.style.right = '10px';
closeBtn.style.width = '30px';
closeBtn.style.height = '30px';
closeBtn.style.lineHeight = '30px';
closeBtn.style.textAlign = 'center';
closeBtn.style.backgroundColor = '#fff';
closeBtn.style.borderRadius = '50%';
closeBtn.style.cursor = 'pointer';
closeBtn.style.fontSize = '20px';
closeBtn.style.color = '#000';
closeBtn.innerHTML = '×';
closeBtn.addEventListener('click', function () {
container.parentNode.removeChild(container);
});
container.appendChild(closeBtn);
// 添加点击事件,点击拼接后的图片时关闭
imgContainer.addEventListener('click', function (e) {
// 阻止事件冒泡
e.stopPropagation();
// 关闭查看模式
container.parentNode.removeChild(container);
});
// 将div添加到页面中
document.body.appendChild(container);
}, true);
}
}setTimeout(ImagePreview, 2500);
}
// 屏蔽指定用户帖子
if (blockUserPosts && window.location.href.includes('thread0806.php?fid=')) {
// 获取屏蔽名单,如果不存在则初始化为空数组
let blockedUsers = GM_getValue('blockedUsers', []);
// 屏蔽指定用户帖子
if (GM_getValue('blockUserPosts', true) && window.location.href.includes('thread0806.php?fid=')) {
function addBlockUserLink() {
const userElements = document.querySelectorAll('.f10[onclick^="goUid("]');
userElements.forEach(userElement => {
const userId = extractUserId(userElement.getAttribute('onclick'));
const usernameElement = userElement.childNodes[0];
const username = usernameElement.textContent.trim();
const blockLink = document.createElement('a');
blockLink.href = 'javascript:void(0)';
blockLink.textContent = '不看ta';
blockLink.style.textDecoration = 'underline';
blockLink.style.color = 'blue';
blockLink.addEventListener('click', function(event) {
event.preventDefault();
event.stopPropagation(); // 阻止点击事件冒泡到父元素
addToBlockedUsers(username, userId);
});
userElement.insertBefore(document.createTextNode(' '), usernameElement.nextSibling);
userElement.insertBefore(blockLink, usernameElement.nextSibling);
});
}
function extractUserId(onclickValue) {
const regex = /goUid\((\d+)\)/;
const match = onclickValue.match(regex);
return match ? match[1] : null;
}
function addToBlockedUsers(username, userId) {
if (!blockedUsers.includes(username)) {
const confirmBlock = confirm(`确定要屏蔽用户 ${username} 吗?`);
if (confirmBlock) {
blockedUsers.push(username);
GM_setValue('blockedUsers', blockedUsers);
location.reload();
}
}
}
function hideBlockedUsersPosts() {
blockedUsers.forEach(username => {
const userElements = document.querySelectorAll(`span.f10:not([data-blocked])`);
userElements.forEach(userElement => {
const postUsernameElement = userElement.childNodes[0];
const postUsername = postUsernameElement.textContent.trim();
if (postUsername === username) {
userElement.closest('div').style.display = 'none';
}
});
});
}
addBlockUserLink();
hideBlockedUsersPosts();
window.addEventListener('load', function() {
hideBlockedUsersPosts();
});
}
}
// 创建style元素并添加到head
const style = document.createElement('style');
style.textContent = `
.tpc_line {
margin: 2px 0 10px 0 !important;
clear: both !important;
}
.tpc_detail {
line-height: 10px;
color: #999999;
display: table;
height: 5px;
}
`
;
document.head.appendChild(style);
})();