block-bilibili-up

屏蔽B站用户、屏蔽视频、屏蔽直播

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         block-bilibili-up
// @namespace    https://bbs.tampermonkey.net.cn/
// @version      0.1.5
// @license      MIT
// @description  屏蔽B站用户、屏蔽视频、屏蔽直播
// @author       You
// @require https://cdn.bootcss.com/jquery/1.12.4/jquery.min.js
// @match        https://www.bilibili.com/
// @grant        unsafeWindow
// @grant        GM_addStyle
// @grant        GM_xmlhttpRequest

// ==/UserScript==

(function () {
    'use strict';
    const cssStyle = `
     .opt-button {
        display: block;
        z-index: 999;
        width: 60px;
        background-color: #ff5722;
        color: #fff;
        padding: 0.5em 1em;
        border-radius: 0.2em;
        cursor: pointer;
        font-size: 0.8em;
        transition: all 0.3s ease;
        display: none;
        margin: 5px;
      }
     .opt-button:hover {
        background-color: #f44336;
      }
 
      .block-hide{
        display: none !important;
      }

      .block-container {
        z-index: 999;
        top: 0;
        left: 0;
        position: absolute;
        padding: 0.5em 1em;
        width: 150px;
        height: 50px;
        display: flex;
        flex-direction: horizontal;
      }

      .block-container:hover .opt-button {
        display: block;
      }

    `;
    GM_addStyle(cssStyle);

    const storageBlocksItemName = 'block-bilibili-blackList';
    const storgeIgnoresItemName = 'block-bilibili-ignoreList';
    //从storage读取黑名单
    //格式: [{"name":"黑名单用户1","uid":123456}]
    let blackList = JSON.parse(localStorage.getItem(storageBlocksItemName) || '[]');

    //忽略视频列表
    //格式: [{"videoid":"BV1jb421v7EY","name":"忽略视频1"},{"videoid":"BV1jb421v7EZ","name":"忽略视频2"}]
    let ignoreList = JSON.parse(localStorage.getItem(storgeIgnoresItemName) || '[]');

    function hideCard(card) {
        if ($(card).hasClass("block-hide")) {
            return;
        }
        $(card).attr("class", "block-hide");

    }

    //右上角添加“屏蔽”按钮,鼠标移上时显示
    function addBlockButton(card) {
        if ($(card).find(".block-button").length > 0) {
            return;
        }

        $(card).css("position", "relative");

        let blockContainer = $('<div class="block-container"></div>');
        $(card).append(blockContainer);
        let blockButton = $('<button class="block-button opt-button">屏蔽</button>');
        $(blockContainer).append(blockButton);
        $(blockButton).click(function () {
            hideCard(card);
            let black = getAuthorUid(card);
            if (black == null) {
                return;
            }
            blackList.push(black);
            localStorage.setItem(storageBlocksItemName, JSON.stringify(blackList));
            console.log("屏蔽用户:" + black.name + " uid:" + black.uid);
        });
    }

    function addIgnoreButton(card) {
        if ($(card).find(".ignore-button").length > 0) {
            return;
        }

        let blockContainer = $(card).find(".block-container");
        if (blockContainer.length == 0) {
            return;
        }

        let ignoreButton = $('<button class="ignore-button opt-button">忽略</button>');
        $(blockContainer).append(ignoreButton);

        ignoreButton.click(function () {
            //添加到忽略列表,存入storage
            let videoIdAndName = getVideoIdAndName(card);
            if (videoIdAndName == null) {
                return;
            }

            ignoreList.push(videoIdAndName);
            localStorage.setItem(storgeIgnoresItemName, JSON.stringify(ignoreList));
            console.log("忽略视频:" + videoIdAndName.name + " videoid:" + videoIdAndName.videoid);
            hideCard(card);
        });
    }

    //return {name: "黑名单用户1", uid: 123456}
    function getAuthorUid(card) {
        let owner = $(card).find("a.bili-video-card__info--owner");
        if (owner.length == 0) {
            return null;
        }

        //space地址://space.bilibili.com/123456
        let spaceHref = $(owner).attr("href")
        //提取uid
        let uid = spaceHref.match(/\/(\d+)/)[1];

        let author = $(card).find(".bili-video-card__info--author");
        let name = $(author).attr("title");

        return { name: name, uid: uid };
    }

    //return {videoid: "BV1jb421v7EY", name: "忽略视频1"}
    function getVideoIdAndName(card) {
        //提取href中的videoid:href="https://www.bilibili.com/video/BV1jb421v7EY"
        let a = $(card).find(".bili-video-card__image--link");
        if (a.length == 0) {
            return null;
        }

        let href = $(a).attr("href");
        let videoid = href.match(/\/video\/(\w+)/)[1];

        let title = $(card).find(".bili-video-card__info--tit");
        if (title.length == 0) {
            return null;
        }

        return { videoid: videoid, name: $(title).attr("title") };
    }

    //屏蔽直播card
    //return :true-已屏蔽; false-未屏蔽
    function blockLiving(card) {
        let living = $(card).find(".bili-live-card__info--living,.living");
        if (living.length > 0) {
            hideCard(card);
            console.log("屏蔽直播card.");
            return true;
        }
        return false;
    }

    function refreshBlackList() {
        $(".feed-card,.bili-video-card.is-rcmd.enable-no-interest,.bili-live-card.is-rcmd.enable-no-interest,.floor-single-card").each((index, card) => {
            if ($(card).parent(".feed-card").length > 0) {
                card = $(card).parent(".feed-card");
            }
            $(card).removeClass("recommended-container_floor-aside");
            addBlockButton(card);
            addIgnoreButton(card);

            if ($(card).hasClass("block-hide")) {
                return;
            }

            //隐藏直播
            if (blockLiving(card)) {
                return;
            }

            //隐藏黑名单
            let authorUid = getAuthorUid(card);
            if (authorUid == null) {
                return;
            }
            let isInBlackList = blackList.some(item => item.uid == authorUid.uid);
            if (isInBlackList) {
                //隐藏
                hideCard(card);
                console.log("隐藏用户:" + authorUid.name + " uid:" + authorUid.uid);
            }

            let videoIdAndName = getVideoIdAndName(card);
            if (videoIdAndName == null) {
                return;
            }

            let isInIgnoreList = ignoreList.some(item => item.videoid == videoIdAndName.videoid);
            if (isInIgnoreList) {
                //隐藏
                hideCard(card);
                console.log("隐藏视频:" + videoIdAndName.name + " videoid:" + videoIdAndName.videoid);
            }
        });
    }

    refreshBlackList();
    //每2秒检测一次
    setInterval(() => {
        refreshBlackList();
    }, 2000);
})();