知乎-我不感兴趣

隐藏掉你可能感兴趣

当前为 2018-02-19 提交的版本,查看 最新版本

// ==UserScript==
// @name         知乎-我不感兴趣
// @namespace
// @version      3.0
// @description  隐藏掉你可能感兴趣
// @author       MQ
// @grant        GM_setValue
// @grant        GM_getValue
// @grant        GM_notification
// @match        https://www.zhihu.com/
// @namespace https://gf.qytechs.cn/users/159603
// ==/UserScript==

(function() {
    'use strict';
    const MAX_FILTER_COUNT = 100; //最多主动刷新的条目数
    const USER_ID_KEY = "user-id";
    const USER_TOPICS_KEY = "user-topics";

    let GET = (url, headers) => {
        let xhr = new XMLHttpRequest();
        xhr.open("GET", url, false);
        if (headers) {
            Object.keys(headers).forEach((key) => { xhr.setRequestHeader(key, headers[key]); });
        }
        xhr.send();
        return xhr.response;
    };

    let getUserId = () => {
        //以下部分获取用户ID
        //获取右上角头像按钮
        const avatar = document.querySelector("button.Button.AppHeader-profileEntry.Button--plain");
        //模拟点击
        avatar.click();
        //获取弹出菜单
        const homeElm = document.querySelector("a.Button.Menu-item.AppHeaderProfileMenu-item.Button--plain");
        console.log(homeElm);
        //获取主页链接
        const homeLink = homeElm.href;
        console.log(homeLink);
        //从链接中匹配用户ID
        const userId = homeLink.match(/(?<=people\/).*/).toString();
        console.log("user id:", userId);
        //关闭弹出菜单
        avatar.click();

        return userId;
    };

    let userId = GM_getValue(USER_ID_KEY, null);
    if (userId == null) {
        userId = getUserId();
        GM_setValue(USER_ID_KEY, getUserId());
    } else {
        setTimeout(()=> GM_setValue(USER_ID_KEY, getUserId()), 0);
    }

    let getUserTopics = (userId) => {
        //以下部分获取用户关注话题,知乎这前端太辣鸡了
        //获取话题页面
        const rawTopicsPage = GET(`/people/${userId}/following/topics`);
        //得到的是一坨raw的html,parse一下
        const topicsPageDOM = new DOMParser().parseFromString(rawTopicsPage, "text/html");
        //里面的这个attribute的值是一个json
        const rawTopicsPageData = topicsPageDOM.querySelector("div#data").getAttribute("data-state");
        //parse一下
        const userData = JSON.parse(rawTopicsPageData);
        //里面有你关注的所有话题
        const followedTopics = Object.values(userData.entities.topics).map(e=>e.name);
        console.log("your followed topics: ", followedTopics);

        return followedTopics;
    };

    let followedTopics = GM_getValue(USER_TOPICS_KEY, null);
    if (followedTopics == null) {
        followedTopics = getUserTopics(userId);
        GM_setValue(USER_TOPICS_KEY, followedTopics);
    } else {
        setTimeout(()=> GM_setValue(USER_TOPICS_KEY, getUserTopics(userId)), 0);
    }

    const mainFrame = document.querySelector(".TopstoryMain div");
    //全局中没被隐藏的卡片数
    let nonHiddenCards = 0;
    let allCards = 0;
    let fillNewCards = () => setTimeout(() => window.dispatchEvent(new Event("resize"))); //发送resize事件来补充新的内容
    //检查函数
    let checkCards = (cards) => {
        if (cards.length == 0) return;
        cards.forEach(e => {
            try{
                if (e.hidden) return;
                let feature = e.querySelector(".FeedSource-firstline");
                let doHide = false;
                if (feature.textContent.match(/你可能感兴趣|热门内容/)) {
                    doHide = true;
                    console.log(feature.textContent, "hide");
                } else if (feature.textContent.match(/来自话题/)) {
                    var topicDivs = [...feature.querySelectorAll("div.Popover div")];
                    var topicNames = topicDivs.map(e=>e.textContent);
                    doHide = true;
                    for(let topicName of topicNames) {
                        if(followedTopics.includes(topicName)) {
                            doHide = false;
                            break;
                        }
                    }
                    console.log(topicNames, doHide ? "hide" : "not hide");
                }
                if (doHide) {
                    e.remove();
                } else {
                    nonHiddenCards++;
                }
                allCards++;
            } catch(x) {
                console.log(x, e);
            }
        });
        if (nonHiddenCards < 8 && allCards < MAX_FILTER_COUNT) {
            console.log(`too few cards (${nonHiddenCards}/${allCards}) requesting for more...`);
            fillNewCards();
        } else if (nonHiddenCards < 8 && allCards >= MAX_FILTER_COUNT) {
            let option = {
                text: `知乎-我不感兴趣 已为您过滤了 ${allCards-nonHiddenCards} 条推送,仍然没有足够的条目填满您的主页,您可以去喝杯茶,看看别的东西。`,
                title: "主动刷新已停止",
            };
            GM_notification(option, null);
        }
    };

    //注册(不可用)钩子
    var ob = new MutationObserver((records) => {
        //console.log("mutation records: ", records);
        let addedCards = records.reduce((r, e) => r.concat([...e.addedNodes]), []);
        checkCards(addedCards);
    });
    var config = { childList: true };
    ob.observe(mainFrame, config);
    console.log("hooked");

    //进行首次检查,这里不DRY
    checkCards([...mainFrame.children]);
}());

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址