// ==UserScript==
// @name 哔哩哔哩 - 屏蔽指定内容
// @namespace https://greasyfork.org/zh-CN/users/193133-pana
// @homepage https://www.sailboatweb.com
// @version 1.1.1
// @description 实现按用户名或直接以标题中的关键字进行屏蔽
// @author pana
// @include http*://www.bilibili.com/*
// @include http*://search.bilibili.com/*
// @require https://cdn.bootcss.com/jquery/2.2.4/jquery.min.js
// @require https://cdnjs.cloudflare.com/ajax/libs/arrive/2.4.1/arrive.min.js
// @grant GM_getValue
// @grant GM_setValue
// @grant GM_registerMenuCommand
// @grant GM_info
// @run-at document-start
// @note ver.1.1.0 匹配视频播放页面; 优化代码
// @note ver.1.1.1 修复搜索页面以关键字屏蔽无效的问题
// @downloadURL none
// ==/UserScript==
(function() {
'use strict';
const HEAD_TITLE = 'bilibili_屏蔽设置 ver.' + GM_info.script.version;
const OLD_URL = location.href;
const CHECKBOX_VALUE = {
START_ARRAY: ['startInput', '启用屏蔽功能'],
USERNAME_ARRAY: ['usernameInput', '--> 按用户名进行屏蔽'],
KEYWORD_ARRAY: ['keywordInput', '--> 按关键字进行屏蔽'],
SAVE_CLOSE_ARRAY: ['saveCloseInput', '保存的同时关闭设置框'],
};
var bilibili_config = {
functionEnable: true,
usernameEnable: true,
keywordEnable: true,
saveCloseEnable: true,
usernameArray: [],
keywordArray: []
};
function string_2_Array(text_string) {
let temp_array = text_string.split(',');
let return_array = [];
for (let i = 0, l = temp_array.length; i < l; i++) {
for (let j = i + 1; j < l; j++) {
if (temp_array[i] === temp_array[j]) {
++i;
j = i
}
}
return_array.push(temp_array[i])
}
return return_array
}
function array_2_String(text_array) {
return text_array.join(',')
}
function expand_Wrap(id_value) {
if (document.getElementById(id_value).style.display === 'block') {
document.getElementById(id_value).style.display = 'none'
} else {
document.getElementById(id_value).style.display = 'block'
}
}
function insert_Checkbox(ul_node, li_array, check_enable_value) {
let temp_li = document.createElement('li');
temp_li.innerHTML = '';
ul_node.appendChild(temp_li)
}
function decide_Keyword(headline) {
if (bilibili_config.functionEnable) {
if (bilibili_config.keywordEnable) {
for (let i = 0; i < bilibili_config.keywordArray.length; i++) {
if ((bilibili_config.keywordArray[i]) && (headline) && (headline.indexOf(bilibili_config.keywordArray[i]) !== -1)) {
return true
}
}
}
}
return false
}
function decide_Username(username) {
if (bilibili_config.functionEnable) {
if (username && bilibili_config.usernameEnable) {
return bilibili_config.usernameArray.includes(username)
}
}
return false
}
function hide_Event() {
if (OLD_URL.indexOf('www.bilibili.com') !== -1) {
let common_card = $('.video-card-common');
$.each(common_card, function(_index, item) {
if (decide_Username($(item).find('a.up:first').text().replace(/\s+$/i, '')) || decide_Username($(item).find('a.ex-up:first').text().replace(/\s+$/i, ''))) {
$(item).hide()
} else if (decide_Keyword($(item).find('a.title:first').text()) || decide_Keyword($(item).find('p.ex-title:first').text())) {
$(item).hide()
} else {
$(item).css('display', '')
}
});
let reco_card = $('.video-card-reco');
$.each(reco_card, function(_index, item) {
if (decide_Username($(item).find('p.up:first').text().replace(/\s+$/i, ''))) {
$(item).hide()
} else if (decide_Keyword($(item).find('p.title:first').text())) {
$(item).hide()
} else {
$(item).css('display', '')
}
});
let rank_wrap = $('.rank-wrap');
$.each(rank_wrap, function(index, item) {
if (decide_Username($(item).find('span.name:first').text())) {
$(item).hide()
} else if (decide_Keyword($(item).find('p.f-title:first').text())) {
$(item).hide()
} else {
$(item).css('display', '')
}
});
let spread_module = $('.spread-module');
$.each(spread_module, function(_index, item) {
if (decide_Keyword($(item).find('p.t:first').text())) {
$(item).hide()
} else {
$(item).css('display', '')
}
});
let groom_module = $('.groom-module');
$.each(groom_module, function(_index, item) {
if (decide_Username($(item).find('p.author:first').text().replace(/^up主:|\s+$/i, ''))) {
$(item).hide()
} else if (decide_Keyword($(item).find('p.title:first').text())) {
$(item).hide()
} else {
$(item).css('display', '')
}
});
let rank_item = $('.rank-item');
$.each(rank_item, function(_index, item) {
if (decide_Keyword($(item).find('p.ri-title:first').text())) {
$(item).hide()
} else {
$(item).css('display', '')
}
});
let recent_hot = $('div#recent_hot li');
$.each(recent_hot, function(_index, item) {
if (decide_Keyword($(item).attr('title'))) {
$(item).hide()
} else {
$(item).css('display', '')
}
});
let vd_list = $('ul.vd-list li');
$.each(vd_list, function(_index, item) {
if (decide_Username($(item).find('a.v-author:first').text())) {
$(item).hide()
} else if (decide_Keyword($(item).find('a.title:first').text())) {
$(item).hide()
} else {
$(item).css('display', '')
}
});
let video_page_card = $('.video-page-card');
$.each(video_page_card, function(_itenx, item) {
if (decide_Username($(item).find('div.up:first').text())) {
$(item).hide()
} else if (decide_Keyword($(item).find('a.title:first').text())) {
$(item).hide()
} else {
$(item).css('display', '')
}
})
} else if (OLD_URL.indexOf('search.bilibili.com') !== -1) {
let video_item = $('.video-item');
$.each(video_item, function(_item, item) {
if (decide_Username($(item).find('a.up-name:first').text())) {
$(item).hide()
} else if (decide_Keyword($(item).find('a.title:first').text())) {
$(item).hide()
} else {
$(item).css('display', '')
}
})
}
}
function init_Bilibili() {
let expand_div = document.createElement('div');
expand_div.id = 'expandDiv';
expand_div.title = 'bilibili_屏蔽设置';
expand_div.setAttribute('style', 'display: block; position: fixed; top: 10px; right: 20px; float: right; border: 1px solid #fff; border-radius: 3px; padding: 6px; background-color: #2866bd; color: #fff; font-size: 13px; cursor: pointer; z-index: 99999;');
expand_div.innerText = '屏蔽设置';
expand_div.addEventListener('click', function() {
expand_Wrap('wrapDiv')
}, false);
let wrap_div = document.createElement('div');
wrap_div.id = 'wrapDiv';
wrap_div.setAttribute('style', 'position: fixed; top: 3vw; right: 1vw; z-index: 99999; background-color: #fff; text-align: left; display: block; padding: 0; margin: 0; border: 1px solid #a0a0a0; border-radius: 3px; color: #000; font-size: 13px; display: none;');
let main_tag = document.createElement('fieldset');
main_tag.id = 'mainTan';
main_tag.setAttribute('style', 'border: 3px solid #ccc; border-radius: 3px; padding: 4px 9px 6px 9px; margin: 8px; min-width: 300px; width: auto; height: auto;');
wrap_div.appendChild(main_tag);
let legend_tag = document.createElement('legend');
legend_tag.innerText = HEAD_TITLE;
legend_tag.style.fontSize = '14px';
main_tag.appendChild(legend_tag);
let ul_tag = document.createElement('ul');
ul_tag.setAttribute('style', 'list-style: none; padding-left: 0;');
main_tag.appendChild(ul_tag);
insert_Checkbox(ul_tag, CHECKBOX_VALUE.START_ARRAY, bilibili_config.functionEnable);
insert_Checkbox(ul_tag, CHECKBOX_VALUE.USERNAME_ARRAY, bilibili_config.usernameEnable);
insert_Checkbox(ul_tag, CHECKBOX_VALUE.KEYWORD_ARRAY, bilibili_config.keywordEnable);
let br = document.createElement('li');
br.innerHTML = '------------------------------------------------------';
ul_tag.appendChild(br);
insert_Checkbox(ul_tag, CHECKBOX_VALUE.SAVE_CLOSE_ARRAY, bilibili_config.saveCloseEnable);
let text_li = document.createElement('li');
text_li.innerHTML = '
用户名列表:(以 , 分隔)
';
ul_tag.appendChild(text_li);
let keyword_li = document.createElement('li');
keyword_li.innerHTML = '
关键字列表:(以 , 分隔)
';
ul_tag.appendChild(keyword_li);
let save_button = document.createElement('button');
save_button.id = 'saveButton';
save_button.type = 'button';
save_button.setAttribute('style', 'position: relative; float: right; margin-right: 5px; margin-top: 5px; cursor: pointer;');
save_button.innerText = '保存';
ul_tag.appendChild(save_button);
let cancel_button = document.createElement('button');
cancel_button.id = 'cancelButton';
cancel_button.type = 'button';
cancel_button.setAttribute('style', 'position: relative; float: left; margin-left: 5px; margin-top:5px; cursor: pointer;');
cancel_button.innerText = '取消';
ul_tag.appendChild(cancel_button);
save_button.addEventListener('click', function() {
bilibili_config.functionEnable = document.getElementById(CHECKBOX_VALUE.START_ARRAY[0]).checked;
bilibili_config.usernameEnable = document.getElementById(CHECKBOX_VALUE.USERNAME_ARRAY[0]).checked;
bilibili_config.keywordEnable = document.getElementById(CHECKBOX_VALUE.KEYWORD_ARRAY[0]).checked;
bilibili_config.saveCloseEnable = document.getElementById(CHECKBOX_VALUE.SAVE_CLOSE_ARRAY[0]).checked;
bilibili_config.usernameArray = string_2_Array(document.getElementById('userNameText').value);
bilibili_config.keywordArray = string_2_Array(document.getElementById('keywordText').value);
GM_setValue('bilibili_config', bilibili_config);
hide_Event();
if (bilibili_config.saveCloseEnable === true) {
document.getElementById('wrapDiv').style.display = 'none'
}
}, false);
cancel_button.addEventListener('click', function(e) {
document.getElementById('wrapDiv').style.display = 'none';
e.stopPropagation()
}, false);
$(document).arrive('body', function() {
document.body.appendChild(expand_div);
document.body.appendChild(wrap_div)
})
}
Promise.all([GM_getValue('bilibili_config')]).then(function(data) {
if (data[0] !== undefined) {
bilibili_config = data[0]
}
init_Bilibili();
hide_Event();
try {
GM_registerMenuCommand('bilibili_屏蔽设置', function() {
document.getElementById('wrapDiv').style.display = 'block'
})
} catch (e) {
console.log(e)
}
$(document).arrive('body', {
onceOnly: true
}, function() {
try {
let observer = new MutationObserver(function() {
hide_Event()
});
let listener_container = document.querySelector("body");
let option = {
'childList': true,
'subtree': true
};
observer.observe(listener_container, option)
} catch (e) {
console.log(e)
}
})
}).
catch (function(except) {
console.log(except)
})
})();