彻底清理百度搜索(www.baidu.com)结果首尾的推广广告、二次顽固广告、右侧广告,去除重定向,删除百家号
// ==UserScript== // @name 百度广告(首尾推广及右侧广告)清理 // @name:zh-CN 百度广告(首尾推广及右侧广告)清理 // @name:zh-TW 百度廣告(首尾推廣及右側廣告)清理 // @name:en Kill Baidu AD // @namespace hoothin // @version 1.23.11 // @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, hidePictureStyle, hidePictureRegister, 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)) { 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)) { 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); 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 === "r###lts" ? ".r###lt" : "#r###lts>.r###lt"); 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 .r###lt-op, #content_left .r###lt { 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; } #r###lt_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>.r###lt-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.r###lt[tpl], .r###lt-op.c-container[tpl], .r###lt-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.r###lt[tpl] h3, .r###lt-op.c-container[tpl] h3, .r###lt-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 .r###lt h3>a:after, #wrapper #content_left .r###lt-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 .r###lt h3>a:visited:after, #wrapper #content_left .r###lt-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 .r###lt a:hover:after, #wrapper #content_left .r###lt-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 .r###lt a:visited:hover:after, #wrapper #content_left .r###lt-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 > .r###lt:hover, #wrapper #content_left > .r###lt-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 { killRight = !!GM_getValue("killRight"); hidePicture = !!GM_getValue("hidePicture"); blackList = GM_getValue("blackList") || []; 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 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; GM_setValue("hidePicture", hidePicture); GM_setValue("killRight", killRight); 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 r###lt = res.response || res.responseText; if (!r###lt) return; blackList = blackList.concat(r###lt.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(); } }); } })();