Greasy Fork

Greasy Fork is available in English.

复读机自动弹幕发射器

适配斗鱼直播平台的自动弹幕发射器 随机复制复读机 Github:https://github.com/zhenshiluosuo/Storyteller-AutoBarrageForDouyuTV

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @icon          https://www.douyu.com/favicon.ico
// @name          复读机自动弹幕发射器
// @namespace     https://github.com/zhenshiluosuo/Storyteller-AutoBarrageForDouyuTV
// @namespace     http://greasyfork.icu/zh-CN/scripts/396928
// @author        闪光魔法师
// @description   适配斗鱼直播平台的自动弹幕发射器 随机复制复读机 Github:https://github.com/zhenshiluosuo/Storyteller-AutoBarrageForDouyuTV
// @match         *://www.douyu.com/*
// @match         *://www.youtube.com/*
// @version       1.0.0
// @grant         none
// ==/UserScript==
(function () {
    'use strict';

    let tip = false;
    let div1 = document.createElement('div');//默认悬浮窗
    let div2 = document.createElement('div');//控制台
    let css1 = 'background: #FFB5C5;color:#ffffff;overflow: hidden;z-index: 998;position: fixed;padding:5px;text-align:center;width: 85px;height: 22px;border-radius: 5px;right: 10px;top: 72%;'
    let css2 = 'background: #ffffff;overflow: hidden;z-index: 999;position: fixed;padding:5px;text-align:center;width: 125px;height: 110px;box-sizing: content-box;border: 1px solid #ff921a;border-radius: 5px;right: 10px;top: 72%;display: none;';
    let cycle_time;//弹幕周期,单位毫秒 建议设定至6000毫秒以上 过低有系统屏蔽风险
    let _cycle_time = 800;//弹幕div定时器
    let sentence = "";//复制的弹幕
    let interval;//发射定时器
    let danmu_interval;//等待弹幕div加载定时器
    let _ready = false;//弹幕div加载标记
    let div_manmu;//网页弹幕div
    let div_wenzi;//网页聊天室div
    let _mode = false;//套娃模式标记
    let __mode = false;//复读白字标记
    let ___mode = false;//重复复读标记
    let website;
    let ytb_iframe;//ytb直播右侧iframe

    init();//初始化

//核心功能函数
    function init() {
        let url = window.location.host;
        if(url === 'www.douyu.com') {
            website = 0;
        } else if(url === 'www.youtube.com') {
            if (window.top !== window.self) {
                throw new Error('Frame error!');
            }
            website = 3;
        }
        div1.id = 'DuLunChe2';
        div1.id = 'DuLunChe3';
        div1.style.cssText = css1;
        div2.style.cssText = css2;
        div1.innerHTML = '复读机控制台';
        div2.innerHTML = '<input type="text" style="width: 100px" placeholder="间隔时间(ms)" id="DuLunCheTime1"/><div style="font-size: 10px;margin-bottom: 2px;"><button id="DuLunCheBtn1" style="display: inline-block; background: #f70; color: #FFFFFF; width:50px; height: 25px; margin: 1px;">出动</button><button id="DuLunCheYinCang1" style="display: inline-block; background: #f70; color: #FFFFFF; width:50px; height: 25px; margin: 1px;">隐藏</div></button><div style="color: black;float: left;width: 100%;font-size: 75%;"><span>套娃模式(仅斗鱼):</span><input type="checkbox" id="dlc_btn99" value="0" style=""/></div><div style="color: black;float: left;width: 100%;font-size: 75%;"><span>不复读白字(斗鱼):</span><input type="checkbox" id="dlc_btn98" value="0" style=""/></div><div style="color: black;float: left;width: 100%;font-size: 75%;"><span>不重复复读(斗鱼):</span><input type="checkbox" id="dlc_btn97" value="0" style=""/></div>';
        div1.onclick = () => {
            div2.style.setProperty('display','block');
            if(!tip){
                tip = true;
                alert('欢迎使用偶尔更新的复读机自动弹幕发射装置,当前版本V1.0.0,对本插件的意见和问题可以到Github反馈哦,项目地址:https://github.com/zhenshiluosuo/Storyteller-AutoBarrageForDouyuTV/ ');
            }
        };
        document.body.appendChild(div1);
        document.body.appendChild(div2);
        document.getElementById('DuLunCheYinCang1').onclick = () => {
            div2.style.setProperty('display','none');
        };
        document.getElementById('DuLunCheBtn1').onclick = () => {
            if(document.getElementById('DuLunCheBtn1').innerText === '出动') {
                document.getElementById('DuLunCheBtn1').innerText = '中止';
                if(!website) {
                    dy_run();
                } else {
                    ytb_run();
                }
            }
            else finish();
        };
        document.getElementById('dlc_btn99').onclick = () => {
            if(document.getElementById('dlc_btn99').checked){
                _mode = true;
            }else{
                _mode = false;
            }
        };
        if(!website) {
            document.getElementById('dlc_btn98').onclick = () => {
                if(document.getElementById('dlc_btn98').checked){
                    __mode = true;
                }else{
                    __mode = false;
                }
            };
            document.getElementById('dlc_btn97').onclick = () => {
                if(document.getElementById('dlc_btn97').checked){
                    ___mode = true;
                }else{
                    ___mode = false;
                }
            };
            danmu_interval = setInterval(() => {
                if(document.getElementsByClassName('danmu-6e95c1')[0].childNodes.length){
                    div_manmu = document.getElementsByClassName('danmu-6e95c1')[0];
                    div_wenzi = document.getElementById('js-barrage-list');
                    div_manmu.addEventListener('DOMNodeInserted', function () {
                        let _sentence = sentence;
                        if(_mode){
                            if(__mode && 'Barrage-content' === div_wenzi.childNodes[div_wenzi.childNodes.length - 1].getElementsByClassName('Barrage-content')[0].className){
                                return;
                            }
                            sentence = '@' + div_wenzi.childNodes[div_wenzi.childNodes.length - 1].getElementsByClassName('Barrage-nickName')[0].innerText + div_wenzi.childNodes[div_wenzi.childNodes.length - 1].getElementsByClassName('Barrage-content')[0].innerText;
                            _ready = true;

                        }else{
                            let len = div_manmu.childNodes.length;
                            if(len){
                                let _temp = div_manmu.childNodes[Math.floor((Math.random() * len))];
                                let _color = _temp.style.color;
                                if(!__mode || (__mode && _color.length)){
                                    _ready = true;
                                    sentence = _temp.innerText;
                                }
                            }
                        }
                        if(___mode && _ready){
                            if(_sentence === sentence){
                                _ready = false;
                            }
                        }
                    },false);
                    clearInterval(danmu_interval);
                }
            }, _cycle_time);
            let ad_i1 = setInterval(() => {
                if(document.getElementsByClassName('CommonShareDraw')[0].childNodes.length){
                    document.getElementsByClassName('CommonShareDraw')[0].style.display = 'none'
                    clearInterval(ad_i1);
                }
            },1000);
        } else {

        }
//
    }
//发射弹幕
    function dy_run() {
        let btn = document.getElementsByClassName('ChatSend-button')[0];
        let txt = document.getElementsByClassName('ChatSend-txt')[0];
        cycle_time = parseInt(document.getElementById('DuLunCheTime1').value);
        if(cycle_time <= 2999 || !cycle_time) {
            alert('请珍惜账号 加大发言间隔!');
            finish();
            document.getElementById('DuLunCheTime1').value = '9999';
            return;
        }
        interval = setInterval(() => {
            if(txt.value === '' && _ready && btn.innerHTML === '发送'){//输入框中有内容时等待用户发送完成后再继续
                txt.value = sentence;
                btn.click();
                _ready = false;
            }
        }, cycle_time);
    }
    function ytb_run() {
        ytb_iframe = document.getElementById('chatframe').contentWindow;
        let btn = ytb_iframe.document.querySelector('#send-button button');
        let txt = ytb_iframe.document.querySelector('#input.yt-live-chat-text-input-field-renderer');
        cycle_time = parseInt(document.getElementById('DuLunCheTime1').value);
        if(!cycle_time) {
            alert('请设定一个时间间隔!');
            finish();
            document.getElementById('DuLunCheTime1').value = '9999';
            return;
        }
        interval = setInterval(() => {
            let list = ytb_iframe.document.getElementsByClassName('style-scope yt-live-chat-item-list-renderer');
            txt.textContent = list[Math.floor(Math.random() * (list.length - 9))].children[1].children[2].innerText;
            txt.dispatchEvent(new InputEvent('input'));
            btn.click();
        }, cycle_time);
    }
//结束发射
    function finish() {
        document.getElementById('DuLunCheBtn1').innerText = '出动';
        clearInterval(interval);
    }
})();