Greasy Fork

Greasy Fork is available in English.

检测B站弹幕拦截

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

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

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