百度廣告(首尾推廣及右側廣告)清理

徹底清理百度搜索(www.baidu.com)結果首尾的推廣廣告、二次頑固廣告、右側廣告,去除重定向,刪除百家號

安裝腳本?
作者推薦腳本

您可能也會喜歡 怠惰小説下載器

安裝腳本

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name               百度广告(首尾推广及右侧广告)清理
// @name:zh-CN         百度广告(首尾推广及右侧广告)清理
// @name:zh-TW         百度廣告(首尾推廣及右側廣告)清理
// @name:en            Kill Baidu AD
// @namespace          hoothin
// @version            1.23.12
// @description        彻底清理百度搜索(www.baidu.com)结果首尾的推广广告、二次顽固广告、右侧广告,去除重定向,删除百家号
// @description:zh-CN  彻底清理百度搜索(www.baidu.com)结果首尾的推广广告、二次顽固广告、右侧广告,去除重定向,移除百家号
// @description:zh-TW  徹底清理百度搜索(www.baidu.com)結果首尾的推廣廣告、二次頑固廣告、右側廣告,去除重定向,刪除百家號
// @description:en     Just Kill Baidu AD
// @author             hoothin
// @match              *://www.baidu.com/*
// @match              *://m.baidu.com/*
// @match              *://greasyfork.org/*/scripts/24192-*
// @grant              GM_xmlhttpRequest
// @grant              GM_addStyle
// @grant              GM_getValue
// @grant              GM_setValue
// @grant              GM_openInTab
// @grant              GM_registerMenuCommand
// @grant              GM_unregisterMenuCommand
// @connect            *
// @run-at             document-start
// @license            MIT License
// @compatible         chrome 测试通过
// @compatible         firefox 测试通过
// @compatible         opera 未测试
// @compatible         safari 未测试
// ==/UserScript==

