移除 Bilibili 首页的左上角 banner、信息流里的推广卡片、视频播放页面右上角的推广卡片等广告
// ==UserScript==
// @name 移除 Bilibili 推广广告卡片
// @description 移除 Bilibili 首页的左上角 banner、信息流里的推广卡片、视频播放页面右上角的推广卡片等广告
// @author xuejianxianzun
// @version 1.6
// @namespace saber.love
// @run-at document-body
// @match https://www.bilibili.com/*
// @match https://www.bilibili.com/video/*
// @icon https://www.google.com/s2/favicons?sz=64&domain=bilibili.com
// @grant none
// @license MIT
// ==/UserScript==
(function () {
'use strict';
// 对于有标记的广告元素,通过样式表隐藏,体验更好
function addStyle () {
const selectors = [
// 移除左上角的切换 banner
'div.recommended-swipe',
// 首页推流的直播间
'div.bili-live-card',
// 卡片下方有几层阴影的,都是推流
'.floor-single-card',
// 视频页面里,评论区上方的广告横幅
'.ad-floor-cover',
'.ad-report',
'.strip-ad',
// 视频页面里,右侧弹幕列表下方的广告,会标注“广告”字样
'#slide_ad',
// 视频页面里,右侧弹幕列表下方的广告,有小火箭图标,经常看到些逆天的玩意
'.video-card-ad-small',
// 视频页面里,混在右侧视频列表里的游戏广告
'.video-page-game-card-small',
]
const style = document.createElement('style')
style.textContent = `${selectors.join(',')}{display:none !important;}`
document.body.append(style)
}
// 对于本身没有标记的广告,先查找子元素,再移除其父元素
function removeAD () {
if (document.hidden) {
return
}
// 先查找具有特征的子元素,再查找父元素(整个卡片)
const childrenSelectors = [
// 1. 小火箭图标
'svg.bili-video-card__info--creative-ad',
// 2. 小火箭图标
'svg.vui_icon.bili-video-card__stats--icon',
// 3. 标题前面带“广告”的,其“广告”二字的图标
'.bili-video-card__info--ad',
// 4. 图片右下角带“广告”二字的,看起来都是游戏。点击会尝试打开小程序
// 它和视频卡片的不同之处在于:正常的视频卡片这里是一个 a 标签,而这种是 div
'div.bili-video-card__image--link',
// 5. 图片右下角带“广告”二字的,看起来都是游戏。点击会跳转到外部链接
'a.bili-video-card__info--owner.disable-hover',
]
childrenSelectors.forEach(selector => {
const array = document.querySelectorAll(selector)
for (const el of array) {
const card = el.closest('.feed-card') || el.closest('.bili-video-card')
// console.log(card)
card?.remove()
}
})
}
// 监听页面变化
let timer
function ob () {
const observer = new MutationObserver(() => {
window.clearTimeout(timer)
timer = window.setTimeout(removeAD, 0)
})
observer.observe(document.body, {
childList: true,
subtree: true,
})
}
addStyle()
removeAD()
ob()
})()