知乎屏蔽用户评论

指定用户,将他的评论屏蔽。

Versão de: 16/09/2022. Veja: a última versão.

Você precisará instalar uma extensão como Tampermonkey, Greasemonkey ou Violentmonkey para instalar este script.

Você precisará instalar uma extensão como Tampermonkey para instalar este script.

Você precisará instalar uma extensão como Tampermonkey ou Violentmonkey para instalar este script.

Você precisará instalar uma extensão como Tampermonkey ou Userscripts para instalar este script.

Você precisará instalar uma extensão como o Tampermonkey para instalar este script.

Você precisará instalar um gerenciador de scripts de usuário para instalar este script.

(Eu já tenho um gerenciador de scripts de usuário, me deixe instalá-lo!)

Advertisement:

Você precisará instalar uma extensão como o Stylus para instalar este estilo.

Você precisará instalar uma extensão como o Stylus para instalar este estilo.

Você precisará instalar uma extensão como o Stylus para instalar este estilo.

Você precisará instalar um gerenciador de estilos de usuário para instalar este estilo.

Você precisará instalar um gerenciador de estilos de usuário para instalar este estilo.

Você precisará instalar um gerenciador de estilos de usuário para instalar este estilo.

(Eu já possuo um gerenciador de estilos de usuário, me deixar fazer a instalação!)

Advertisement:

// ==UserScript==
// @name         知乎屏蔽用户评论
// @namespace    Shurlormes
// @version      0.1
// @description  指定用户,将他的评论屏蔽。
// @author       Shurlormes
// @match        *://*.zhihu.com/question/*
// @icon         https://static.zhihu.com/heifetz/favicon.ico
// @grant        none
// @license      GPL-3.0
// ==/UserScript==

