移除 Bilibili 推广广告卡片

移除 Bilibili 首页的左上角 banner、信息流里的推广卡片、视频播放页面右上角的推广卡片等广告

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==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()

})()