Greasy Fork

Greasy Fork is available in English.

B站直播跨房弹幕屏蔽器

通过劫持JSON.parse,解析DANMU_MSG中的extra字段,识别并拦截跨房弹幕

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         B站直播跨房弹幕屏蔽器
// @namespace    http://tampermonkey.net/
// @version      1.0
// @description  通过劫持JSON.parse,解析DANMU_MSG中的extra字段,识别并拦截跨房弹幕
// @author       hiback
// @match        https://live.bilibili.com/*
// @run-at       document-start
// @grant        none
// @license      MIT
// ==/UserScript==

(function() {
    'use strict';

    console.log("B站直播跨房弹幕屏蔽器已启动");

    const originalParse = JSON.parse;

    JSON.parse = function(text, reviver) {
        const data = originalParse(text, reviver);

        if (!data || typeof data !== 'object') return data;

        // 仅处理弹幕消息 (DANMU_MSG)
        if (data.cmd && data.cmd.startsWith('DANMU_MSG')) {
            try {
                // 安全检查数据结构
                // data.info[0] 存放弹幕元数据
                if (data.info && Array.isArray(data.info) && data.info[0]) {
                    const meta = data.info[0];

                    // 核心逻辑:检查 index 15 的 extra 字段
                    // 结构:meta[15] = { "extra": "{\"is_mirror\":true...}" }
                    if (meta[15] && meta[15].extra) {
                        // 为了性能,用字符串匹配快速筛查(避免每次都二次 parse)
                        const extraStr = meta[15].extra;

                        // 包含 "is_mirror":true
                        if (extraStr.includes('"is_mirror":true')) {
                            return null; // 拦截
                        }
                    }
                }
            } catch (e) {
                console.warn("拦截逻辑异常,放行弹幕", e);
            }
        }

        // 其他消息一律放行
        return data;
    };

})();