海角社区黑名单

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

2024-03-21 يوللانغان نەشرى. ئەڭ يېڭى نەشرىنى كۆرۈش.

// ==UserScript==
// @name        海角社区黑名单
// @namespace   Violentmonkey Scripts
// @match       https://haijiao.com/*
// @match       https://hj*.*/*
// @grant       none
// @version     0.0.1
// @author      YYSSLL
// @license     GPL-3.0
// @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 }


  // 创建一个不喜欢按钮
  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 (blacklist.includes(element.title)) {
      console.log("已屏蔽 [ " + element.title + " ] " + describe.title)
      // 直接删除
      li.remove()
      return
    }

    // 创建不喜欢按钮
    let div = createDislikeButton()
    div.addEventListener("click", function () {

      if (confirm("确定要屏蔽昵称 [ " + element.title + " ] 的全部作品吗?")) {

        console.log("新加黑 [ " + element.title + " ]")
        blacklist.push(element.title)
        GM_setValue("blacklist", blacklist)
        // 直接删除,同时触发观察器
        li.remove()
        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

    } 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
    } 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();

})();