避免误伤 const LIVE_BANNER_AD_SELECTOR = 'div.flip-view:has(div[data-type=liveroom_banner_show])'; // --- 导航栏选择器 --- const NAV_ANIME_SELECTOR = 'li.v-popover-wrap:has(a.default-entry[href*=anime])'; const NAV_LIVE_SELECTOR = 'li.v-popover-wrap:has(a.default-entry[href*=live.bilibili])'; const NAV_GAME_SELECTOR = 'li.v-popover-wrap:has(a.default-entry[href*=game.bilibili])'; const NAV_MALL_SELECTOR = 'li.v-popover-wrap:has(a.default-entry[href*=show.bilibili])'; const NAV_MANGA_SELECTOR = 'li.v-popover-wrap:has(a.default-entry[href*=manga.bilibili])'; const NAV_MATCH_SELECTOR = 'li.v-popover-wrap:has(a.default-entry[href*=match])'; const NAV_DOWNLOAD_SELECTOR = 'li.v-popover-wrap:has(a.download-client-trigger)'; const NAV_VIP_SELECTOR = 'div.vip-wrap'; // 评论区根容器(绝不处理) const COMMENT_ROOT_SELECTOR = '#comment-area, { key: 'rightBottomAd', childList: true }); // 启动清理 fullClean();})(); 。
label: '隐藏 大会员' } ] } ]; function getConfig() { let saved = localStorage.getItem(CONFIG_KEY); if (saved) { try { let oldCfg = JSON.parse(saved); if (oldCfg.leftBanner !== undefined oldCfg.bottomBanner === undefined) { oldCfg.bottomBanner = oldCfg.leftBanner; delete oldCfg.leftBanner; localStorage.setItem(CONFIG_KEY, div.ad-report.strip-ad a[href*=cm.bilibili.com]'; const SIDE_AD_SELECTOR = '#slide_ad, 'true'); } }); } hideVideoAdsInRecommended(); // --- 清理导航栏元素 --- checkAndHide(NAV_ANIME_SELECTOR,0, // ==UserScript==// @name 哔哩哔哩广告全面屏蔽 nbsp; 3.2// @description屏蔽视频底部广告/活动横幅、侧边栏广告及底部推广、推荐流广告视频、小型广告卡片、视频底部标签、首页轮播、花生平台广告、直播页广告等, closePanel); overlay.addEventListener('click', ...oldCfg}; } catch(e) { return {...defaultConfig}; } } return {...defaultConfig}; } function saveConfig(cfg) { localStorage.setItem(CONFIG_KEY。
Roboto。
'hideMall'); checkAndHide(NAV_MANGA_SELECTOR。
() = { observer.observe(document.body。
// 2. 侧边栏广告(右侧浮动) rightBottomAd: true, 'huashengBanner'); checkAndHide(BTN_AD_SELECTOR, Segoe UI。
.comment-container, label: '创作页按钮广告' }, 'hideMall'); checkAndHide(NAV_MANGA_SELECTOR, label: '侧边栏广告(浮动)' }。
0, // 赛事 hideDownload: false, 'btnAd'); checkAndHide(LIVE_BANNER_AD_SELECTOR, JSON.stringify(oldCfg)); } return {...defaultConfig, 'hideMatch'); checkAndHide(NAV_DOWNLOAD_SELECTOR, 'btnAd'); checkAndHide(LIVE_BANNER_AD_SELECTOR。
// 1. 视频底部广告横幅 sideAd: true, (e) = { if (e.target === overlay) closePanel(); }); } GM_registerMenuCommand(' B站净化器设置',0.1); } .bp-switch input:checked + .bp-slider { background-color: #FB7299; } .bp-switch input:checked + .bp-slider:before { transform: translateX(18px); } `; document.head.appendChild(style); const overlay = document.createElement('div'); overlay.id = 'bp-overlay'; const modal = document.createElement('div'); modal.id = 'bp-modal'; const header = document.createElement('div'); header.id = 'bp-header'; const title = document.createElement('h3'); title.textContent = 'B站净化器 - 设置'; const closeBtn = document.createElement('button'); closeBtn.id = 'bp-close-btn'; closeBtn.textContent = ''; header.appendChild(title); header.appendChild(closeBtn); const body = document.createElement('div'); body.id = 'bp-body'; const cfg = getConfig(); configStructure.forEach(group = { const groupTitle = document.createElement('div'); groupTitle.className = 'bp-group-title'; groupTitle.textContent = group.groupName; body.appendChild(groupTitle); group.items.forEach(item = { const row = document.createElement('div'); row.className = 'bp-switch-row'; const label = document.createElement('span'); label.textContent = item.label; const switchContainer = document.createElement('label'); switchContainer.className = 'bp-switch'; const input = document.createElement('input'); input.type = 'checkbox'; input.checked = cfg[item.key]; input.dataset.key = item.key; const slider = document.createElement('span'); slider.className = 'bp-slider'; switchContainer.appendChild(input); switchContainer.appendChild(slider); row.appendChild(label); row.appendChild(switchContainer); body.appendChild(row); input.addEventListener('change', 'videoTag'); checkAndHide(HOME_CAROUSEL_AD_SELECTOR, 'hideDownload'); checkAndHide(NAV_VIP_SELECTOR, 'homeCarouselAd'); checkAndHide(HUASHENG_BANNER_SELECTOR, .bili-comment'; const HIDE_MARKER = 'data-ad-hidden'; function isInsideCommentArea(element) { if (!element) return false; let node = element; while (node node !== document.body) { if (node.nodeType === Node.ELEMENT_NODE node.matches node.matches(COMMENT_ROOT_SELECTOR)) { return true; } node = node.parentElement; } return false; } // 验证是否为活动横幅 function isActivityBanner(el) { return el.querySelector('.hinter-msg') el.querySelector('.inside-bg'); } // 通用隐藏逻辑 function checkAndHide(selector。
'smallAdCard'); checkAndHide(VIDEO_TAG_SELECTOR, JSON.stringify(cfg)); } // ================= 油猴菜单与设置 UI ================= let isPanelOpen = false; let needReload = false; function openSettingsPanel() { if (isPanelOpen) return; isPanelOpen = true; needReload = false; const style = document.createElement('style'); style.id = 'bp-settings-style'; style.textContent = ` #bp-overlay { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0, // 番剧 hideLive: false。
.slide-ad-exp'; const RIGHT_BOTTOM_AD_SELECTOR = 'div.ad-report.ad-floor-exp, { key: 'btnAd'。
{ key: 'hideMall', 'hideAnime'); checkAndHide(NAV_LIVE_SELECTOR。
0, 'hideLive'); checkAndHide(NAV_GAME_SELECTOR, subtree: true }); }); } // SPA 路由变化辅助 let lastUrl = location.href; const urlObserver = new MutationObserver(() = { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(fullClean, { key: 'sideAd', // 5. 推荐流广告视频 videoTag: true, { key: 'smallAdCard', .comment-list-holder。
'hideManga'); checkAndHide(NAV_MATCH_SELECTOR, subtree: true }); } else { window.addEventListener('DOMContentLoaded', // 4. 小型广告卡片 feedAdVideo: true, 'bottomBanner'); checkAndHide(SIDE_AD_SELECTOR。
'huashengBanner'); checkAndHide(BTN_AD_SELECTOR, // 直播 hideGameCenter: false, .feed-card, 'hideMatch'); checkAndHide(NAV_DOWNLOAD_SELECTOR,0, // 游戏中心 hideMall: false, 'sideAd'); checkAndHide(RIGHT_BOTTOM_AD_SELECTOR, configKey) { const cfg = getConfig(); if (!cfg[configKey]) return; document.querySelectorAll(selector).forEach(el = { if (!isInsideCommentArea(el) el.getAttribute(HIDE_MARKER) !== 'true') { el.style.display = 'none'; el.setAttribute(HIDE_MARKER。
span[class*=sponsor]。
.feed-list, 'hideDownload'); checkAndHide(NAV_VIP_SELECTOR, 'hideManga'); checkAndHide(NAV_MATCH_SELECTOR, label: '投稿菜单花生横幅' }, 'true'); } }; checkActivity(node); if (node.querySelectorAll) { node.querySelectorAll(ACTIVITY_BANNER_SELECTOR).forEach(wrp = checkActivity(wrp)); } } // 广告视频卡片检查优化 const cfg = getConfig(); if (cfg.feedAdVideo) { let needScanVideo = false; if (node.matches (node.matches('.bili-video-card') || node.matches('.feed-card') || node.matches(FEED_CONTAINER_SELECTOR))) { needScanVideo = true; } else if (node.querySelector (node.querySelector('.bili-video-card') || node.querySelector('.feed-card') || node.querySelector(FEED_CONTAINER_SELECTOR))) { needScanVideo = true; } if (needScanVideo) { setTimeout(() = hideVideoAdsInRecommended(), { key: 'huashengBanner', 'true'); } }); }); } // 统一清理入口 function fullClean() { checkAndHide(BOTTOM_BANNER_AD_SELECTOR, items: [ { key: 'hideAnime', label: '视频底部标签' }, { childList: true, { key: 'homeCarouselAd'。
Helvetica Neue, sans-serif; } #bp-modal { background: #fff; width: 380px; border-radius: 8px; box-shadow: 0 10px 30px rgba(0,0, { key: 'feedAdVideo', label: '隐藏 直播' }。
'rightBottomAd'); checkAndHide(SMALL_AD_CARD_SELECTOR, 'true'); } }); } // ================= 强化:推荐流广告视频识别 ================= function isAdVideoCard(card) { const adLink = card.querySelector('a[href*=cm.bilibili.com]'); if (adLink) return true; if (card.dataset card.dataset.isAd !== undefined) return true; if (card.classList.contains('is-ad')) return true; const statsContainer = card.querySelector('.bili-video-card__stats') || card.querySelector('.bili-video-card__image .bili-video-card__mask') || card.querySelector('.feed-card-statistics'); if (statsContainer) { const spans = statsContainer.querySelectorAll('span'); for (let span of spans) { if (/广告|推广|AD|赞助/i.test(span.textContent.trim())) { return true; } } } const imageWrap = card.querySelector('.bili-video-card__image') || card.querySelector('.feed-card-image'); if (imageWrap) { const cornerTags = imageWrap.querySelectorAll('span[class*=ad]。
'homeCarouselAd'); checkAndHide(HUASHENG_BANNER_SELECTOR, .comment-list, // 会员购 hideManga: false, { childList: true。
150); } }); if (document.body) { observer.observe(document.body, BlinkMacSystemFont, 'liveBannerAd'); // 活动横幅需特征双重验证 if (getConfig().activityBanner) { document.querySelectorAll(ACTIVITY_BANNER_SELECTOR).forEach(wrp = { if (isActivityBanner(wrp) !isInsideCommentArea(wrp) wrp.getAttribute(HIDE_MARKER) !== 'true') { wrp.style.display = 'none'; wrp.setAttribute(HIDE_MARKER, 'videoTag'); checkAndHide(HOME_CAROUSEL_AD_SELECTOR。
// 11. 直播间轮播广告 // --- 导航栏精简 --- hideAnime: false。
div.right-bottom-banner'; const SMALL_AD_CARD_SELECTOR = '.video-card-ad-small'; const FEED_CONTAINER_SELECTOR = '.bili-feed4, { subtree: true, items: [ { key: 'videoTag', { groupName: 导航栏精简 (左侧+右侧),// 7. 视频底部活动横幅 homeCarouselAd: false, label: '隐藏 会员购' }, 'bottomBanner'); checkAndHide(SIDE_AD_SELECTOR, label: '推荐流广告视频' }, 'hideVip'); } // 处理动态新增节点 function processNewNode(node) { if (node.nodeType !== Node.ELEMENT_NODE) return; if (isInsideCommentArea(node)) return; checkAndHide(BOTTOM_BANNER_AD_SELECTOR。
{ groupName: 页面元素精简, // 6. 视频底部标签 activityBanner: true, items: [ { key: 'bottomBanner', 'hideAnime'); checkAndHide(NAV_LIVE_SELECTOR, 'hideLive'); checkAndHide(NAV_GAME_SELECTOR,完全避开评论区, 'sideAd'); checkAndHide(RIGHT_BOTTOM_AD_SELECTOR。
label: '直播间轮播广告' } ] }, a.strip-ad[href*=cm.bilibili.com], { key: 'hideVip', openSettingsPanel); // ================= 核心屏蔽逻辑 ================= // 广告选择器 const BOTTOM_BANNER_AD_SELECTOR = 'a.ad-report-inner[href*=cm.bilibili.com], 'hideGameCenter'); checkAndHide(NAV_MALL_SELECTOR,0.15); overflow: hidden; display: flex; flex-direction: column; } #bp-header { display: flex; justify-content: space-between; align-items: center; padding: 15px 20px; border-bottom: 1px solid #e8e8e8; } #bp-header h3 { margin: 0; font-size: 16px; color: #333; } #bp-close-btn { background: none; border: none; font-size: 20px; color: #999; cursor: pointer; line-height: 1; padding: 0; } #bp-close-btn:hover { color: #333; } #bp-body { padding: 10px 0; max-height: 70vh; overflow-y: auto; } .bp-group-title { padding: 10px 20px 5px; margin: 0; font-size: 13px; color: #888; font-weight: 500; } .bp-switch-row { display: flex; justify-content: space-between; align-items: center; padding: 12px 20px; font-size: 14px; color: #333; transition: background 0.2s; } .bp-switch-row:hover { background: #fff1f5; } .bp-switch { position: relative; display: inline-block; width: 40px; height: 22px; flex-shrink: 0; } .bp-switch input { opacity: 0; width: 0; height: 0; } .bp-slider { position: absolute; cursor: pointer; top: 0; left: 0; right: 0; bottom: 0; background-color: #ccc; transition: .3s; border-radius: 22px; } .bp-slider:before { position: absolute; content: ; height: 16px; width: 16px; left: 3px; bottom: 3px; background-color: white; transition: .3s; border-radius: 50%; box-shadow: 0 1px 3px rgba(0, 300); } }); urlObserver.observe(document, .bili-video-card-list, 'hideGameCenter'); checkAndHide(NAV_MALL_SELECTOR, { key: 'hideDownload'。
'rightBottomAd'); checkAndHide(SMALL_AD_CARD_SELECTOR, .video-page-special'; const VIDEO_TAG_SELECTOR = '.video-tag-container'; const ACTIVITY_BANNER_SELECTOR = '.inside-wrp'; const HOME_CAROUSEL_AD_SELECTOR = 'div.recommended-swipe'; const HUASHENG_BANNER_SELECTOR = 'a.upload-huasheng-banner'; const BTN_AD_SELECTOR = 'div.btn-ad'; // 直播间轮播广告:精确匹配包含特定数据类型的翻转容器,// 9. 投稿菜单花生横幅 btnAd: true, label: '视频底部广告横幅' }, label: '小型广告卡片' }。
并支持导航栏精简// @author MRBANK// @match *://*.bilibili.com/*// @icon https://www.bilibili.com/favicon.ico// @grant GM_registerMenuCommand// @run-at document-end// ==/UserScript==// @downloadURLhttps://cdn.jsdelivr.net/gh/hangzai1667/my-tampermonkey-scripts@main/bilibili.user.js// @updateURL https://cdn.jsdelivr.net/gh/hangzai1667/my-tampermonkey-scripts@main/bilibili.user.js(function() { 'use strict'; // ================= 配置管理 ================= const CONFIG_KEY = 'bilibili_purifier_config'; const defaultConfig = { bottomBanner: true, label: '隐藏 番剧' }, // 3. 侧边栏底部推广 smallAdCard: true, label: '侧边栏底部推广' },。
{ key: 'activityBanner', 'liveBannerAd'); if (getConfig().activityBanner) { const checkActivity = (el) = { if (isActivityBanner(el) !isInsideCommentArea(el) el.getAttribute(HIDE_MARKER) !== 'true') { el.style.display = 'none'; el.setAttribute(HIDE_MARKER, // 8. 首页轮播广告(默认关闭) huashengBanner: true, .recommend-container, // 10. 创作页按钮广告 liveBannerAd: true, label: '视频底部活动横幅' } ] }, 'smallAdCard'); checkAndHide(VIDEO_TAG_SELECTOR, { key: 'hideLive', label: '隐藏 漫画' }, { key: 'hideMatch', span[class*=promote]'); for (let tag of cornerTags) { if (/广告|推广|AD/i.test(tag.textContent.trim())) { return true; } } } return false; } function hideVideoAdsInRecommended() { if (!getConfig().feedAdVideo) return; const containers = document.querySelectorAll(FEED_CONTAINER_SELECTOR); containers.forEach(container = { if (isInsideCommentArea(container)) return; const cards = container.querySelectorAll('.bili-video-card, label: '隐藏 游戏中心' }, // 下载客户端 hideVip: false // 大会员 }; const configStructure = [ { groupName: 广告与推广, { key: 'liveBannerAd',0.4); z-index: 999998; display: flex; align-items: center; justify-content: center; font-family: -apple-system。
// 漫画 hideMatch: false。
0, .reply-list,带UI开关控制, label: '首页轮播广告' }, { key: 'hideGameCenter', label: '隐藏 赛事' }, Arial, .video-card'); cards.forEach(card = { if (!isInsideCommentArea(card) isAdVideoCard(card)) { if (card.getAttribute(HIDE_MARKER) === 'true') return; card.style.display = 'none'; card.setAttribute(HIDE_MARKER, 'hideVip'); } // MutationObserver 监听页面变化 const observer = new MutationObserver(mutations = { let hasAddedNodes = false; for (const mutation of mutations) { if (mutation.type === 'childList' mutation.addedNodes.length) { mutation.addedNodes.forEach(node = processNewNode(node)); hasAddedNodes = true; } } if (hasAddedNodes) { setTimeout(() = { fullClean(); }, label: '隐藏 下载客户端' }, { key: 'hideManga', (e) = { const currentCfg = getConfig(); currentCfg[e.target.dataset.key] = e.target.checked; saveConfig(currentCfg); needReload = true; }); }); }); modal.appendChild(header); modal.appendChild(body); overlay.appendChild(modal); document.body.appendChild(overlay); const closePanel = () = { document.body.removeChild(overlay); document.head.removeChild(style); isPanelOpen = false; if (needReload) location.reload(); }; closeBtn.addEventListener('click', 80); } } // --- 动态节点导航栏检查 --- checkAndHide(NAV_ANIME_SELECTOR。
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。
