// ==UserScript== // @name 微博知乎B站小红书关键词屏蔽器 // @namespace http://tampermonkey.net/ // @version 1.5 // @description 屏蔽微博、知乎、小红书、B站含关键词的内容 // @author KasenRi // @match https://www.zhihu.com/ // @match https://www.xiaohongshu.com/* // @match https://www.bilibili.com/ // @match https://www.bilibili.com/?* // @match https://www.bilibili.com/v/* // @match https://search.bilibili.com/* // @match https://weibo.com/* // @match https://www.weibo.com/* // @match https://s.weibo.com/* // @icon data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw== // @grant none // @license MIT // @downloadURL none // ==/UserScript== /* * 开源Fork声明 / Open Source Fork Declaration * * 本脚本基于以下原始作品二次开发而成: * This script is forked and merged from the following original works: * * 1. 知乎屏蔽词修改器 * 作者/Author: 三无用户 * 来源/Source: https://www.zhihu.com/question/1920892831981106398/answer/1928760410783343183 * * 2. 微博/B站/小红书屏蔽器 * 作者/Author: Andante * 来源/Source: https://www.zhihu.com/question/1920892831981106398/answer/1929126813218631948 * * 感谢原作者的贡献! * Thanks to the original authors for their contributions! * * 本脚本采用MIT许可证开源 * This script is open-sourced under MIT License */ (function() { 'use strict'; // 统一的屏蔽关键词列表 const BLOCK_KEYWORDS = [ '男','女','父亲','母亲','大龄剩女','男性','女性','coser','儿子','体育生', '女儿','迪士尼','盲盒','奶茶','COSER','漫展','小孩','结婚','生娃','华为', '大龄女','大妈','单亲','女生','美女','女神','小姐姐','男子','女演员', '健身房','JK','身材','985','211','小米','妈','妈妈','生物爹','原生家庭', '今日俄罗斯' ]; // 获取当前网站类型 function getCurrentSite() { const hostname = window.location.hostname; if (hostname.includes('zhihu.com')) return 'zhihu'; if (hostname.includes('xiaohongshu.com')) return 'xiaohongshu'; if (hostname.includes('bilibili.com')) return 'bilibili'; if (hostname.includes('weibo.com')) return 'weibo'; return 'unknown'; } // 网站特定的配置 const siteConfigs = { zhihu: { containerSelector: '.ContentItem', titleSelector: '.ContentItem-title a', logPrefix: '已屏蔽知乎问题' }, xiaohongshu: { containerSelector: 'section.note-item', titleSelector: 'a.title, .title', logPrefix: '已屏蔽小红书内容' }, bilibili: { containerSelector: '.bili-feed-card, .bili-video-card', titleSelector: '.bili-video-card__info--tit, .bili-video-card__info--tit a, .bili-video-card__wrap .bili-video-card__info--tit', logPrefix: '已屏蔽B站内容' }, weibo: { containerSelector: '.wbpro-scroller-item', titleSelector: '.wbpro-feed-content .detail_wbtext_4CRf9', logPrefix: '已屏蔽微博内容' } }; // 处理单个内容元素 function processContentElement(element, config) { const site = getCurrentSite(); // B站特殊处理:检测反屏蔽提示并删除 if (site === 'bilibili') { // 检测反屏蔽box:有"bili-video-card is-rcmd"但没有"enable-no-interest" if (element.classList.contains('bili-video-card') && element.classList.contains('is-rcmd') && !element.classList.contains('enable-no-interest')) { // 查找上级容器并删除 let targetContainer = element.closest('.feed-card') || element.closest('.bili-feed-card'); if (targetContainer) { targetContainer.remove(); console.log(`${config.logPrefix}: 反屏蔽提示 (删除整个容器)`); } else { element.remove(); console.log(`${config.logPrefix}: 反屏蔽提示 (删除元素)`); } return; } } const titleElement = element.querySelector(config.titleSelector); let title = ''; if (titleElement) { title = titleElement.textContent.trim(); } else { // 兜底查找整个元素文本 title = element.textContent.trim(); } // 检查是否包含屏蔽关键词 if (BLOCK_KEYWORDS.some(keyword => title.includes(keyword))) { let containerRemoved = false; // 针对不同网站的特殊处理:删除整个容器 if (site === 'zhihu') { // 向上查找Card容器 let cardElement = element.closest('.Card.TopstoryItem.TopstoryItem-isRecommend'); if (cardElement) { cardElement.remove(); console.log(`${config.logPrefix}: ${title} (删除整个卡片)`); containerRemoved = true; } } else if (site === 'bilibili') { // 向上查找B站容器,同时检测feed-card和bili-feed-card let feedCardElement = element.closest('.feed-card') || element.closest('.bili-feed-card'); if (feedCardElement) { feedCardElement.remove(); console.log(`${config.logPrefix}: ${title} (删除整个B站容器)`); containerRemoved = true; } } else if (site === 'xiaohongshu') { // 向上查找note-item容器 let noteItemElement = element.closest('.note-item'); if (noteItemElement) { noteItemElement.remove(); console.log(`${config.logPrefix}: ${title} (删除整个note-item)`); containerRemoved = true; } } // 如果没找到特定容器或其他网站,使用原来的隐藏方式 if (!containerRemoved) { element.style.display = 'none'; console.log(`${config.logPrefix}: ${title} (隐藏元素)`); } } } // 处理所有内容元素 function processAllContent() { const site = getCurrentSite(); const config = siteConfigs[site]; if (!config) { console.log('未支持的网站:', window.location.hostname); return; } document.querySelectorAll(config.containerSelector).forEach(element => { processContentElement(element, config); }); } // 防抖处理函数 function debounce(func, wait) { let timeout; return function(...args) { clearTimeout(timeout); timeout = setTimeout(() => func(...args), wait); }; } const debouncedProcessAllContent = debounce(processAllContent, 500); // 初始化处理 if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', processAllContent); } else { processAllContent(); } window.addEventListener('load', processAllContent); // 监听DOM变化 const observer = new MutationObserver(mutations => { const site = getCurrentSite(); const config = siteConfigs[site]; if (!config) return; let shouldProcess = false; mutations.forEach(mutation => { if (mutation.addedNodes.length) { mutation.addedNodes.forEach(node => { if (node.nodeType === 1) { if (node.matches && node.matches(config.containerSelector)) { processContentElement(node, config); } else if (node.querySelectorAll) { const elements = node.querySelectorAll(config.containerSelector); if (elements.length > 0) { shouldProcess = true; elements.forEach(element => processContentElement(element, config)); } } } }); } }); if (shouldProcess) debouncedProcessAllContent(); }); observer.observe(document.body, { childList: true, subtree: true }); // 滚动事件监听 let scrollTimeout; window.addEventListener('scroll', () => { clearTimeout(scrollTimeout); scrollTimeout = setTimeout(debouncedProcessAllContent, 1000); }, { passive: true }); // 定时扫描 setInterval(processAllContent, 5000); console.log(`四平台关键词屏蔽器已启动,当前网站: ${getCurrentSite()}`); })();