您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Greasy Fork is available in English.
隐藏掉你可能感兴趣
当前为
// ==UserScript== // @name 知乎-我不感兴趣 // @namespace // @version 3.3 // @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); nonHiddenCards = 8; } }; //注册钩子 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]); }());