Sleazy Fork is available in English.

海角社区黑名单

海角社区黑名单系统屏蔽不喜欢的作者

// ==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();

})();