(function() {
    'use strict';

    const BLOCK_BTN_STYLE = 'cursor: pointer;position: relative;width: 36px;height: 20px;font-size: 12px;padding: 2px;background: rgb(241 129 129);text-align: center;border-radius: 36px;left: 5px;color: black;';
    const CANCEL_BTN_STYLE = 'cursor: pointer;position: relative;width: 36px;height: 20px;font-size: 12px;padding: 2px;background: rgb(129 200 241);text-align: center;border-radius: 36px;left: 5px;color: black;';
    const COMMENT_CONTENT_CLASS = 'CommentContent';
    const BTN_GROUP_CLASS = 'shurlormes-btn-group';
    const BLOCK_BTN_CLASS = 'shurlormes-block-btn-';
    const CANCEL_BTN_CLASS = 'shurlormes-cancel-btn-';
    const USER_COMPONENT_CLASS = 'shurlormes-user-component';
    const USER_NAME_COMPONENT_CLASS = 'shurlormes-user-name-component';
    const BTN_APPENDED_COMPONENT_CLASS = 'shurlormes-btn-appended-component';
    const USER_COMMENT_COMPONENT_CLASS = 'shurlormes-user-comment-component';
    const HIDE_USER_COMMENT_COMPONENT_CLASS = "shurlormes-hide-user-comment-component-";
    const HIDE_CLASS = 'shurlormes-hide';
    const ATTR_USER_ID = 'shurlormes-user-id';
    const BLOCK_USER_KEY_PREFIX = 'shurlormes-block-user-';

    //执行间隔,单位毫秒
    const INTERVAL_TIME = 500;

    //屏蔽替换文本
    const BLOCK_REPLACE_TXT = '[已屏蔽]';

    const BLOCK_BTN_TXT = '屏蔽';
    const CANCEL_BTN_TXT = '取消';

    const TYPE_BLOCK = 0;
    const TYPE_CANCEL = 1;
    const TYPE_BTN_CLASS = [BLOCK_BTN_CLASS, CANCEL_BTN_CLASS]


    let showCancelUserComment = function(cancelUserId) {
        let hideComponents = document.getElementsByClassName(HIDE_USER_COMMENT_COMPONENT_CLASS + cancelUserId);
        while (hideComponents.length > 0) {
            let hideComponent = hideComponents[0];
            let commentComponents = hideComponent.parentElement.getElementsByClassName(USER_COMMENT_COMPONENT_CLASS);
            if(commentComponents.length > 0) {
                commentComponents[0].innerHTML = hideComponent.innerHTML;
                commentComponents[0].classList.remove(HIDE_CLASS);
            }
            hideComponent.remove();
        }
    }

    let hideBlockedUserComment = function() {
        let commentComponents = document.querySelectorAll(`.${USER_COMMENT_COMPONENT_CLASS}:not(.${HIDE_CLASS})`)
        if(commentComponents.length > 0) {
            for (let i = 0; i < commentComponents.length; i++) {
                let commentComponent = commentComponents[i];
                let userId = commentComponent.getAttribute(ATTR_USER_ID);
                let hasBlocked = localStorage.getItem(BLOCK_USER_KEY_PREFIX + userId);
                if(hasBlocked && commentComponent.className.indexOf(HIDE_CLASS) === -1) {
                    let hideComponent = document.createElement('div');
                    hideComponent.innerHTML = commentComponent.innerHTML;
                    hideComponent.hidden = true;
                    hideComponent.className = HIDE_USER_COMMENT_COMPONENT_CLASS + userId;

                    commentComponent.innerText = BLOCK_REPLACE_TXT;
                    commentComponent.classList.add(HIDE_CLASS);
                    commentComponent.parentElement.appendChild(hideComponent);
                }
            }
        }
    }

    let changeBtn = function(userId, type) {
        let btns = document.getElementsByClassName(TYPE_BTN_CLASS[type] + userId);
        for (let i = 0; i < btns.length; i++) {
            btns[i].hidden = true;
        }
        let revertBtns = document.getElementsByClassName(TYPE_BTN_CLASS[1 - type] + userId);
        for (let i = 0; i < btns.length; i++) {
            revertBtns[i].hidden = false;
        }
    }

    let blockBtnClickEvent = function(e) {
        e.cancelBubble = true;
        e.stopPropagation();

        let userId = e.target.getAttribute(ATTR_USER_ID);
        localStorage.setItem(BLOCK_USER_KEY_PREFIX + userId, 1);

        hideBlockedUserComment();
        changeBtn(userId, TYPE_BLOCK);
    }

    let cancelBtnClickEvent = function(e) {
        e.cancelBubble = true;
        e.stopPropagation();

        let userId = e.target.getAttribute(ATTR_USER_ID);
        localStorage.removeItem(BLOCK_USER_KEY_PREFIX + userId);

        showCancelUserComment(userId);
        changeBtn(userId, TYPE_CANCEL);
    }

    let markBlockElements = function() {
        let commentComponents = document.querySelectorAll(`.${COMMENT_CONTENT_CLASS}:not(.${USER_COMMENT_COMPONENT_CLASS})`)
        if(commentComponents.length > 0) {
            for (let i = 0; i < commentComponents.length; i++) {
                let commentComponent = commentComponents[i];
                let userComponent = commentComponent.parentElement;
                let userNameComponent = userComponent.getElementsByClassName('Popover')[0].parentElement;

                let userHref = userNameComponent.getElementsByTagName('a')[0].getAttribute('href');
                let userId = userHref.substr(userHref.lastIndexOf("/") + 1)

                userNameComponent.classList.add(USER_NAME_COMPONENT_CLASS);
                userNameComponent.setAttribute(ATTR_USER_ID, userId);

                userComponent.classList.add(USER_COMPONENT_CLASS);
                userComponent.setAttribute(ATTR_USER_ID, userId);

                commentComponent.classList.add(USER_COMMENT_COMPONENT_CLASS);
                commentComponent.setAttribute(ATTR_USER_ID, userId);
            }
        }
    }

    let appendBlockBtn = function() {
        let userNameComponents = document.querySelectorAll(`.${USER_NAME_COMPONENT_CLASS}:not(.${BTN_APPENDED_COMPONENT_CLASS})`);
        if(userNameComponents.length > 0) {
            for (let i = 0; i < userNameComponents.length; i++) {
                let userNameComponent = userNameComponents[i];
                let userId = userNameComponent.getAttribute(ATTR_USER_ID);
                if(userNameComponent.getElementsByClassName(BTN_GROUP_CLASS).length === 0) {
                    let hasBlocked = localStorage.getItem(BLOCK_USER_KEY_PREFIX + userId);

                    let blockBtn = document.createElement("span");
                    blockBtn.setAttribute(ATTR_USER_ID, userId);
                    blockBtn.classList.add(BTN_GROUP_CLASS)
                    blockBtn.classList.add(BLOCK_BTN_CLASS + userId)
                    blockBtn.style = BLOCK_BTN_STYLE;
                    blockBtn.innerText = BLOCK_BTN_TXT;
                    blockBtn.onclick = blockBtnClickEvent;
                    blockBtn.hidden = hasBlocked

                    let cancelBtn = document.createElement("span");
                    cancelBtn.setAttribute(ATTR_USER_ID, userId);
                    cancelBtn.classList.add(BTN_GROUP_CLASS)
                    cancelBtn.classList.add(CANCEL_BTN_CLASS + userId)
                    cancelBtn.style = CANCEL_BTN_STYLE;
                    cancelBtn.innerText = CANCEL_BTN_TXT;
                    cancelBtn.onclick = cancelBtnClickEvent;
                    cancelBtn.hidden = !hasBlocked

                    userNameComponent.appendChild(blockBtn);
                    userNameComponent.appendChild(cancelBtn);
                    userNameComponent.classList.add(BTN_APPENDED_COMPONENT_CLASS);
                }
            }
        }
    }

    let mainEvent = function() {
        markBlockElements();
        appendBlockBtn();
        hideBlockedUserComment();
    }

    setInterval(mainEvent, INTERVAL_TIME);


})();