和谐知乎

知乎关键字屏蔽

// ==UserScript==
// @name         和谐知乎
// @namespace    https://github.com/iimondo/zhihu
// @version      0.1
// @description  知乎关键字屏蔽
// @author       iimondo
// @match        *://*.zhihu.com/*
// @icon         https://static.zhihu.com/heifetz/assets/apple-touch-icon-60.362a8eac.png
// @grant        GM_setValue
// @grant        GM_getValue
// @run-at       document-end
// ==/UserScript==

(function() {
    'use strict';

    let local_filter_keywords = [
        '程序员|裁员', '计算机|中央', '就业|专家', '战争',

        '美|台', '俄|乌', '二十大|中国', '拜登|政府', '政府', '外交部|人民', '加沙|东北', '原神|BBC', '富士康|郑州',

        '立陶宛|韩国', '香港|德国', '越南|叙利亚', '中东|特朗普', '伊朗|日本', '以色列|土耳其', '法国|阿拉伯',

        '(?=.*评价)(?=.*《)', '(?=.*看待)(?=.*《)',

        '(?=.*重庆)(?=.*星巴克)', '千帆|国企', '吴柳芳|封神',
    ];


    // 返回当前列表的容器
    function getContainerElement(){
        let listShortcut = document.querySelector('#TopstoryContent > .ListShortcut');
        let hotList = listShortcut.querySelector('.HotList'); // 热门
        let topstory_recommend = listShortcut.querySelector('.Topstory-recommend'); // 推荐
        let topstory_follow = listShortcut.querySelector('.Topstory-follow'); // 关注

        if(hotList !== null ){
            return hotList.querySelectorAll('section'); // 去除热置顶前5内容

        } else if(topstory_recommend !== null){
            return topstory_recommend.querySelectorAll('.TopstoryItem');

        } else if(topstory_follow !== null){
            return topstory_follow;
        }

        return null;
    }


    // 过滤内容
    function filterHotContent(filterKeyword, elements){
        let removeCartItem = [];

        elements.forEach(item => {
            if(filterHotContent_(filterKeyword, item)){
                removeCartItem.push(item);
            }
        });

        while(removeCartItem.length > 0){
            removeCartItem.pop().remove();
        }
    }


    // 过滤单个内容,返回true则过滤
    function filterHotContent_(filterKeyword, element){
        let cartTitle = element.querySelector('h2');

        if(cartTitle == null){
            console.log('filterHotContent_().cartTitle not found');
            return false;
        }

        // 视频全部过滤
        if(element.querySelector('.VideoAnswerPlayer') != null || element.querySelector('.ZVideoItem-player') != null){
            console.log(`过滤视频:${cartTitle.innerText}`);
            return true;
        }

        // 判断是否要过滤
        const filter_result = filterKeyword.filter(keyword => new RegExp(keyword.replaceAll("/","")).test(cartTitle.innerText));

        // 结果为包含过滤关键字数组
        if(Array.isArray(filter_result) && filter_result.length > 0){
            console.log(`关键字:${JSON.stringify(filter_result)}\n内容:${cartTitle.innerText}\n${element.querySelector('a').href}`);
            return true;
        }
    }


    // 监听导航改变
    (function(){
        function navgation_callback(mutationList, observer) {
            mutationList.forEach((mutation) => {
                switch(mutation.type) {
                    case 'childList':
                        if(mutation.addedNodes.length > 0){
                            filterHotContent(local_filter_keywords, getContainerElement());
                        }

                        // 注册添加监听
                        register_element_observer();
                        break;
                }
            });
        }

        let navgation_observer = new MutationObserver(navgation_callback);
        navgation_observer.observe(document.querySelector('#TopstoryContent'), { attributes: true, childList: true, subtree: false });
    }());


    // 监听动态添加
    function element_callbac(mutationList, observer) {
        mutationList.forEach((mutation) => {
            switch(mutation.type) {
                case 'childList':
                    if(mutation.addedNodes.length > 0){
                        filterHotContent(local_filter_keywords, mutation.addedNodes);
                    }
                    break;
            }
        });
    }

    let element_observer = new MutationObserver(element_callbac);

    function register_element_observer(){
        element_observer.disconnect();

        switch(window.location.href){
            case "https://www.zhihu.com/follow":
                element_observer.observe(
                    document.querySelector('#TopstoryContent > .ListShortcut > .Topstory-follow > div'),
                    { attributes: true, childList: true, subtree: false });
                break;

            case "https://www.zhihu.com/":
                element_observer.observe(
                    document.querySelector('#TopstoryContent > .ListShortcut > .Topstory-recommend > div'),
                    { attributes: true, childList: true, subtree: false });
                break;

            case "https://www.zhihu.com/hot":
                element_observer.observe(
                    document.querySelector('#TopstoryContent > .ListShortcut > .HotList > div'),
                    { attributes: true, childList: true, subtree: false });
                break;
        }
    }


    // init
    filterHotContent(local_filter_keywords, getContainerElement());
    register_element_observer();

})();