Greasy Fork

Greasy Fork is available in English.

检测B站弹幕拦截

检测你的弹幕是否真的发出去了

当前为 2021-10-31 提交的版本,查看 最新版本

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         检测B站弹幕拦截
// @namespace    http://tampermonkey.net/
// @version      0.1.1
// @description  检测你的弹幕是否真的发出去了
// @author       熊孩子
// @match        https://live.bilibili.com/*
// @grant        none
// @require      https://cdn.jsdelivr.net/npm/[email protected]/dist/axios.min.js
// ==/UserScript==
(function () {

    function main () {
        init()
    }

    function init () {
        let i = 0;
        let id = setInterval(() => {//设置定时器每隔半秒找一下弹幕按钮的那个元素
            let element = document.querySelector("#control-panel-ctnr-box");
            if (element !== null) {
                clearInterval(id);//销毁定时器
                let button = element.childNodes[2].childNodes[0].childNodes[0];
                let textarea = element.childNodes[1].childNodes[1].childNodes[0];
                button.addEventListener("click", click);
                textarea.addEventListener("keydown", keydown);
            } else if (i < 100) {
                i++;
            } else {
                clearInterval(id);//销毁定时器
            }
        }, 500);
    }

    function keydown (event) {
        //表示键盘监听所触发的事件,同时传递参数event
        switch (event.keyCode) {
            case 13:
                click();
                break;
        }
    }

    function click () {//点击了发送弹幕的按钮后
        let id = setInterval(() => {
            clearInterval(id);
            let uid = getuid();
            let barrage = getbarrage(uid);
            let barrageNetwork = getbarrageNetwork(uid);
            barrageNetwork.then(function (data) {
                if (data != barrage) {
                    prompt("你的弹幕被吞了(Ctrl+c 复制该弹幕)", barrage);
                }
            })
        }, 500);
    }

    function getuid () {//获取当前登录用户的uid
        if (document.querySelector("#right-part") !== null) {
            let url = document.querySelector("#right-part").childNodes[1].childNodes[0].childNodes[0].childNodes[0].href;
            let uid = url.split('/')[url.split('/').length - 1]
            return uid;
        }
        return null;
    }

    function getbarrage (uid) {//获取当前登录用户在这个直播间发的最后一条弹幕
        let barrages = document.querySelector("#chat-items").childNodes;
        let barrage;
        for (let i = barrages.length - 1; i >= 0; i--) {
            if (barrages[i].dataset.uid === uid) {
                barrage = barrages[i].dataset.danmaku
                return barrage
            }
        }
        return null;
    }

    let apiClient = axios.create({
        baseURL: 'https://api.live.bilibili.com',
        withCredentials: true
    })

    async function getbarrageNetwork (uid) {//获取弹幕池中当前登录用户在这个直播间发的最后一条弹幕
        let roomid = window.location.pathname.slice(1);
        let ajaxObj = (await apiClient.get('/ajax/msg?roomid=' + roomid)).data
        if (ajaxObj.code === 0) {
            let barrageNetworks = ajaxObj.data.room;
            for (let i = barrageNetworks.length - 1; i >= 0; i--) {
                if (barrageNetworks[i].uid == uid) {
                    let barrageNetwork = barrageNetworks[i].text
                    return barrageNetwork;
                }
            }
            return null;
        }
        return null;
    }

    main()
})();