枝江拖拉机 独轮车

用于B站直播的弹幕重复发送,弹幕发送间隔时间建议为六秒及以上(不然容易发送过快)

当前为 2022-05-11 提交的版本,查看 最新版本

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         枝江拖拉机 独轮车
// @namespace    http://tampermonkey.net/
// @version      3.0.1
// @description  用于B站直播的弹幕重复发送,弹幕发送间隔时间建议为六秒及以上(不然容易发送过快)
// @author       你失散已久的父亲向晚
// @match        https://live.bilibili.com/*
// @icon         data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==
// @grant        GM_getValue
// @grant        GM_setValue
// @license      MIT
// ==/UserScript==
//想想自己到底要不要用这个再作决定!!!🙁

(function () {
    'use strict';

    var check = setInterval(function () {
        let point1 = document.getElementsByClassName("bottom-actions p-relative")[0];
        let point2 = document.getElementsByClassName('chat-history-panel')[0];
        if (point1 !== undefined && point2 !== undefined) {
            let panelBtn = 0;//面板开关的数值,开为1,关为0
            let tractorBtn = 0;//拖拉机开关数值,开为1,关为0
            var tractorValue = '';//拖拉机内容
            var mudTruckValue = '';//泥头车内容
            var tractor;//拖拉机定时器
            var value;//快速发送内容
            var time = '';//弹幕发送间隔
            var index = 0;

            //创建控制面板开关按钮
            let btn = document.createElement('div');
            btn.className = 'p-absolute';
            btn.style.left = '0';
            btn.style.top = '0';
            btn.innerHTML = '<button style="position: relative; box-sizing: border-box; line-height: 1; margin: 0; padding: 6px 12px; border: 0; cursor: pointer; outline: 0; overflow: hidden; display: inline-flex; justify-content: center; align-items: center; min-width: 80px; height: 24px; font-size: 12px; background-color: #23ade5; color: #fff; border-radius: 4px; "><span class="txt" style="position: relative; ">拖拉机面板</span></button>';
            point1.appendChild(btn);

            //创建拖拉机关闭按钮
            let btn1 = document.createElement('div');
            btn1.className = 'p-absolute';
            btn1.style.left = '90px';
            btn1.style.top = '0';
            btn1.innerHTML = '<button id="closeBtn" style="display: none; position: relative; box-sizing: border-box; line-height: 1; margin: 0; padding: 6px 12px; border: 0; cursor: pointer; outline: 0; overflow: hidden; display: inline-flex; justify-content: center; align-items: center; min-width: 80px; height: 24px; font-size: 12px; background-color: #23ade5; color: #fff; border-radius: 4px; "><span class="txt" style="position: relative; ">关闭拖拉机</span></button>';
            btn1.style.display = 'none';
            point1.appendChild(btn1);

            //创建控制面板
            let panel = document.createElement('div');
            panel.style.position = 'absolute';
            panel.style.bottom = '145px';
            panel.style.left = '0';
            panel.style.width = '100%';
            panel.style.zIndex = 50;
            panel.style.backgroundColor = '#fff';
            panel.style.display = 'flex';
            panel.style.justifyContent = 'center';
            panel.style.alignItems = 'center';
            panel.innerHTML = '<img src="https://i0.hdslb.com/bfs/album/[email protected]" width="100%"> <div id="partition" style="display: none; position: absolute; top: 0; left: 0; z-index: 52; width: 100%; height: 100%; margin: 0; padding: 0; font-size: 20px; font-weight: 700; background-color: rgba(255, 255, 255, 0.7); align-items: center; justify-content: center;"><div>嘀哩啪啦吧啦啪啦boom</div></div> <div style="position: absolute; top: 0; left: 0; z-index: 51; width: 100%; height: 100%; margin: 0; padding: 0; font-weight: 700;"> <div id="myHead" style="width: 100%; height: 10%; margin: 0; padding: 0; display: flex; justify-content: space-around;"> <div id="dulunche" data-index="0" style="margin: 0; padding: 0; width: 33%; height: 100%; text-align: center; cursor: pointer;">独轮车 </div> <div id="loop" data-index="1" style="margin: 0; padding: 0; width: 33%; height: 100%; border-left: 1px solid #e1e1e1; text-align: center; cursor: pointer;"> 循环发送</div> <div id="random" data-index="2" style="margin: 0; padding: 0; width: 33%; height: 100%; border-left: 1px solid #e1e1e1; text-align: center; cursor: pointer;"> 随机发送</div> </div> <div id="myBody" style="width:100%; height: 90%; margin: 0; padding: 0;"> <div id="dulunchePanel" style="display: flex; flex-direction: column; justify-content: space-around; align-items: center; width: 100%; height: 100%; margin: 0; padding: 0;"> <input type="text" id="duluncheInput" placeholder="字数不能超过20个字" style="outline: medium; display: block; margin-bottom: 10px; width: 80%;" maxlength="20"> <div id="settime">发送间隔为<button id="sub">-</button><input type="text" id="time" style="text-align: center; width: 1.5rem;"><button id="add">+</button>秒</div> <button id="ruin" style="width:28%">开启拖拉机</button> </div> <div id="loopPanel" style="display: none; width: 100%; height: 100%; margin: 0; padding: 0;"> <textarea id="loopInput" cols="21" placeholder="循环模式用 | 分隔不同条弹幕" style="width: 45%; height: 90%; margin: 0; padding: 0; resize: none;"></textarea> <div style="margin: 0; padding: 0; display: flex; flex-direction: column; justify-content: space-around; align-items: center;"> <div id="settime">发送间隔为<button id="sub">-</button><input type="text" id="time" style="text-align: center; width: 1.5rem;"><button id="add">+</button>秒 </div> <button id="ruin" style="width:55%">开启拖拉机</button> </div> </div> <div id="randomPanel" style="display: none; width: 100%; height: 100%; margin: 0; padding: 0;"> <textarea id="randomInput" cols="21" placeholder="随机模式用 | 分隔不同条弹幕" style="width: 45%; height: 90%; margin: 0; padding: 0; resize: none;"></textarea> <div style="margin: 0; padding: 0; display: flex; flex-direction: column; justify-content: space-around; align-items: center;"> <div id="settime">发送间隔为<button id="sub">-</button><input type="text" id="time" style="text-align: center; width: 1.5rem;"><button id="add">+</button>秒</div> <button id="ruin" style="width:55%">开启拖拉机</button> </div> </div> </div> </div>';
            panel.style.display = 'none';
            point2.appendChild(panel);
            for (var i = 0; i < panel.querySelectorAll('#time').length; i++) {
                panel.querySelectorAll('#time')[i].value = GM_getValue('time', '6');
            }

            //为按钮绑定点击事件,点击打开或关闭面板
            btn.addEventListener('click', function () {
                if (!panelBtn) {
                    panel.style.display = 'flex';
                    panelBtn = 1;
                }
                else {
                    panel.style.display = 'none';
                    panelBtn = 0;
                }
            });

            //为控制面板切换绑定事件
            for (var i = 0; i < panel.querySelector('#myHead').children.length; i++) {
                panel.querySelector('#myHead').children[i].addEventListener('click', function () {
                    for (var j = 0; j < panel.querySelector('#myBody').children.length; j++) {
                        panel.querySelector('#myBody').children[j].style.display = 'none';
                    }
                    panel.querySelector('#myBody').children[this.getAttribute('data-index')].style.display = 'flex';
                });
            }

            //为加减时间按钮绑定事件
            for (var i = 0; i < panel.querySelectorAll('#sub').length; i++) {
                panel.querySelectorAll('#sub')[i].addEventListener('click', function () {
                    let timeClone = panel.querySelector('#time').value;
                    if (timeClone * 1 > 1) {
                        timeClone = --timeClone + '';
                        GM_setValue('time', timeClone);
                        for (var j = 0; j < panel.querySelectorAll('#sub').length; j++) {
                            panel.querySelectorAll('#time')[j].value = timeClone;
                        }
                    }
                });
            }
            for (var i = 0; i < panel.querySelectorAll('#add').length; i++) {
                panel.querySelectorAll('#add')[i].addEventListener('click', function () {
                    let timeClone = panel.querySelector('#time').value;
                    timeClone = timeClone * 1;
                    timeClone = ++timeClone + '';
                    GM_setValue('time', timeClone);
                    for (var j = 0; j < panel.querySelectorAll('#add').length; j++) {
                        panel.querySelectorAll('#time')[j].value = timeClone;
                    }
                });
            }

            //为间隔时间输入框绑定输入事件
            for (var i = 0; i < panel.querySelectorAll('#time').length; i++) {
                panel.querySelectorAll('#time')[i].addEventListener('input', function () {
                    this.value = this.value.replace(/[^\d]/g, '');
                    GM_setValue('time', this.value);
                    for (var j = 0; j < panel.querySelectorAll('#time').length; j++) {
                        panel.querySelectorAll('#time')[j].value = this.value;
                    }
                });
            }

            //拖拉机开关闭
            //为独轮车开关绑定事件
            panel.querySelector('#dulunchePanel').querySelector('#ruin').addEventListener('click', function () {
                //开启独轮车
                if (!tractorBtn) {
                    tractorValue = panel.querySelector('#duluncheInput').value;
                    time = panel.querySelector('#dulunchePanel').querySelector('#time').value;
                    if (tractorValue != '' && time != '') {
                        btn.getElementsByTagName('button')[0].getElementsByTagName('span')[0].innerText = '拖拉机启动';
                        btn.getElementsByTagName('button')[0].style.backgroundColor = '#d93f4b';
                        go();
                        tractor = setInterval(go, time * 1000);//弹幕发送间隔时间
                        panel.querySelector('#partition').style.display = 'flex';
                        btn1.style.display = 'block';
                        tractorBtn = 1;
                    }
                    else if (tractorValue == '' && time != '') {
                        alert('未设置弹幕');
                    }
                    else if (tractorValue != '' && time == '') {
                        alert('未设置弹幕发送间隔时间');
                    }
                    else {
                        alert('未设置弹幕及弹幕发送间隔时间');
                    }
                }
            });

            //为循环模式开关绑定事件
            panel.querySelector('#loopPanel').querySelector('#ruin').addEventListener('click', function () {
                if (!tractorBtn) {
                    mudTruckValue = panel.querySelector('#loopInput').value;
                    time = panel.querySelector('#loopPanel').querySelector('#time').value;
                    if (mudTruckValue != '' && time != '') {
                        var valueArray = mudTruckValue.split('|');
                        if (valueArray.length > 1) {
                            tractorValue = valueArray[index];
                            index++;
                            go();
                            tractor = setInterval(function () {
                                tractorValue = valueArray[index];
                                if (index < valueArray.length - 1) {
                                    index++;
                                }
                                else if (index == valueArray.length - 1) {
                                    index = 0;
                                }
                                go();
                            }, time * 1000);
                            btn.getElementsByTagName('button')[0].getElementsByTagName('span')[0].innerText = '拖拉机启动';
                            btn.getElementsByTagName('button')[0].style.backgroundColor = '#d93f4b';
                            panel.querySelector('#partition').style.display = 'flex';
                            btn1.style.display = 'block';
                            tractorBtn = 1;
                        }
                        else {
                            alert('请设置大于1条弹幕');
                        }
                    }
                    else if (mudTruckValue == '' && time != '') {
                        alert('未设置弹幕');
                    }
                    else if (mudTruckValue != '' && time == '') {
                        alert('未设置弹幕发送间隔时间');
                    }
                    else {
                        alert('未设置弹幕及弹幕发送间隔时间');
                    }
                }
            });

            //为随机模式开关绑定事件
            panel.querySelector('#randomPanel').querySelector('#ruin').addEventListener('click', function () {
                if (!tractorBtn) {
                    mudTruckValue = panel.querySelector('#randomInput').value;
                    time = panel.querySelector('#randomPanel').querySelector('#time').value;
                    if (mudTruckValue != '' && time != '') {
                        var randomArray = mudTruckValue.split('|');
                        if (randomArray.length > 1) {
                            tractorValue = randomArray[Math.round(Math.random() * (randomArray.length - 1))];
                            go();
                            tractor = setInterval(function () {
                                tractorValue = randomArray[Math.round(Math.random() * (randomArray.length - 1))];
                                go();
                            }, time * 1000);
                            btn.getElementsByTagName('button')[0].getElementsByTagName('span')[0].innerText = '拖拉机启动';
                            btn.getElementsByTagName('button')[0].style.backgroundColor = '#d93f4b';
                            panel.querySelector('#partition').style.display = 'flex';
                            btn1.style.display = 'block';
                            tractorBtn = 1;
                        }
                        else {
                            alert('请设置大于1条弹幕');
                        }
                    }
                    else if (mudTruckValue == '' && time != '') {
                        alert('未设置弹幕');
                    }
                    else if (mudTruckValue != '' && time == '') {
                        alert('未设置弹幕发送间隔时间');
                    }
                    else {
                        alert('未设置弹幕及弹幕发送间隔时间');
                    }
                }
            });

            //为关闭拖拉机按钮绑定事件
            btn1.querySelector('#closeBtn').addEventListener('click', function () {
                if (tractorBtn) {
                    tractorBtn = 0;
                    btn.getElementsByTagName('button')[0].getElementsByTagName('span')[0].innerText = '拖拉机面板';
                    btn.getElementsByTagName('button')[0].style.backgroundColor = '#23ade5';
                    panel.querySelector('#partition').style.display = 'none';
                    btn1.style.display = 'none';
                    mudTruckValue = '';
                    index = 0;
                    clearInterval(tractor);
                }
            });

            //发送弹幕函数
            function go() {
                let text = document.getElementsByClassName('chat-input')[1];
                let evt = document.createEvent('HTMLEvents');
                evt.initEvent('input', true, true);
                text.value = text._value = tractorValue;
                text.dispatchEvent(evt);
                document.querySelector('.live-skin-highlight-button-bg').click();
            }
            clearInterval(check);
        }
    }, 100);
})();