// ==UserScript==
// @name 豆瓣小组屏蔽用户及屏蔽关键词
// @namespace http://tampermonkey.net/
// @version 1.1.2.5
// @license MIT
// @description 提供豆瓣小组屏蔽用户及屏蔽关键词的功能,no sight,no mind
// @author https://greasyfork.org/users/574395-frammolz-amanda
// @require https://code.jquery.com/jquery-3.6.0.min.js
// @match https://www.douban.com/group/*
// @grant unsafeWindow
// ==/UserScript==
(function() {
function update(){
var i0=0;
for(var j = 0; j<blk.length; j++){
var fix1 = new RegExp("https://www.douban.com/people/"+".*");
var result=fix1.exec(blk[j]);
if(!result){
keyword[i0]=blk[j];
blk.splice(j,1);
i0++;
j--;
}
}
localStorage.setItem("blk", JSON.stringify(blk));
localStorage.setItem("keyword", JSON.stringify(keyword));
localStorage.setItem("blkver", "1.1.0");
}
var Html = `
<div id="top-nav-blk" class="douban-blk">
<div class="douban-blk-out"></div>
<div class="popup">
<div>
<img class="img" src="https://s1.ax1x.com/2022/03/08/b6j7pF.png" height="80" width="80" />
<h1><br /></h1>
<h1>屏蔽名单</h1>
<div id="blk"></div>
<div>
<br /><input type="text" placeholder="输入主页地址" id="blockItem" />
<button id="addBlockItem" class="addBlockItem">add</button>
<p align="center">示例:https://www.douban.com/people/xxxxxxx/<br />(链接后面不要加后缀)</p>
</div>
<br />
<h1>屏蔽词</h1>
<div id="keyword"></div>
<div>
<div class="cb">
<input type="checkbox" id="applyOnComment" value="1">应用屏蔽词于评论(默认只应用于标题)
</div>
<br /><input type="text" placeholder="输入屏蔽词" id="blkword" />
<button id="addkeyword" class="addBlockItem">add</button>
<p align="center">示例:抽奖</p>
</div>
</div>
<div class="BackupContent"><div>请完全复制以下内容:</div>
<p id="BackupContent"></p>
</div>
<div class="RestoreWindow">
<input type="text" placeholder="输入要导入的数据" id="SyncData" />
<button id="sync" class="addBlockItem">OK</button>
<p align="center">示例:["https://www.douban.com/people/xxxx/","抽奖"]</p>
</div>
<button id="Backup" class="addBlockItem" >导出</button>
<button id="Restore" class="addBlockItem" >导入</button><br /><br />
<button id="Done" class="addBlockItem" >完成</button><br /><br />
</div>
</div>
`;
var style = `
<style>
.img{
position:absolute;
top:0px;
right:0px;
}
.blk{
float: left;
margin: auto auto auto 30px;
}
.cb{
float: left;
padding-top: 20px;
margin: auto auto 10px 30px;
}
.del{
float: right;
cursor: pointer;
margin-right: 30px;
padding: 0px 12px;
}
.del:hover {
color: #fff;
}
.del0{
float: right;
cursor: pointer;
margin-right: 30px;
padding: 0px 12px;
}
.del0:hover {
color: #fff;
}
.addBlockItem{
cursor: pointer;
padding: 0px 8px;
}
.addBlockItem:hover {
color: #fff;
}
.douban-blk {
width: 100vw;
height: 100vh;
position: absolute;
top: 0;
left: 0;
display:none;
}
.douban-blk-out {
position: absolute;
background: rgba(0,0,0,0);
width: 100%;
height: 100%;
z-index: 99;
}
.popup {
width: 400px;
text-align: center;
margin: auto;
position:absolute;
right:0px;
top: 28px;
background: #fff;
padding: auto;
overflow: auto;
z-index: 100;
border-style: groove
}
.RestoreWindow {
display:none;
}
#BackupContent {
margin: auto 30px 10px 30px;
word-wrap:break-word;
word-break:normal;
border-style: groove;
}
.BackupContent{
display:none;
}
</style>
`;
var style1 = `
<style>
.popup {
height: auto;
}
</style>
`;
var style2 = `
<style>
.popup {
height: 800px;
}
</style>
`;
var blk=JSON.parse(localStorage.getItem("blk"));
var keyword=JSON.parse(localStorage.getItem("keyword"));
var ver=localStorage.getItem("blkver");
var apoc=localStorage.getItem("apoc");
if(!blk){
blk=[];
localStorage.setItem("blk", JSON.stringify(blk));
}
if(!keyword){
keyword=[];
localStorage.setItem("keyword", JSON.stringify(keyword));
}
if(ver!="1.1.0"){
update();
}
if(!apoc){
apoc = 0;
localStorage.setItem("apoc", "0");
}
$(document.body).append(Html);
$(document.body).append(style);
if(blk.length+keyword.length>11){
$(document.body).append(style2);
}
else{
$(document.body).append(style1);
}
const utils = {
bindedEles: [],
bindClick: function(selector, callback) {
this.bindedEles.push(selector);
$(selector).click(callback);
}
}
const insertPos = $('#db-global-nav .top-nav-doubanapp');
if (insertPos && insertPos[0]) {
$(insertPos[0]).after('<div id="blk-config" class="top-nav-info"><span class="addBlockItem">黑名单设置</span></div>');
}
const $contain = $('#top-nav-blk');
const $body = $(document.body);
utils.bindClick('#blk-config', e => {
$contain.show();
$body.css('overflow', 'hidden');
});
utils.bindClick('#Done', e => {
$contain.hide();
$body.css('overflow', 'initial');
});
utils.bindClick('.douban-blk-out', e => {
$contain.hide();
$body.css('overflow', 'initial');
});
var list=[];
var list1=[];
goto();
function goto(){
list=[];
list1=[];
blk.forEach(function(item,index){
var listItem='<br /><div class="blockItem"><p class="blk">item</p><button data-index="{index}" class="del">删除</button></div><br />'.replace(/item/g,item)
listItem=listItem.replace(/{index}/g,index)
list.push(listItem)
$("#blk").html(list.join(""));
$(".del").on("click",function(){
var index=$(this).attr("data-index");
$(this).closest("div").remove();
blk=JSON.parse(localStorage.getItem("blk"));
blk.splice(index,1)
localStorage.setItem("blk", JSON.stringify(blk));
goto();
})
})
keyword.forEach(function(item,index){
var listItem='<br /><div class="blockItem"><p class="blk">item</p><button data-index="{index}" class="del0">删除</button></div><br />'.replace(/item/g,item)
listItem=listItem.replace(/{index}/g,index)
list1.push(listItem)
$("#keyword").html(list1.join(""));
$(".del0").on("click",function(){
var index=$(this).attr("data-index");
$(this).closest("div").remove();
keyword=JSON.parse(localStorage.getItem("keyword"));
keyword.splice(index,1)
localStorage.setItem("keyword", JSON.stringify(keyword));
goto();
})
})
}
if(apoc == 1){
$("#applyOnComment").attr("checked", true);
}
else{
$("#applyOnComment").attr("checked", false);
}
$("#addBlockItem").on("click",function(){
var blockItem=$("#blockItem").val();
if(!blockItem){
alert("不能提交空白内容")
return;
}
var re1 = new RegExp("https://www.douban.com/people/"+".*"+"/"+"$");
var result4=re1.exec(blockItem);
if(!result4){
alert("主页地址必须为“https://www.douban.com/people/xxxxxxxxxx/”\n请删除例如“?_dtcc=1”的后缀!")
return;
}
blk=JSON.parse(localStorage.getItem("blk"));
var listItem='<br /><div class="blockItem"><p class="blk">item</p><button data-index="{index}" class="del">删除</button></div><br />'.replace(/item/g,blockItem);
if($.isEmptyObject(blk)){
blk.push(blockItem)
localStorage.setItem("blk", JSON.stringify([blockItem]));
listItem=listItem.replace(/{index}/,"0")
}
else{
blk.push(blockItem)
localStorage.setItem("blk", JSON.stringify(blk));
listItem=listItem.replace(/{index}/,blk.length-1)
}
$("#blockItem").val("");
goto();
})
$("#addkeyword").on("click",function(){
var blockItem=$("#blkword").val();
if(!blockItem){
alert("不能提交空白内容")
return;
}
var re2 = new RegExp("https://www.douban.com/people/"+".*");
var result5=re2.exec(blockItem);
if(result5){
alert("请勿输入主页地址!")
return;
}
keyword=JSON.parse(localStorage.getItem("keyword"));
var listItem='<br /><div class="blockItem"><p class="blk">item</p><button data-index="{index}" class="del0">删除</button></div><br />'.replace(/item/g,blockItem);
if($.isEmptyObject(keyword)){
keyword.push(blockItem)
localStorage.setItem("keyword", JSON.stringify([blockItem]));
listItem=listItem.replace(/{index}/,"0")
}
else{
keyword.push(blockItem)
localStorage.setItem("keyword", JSON.stringify(keyword));
listItem=listItem.replace(/{index}/,blk.length-1)
}
$("#blkword").val("");
goto();
})
$("#applyOnComment").on("click",function(){
if ($("#applyOnComment")[0].checked) {
apoc = 1;
}
else{
apoc = 0;
}
localStorage.setItem("apoc", apoc);
goto();
})
$("#Backup").on("click",function(){
var a = JSON.parse(localStorage.getItem("blk"));
var b = JSON.parse(localStorage.getItem("keyword"));
var c = a.concat(b);
$(".BackupContent").show();
$("#BackupContent").html(JSON.stringify(c));
goto();
})
$("#Restore").on("click",function(){
$(".RestoreWindow").show();
})
$("#sync").on("click",function(){
var b = $("#SyncData").val()
var re1 = new RegExp("\\["+".*"+"\\]");
var result4 = re1.exec(b);
if(!result4){
alert("请输入导出后复制的完整格式!(一定要带中括号\"[]\"!)\n例:[\"https://www.douban.com/people/xxxx/\",\"抽奖\"]")
return;
}
else{
var a = JSON.parse($("#SyncData").val())
var re2 = new RegExp("https://www.douban.com/people/"+".*");
blk=JSON.parse(localStorage.getItem("blk"));
keyword=JSON.parse(localStorage.getItem("keyword"));
a.forEach(function(itema){
var result=re2.exec(itema)
if(result){
var i = 0
blk.forEach(function(itemblk){
if(itema == itemblk){
i = 1;
}
})
if (i == 0){
blk.push(itema);
}
}
else{
var i = 0
keyword.forEach(function(itemblk){
if(itema == itemblk){
i = 1;
}
})
if (i == 0){
keyword.push(itema);
}
}
})
localStorage.setItem("blk", JSON.stringify(blk));
localStorage.setItem("keyword", JSON.stringify(keyword));
$("#SyncData").val("");
goto();
}
})
var windowUrl = window.location.href;
var topicre = /https:\/\/www.douban.com\/group\/topic\/*/;
var groupre = /https:\/\/www.douban.com\/group\/*/;
if( windowUrl.match(groupre)){
if( windowUrl.match(topicre)){
blk=JSON.parse(localStorage.getItem("blk"));
keyword=JSON.parse(localStorage.getItem("keyword"));
$("a").each(function(index,item){
var href=$(item).attr("href");
var title=$(item).attr("title");
blk.forEach(function(blockItem){
var re = new RegExp(".*"+blockItem+".*");
var result1=re.exec(href);
if(result1){
$(item).closest(".comment-item").hide();
}
})
keyword.forEach(function(blockItem){
var re = new RegExp(".*"+blockItem+".*");
var fix = new RegExp("真的要删除"+".*"+blockItem+".*"+"的发言");
var result2=re.exec(title);
var result3=fix.exec(title);
if(result2&&!result3){
$(item).closest("li").hide();
}
})
})
if(apoc == 1){
$("p.reply-content").each(function(index,item){
var reply = $(this).text();
keyword.forEach(function(blockItem){
var re = new RegExp(".*"+blockItem+".*");
var result2=re.exec(reply);
if(result2){
$(item).closest(".reply-item").hide();
}
})
})
}
}
else{
blk=JSON.parse(localStorage.getItem("blk"));
keyword=JSON.parse(localStorage.getItem("keyword"));
$("a").each(function(index,item){
var href=$(item).attr("href");
var title=$(item).attr("title");
blk.forEach(function(blockItem){
var re = new RegExp(".*"+blockItem+".*");
var result1=re.exec(href);
if(result1){
$(item).closest("tr").hide();
}
})
keyword.forEach(function(blockItem){
var re = new RegExp(".*"+blockItem+".*");
var result2=re.exec(title);
if(result2){
$(item).closest("tr").hide();
}
})
})
}
}
})();