知乎拉黑用户屏蔽回答(本地)
// ==UserScript==
// @name 知乎拉黑用户屏蔽回答
// @namespace zhihublacklist
// @version 0.3
// @description 知乎拉黑用户屏蔽回答(本地)
// @license MIT
// @author MIO
// @match https://www.zhihu.com/question/*
// @grant none
// ==/UserScript==
let preblack = ['知乎 官方帐号']
let tbus = localStorage.getItem('blackUsers')
let blackUsers = tbus ? tbus.split(',') : []
if (!blackUsers) {
blackUsers = []
localStorage.setItem('blackUsers', blackUsers)
}
let run = () => {
// document.querySelector('.AdblockBanner').hidden = true
let handleOne = (item) => {
var userLink = queryItemInnerUserLink(item)
if (!userLink || item.getAttribute(attrBlocked)) {
return
}
var href = userLink.href
var userId = getUserNameFromLink(href)
var userName = userLink.innerHTML
if (blackUsers.includes(userId)) {
collapsedItem(item, userName, userId)
} else {
let div = document.createElement('div')
div.className = 'mdiv'
let blackfy = () => {
collapsedItem(item, userName, userId)
blackUsers.push(userId)
localStorage.setItem('blackUsers', blackUsers)
div.parentNode.removeChild(div)
}
div.innerHTML = '拉黑'
div.style = 'float:right;cursor:pointer'
div.onclick = blackfy
let tdesc = item.querySelector('.AuthorInfo-badgeText')
if (tdesc) {
} else {
return
}
let desc = tdesc.innerHTML
if (preblack.includes(desc)) {
blackfy()
return
}
let first = item.children[0]
if (first.className == 'mdiv') {
return
}
item.insertBefore(div, first)
}
}
let listItem = queryListItem()
listItem.forEach(handleOne)
var attrBlocked = 'blocked'
function getUserNameFromLink(link) {
var exec = /[^\/]+$/.exec(link)
return exec ? exec[0] : null
}
function queryListItem() {
return document.querySelectorAll('.List-item')
}
function queryItemInnerUserLink(item) {
return item.querySelector('.AuthorInfo-content a.UserLink-link')
}
function collapsedItem(item, userName, userId) {
item.setAttribute(attrBlocked, attrBlocked)
var content = item.querySelector('.ContentItem')
content.style.height = '0'
content.style.overflow = 'hidden'
var holder = document.createElement('div')
holder.className = 'mdiv'
holder.style.cssText =
'display:flex;align-items:center;justify-content:space-between;padding:16px;background:#fafafa;cursor:pointer;'
holder.innerHTML = `<span>折叠一条内容:发布者(${userName})</span><i style="text-decoration: underline;">取消拉黑</i>`
holder.onclick = function () {
content.style.height = 'auto'
holder.parentNode.removeChild(holder)
holder = null
content = null
let div = document.createElement('div')
div.className = 'mdiv'
let blackfy = () => {
collapsedItem(item, userName, userId)
blackUsers.push(userId)
localStorage.setItem('blackUsers', blackUsers)
div.parentNode.removeChild(div)
}
div.innerHTML = '拉黑'
div.style = 'float:right;cursor:pointer'
div.onclick = blackfy
blackUsers = blackUsers.filter((one) => one != userId)
localStorage.setItem('blackUsers', blackUsers)
let first = item.children[0]
let second = item.children[1]
if (first.className == 'mdiv' || (second && second.className == 'mdiv')) {
return
} else {
console.log(second, 'second')
item.insertBefore(div, first)
}
}
item.appendChild(holder)
}
let dynamicChange = (el = '.List-item') => {
const parent = document.querySelector(el).parentElement
// 创建 MutationObserver 对象
const observer = new MutationObserver(function (mutationsList) {
for (let mutation of mutationsList) {
if (mutation.type === 'childList') {
// 遍历新增的节点
for (let node of mutation.addedNodes) {
handleOne(node)
}
}
}
})
// 监听父元素
observer.observe(parent, {
childList: true,
})
}
dynamicChange('.List-item')
// maskUserLinks()
}
run()