您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
海角社区黑名单系统屏蔽不喜欢的作者
// ==UserScript== // @name 海角社区黑名单 // @namespace Violentmonkey Scripts // @match https://haijiao.com/* // @match https://hj*.*/* // @grant none // @version 0.0.2 // @author YYSSLL // @license GPL-3.0-or-later // @grant GM_addStyle // @grant GM_setValue // @grant GM_getValue // @description 海角社区黑名单系统屏蔽不喜欢的作者 // ==/UserScript== (function () { 'use strict'; console.log("开始运行黑名单系统") const iconOut = "url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8BAMAAADI0sRBAAAAHlBMVEVHcEzV1dXY2NjZ2dna2trY2NjX19fZ2dnX19fY2Njh5OoZAAAACXRSTlMAMO/vMJdgXiAyZE3cAAAAqUlEQVQ4y+3UMRKDIBAFUJzRxDLDDVLac4Acwc4T2Nuk5wym4rYB1sWC/zkBW+24Pga+jMb06gXq67Ubt3r6CE5bG45qPIXfR7phCWs1jg+d4tPXq9uLx/feYGvKI36hrQsnWDnDwikWznHmHGfewIk3cB4701xck4f4XDhPZ7acpzMPlEtglEtgjGvahGvamM8lbcinkja8is87bXSRzV4+1bz1n0IvVH+2gTclx+L2cQAAAABJRU5ErkJggg==) no-repeat 50%" const iconOver = "url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8BAMAAADI0sRBAAAAG1BMVEVHcEzvQEDwQUHwQUHxQEHxQELvQUHvQEDwQUJ81f6CAAAACHRSTlMAMO/vX5+QIH0cREEAAACNSURBVDjLY2AYBaMAC3ArgLEYQzBlWToMYUzhDgcMadaOZgGoZouOBAxpoKAhTHNzAabpwlDtCHVYtQvDbcGmHYdmmAQuzRAZnJoh2nFrBmvHrRmsHY9mkHY8mglJEzAcv9MIeAx/sBAIVPxRQiBC8ScHduTEhKmdDTkpBpCakBlc4Sayp4wWCqMAGwAA1UYyEwpcChIAAAAASUVORK5CYII=)" // 获取黑名单列表 let blacklist = GM_getValue("blacklist") // console.log(blacklist) // 声明一个对象不同页面需要的不同选择器 作者(选择作者昵称) 描述(选择作品的标题描述) 祖父(选择祖父方便屏蔽) 写入标题(是否用标题来储存值) 删除(是否直接删除祖父元素) let selector = { author: "", describe: "", grandfather: "", writeTitle: false, remove: false } // 创建一个不喜欢按钮 function createDislikeButton() { // 添加一个屏蔽按钮 let div = document.createElement('div') div.style.display = "inline-block" div.style.width = "20px" div.style.height = "20px" div.style.background = iconOut div.style.backgroundSize = "contain" div.style.cursor = "pointer" div.classList.add("dislikeIcon") // 鼠标移入事件 div.onmouseover = function () { div.style.background = iconOver div.style.backgroundSize = "contain" } // 鼠标移出事件 div.onmouseout = function () { div.style.background = iconOut div.style.backgroundSize = "contain" } return div } // 每个元素都要执行的操作的回调函数 function checkNode(element) { // 兼容性补充,没有标题就用内容来替换 if (selector.writeTitle) { element.title = element.innerText } // 兼容性补充,添加一个类方便选择 element.classList.add("author") // 得到这行的祖宗方便删除 let li = element.parentNode.parentNode.parentNode.parentNode // 得到这个作品的标题描述 let describe = li.querySelector(selector.describe) // console.log("取到值") if (selector.writeTitle) { // 兼容性补充,没有标题就用内容来替换 describe.title = describe.innerText } // 非直接删除的先恢复显示,后期再优化通过添加自定义类去屏蔽 if (!selector.remove) { li.style.display = "block" } // 判断一个数组是否包含一个指定的值 if (blacklist.includes(element.title)) { console.log("已屏蔽 [ " + element.title + " ] " + describe.title) // 是否直接删除 if (selector.remove) { li.remove() } else { li.style.display = "none" } return } // 创建不喜欢按钮 let div = createDislikeButton() div.addEventListener("click", function () { if (confirm("确定要屏蔽昵称 [ " + element.title + " ] 的全部作品吗?")) { console.log("新加黑 [ " + element.title + " ]") blacklist.push(element.title) GM_setValue("blacklist", blacklist) // 是否直接删除 if (selector.remove) { li.remove() } else { li.style.display = "none" } return } }) // 没有才追加 if (!li.querySelector(".dislikeIcon")) { // 追加一个不喜欢按钮 li.querySelector(selector.grandfather).appendChild(div) } } // 核心工作函数,返回当前所在网页是否是支持加黑的页面,如果不支持就返回 false function work() { if (window.location.href.indexOf("/home") > -1) { // 当前在首页 selector.author = "i+.hjbox-linkcolor" selector.describe = "h4>span" selector.grandfather = ".d-flex.justify-content-between" selector.writeTitle = false selector.remove = true } else if (window.location.href.indexOf("/es?key=") > -1) { // 当前在搜索页 selector.author = "i+.hjbox-linkline" selector.describe = "h4>div" selector.grandfather = ".show_list_info" selector.writeTitle = true selector.remove = false } else { // 不在这两个位置自然没有执行的必要 console.log("不受支持的页面已停止运行") return } // 设置一个定时器 let id = setInterval(function () { // 得到一堆作者昵称 let nicknames = document.querySelectorAll(selector.author) // 如果找到元素就清除定时器 if (nicknames.length > 0) { clearInterval(id) // 清除定时器 // 对数组的每个元素执行一次给定的函数 nicknames.forEach(checkNode) } }, 1000) } // 主函数 function main() { // 选择要观察的元素列表 let targetNode = document.documentElement let observerOptions = { childList: true, // 观察目标子节点的变化,是否有添加或者删除 // attributes: true, // 观察属性变动 subtree: true, // 观察后代节点,默认为 false }; // 实例化一个观察器 let observer = new MutationObserver(function (mutationsList, observer) { // 元素变化 console.log("页面变化了重新执行") work() }); // 开始观察目标节点 observer.observe(targetNode, observerOptions); // 页面加载成功执行一次 work() } main(); })();