// ==UserScript== // @name 百度搜索网站屏蔽器 Plus // @name:en Baidu Site Blocker Plus // @namespace baidu-site-blocker-plus // @description 自定义屏蔽百度搜索结果中的指定网站和关键词,支持设置界面管理 // @description:en Block specified websites and keywords from Baidu search results // @version 1.2 // @author WHATIFAAA // @icon https://www.baidu.com/favicon.ico // @include *://www.baidu.com/s?* // @include *://www.baidu.com/* // @include *://m.baidu.com/* // @run-at document-end // @grant GM_setValue // @grant GM_getValue // @grant GM_registerMenuCommand // ==/UserScript== (function() { 'use strict'; const SITES_KEY = 'baidu_blocker_sites'; const KEYWORDS_KEY = 'baidu_blocker_keywords'; const DEFAULT_BLOCKED_SITES = [ { domain: 'wenku.baidu.com', keywords: ['百度文库'] }, { domain: 'zhidao.baidu.com', keywords: ['百度知道'] } ]; const DEFAULT_BLOCKED_KEYWORDS = ['文心智能体', 'AI生成', 'AI生成内容']; function getBlockedSites() { try { const saved = GM_getValue(SITES_KEY, '[]'); const parsed = JSON.parse(saved); if (parsed.length === 0) return DEFAULT_BLOCKED_SITES; return parsed; } catch { return DEFAULT_BLOCKED_SITES; } } function saveBlockedSites(sites) { GM_setValue(SITES_KEY, JSON.stringify(sites)); } function getBlockedKeywords() { try { const saved = GM_getValue(KEYWORDS_KEY, '[]'); const parsed = JSON.parse(saved); if (parsed.length === 0) return DEFAULT_BLOCKED_KEYWORDS; return parsed; } catch { return DEFAULT_BLOCKED_KEYWORDS; } } function saveBlockedKeywords(keywords) { GM_setValue(KEYWORDS_KEY, JSON.stringify(keywords)); } function addBlockedSite(domain, keywords) { const sites = getBlockedSites(); const exists = sites.some(s => s.domain === domain); if (!exists) { sites.push({ domain, keywords: keywords || [] }); saveBlockedSites(sites); } return sites; } function removeBlockedSite(domain) { const sites = getBlockedSites(); const index = sites.findIndex(s => s.domain === domain); if (index > -1) { sites.splice(index, 1); saveBlockedSites(sites); } return sites; } function addBlockedKeyword(keyword) { const keywords = getBlockedKeywords(); if (!keywords.includes(keyword)) { keywords.push(keyword); saveBlockedKeywords(keywords); } return keywords; } function removeBlockedKeyword(keyword) { const keywords = getBlockedKeywords(); const index = keywords.indexOf(keyword); if (index > -1) { keywords.splice(index, 1); saveBlockedKeywords(keywords); } return keywords; } function isBlockedContent(url, text) { if (!url && !text) return false; const sites = getBlockedSites(); for (const site of sites) { if (url && url.toLowerCase().includes(site.domain.toLowerCase())) { return true; } if (text && site.keywords) { for (const keyword of site.keywords) { if (text.includes(keyword)) { return true; } } } } const keywords = getBlockedKeywords(); if (text) { for (const keyword of keywords) { if (text.includes(keyword)) { return true; } } } return false; } function removeNode(node) { if (node.hasAttribute('blocker-removed')) return; node.setAttribute('blocker-removed', '1'); node.remove(); } function removeBlockedResults() { const selectors = [ '#content_left > .c-container', '#content_left > [srcid]', '.result-op', '.result', '.xpath-log', '[tpltype="wk"]', '.c-result', '#content_left > div' ]; selectors.forEach(selector => { const elements = document.querySelectorAll(selector); elements.forEach(element => { const link = element.querySelector('a'); const text = element.textContent || ''; if (link && isBlockedContent(link.href, text)) { removeNode(element); } }); }); } function setupObserver() { let isProcessing = false; const observer = new MutationObserver(() => { if (isProcessing) return; isProcessing = true; setTimeout(() => { removeBlockedResults(); isProcessing = false; }, 100); }); const target = document.body || document.documentElement; if (target) { observer.observe(target, { childList: true, subtree: true, attributes: false, characterData: false }); } } function createSettingsPanel() { const panel = document.createElement('div'); panel.id = 'baidu-blocker-panel'; panel.style.cssText = ` position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%); background: #fff; border-radius: 12px; box-shadow: 0 10px 40px rgba(0,0,0,0.2); padding: 24px; width: 520px; max-height: 80vh; overflow-y: auto; z-index: 9999; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; `; panel.innerHTML = `

网站屏蔽设置

屏蔽网站域名

屏蔽关键词

`; const overlay = document.createElement('div'); overlay.id = 'blocker-overlay'; overlay.style.cssText = ` position: fixed; top: 0; left: 0; right: 0; bottom: 0; background: rgba(0,0,0,0.5); z-index: 9998; `; document.body.appendChild(overlay); document.body.appendChild(panel); updateSiteList(); updateKeywordList(); document.getElementById('blocker-close').addEventListener('click', closePanel); document.getElementById('blocker-overlay').addEventListener('click', closePanel); document.getElementById('blocker-site-add').addEventListener('click', handleSiteAdd); document.getElementById('blocker-site-input').addEventListener('keydown', (e) => { if (e.key === 'Enter') handleSiteAdd(); }); document.getElementById('blocker-keyword-add').addEventListener('click', handleKeywordAdd); document.getElementById('blocker-keyword-input').addEventListener('keydown', (e) => { if (e.key === 'Enter') handleKeywordAdd(); }); document.getElementById('blocker-reset').addEventListener('click', handleReset); function closePanel() { panel.remove(); overlay.remove(); } function handleSiteAdd() { const input = document.getElementById('blocker-site-input'); const domain = input.value.trim(); if (domain) { addBlockedSite(domain, []); input.value = ''; updateSiteList(); } } function handleKeywordAdd() { const input = document.getElementById('blocker-keyword-input'); const keyword = input.value.trim(); if (keyword) { addBlockedKeyword(keyword); input.value = ''; updateKeywordList(); } } function handleReset() { saveBlockedSites(DEFAULT_BLOCKED_SITES); saveBlockedKeywords(DEFAULT_BLOCKED_KEYWORDS); updateSiteList(); updateKeywordList(); } function updateSiteList() { const list = document.getElementById('blocker-site-list'); const sites = getBlockedSites(); if (sites.length === 0) { list.innerHTML = '

暂无屏蔽网站

'; return; } list.innerHTML = sites.map(site => `
${site.domain}
`).join(''); document.querySelectorAll('.blocker-site-remove-btn').forEach(btn => { btn.addEventListener('click', (e) => { const domain = e.target.dataset.domain; removeBlockedSite(domain); updateSiteList(); }); }); } function updateKeywordList() { const list = document.getElementById('blocker-keyword-list'); const keywords = getBlockedKeywords(); if (keywords.length === 0) { list.innerHTML = '

暂无屏蔽关键词

'; return; } list.innerHTML = keywords.map(keyword => `
${keyword}
`).join(''); document.querySelectorAll('.blocker-keyword-remove-btn').forEach(btn => { btn.addEventListener('click', (e) => { const keyword = e.target.dataset.keyword; removeBlockedKeyword(keyword); updateKeywordList(); }); }); } } GM_registerMenuCommand('网站屏蔽设置', createSettingsPanel); function init() { if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', () => { removeBlockedResults(); setupObserver(); }); } else { removeBlockedResults(); setupObserver(); } } init(); })();