// ==UserScript== // @icon https://www.douyu.com/favicon.ico // @name 复读机自动弹幕发射器 // @namespace https://github.com/zhenshiluosuo/Storyteller-AutoBarrageForDouyuTV // @namespace https://greasyfork.org/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 // @downloadURL https://update.greasyfork.icu/scripts/396928/%E5%A4%8D%E8%AF%BB%E6%9C%BA%E8%87%AA%E5%8A%A8%E5%BC%B9%E5%B9%95%E5%8F%91%E5%B0%84%E5%99%A8.user.js // @updateURL https://update.greasyfork.icu/scripts/396928/%E5%A4%8D%E8%AF%BB%E6%9C%BA%E8%87%AA%E5%8A%A8%E5%BC%B9%E5%B9%95%E5%8F%91%E5%B0%84%E5%99%A8.meta.js // ==/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 = '
套娃模式(仅斗鱼):
不复读白字(斗鱼):
不重复复读(斗鱼):
'; 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); } })();