具体而言,要在首页屏蔽哪一个版面的文章只需手动编辑“黑名单”把版面名像id一样加入黑名单即可。
举例说,要屏蔽“加州华人”版,将“加州华人”这个名字(不带双引号)加入“黑名单”。注意,需要全名。如果版名有()注释,则这部分也要加上。
同理,要屏蔽“牛河梁”这个id的所有帖子,包括首页的帖子链接,将“牛河梁”这个名字(不带双引号)加入“黑名单”即可。
如果名字带有空格,将空格替换为#。
插件安装指南请见:viewtopic.php?t=9560
修改的代码如下:
代码: 全选
// ==UserScript==
// @name NewMitbbs-bot-blocker
// @namespace http://tampermonkey.net/
// @version 0.2
// @description Manages and blocks bot generated content. Shamelessly modified from chunjuan's script at https://greasyfork.org/en/scripts/29195-mitbbs-bot-blocker/code, which was inspired by Smalltalk80's original GM script, http://userscripts-mirror.org/scripts/review/78633
// @author Sagittarius A*,modified by 牛河梁
// @match http://newmitbbs.com/*
// @match https://newmitbbs.com/*
// @grant GM_addStyle
// @run-at document-idle
// ==/UserScript==
// debugger;
(function() {
'use strict';
var storageKey = 'new.mitbbs.blocklist';
function getBlocklist() {
var blockList = localStorage.getItem(storageKey);
if (blockList === null) {
setBlocklist([]);
blockList = localStorage.getItem(storageKey);
}
try {
blockList = JSON.parse(blockList);
} catch (error) {
blockList = [];
setBlocklist(blockList);
}
blockList = Array.isArray(blockList) ? blockList : [];
return blockList;
}
function setBlocklist(idNameList) {
// remove duplicate items
// todo: babel output for this one doesn't really work, have to revert back to old fashion way
// idNameList = [...new Set(idNameList)]
var uniqueidNameList = idNameList.filter(function (elem, index, self) {
return index === self.indexOf(elem);
});
uniqueidNameList = uniqueidNameList.sort(function (a, b) {
// defer from localeCompare for better browser support
if (a.toLowerCase() < b.toLowerCase()) return -1;
if (a.toLowerCase() > b.toLowerCase()) return 1;
return 0;
});
localStorage.setItem(storageKey, JSON.stringify(uniqueidNameList));
document.getElementById('blockListInput').value = uniqueidNameList;
}
function getBlockFlag() {
var blockFlag = localStorage.getItem(storageKey + '.flag');
if (blockFlag === null) {
setBlockFlag(0);
blockFlag = localStorage.getItem(storageKey + '.flag');
}
// js, just being js
return parseInt(blockFlag);
}
function setBlockFlag(flag) {
localStorage.setItem(storageKey + '.flag', flag);
}
function changeRowVisibility() {
var blockList = getBlocklist();
var flag = getBlockFlag();
var counter = 0;
if (blockList) {
document.querySelectorAll('li.row').forEach(r => {
r.style.display = '';
if (flag) {
if (blockList.indexOf(r.querySelector('span.username')?.textContent) > -1 ||
blockList.indexOf(r.querySelector('div.responsive-show')?.querySelector('a')?.textContent?.replaceAll(' ','#')) > -1) {
r.style.display = 'none';
counter += 1;
}
}
});
}
counter = flag ? counter : 0;
document.getElementById('blockCounter').innerHTML = counter;
}
function changePostVisibility() {
var blockList = getBlocklist();
var flag = getBlockFlag();
var counter = 0;
// if list is not empty
if (blockList) {
// yeah yeah yeah magic number, whatever
// this will miss the first one though, nice try langfang coder
document.querySelector('div.forumbg:not(.announcement)')
.querySelectorAll('li.row')
.forEach(function (td) {
// damn, now i miss jquery/zepto
var id = td.querySelector('div.responsive-show').querySelector('span.username').textContent;
// reset all reply to visible. This is a hack-ish method to fix content not being displayed after userID has been removed from blocklist.
// TODO: maybe in the near future, we should keep a local copy of blocklist so that we can compare the changes and show/hide content intelligently, maybe
td.style.display = '';
// yeah, nested if statements
if (blockList.indexOf(id) > -1) {
if (flag) {
td.style.display = 'none';
counter += 1;
} else {
td.style.display = '';
}
}
});
counter = flag ? counter : 0;
document.getElementById('blockCounter').innerHTML = counter;
}
}
function changeReplyVisibility() {
// now we on individual post page
var blockList = getBlocklist();
var flag = getBlockFlag();
var counter = 0;
var sideBarBG = document.querySelectorAll('div.post.has-profile');
sideBarBG.forEach(function (reply) {
// var post = reply.parentElement.parentElement.parentElement.parentElement.parentElement;
var userID = reply.querySelector('span.username').textContent;
// another magic number!
var userMenu = reply.querySelector('strong');
var hasButton = userMenu.querySelector('span.button') !== null;
if (!hasButton) {
var blockButton = document.createElement('span');
blockButton.setAttribute('class', 'button');
blockButton.innerHTML = ' <button class="addToBlock" title="' + userID + '">屏蔽!</button>';
userMenu.appendChild(blockButton);
}
if(!flag) userMenu.querySelector('span.button').style.display = 'none';
else userMenu.querySelector('span.button').style.display = '';
// reset all reply to visible. This is a hack-ish method to fix content not being displayed after userID has been removed from blocklist.
// TODO: maybe in the near future, we should keep a local copy of blocklist so that we can compare the changes and show/hide content intelligently, maybe
reply.style.display = '';
if (blockList.indexOf(userID) > -1) {
if (flag) {
reply.style.display = 'none';
counter += 1;
} else {
reply.style.display = '';
}
}
counter = flag ? counter : 0;
document.getElementById('blockCounter').innerHTML = counter;
});
var allBlockButton = document.querySelectorAll('.addToBlock');
Array.from(allBlockButton).forEach(function (button) {
var userID = button.getAttribute('title');
button.addEventListener('click', function () {
var yesBlock = confirm('Block ' + userID + ' ?');
if (yesBlock) {
blockList.push(userID);
setBlocklist(blockList);
document.getElementById('blockListInput').value = getBlocklist().join();
// toggleBlockedContent();
// copy & paste from above code to refresh the page with newly added id
sideBarBG.forEach(function (reply) {
// var post = reply.parentElement.parentElement.parentElement.parentElement.parentElement;
var userID = reply.querySelector('span.username').textContent;
// another magic number!
var userMenu = reply.querySelector('strong');
var hasButton = userMenu.querySelector('span.button') !== null;
if (!hasButton) {
var blockButton = document.createElement('span');
blockButton.setAttribute('class', 'button');
blockButton.innerHTML = ' <button class="addToBlock" title="' + userID + '">屏蔽!</button>';
userMenu.appendChild(blockButton);
}
if(!flag) userMenu.querySelector('span.button').style.display = 'none';
else userMenu.querySelector('span.button').style.display = '';
// reset all reply to visible. This is a hack-ish method to fix content not being displayed after userID has been removed from blocklist.
// TODO: maybe in the near future, we should keep a local copy of blocklist so that we can compare the changes and show/hide content intelligently, maybe
reply.style.display = '';
if (blockList.indexOf(userID) > -1) {
if (flag) {
reply.style.display = 'none';
counter += 1;
} else {
reply.style.display = '';
}
}
counter = flag ? counter : 0;
document.getElementById('blockCounter').innerHTML = counter;
});
}
});
});
}
function toggleBlockedContent() {
document.getElementById('isBlocking').checked ? setBlockFlag(1) : setBlockFlag(0);
changeRowVisibility();
var pageType = locationGuesser();
switch (pageType) {
case 1:
changeReplyVisibility();
break;
case -1:
// changePostVisibility();
changeRowVisibility();
break;
case 0:
changeRowVisibility();
break;
}
}
function locationGuesser() {
var pageType = void 0;
var url = window.location.href;
if (url.indexOf('viewtopic') > -1) {
pageType = 1;
} else if (url.indexOf('viewforum') > -1) {
pageType = -1;
} else {
pageType = 0;
}
return pageType;
}
// callback for when clicking 黑名单 button
function changeBlockListVisibility() {
var notVisible = document.getElementById('blockListPop').style.display === 'none';
if (notVisible) {
// show block list pop up
document.getElementById('blockListInput').value = getBlocklist().join();
document.getElementById('blockListPop').style.display = '';
} else {
// close block list pop up
document.getElementById('blockListPop').style.display = 'none';
// update blocklist when closing the pop up
updateBlockList();
}
}
function updateBlockList() {
var newBlockList = document.getElementById('blockListInput').value;
// remove line break, space, trailing comma
newBlockList = newBlockList.replace(/(\r\n|\n|\r)/gm, '').replace(/\s/g, '').replace(/,+$/, '');
newBlockList = newBlockList.split(',');
setBlocklist(newBlockList);
// re-filter existing content
toggleBlockedContent();
}
function hideBlockList() {
document.getElementById('blockListPop').style.display = 'none';
}
function prepPage() {
var flag = getBlockFlag();
getBlocklist();
if (flag) {
document.getElementById('isBlocking').checked = true;
toggleBlockedContent();
}
}
function pageOnLoad() {
// build blocker control gui
var blockerDiv = document.createElement('div');
blockerDiv.innerHTML = '<button id="showBlocklist" class="button">黑名单</button><input type="checkbox" id="isBlocking" /><span id="blockCounter" title="Currently Blocked"></span>';
blockerDiv.style.cssText = 'position:fixed; bottom:2em; right:0.5em; width:9em; padding:0.5em; border-radius:0.25em; background-color:#D7EAF9; box-shadow:2px 2px 4px 0px rgba(0,0,0,0.5); text-align:center; cursor:pointer;';
document.body.appendChild(blockerDiv);
document.getElementById('showBlocklist').addEventListener('click', changeBlockListVisibility);
document.getElementById('blockCounter').style.cssText = 'padding:0 4px; font-weight:bold';
document.getElementById('isBlocking').addEventListener('change', toggleBlockedContent);
// block list
var blockListDiv = document.createElement('div');
blockListDiv.setAttribute('id', 'blockListPop');
blockListDiv.innerHTML = '<span>修改ID,用逗号分隔,大小写敏感!</span>' + '<br/>' + '<textarea rows="10" cols="40" id="blockListInput" style="background-color:orange;color:black;font-size:10pt;"></textarea>' + '<br/>' + '<button id="updateBlockList">Update</button><span style="width:2em"></span><button id="closePop">Close</button>';
blockListDiv.style.cssText = 'position:fixed; bottom:5.3em; right:0.5em; padding:0.5em; border-radius:0.25em; background-color:#D7EAF9; box-shadow:2px 2px 4px 0px rgba(0,0,0,0.5); text-align:center; display:none';
document.body.appendChild(blockListDiv);
document.getElementById('updateBlockList').addEventListener('click', updateBlockList);
document.getElementById('closePop').addEventListener('click', hideBlockList);
prepPage();
}
function ready(fn) {
if (document.readyState !== 'loading') {
fn();
} else {
document.addEventListener('DOMContentLoaded', fn);
}
}
ready(pageOnLoad);
})();