fuck csdn and geek-docs

在搜索结果中屏蔽指定域名。支持 Google / Baidu / Bing / 360 搜索

当前为 2025-03-10 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         fuck csdn and geek-docs
// @namespace    null
// @version      0.1
// @icon         https://www.google.com/s2/favicons?sz=64&domain=csdn.net
// @description  在搜索结果中屏蔽指定域名。支持 Google / Baidu / Bing / 360 搜索
// @license      GNU-GPLv3
// @match        *://*/*
// @grant        none
// ==/UserScript==

// 要屏蔽的域名列表
const blockedDomains = ['csdn.net', 'blog.csdn.net', 'time.geekbang.org', 'geekbang.org','geek-docs.com'];

// 搜索引擎域名列表
const searchEngines = [
    'www.baidu.com/s',
    'www.google.com/search',
    'www.bing.com/search',
    'www.so.com/s'
];

// 创建提示框样式
const style = document.createElement('style');
style.textContent = `
.toast-notification {
    position: fixed;
    bottom: 20px;
    right: 20px;
    background: #333;
    color: white;
    padding: 12px 24px;
    border-radius: 4px;
    z-index: 9999;
    opacity: 0;
    transition: opacity 0.3s ease-in-out;
    box-shadow: 0 2px 5px rgba(0,0,0,0.2);
	user-select:none;
}
.toast-notification.show {
    opacity: 1;
	user-select:none;
}
.blocked-overlay {
    position: fixed;
	user-select:none;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    background: #000;
    color: white;
    display: flex;
    justify-content: center;
    align-items: center;
    z-index: 99999;
    font-size: 24px;
    font-family: Arial, sans-serif;
    opacity: 1;
}
`;
document.head.appendChild(style);

// 显示提示框函数
function showToast(message, duration = 2000) {
    const toast = document.createElement('div');
    toast.className = 'toast-notification';
    toast.textContent = message;
    document.body.appendChild(toast);
    
    // 显示提示框
    setTimeout(() => toast.classList.add('show'), 10);
    
    // 定时移除提示框
    setTimeout(() => {
        toast.classList.remove('show');
        setTimeout(() => toast.remove(), 300);
    }, duration);
}

function isBlockedDomain() {
    return blockedDomains.some(domain => 
        window.location.hostname.includes(domain)
    );
}

function isSearchEngine() {
    const currentPath = window.location.hostname + window.location.pathname;
    return searchEngines.some(engine => currentPath.includes(engine));
}

function showBlockedPage() {
    document.body.innerHTML = '';
    const overlay = document.createElement('div');
    overlay.className = 'blocked-overlay';
    overlay.textContent = '当前域名已被屏蔽';
    document.body.appendChild(overlay);
}

function hideBlockedSites() {
    const filters = ".source_1Vdff, .iUh30, .b_attribution, .g-linkinfo-a, .c-abstract, .c-title".split(", ")
    const Elements = document.querySelectorAll(".result.c-container, .g, .b_algo, .res-list, .c-container, [class*='result']");
    let blockedCount = 0;
    let blockedUrls = [];
    
    Elements.forEach(function(Item) {
        let shouldBlock = false;
        // 检查元素本身的文本内容
        if (Item.textContent && blockedDomains.some(domain => Item.textContent.toLowerCase().includes(domain))) {
            shouldBlock = true;
        }
        
        // 检查特定选择器
        if (!shouldBlock) {
            for (const filter of filters) {
                const selectedContent = Item.querySelector(filter);
                if (selectedContent !== null) {
                    const contentText = selectedContent.innerText.toLowerCase();
                    if (blockedDomains.some(domain => contentText.includes(domain))) {
                        shouldBlock = true;
                        break;
                    }
                }
            }
        }
        
        if (shouldBlock) {
            // 尝试获取链接URL
            const link = Item.querySelector('a');
            if (link && link.href) {
                blockedUrls.push(link.href);
            }
            Item.parentNode.removeChild(Item);
            blockedCount++;
        }
    });
    
    if (blockedCount > 0) {
        console.log(`[Domain Blocker] 已去除 ${blockedCount} 条屏蔽域名的内容`);
        console.log(`已屏蔽的链接:\n${blockedUrls.map(url => `- ${url}`).join('\n')}`);
        showToast(`已屏蔽 ${blockedCount} 条内容`);
    }
}

// 主函数
function main() {
    if (isBlockedDomain()) {
        showBlockedPage();
    } else if (isSearchEngine()) {
        hideBlockedSites();
        // 监听页面变化(针对动态加载的搜索结果)
        const observer = new MutationObserver(() => {
            hideBlockedSites();
        });
        observer.observe(document.body, { childList: true, subtree: true });
    }
}

// 运行主函数
main();