// ==UserScript==
// @name 水源低质量发帖过滤器
// @license MIT
// @namespace https://gf.qytechs.cn/scripts/480756
// @version 2.0b1
// @description 从水源主页直接屏蔽常见类型的低质量发帖,如垃圾标题、戾气帖子等。误伤概率高,宁杀一千原则,请谨慎使用。
// @match https://shuiyuan.sjtu.edu.cn/*
// @grant none
// ==/UserScript==
(function() {
'use strict';
var removeMode = "remove";
var device;
var counter = 0;//屏蔽计数器
var blacklistKeywords = ["😅", "插头", "图书馆键盘", "占座", "交小苗", "拔电", "电动车充", "充电桩", "拔充", "拔插", "车充", "拔线", "恶心", "分流", "被拔", "乱拔", "偷充", "别拔", "拔人"];
var whitelistWords = ["投喂", "公告", "楼", "搭子"];//最高优先级:有白名单总会不屏蔽
var biaotidangList = ["!", ":", ",", "禁", "官", "竟"];
// 主页已屏蔽数量文字提示
var blockTextInfo = ";\)";
var blocktext = document.createElement('div');
blocktext.innerText = blockTextInfo;
blocktext.style.height = '100%';
blocktext.style.display = 'flex';
blocktext.style.alignItems = 'center';
blocktext.style.justifyContent = 'center';
blocktext.style.padding = '0 10px';
blocktext.classList.add('block-number-text');
//移动端设备采用无感屏蔽存在无法无限加载的问题
var htmlElement = document.documentElement;
var isDeviceMobile = htmlElement.classList.contains('mobile-view');//移动端不启用移除模式,而是使用隐藏模式,保留控件占位
if(isDeviceMobile){
device = "mobile";
}
else{
device = "others";
}
if (device == "mobile"){
removeMode = "hide";
}
function getCurrentDate() {
var today = new Date();
var year = today.getFullYear();
var month = String(today.getMonth() + 1).padStart(2, '0');
var day = String(today.getDate()).padStart(2, '0');
var currentDate = year + '-' + month + '-' + day;
console.log('currentDate:'+currentDate);
return currentDate;
}
//屏蔽日志
function blockLogWrite(blockExplanation){
//blockExplanation
var blocklogtext = "";
var blockLogDate = localStorage.getItem("blockLogDateV1")
if(blockLogDate==getCurrentDate()){
blocklogtext = localStorage.getItem("blockLogV1")
}
if(removeMode=="hide"){
//hide模式会反复写入同一个标题
if(!blocklogtext.includes(blockExplanation)){
localStorage.setItem('blockLogV1', blockExplanation+"\n"+blocklogtext);
localStorage.setItem('blockLogDateV1', getCurrentDate());
}
}
else{
localStorage.setItem('blockLogV1', blockExplanation+"\n"+blocklogtext);
localStorage.setItem('blockLogDateV1', getCurrentDate());
}
}
function blockLogRead() {
var blockLogDate = localStorage.getItem("blockLogDateV1");
var blockLogText = localStorage.getItem("blockLogV1");
console.log("blockLogRead_blockLogDateV1:" + blockLogDate);
// 创建对话框的内容
var blockLogDialogContent = `
blockLogDate: ${blockLogDate}
blockLogText: ${blockLogText}
`;
// 弹出对话框
window.alert(blockLogDialogContent);
}
//屏蔽函数
function block(subject){
if(removeMode=="remove"){
subject.remove();
}
else if(removeMode=="hide"){
subject.style.visibility = 'hidden';
}
else{
console.log("错误:不存在的removeMode");
}
}
// 查找目标位置并添加按钮
function addTextToContainer(num) {
if(num == 0){
blockTextInfo = ";\)";
}
else{
blockTextInfo = "🚫: "+num;
}
var container = document.getElementById('navigation-bar');
if(container){
var existingBlockText = container.querySelector('.block-number-text');
if(existingBlockText){
existingBlockText.innerText = blockTextInfo;
}
else{
var firstChild = container.firstElementChild;
container.insertBefore(blocktext, firstChild);
}
}
}
setInterval(function() {
// 获取所有需要检测的元素
var elements = document.querySelectorAll('a[role="heading"]');
console.log('元素数量:', elements.length);
var isTrashContentFlag;
var blockExplanation;
// 屏蔽检测与删除
for (var i = 0; i < elements.length; i++) {
isTrashContentFlag = false;
//---白名单检测---
var element = elements[i];
var textContent = element.innerText.trim();
blockExplanation = '['+textContent+'] '
var containsWhitelistWord = false;
for (var j = 0; j < whitelistWords.length; j++) {
if (textContent.includes(whitelistWords[j])) {
containsWhitelistWord = true;
console.log('白名单通过:', textContent, ' ', whitelistWords[j]);
break;
}
}
//---白名单检测:结束---
var parentElement = element.parentElement;
// 1. 如果文本内容少于等于六个字,判定为过短标题
if (textContent.length <= 6) {
console.log('标记:', textContent);
if (parentElement && parentElement.parentElement && parentElement.parentElement.parentElement) {
isTrashContentFlag = true;
blockExplanation = blockExplanation+"规则1:过短标题(文本内容少于等于六个字);";
//parentElement.parentElement.parentElement.style.display = 'none';
//parentElement.parentElement.parentElement.style.height = '0';
//parentElement.parentElement.parentElement.style.visibility = 'hidden';
//parentElement.parentElement.parentElement.style.opacity = '0';
//parentElement.parentElement.parentElement.remove();
//block(parentElement.parentElement.parentElement);
//counter++;
}
}
// 2. 检查文本是否包含关键词
var containsKeyword = false;
for (j = 0; j < blacklistKeywords.length; j++) {
if (textContent.includes(blacklistKeywords[j])) {
containsKeyword = true;
console.log('关键词检测:', textContent, ' ', blacklistKeywords[j]);
break;
}
}
if (containsKeyword) {
console.log('标记:', textContent);
if (parentElement && parentElement.parentElement && parentElement.parentElement.parentElement) {
isTrashContentFlag = true;
blockExplanation = blockExplanation+"规则2:黑名单屏蔽(标题命中黑名单关键词);";
}
}
// 3. 标题党专项屏蔽:逻辑为,12个字符以内,含有2个敏感字符(!:,禁官竟)
var biaotidangScore = 0;
for (j = 0; j < biaotidangList.length; j++) {
if (textContent.includes(biaotidangList[j])) {
biaotidangScore++;
}
}
if (biaotidangScore>=2 && textContent.length <= 12) {
console.log('标记:', textContent);
parentElement = element.parentElement;
if (parentElement && parentElement.parentElement && parentElement.parentElement.parentElement) {
isTrashContentFlag = true;
blockExplanation = blockExplanation+"规则3:疑似标题党(标题党指数过高,且文本过短。biaotidangScore="+biaotidangScore+");";
}
}
//---开始屏蔽----
if(isTrashContentFlag && !containsWhitelistWord){
block(parentElement.parentElement.parentElement);
blockLogWrite(blockExplanation);
counter++;
}
//---开始屏蔽:完成----
}
//显示屏蔽数量
addTextToContainer(counter);
if(removeMode=="hide"){
counter = 0;
}
}, 500);
// 设置区
function addSettingArea() {
//<div class="control-group theme" data-setting-name="user-theme">
var targetElement = document.querySelector('div[data-setting-name="user-theme"]');
var createdElement = document.querySelector('.lowQualityPostsBlocker');
// 检测指定代码是否存在
if (targetElement && !createdElement) {
console.log("已找到control-group theme标签");
// 创建外层容器
var containerElement = document.createElement('div');
containerElement.style.backgroundColor = '#f4f4f4';
containerElement.style.padding = '10px';
containerElement.style.marginBottom = '10px';
containerElement.classList.add("lowQualityPostsBlocker");
// 创建标题元素
var titleElement = document.createElement('h2');
titleElement.style.fontWeight = 'bold';
titleElement.style.color = 'black';
titleElement.style.marginBottom = '10px';
titleElement.textContent = '低质量发帖过滤器';
containerElement.appendChild(titleElement);
// 创建按钮容器
var buttonsContainer = document.createElement('div');
buttonsContainer.style.display = 'flex';
buttonsContainer.style.gap = '10px';
buttonsContainer.style.marginTop = '10px';
containerElement.appendChild(buttonsContainer);
// 创建脚本主页按钮
var homepageButton = document.createElement('button');
homepageButton.textContent = '脚本主页';
homepageButton.style.padding = '6px 12px';
homepageButton.style.backgroundColor = '#ccc';
homepageButton.style.border = 'none';
homepageButton.addEventListener('click', function() {
window.open('https://gf.qytechs.cn/scripts/480756', '_blank');
});
buttonsContainer.appendChild(homepageButton);
// 创建查看日志按钮
var logButton = document.createElement('button');
logButton.textContent = '查看日志';
logButton.style.padding = '6px 12px';
logButton.style.backgroundColor = '#ccc';
logButton.style.border = 'none';
logButton.addEventListener('click', blockLogRead);
buttonsContainer.appendChild(logButton);
// 将外层容器插入到目标元素之前
targetElement.parentNode.insertBefore(containerElement, targetElement);
}
}
// 执行函数并每秒检测
function loadSetting() {
//console.log("寻找control-group theme标签");
setInterval(addSettingArea, 1000);
}
loadSetting();
})();