Greasy Fork

Greasy Fork is available in English.

移除 Bilibili 推广广告卡片

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

当前为 2025-06-16 提交的版本,查看 最新版本

// ==UserScript==
// @name         移除 Bilibili 推广广告卡片
// @description  移除 Bilibili 首页的左上角 banner、信息流里的推广卡片、视频播放页面右上角的推广卡片等广告
// @author       xuejianxianzun
// @version      1.5
// @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',
      // 视频页面里,右侧弹幕列表下方的广告,会标注“广告”字样
      '#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()

})()