(function() {
    'use strict';
    var MO = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver, killBaijiaType = 1, killRight, killRightStyle, killRightRegister, hidePicture, keepBaijia, hidePictureStyle, hidePictureRegister, blackList;
    killRight = !!GM_getValue("killRight");
    hidePicture = !!GM_getValue("hidePicture");
    keepBaijia = !!GM_getValue("keepBaijia");
    blackList = GM_getValue("blackList") || [];
    if (MO) {
        var observer = new MO(function(records) {
            records.map(function(record) {
                if (record.addedNodes.length) {
                    [].forEach.call(record.addedNodes, function(addedNode) {
                        clearOneAD(addedNode);
                    });
                }
                if (record.removedNodes.length) {
                    [].forEach.call(record.removedNodes, function(removedNode) {
                        if (killRight && removedNode === killRightStyle) {
                            document.head.appendChild(killRightStyle);
                            document.body.classList.add("killRight");
                        } else if (hidePicture && removedNode === hidePictureStyle) {
                            document.head.appendChild(hidePictureStyle);
                        }
                    });
                }
            });
        });
        var option = {
            'childList': true,
            'subtree': true
        };
        observer.observe(document, option);
    }

    function checkBaijia(item) {
        var itemHref = item.querySelector("a").href;
        item.style.display = "none";
        if (itemHref.indexOf("baidu.com") == -1) return;
        var gmxhr = GM_xmlhttpRequest({
            url: itemHref,
            headers: {
                "Accept": "text/html"
            },
            method: "head",
            onreadystatechange: function(response) {
                if (response.readyState == 4) {
                    if (response.finalUrl.indexOf("baijiahao.baidu.com") != -1) {
                        item.remove();
                    } else {
                        item.style.display = "";
                    }
                    gmxhr.abort();
                }
            }
        });
    }

    function checkMobileItem(item) {
        let mu = item.dataset.log;
        if (mu) {
            try {
                mu = JSON.parse(mu).mu;
            } catch (e) {
                return;
            }
        }
        if (!mu || mu === 'null') return;
        if (/^https:\/\/baijiahao\.baidu\.com/.test(mu)) {
            !keepBaijia && item.remove();
            return;
        } else {
            let title = item.querySelector('[data-module="title"]');
            let isBlack = checkBlackList(mu, title && title.innerText);
            if (isBlack) {
                item.classList.add("blocked");
                return;
            }
        }
    }

    function checkLeftItem(item) {
        let mu = item.getAttribute("mu");
        if (mu && mu !== 'null' && mu.indexOf("http") == 0 && mu.indexOf("nourl") == -1 && item.getAttribute("tpl") != "short_video") {
            if (/^https:\/\/baijiahao\.baidu\.com/.test(mu)) {
                !keepBaijia && item.remove();
                return;
            } else {
                let title = item.querySelector('h3');
                let isBlack = checkBlackList(mu, title && title.innerText);
                if (isBlack) {
                    item.classList.add("blocked");
                    return;
                }
                let link = item.querySelector("a[href*='www.baidu.com/link']");
                if (link) {
                    link.href = mu;
                    item.setAttribute("mu", "");
                }
            }
        }
        let s = item.getAttribute("style");
        if (s && /display:(table|block)\s!important/.test(s)) {
            item.remove();
        } else {
            let baozhang = item.querySelector("[data-baodata]");
            if (baozhang) {
                item.remove();
                return;
            }
            var span = item.querySelector("div>span");
            if (span && span.innerHTML == "广告") {
                item.remove();
            }
            [].forEach.call(item.querySelectorAll("span,a"), function(span) {
                if (span && (span.innerHTML == "广告" || span.getAttribute("data-tuiguang"))) {
                    item.remove();
                }
            });
            if (killBaijiaType == 2) {
                [].forEach.call(item.querySelectorAll("a>div>span+img"), function(img) {
                    if (img && /^https?:\/\/pic\.rmb\.bdstatic\.com/.test(img.src)) {
                        //checkBaijia(item);
                        !keepBaijia && item.remove();
                    }
                });
            }
        }
    }

    function checkRightTable(item) {
        for (let i = 0; i < item.length; i++) {
            let d = item[i];
            if (d.id != "con-ar") {
                d.remove();
            }
        }
    }

    function checkRightAd(item) {
        var nra = item.querySelectorAll("a");
        for (let i = 0; i < nra.length; i++) {
            let d = nra[i];
            if (d.innerHTML == "广告") {
                item.remove();
                break;
            }
        }
    }

    function removeEcAd(ele) {
        var mAds = ele.querySelectorAll(".ec_wise_ad,.ec_youxuan_card,.page-banner");
        for (let i = 0; i < mAds.length; i++) {
            let mAd = mAds[i];
            mAd.remove();
        }
        var baiduapp = ele.querySelector("#copyright+div");
        if (baiduapp && baiduapp.querySelector("[ref='open']")) {
            baiduapp.remove();
        }
        var list = ele.querySelectorAll(ele.id === "results" ? ".result" : "#results>.result");
        for (let i = 0; i < list.length; i++) {
            let item = list[i];
            checkMobileItem(item);
        }
    }

    function clearAD() {
        if (!document.querySelectorAll) return;
        if (killRight) {
            document.body.classList.add("killRight");
        } else document.body.classList.remove("killRight");
        removeEcAd(document);
        var list = document.querySelectorAll("#content_left>div,#content_left>table");
        for (let i = 0; i < list.length; i++) {
            let item = list[i];
            checkLeftItem(item);
        }

        var eb = document.querySelectorAll("#content_right>table>tbody>tr>td>div");
        checkRightTable(eb);

        var nr = document.querySelector("#content_right>div>div>div");
        if (nr) {
            checkRightAd(nr);
        }
    }

    function clearOneAD(ele) {
        if (ele.nodeType != 1) return;
        if (ele.classList.contains("ec-tuiguang") || ele.classList.contains("ec_wise_ad") || ele.classList.contains("ec_youxuan_card") || ele.classList.contains("page-banner")) {
            ele.remove();
            return;
        }
        if (ele.parentNode && ele.parentNode.id == "content_left" && (ele.nodeName == "DIV" || ele.nodeName == "TABLE")) {
            checkLeftItem(ele);
        } else if (ele.parentNode && ele.parentNode.id == "content_right") {
            if (ele.nodeName == "TABLE") {
                var eb = ele.querySelectorAll("tbody>tr>td>div");
                checkRightTable(eb);
            }
            if (ele.nodeName == "DIV") {
                var nr = ele.querySelector("div>div");
                if (nr) {
                    checkRightAd(nr);
                }
            }
        } else {
            removeEcAd(ele);
            let eles = ele.querySelectorAll("#content_left>div,#content_left>table");
            [].forEach.call(eles, e => {clearOneAD(e)});
        }
    }
    function initCss() {
        killRightStyle && killRightStyle.parentNode && killRightStyle.parentNode.removeChild(killRightStyle);
        GM_addStyle(`
        body:not(.showBlocked) .blocked {
            display: none!important;
        }
        body.showBlocked .blocked {
            background: linen;
        }
        `);
        if (killRight) {
            killRightStyle = GM_addStyle(`
            #content_right,[tpl="recommend_list"],#rs_new {
                display: none;
            }
            #container.sam_newgrid {
                width: calc(100% - 150px);
            }
            #container.sam_newgrid #content_left {
                column-width: 590px;
                width: 100%;
            }
            #content_left .result-op, #content_left .result {
                page-break-inside: avoid;
            }
            `);
        }
        hidePictureStyle && hidePictureStyle.parentNode && hidePictureStyle.parentNode.removeChild(hidePictureStyle);
        if (hidePicture) {
            hidePictureStyle = GM_addStyle(`
            #wrapper_wrapper {
                background: rgba(228, 228, 228, 0.29);
            }
            #content_left .cos-color-bg-page {
                background-color: unset;
            }
            #head:not(.s-skin-hasbg),
            [tpl="app/head-tab"] {
                background: #f7f7f7;
            }
            #container a,
            #container a em {
                text-decoration: auto!important;
            }
            #result_logo {
                opacity: 0.75;
            }
            .cos-col[style*="width:33"],.cos-col[style*="width:25"],#content_left .c-span2,#content_left .c-span3,#content_left .c-span4,#content_left .c-span6>.c-img,[tpl="short_video"],[data-module="gp-peopleintro-img-click"],div[class^="img-container"],[data-module="normal-img"],[role="img"],.c-gap-inner-y-img,div[class*="only-multi-image"],.sc-image-rounded-tl-base>.cos-row>.cos-col:first-child,[class^="image-content"] {
                display: none;
            }
            #wrapper>.result-molecule.new-pmd {
                box-shadow: 0 2px 5px 0 rgba(0, 0, 0, .1);
            }
            .new-pmd .c-span9,.new-pmd .c-span6,.new-pmd .c-span10,.cos-col[style*="width:33"]+div,.cos-col[style*="width:25"]+div,.sc-image-rounded-tl-base>.cos-row>.cos-col:first-child+div {
                width: 100%!important;
            }
            a,a:active,#content_right a {
                color: rgb(80,80,80);
            }
            em {
                color: #4E6EF2!important;
            }
            .c-container.result[tpl], .result-op.c-container[tpl], .result-op.xpath-log.new-pmd[tpl] {
                transition: box-shadow 350ms;
                box-shadow: 0 2px 5px 0px rgba(0, 0, 0, .1);
                padding: 16px;
                box-sizing: content-box;
            }
            .c-container.result[tpl] h3, .result-op.c-container[tpl] h3, .result-op.xpath-log.new-pmd[tpl] h3 {
                padding-bottom: 10px;
                border-bottom: 1px solid rgba(211, 211, 211, 0.63);
            }
            .c-group-wrapper {
                box-shadow: unset;
                margin-left: unset;
                margin-right: unset;
            }
            .sc-image {
                background-image: none !important;
            }
            .wrapper_new #head.no-box-shadow, .wrapper_new #head.no-box-shadow.s_down {
                box-shadow: 0 2px 5px 0 rgba(0, 0, 0, .1);
            }
            [class*=card-shadow] {
                box-shadow: unset!important;
            }
            #wrapper #content_left .op-soft-title h3>a:after, #wrapper #content_left .result h3>a:after, #wrapper #content_left .result-op h3>a.sc-link:after, #wrapper #content_left > .c-container h3>a:after, #wrapper #content_left .op-soft-title a:visited:after, #wrapper #content_left .result h3>a:visited:after, #wrapper #content_left .result-op h3>a.sc-link:visited:after, #wrapper #content_left > .c-container h3>a:visited:after {
                content: "";
                position: relative;
                border-bottom: 2px solid #3075d0;
                bottom: -2px;
                display: block;
                left: 100%;
                width: 0;
                transition: width 300ms, left 300ms;
            }
            #wrapper #content_left .op-soft-title a:hover:after, #wrapper #content_left .result a:hover:after, #wrapper #content_left .result-op a.sc-link:hover:after, #wrapper #content_left > .c-container a:hover:after, #wrapper #content_left .op-soft-title a:visited:hover:after, #wrapper #content_left .result a:visited:hover:after, #wrapper #content_left .result-op a.sc-link:visited:hover:after, #wrapper #content_left > .c-container a:visited:hover:after {
                left: 0;
                width: 100%;
                transition: width 300ms;
            }
            #wrapper #content_left > .c-container:hover, #wrapper #content_left > .result:hover, #wrapper #content_left > .result-op:hover {
                box-shadow: 0 2px 10px 1px rgba(0, 0, 0, .3);
            }
            `);
        }
    }

    function checkBlackList(url, title) {
        if (!blackList || !blackList.forEach) return false;
        for (let i = 0; i < blackList.length; i++) {
            try {
                let isBlack = checkBlack(url, title, blackList[i]);
                if (isBlack) return true;
            } catch (e) {
                console.log(e);
            }
        }
        return false;
    }

    function checkBlack(url, title, pattern) {
        pattern = pattern && pattern.replace(/\s*#.*/, "");
        if (!pattern || !pattern.trim() || pattern.indexOf("#") === 0 || pattern.indexOf("!") === 0 || pattern.indexOf(" ") === 0 || pattern.indexOf("Update") === 0) return false;
        if (pattern.indexOf("/") === 0) {
            let match = pattern.match(/^\/(.*)\/(\w*)$/);
            if (match) {
                return new RegExp(match[1], match[2]).test(url);
            }
        }
        if (pattern.indexOf("title") === 0) {
            let match = pattern.replace("title", "").trim();
            if (match.indexOf("/") === 0) {
                match = match.match(/^\/(.*)\/(\w*)$/);
                if (match) {
                    return new RegExp(match[1], match[2]).test(title);
                }
            } else if (match.indexOf("=~") === 0) {
                match = match.match(/^=~\s*\/(.*)\/(\w*)$/);
                if (match) {
                    return new RegExp(match[1], match[2]).test(title);
                }
            } else if (match.indexOf("=") === 0) {
                match = match.match(/^=\s*"(.*)"$/);
                if (match) {
                    return title === match[1];
                }
            } else if (match.indexOf("^=") === 0) {
                match = match.match(/^\^=\s*"(.*)"$/);
                if (match) {
                    return title.indexOf(match[1]) === 0;
                }
            } else if (match.indexOf("$=") === 0) {
                match = match.match(/^\$=\s*"(.*)"$/);
                if (match) {
                    return title.endsWith(match[1]);
                }
            } else if (match.indexOf("*=") === 0) {
                match = match.match(/^\*=\s*"(.*)"$/);
                if (match) {
                    return title.indexOf(match[1]) !== -1;
                }
            }
        }
        return matchPattern(url, pattern);
    }

    function matchPattern(url, pattern) {
        if (pattern === '<all_urls>') {
            return true;
        }
        try {
            let match = pattern.match(/^(\*|[\w-]+):\/{2,3}(?:(\*|\*\.[^/*]+|[^/*]+)\/)?(.*)$/);
            if (!match) return url.indexOf(pattern) !== -1;
            const [, scheme, host, path] = match;
            const urlScheme = url.split(':')[0];
            const urlParam = new URL(url);
            if (scheme === '*' || urlScheme === scheme) {
                if (host !== '*') {
                    const urlHost = urlParam.hostname;
                    if (host.startsWith('*')) {
                        const hostPattern = host.slice(2);
                        if (!urlHost.endsWith(hostPattern)) return false;
                    } else {
                        if (urlHost !== host) return false;
                    }
                }
                const urlPath = urlParam.pathname + urlParam.search;
                const pathRegex = new RegExp(`^${path.replace(/([\.\?])/g, '\\$1').replace(/\*/g, '.*')}$`);
                return pathRegex.test(urlPath);
            }
        } catch(e) {}
        return false;
    }

    function registerMenuCommand() {
        initCss();
        if (window.top !== window.self) return;
        hidePictureRegister = GM_registerMenuCommand(hidePicture ? "✅ 恢复图片视频与样式" : "❌ 隐藏图片视频并简化样式", () => {
            GM_unregisterMenuCommand(killRightRegister);
            GM_unregisterMenuCommand(hidePictureRegister);
            hidePicture = !hidePicture;
            GM_setValue("hidePicture", hidePicture);
            registerMenuCommand();
        });
        killRightRegister = GM_registerMenuCommand(killRight ? "✅ 恢复右边栏与布局" : "❌ 隐藏右边栏并多列显示", () => {
            GM_unregisterMenuCommand(killRightRegister);
            GM_unregisterMenuCommand(hidePictureRegister);
            killRight = !killRight;
            GM_setValue("killRight", killRight);
            registerMenuCommand();
        });
    }

    function run() {
        try {
            if (location.host === "greasyfork.org") {
                function initConfig() {
                    let parent = document.querySelector('#additional-info');
                    let baseCon = document.createElement('div');
                    baseCon.style.margin = '20px';
                    parent.insertBefore(baseCon, parent.children[0]);
                    let checkIndex = 0;
                    let createCheckbox = (name, defaultValue) => {
                        let box = document.createElement('div');
                        let checkbox = document.createElement('input');
                        checkbox.type = 'checkbox';
                        checkbox.checked = defaultValue;
                        let id = 'stcnsc-checkbox' + checkIndex++;
                        checkbox.id = id;
                        let label = document.createElement('label');
                        label.setAttribute('for', id);
                        label.innerText = name;
                        box.appendChild(checkbox);
                        box.appendChild(label);
                        baseCon.appendChild(box);
                        return checkbox;
                    };
                    let hidePictureInput = createCheckbox('隐藏图片并简化样式', hidePicture);
                    let killRightInput = createCheckbox('隐藏右边栏并多列显示', killRight);
                    let keepBaijiaInput = createCheckbox('保留百家号', keepBaijia);
                    let importInput = document.createElement('textarea');
                    importInput.placeholder = '订阅 uBlacklist 规则:如 https://git.io/ublacklist';
                    importInput.style.width = '100%';
                    importInput.style.marginBottom = '10px';
                    baseCon.appendChild(importInput);
                    let blackListInput = document.createElement('textarea');
                    blackListInput.placeholder = '*://*.12345.cn/*\n*://*.54321.com/*\n一行一条';
                    blackListInput.style.width = '100%';
                    blackListInput.style.minHeight = "60px";
                    blackListInput.value = blackList.join("\n");
                    baseCon.appendChild(blackListInput);
                    function saveBlackList() {
                        GM_setValue("blackList", blackList);
                    }
                    let saveBtn = document.createElement('button');
                    saveBtn.innerText = '保存';
                    saveBtn.style.display = 'block';
                    saveBtn.style.fontSize = 'x-large';
                    saveBtn.style.fontWeight = 'bold';
                    saveBtn.style.pointerEvents = 'all';
                    saveBtn.style.cursor = 'pointer';
                    saveBtn.addEventListener("click", function(e) {
                        hidePicture = hidePictureInput.checked;
                        killRight = killRightInput.checked;
                        keepBaijia = keepBaijiaInput.checked;
                        GM_setValue("hidePicture", hidePicture);
                        GM_setValue("killRight", killRight);
                        GM_setValue("keepBaijia", keepBaijia);
                        if (importInput.value) {
                            alert("读取规则中……");
                            let importUrls = importInput.value.trim().split("\n");
                            importUrls.forEach(url => {
                                url = url && url.trim();
                                if (!url) return;
                                GM_xmlhttpRequest({
                                    url: url,
                                    onload: function(res) {
                                        let result = res.response || res.responseText;
                                        if (!result) return;
                                        blackList = blackList.concat(result.split("\n"));
                                        blackList = blackList.filter((value, index) => blackList.indexOf(value) === index);
                                        saveBlackList();
                                        blackListInput.value = blackList.join("\n");
                                    },
                                    onerror: function(e) {
                                        console.log(e);
                                        alert("网络错误,导入失败");
                                    }
                                });
                            });
                        } else {
                            blackList = blackListInput.value.split("\n");
                            saveBlackList();
                        }
                        alert("设置完毕");
                    });
                    baseCon.appendChild(saveBtn);
                    baseCon.appendChild(document.createElement("hr"));
                }
                if (document.readyState == "complete") {
                    initConfig();
                } else {
                    document.addEventListener("readystatechange", e => {
                        if (document.readyState == "complete") {
                            initConfig();
                        }
                    });
                }
                return;
            }
            registerMenuCommand();
            GM_registerMenuCommand("👁️ 检查屏蔽元素", () => {
                alert(`屏蔽元素数量:${document.body.querySelectorAll(".blocked").length}`)
                document.body.classList.toggle("showBlocked");
            });
            GM_registerMenuCommand("🔧 打开设置页", () => {
                GM_openInTab("https://greasyfork.org/scripts/24192", {active: true});
            });
        } catch(e) {}
        clearAD();
    }

    if (document.readyState == "complete" || document.readyState == "interactive") {
        run();
    } else {
        document.addEventListener("readystatechange", e => {
            if (document.readyState == "interactive") {
                run();
            }
        });
    }
})();