可以同步吧,用
代码: 全选
storage.sync.get()
版主: huangchong
甚好 我刚才担心置顶以后不能回了
是的 贼啊米建议锁定 免得好像本版成天策划叛逃
在帖子里才有,版面列表上没有
thanks for the efforts !supermassive 写了: ↑2022年 8月 9日 14:11 (Huangchong 编辑)https://www.tampermonkey.net/
从春卷老师的脚本改的,使用方法:
- tampermonkey打开dashboard
已知问题:
- 点+号,新建脚本,copy&paste
- 在supernova主题下无效
如果发现bug想要俺修,请确认是最新的脚本.
- 未登录无效
现在就是登出速度很快。手机放一下不看就自己登出了。跟这个插件没关系。
代码: 全选
// ==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*
// @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 changePostVisibility() {
var blockList = getBlocklist();
var flag = getBlockFlag();
// if list is not empty
var counter = 0;
if (blockList) {
var taolunDiv = document.querySelector('div.forumbg:not(.announcement)');
// yeah yeah yeah magic number, whatever
// this will miss the first one though, nice try langfang coder
var userIDtdNodeList = taolunDiv.querySelectorAll('li.row');
userIDtdNodeList.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);
var pageType = locationGuesser();
switch (pageType) {
case 1:
changeReplyVisibility();
break;
case -1:
changePostVisibility();
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);
})();
supermassive 写了: ↑2022年 8月 9日 14:11 (Huangchong 编辑)https://www.tampermonkey.net/
从春卷老师的脚本改的,使用方法:
- tampermonkey打开dashboard
已知问题:
- 点+号,新建脚本,copy&paste
- 在supernova主题下无效
如果发现bug想要俺修,请确认是最新的脚本.
- 未登录无效
代码: 全选
// ==UserScript== // @name NewMitbbs-bot-blocker // @namespace http://tampermonkey.net/ // @version 0.1 // @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* // @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 changePostVisibility() { var blockList = getBlocklist(); var flag = getBlockFlag(); // if list is not empty var counter = 0; if (blockList) { var taolunDiv = document.querySelector('div.forumbg:not(.announcement)'); // yeah yeah yeah magic number, whatever // this will miss the first one though, nice try langfang coder var userIDtdNodeList = taolunDiv.querySelectorAll('li.row'); userIDtdNodeList.forEach(function (td) { // damn, now i miss jquery/zepto var id = td.querySelector('div.topic-poster').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); var pageType = locationGuesser(); switch (pageType) { case 1: changeReplyVisibility(); break; case -1: changePostVisibility(); 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); })();