Greasy Fork

Greasy Fork is available in English.

知乎-我不感兴趣

隐藏掉你可能感兴趣

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

// ==UserScript==
// @name         知乎-我不感兴趣
// @namespace
// @version      3.1
// @description  隐藏掉你可能感兴趣
// @author       MQ
// @grant        GM_setValue
// @grant        GM_getValue
// @grant        GM_notification
// @match        https://www.zhihu.com/
// @namespace http://greasyfork.icu/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("get user id:", userId);
        //关闭弹出菜单
        avatar.click();

        return userId;
    };

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

    let getUserTopics = (uid) => {
        //以下部分获取用户关注话题
        let isEnd = true;
        let offset = 0;
        let topics = [];
        do {
            let batch = JSON.parse(GET(`/api/v4/members/${uid}/following-topic-contributions?offset=${offset}&limit=20`));
            isEnd = batch.paging.is_end;
            topics = topics.concat(batch.data.map(e => e.topic.name));
            offset += batch.data.length;
        } while(!isEnd);
        console.log("your followed topics", topics);
        return topics;
    };

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

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