// ==UserScript== // @icon https://www.douyu.com/favicon.ico // @name 独轮车-说书人自动弹幕发射器 // @namespace https://github.com/zhenshiluosuo/Storyteller-AutoBarrageForDouyuTV // @author 闪光魔法师 // @description 适配斗鱼/虎牙直播平台的自动弹幕发射器 抽象独轮车 说书人 Github:https://github.com/zhenshiluosuo/Storyteller-AutoBarrageForDouyuTV // @match *://www.douyu.com/* // @match *://www.huya.com/* // @version 0.1.11 // @grant none // @namespace https://greasyfork.org/scripts/396285 // @downloadURL none // ==/UserScript== (function () { 'use strict'; let tip = false; let div1 = document.createElement('div');//默认悬浮窗 let div2 = document.createElement('div');//控制台 let div3 = document.createElement('div');//计数器 let div5 = document.createElement('div');//设置 let css1 = 'background: #1A59B7;color:#ffffff;overflow: hidden;z-index: 997;position: fixed;padding:5px;text-align:center;width: 85px;height: 22px;border-radius: 5px;right: 10px;top: 30%;' let css2 = 'background: #FFFFFF;color:#ffffff;overflow: hidden;z-index: 998;position: fixed;padding:5px;text-align:center;width: 155px;height: 370px;box-sizing: content-box;border: 1px solid #ff921a;border-radius: 5px;right: 10px;top: 30%;display: none;'; let css3 = 'background: #FFFFFF;color:#000000;overflow: hidden;z-index: 999;position: fixed;padding:5px;text-align:center;width: 155px;height: 335px;box-sizing: content-box;border: 1px solid #ff921a;border-radius: 5px;right: 10px;top: 33%;display: none;'; let div2_innerHTML1 = '
屏蔽白字黑奴:
屏蔽绿字色友:
屏蔽粉字男同:
临时应急弹幕:
'; let div3_innerHTML1 = '
计数方式1
 / 
   
计数方式2
 单位:
   
'; let max_danmu_long = 43;//弹幕字数限制 let min_danmu_long = 18;//最小弹幕长度 let error_danmu_long = 30;//防止无法断句弹幕长度 let cycle_time;//弹幕周期,单位毫秒 建议设定至6000毫秒以上 过低有系统屏蔽风险 let story;//textarea内容 let story_arr = [];//story分段 let time_arr = [];//时间记录 let index;//小说分段 let interval;//小说定时器 let danmu_interval;//等待弹幕div加载定时器 let color_box = [];//禁止的弹幕颜色 let div_manmu;//网页弹幕div let select_flag = false;//功能标记 let danmu_helperX = false;//应急弹幕标记 let danmu_count = 0; let danmu_parent = null; let website;//当前站点 0:斗鱼 1:虎牙 ... let btn; //发送按钮 let txt; //输入框 init();//初始化 //核心功能函数 function init() { let url = window.location.host; if(url === 'www.douyu.com') { website = 0; btn = document.getElementsByClassName('ChatSend-button')[0]; txt = document.getElementsByClassName('ChatSend-txt')[0]; } else if(url === 'www.huya.com') { max_danmu_long = 25; min_danmu_long = 12; error_danmu_long = 20; website = 1; btn = document.getElementById('msg_send_bt'); txt = document.getElementById('pub_msg_input'); btn.setAttribute('class', 'btn-sendMsg hiido_stat enable'); } div1.id = 'DuLunChe1'; div2.id = 'DuLunChe2'; div1.style.cssText = css1; div2.style.cssText = css2; div3.style.cssText = css3; div1.innerHTML = '独轮车控制台'; div2.innerHTML = div2_innerHTML1; div3.innerHTML = div3_innerHTML1; div1.onclick = () => { div2.style.setProperty('display','block'); if(!tip){ tip = true; alert('欢迎使用说书人自动弹幕发射装置V3.0,本插件由斗鱼用户重载操作符(已永封)和祖冲之丶丶基于祖冲之丶丶版制作,项目地址:https://github.com/zhenshiluosuo/Storyteller-AutoBarrageForDouyuTV/ 多句转轮模式每句之间请用回车分隔,斗鱼字数限制43,为了自己的账号和他人观看体验,建议发言间隔调至8000以上,喜欢的好兄弟打个星星吧~求求了!!!注:编程独轮车教程:奇数行为下一句发送的间隔毫秒时间,偶数行为发送内容,比如第一行8000,第二行啦啦啦,第三行10000,第四行噜噜噜,则先发送啦啦啦,8秒后发送噜噜噜,10秒后再发送啦啦啦,8秒后发送噜噜噜,依此类推'); } }; document.body.appendChild(div1); document.body.appendChild(div2); document.body.appendChild(div3); document.getElementById('DuLunCheYincang').onclick = () => { div2.style.setProperty('display','none'); }; document.getElementById('DuLunCheBtn').onclick = () => { if(document.getElementById('DuLunCheBtn').innerText === '出动') run(); else finish(); }; document.getElementById('dlc_btn1').onclick = () => { if(document.getElementById('dlc_btn1').checked){ color_box.push(''); }else{ for (let i = 0; i < color_box.length; i++){ if(color_box[i] === '') {color_box.splice(i, 1); break;} } } }; document.getElementById('dlc_btn2').onclick = () => { if(document.getElementById('dlc_btn2').checked){ color_box.push('rgb(102, 255, 0)'); }else{ for (let i = 0; i < color_box.length; i++){ if(color_box[i] === 'rgb(102, 255, 0)') {color_box.splice(i, 1); break;} } } }; document.getElementById('dlc_btn3').onclick = () => { if(document.getElementById('dlc_btn3').checked){ color_box.push('rgb(246, 68, 127)'); }else{ for (let i = 0; i < color_box.length; i++){ if(color_box[i] === 'rgb(246, 68, 127)') {color_box.splice(i, 1); break;} } } }; document.getElementById('dlc_btn4').onclick = () => { if(document.getElementById('dlc_btn4').checked){ danmu_helperX = true; danmu_parent.style.setProperty('display','block'); }else{ danmu_helperX = false; danmu_parent.style.setProperty('display','none'); } }; document.getElementById('dlcSetting1').onmouseover = () => { document.getElementById('dlcSetting1').style.backgroundPositionY="-28px"; }; document.getElementById('dlcSetting1').onmouseout = () => { document.getElementById('dlcSetting1').style.backgroundPositionY="0px"; }; document.getElementById('DuLunCheSelect').onchange = () => { if(document.getElementById('DuLunCheSelect').value === '4'){ select_flag = true; div3.style.setProperty('display','block'); }else if(select_flag){ select_flag = false; div3.style.setProperty('display','none'); } }; document.getElementById('dlcCountBtn1').onclick = () => { document.getElementById('dlcCount1').value = "" + (parseInt(document.getElementById('dlcCount1').value) + 1); document.getElementById('dlcCount2').value = "" + (parseInt(document.getElementById('dlcCount2').value) + 1); }; document.getElementById('dlcCountBtn2').onclick = () => { document.getElementById('dlcCount2').value = "" + (parseInt(document.getElementById('dlcCount2').value) + 1); }; document.getElementById('dlcCountBtn5').onclick = () => { document.getElementById('dlcCount3').value = "" + (parseInt(document.getElementById('dlcCount3').value) + 1); }; document.getElementById('dlcCountBtn3').onclick = () => { if(document.getElementsByClassName('ChatSend-txt')[0].value === ''){//输入框中有内容时等待用户发送完成后再继续 document.getElementsByClassName('ChatSend-txt')[0].value = document.getElementById('DuLunCheCountText').value + " " + document.getElementById('dlcCount1').value + "/" + document.getElementById('dlcCount2').value; if (document.getElementsByClassName('ChatSend-button')[0].innerHTML === '发送') { document.getElementsByClassName('ChatSend-button')[0].click(); } } }; document.getElementById('dlcCountBtn6').onclick = () => { if(document.getElementsByClassName('ChatSend-txt')[0].value === ''){//输入框中有内容时等待用户发送完成后再继续 document.getElementsByClassName('ChatSend-txt')[0].value = document.getElementById('DuLunCheCountText').value + " " + document.getElementById('dlcCount3').value + document.getElementById('dlcCountUnit').value; if (document.getElementsByClassName('ChatSend-button')[0].innerHTML === '发送') { document.getElementsByClassName('ChatSend-button')[0].click(); } } }; document.getElementById('dlcCountBtn0').onclick = () => { document.getElementById('DuLunCheCountText').value = ""; document.getElementById('dlcCount1').value = "0"; document.getElementById('dlcCount2').value = "0"; document.getElementById('dlcCount3').value = "0"; document.getElementById('dlcCountUnit').value = "次"; }; danmu_interval = setInterval(() => { if(document.getElementsByClassName('danmu-6e95c1')[0].childNodes.length){ div_manmu = document.getElementsByClassName('danmu-6e95c1')[0]; div_manmu.addEventListener('DOMNodeInserted', function () { let len = div_manmu.childNodes.length; for (let i = 0; i < len; i++){ if(div_manmu.childNodes[i].style.display === 'none') continue; for (let j = 0; j < color_box.length; j++){ if(div_manmu.childNodes[i].style.color === color_box[j]){ div_manmu.childNodes[i].style.display = 'none'; break; } } } },false); clearInterval(danmu_interval); } }, 1000); if(!website) { //关闭广告 let ad_i1 = setInterval(() => { if(document.getElementsByClassName('liveosTag_1Z4iZj')[0].childNodes.length){ document.getElementsByClassName('liveosTag_1Z4iZj')[0].style.display = 'none';//关手游广告 clearInterval(ad_i1); } },1000); let ad_i2= setInterval(() => { if(document.getElementsByClassName('Bottom-ad')[0].childNodes.length){ document.getElementsByClassName('Bottom-ad')[0].style.display = 'none';//关底部广告栏 clearInterval(ad_i2); } },1000); let ad_i3= setInterval(() => { if(document.getElementsByClassName('Title-ad')[0].childElementCount){ document.getElementsByClassName('Title-ad')[0].innerHTML = '';//关左上角广告栏 clearInterval(ad_i3); } },1000); let ad_i5= setInterval(() => { if(document.getElementsByClassName('RoomText-wrap')[0].childElementCount){ document.getElementsByClassName('RoomText-wrap')[0].style.display = 'none';//关右下角广告栏 clearInterval(ad_i5); } },1000); //应急弹幕 let danmu_helper_i = setInterval(() => { if(document.getElementsByClassName('Barrage-list')[0].childElementCount){ let danmu_css = ` `; let ele = document.createElement('div'); ele.innerHTML = danmu_css; document.getElementsByTagName('head')[0].appendChild(ele.firstElementChild);//注入css danmu_parent = document.createElement('div'); danmu_parent.id = 'div_20200604'; danmu_parent.style.width = '100%'; danmu_parent.style.height='92%'; danmu_parent.style.position='absolute'; danmu_parent.style.display = 'none'; document.getElementsByClassName('layout-Player-videoMain')[0].appendChild(danmu_parent); clearInterval(danmu_helper_i); document.getElementsByClassName('Barrage-list')[0].addEventListener('DOMNodeInserted', () => { if(danmu_helperX){ let danmu_text = document.getElementsByClassName('Barrage-list')[0].lastChild.getElementsByClassName('Barrage-content')[0].innerText; let danmu_div = document.createElement('div'); danmu_div.style.width = '' + danmu_text.length * 25 + 'px'; danmu_div.innerHTML = danmu_text; if(danmu_parent.childElementCount){ danmu_div.style.top = '' + (++danmu_count % 12 * 30) + 'px'; }else{ danmu_count = 0; } danmu_div.classList.add("danmu1"); danmu_parent.appendChild(danmu_div); setTimeout(() => { danmu_parent.removeChild(danmu_div); },9000); } }) } },1000); } else { let ad_i1 = setInterval(() => { if(document.getElementById('J_roomGgTop').childNodes.length){ document.getElementById('J_roomGgTop').style.display = 'none';//上方广告 clearInterval(ad_i1); } },1000); let ad_i2= setInterval(() => { if(document.getElementsByClassName('room-business-game')[0].childNodes.length){ document.getElementsByClassName('room-business-game')[0].style.display = 'none';//关底部广告栏 clearInterval(ad_i2); } },1000); } } //发射弹幕 function run() { let _value = document.getElementById('DuLunCheSelect').value; document.getElementById('DuLunCheBtn').innerText = '中止'; story = document.getElementById('DuLunCheText').value; cycle_time = parseInt(document.getElementById('DuLunCheTime').value); if(_value === '3'){ }else if(!story.length || !cycle_time){ alert('请勿空置运行!'); finish(); return; }else if(cycle_time <= 2999) { alert('请珍惜账号 加大发言间隔!'); finish(); document.getElementById('DuLunCheTime').value = '9999'; return; } if(_value === '0') { if (story.length > max_danmu_long){ story = story.slice(0, max_danmu_long); } interval = setInterval(() => { if(txt.value === ''){//输入框中有内容时等待用户发送完成后再继续 txt.value = story; if (btn.innerHTML === '发送') { if(website === 1) btn.setAttribute('class', 'btn-sendMsg hiido_stat enable'); btn.click(); } } }, cycle_time); } else if(_value === '3'){ let temp_arr = story.split('\n'); if(temp_arr.length % 2){ alert('程序存在错误!请检查是否有多余的回车或内容与时间是否对应'); finish(); }else{ for(let i = 0; i < temp_arr.length; i++){ if(i % 2){ if(temp_arr[i].length > 43){ temp_arr[i] = temp_arr[i].substr(0,43); } story_arr.push(temp_arr[i]); }else{ let time_temp = parseInt(temp_arr[i]); if(!time_temp || time_temp < 3000){ alert('程序存在错误!请检查时间格式或等待时间是否小于3000毫秒或者是否过大'); finish(); break; } time_arr.push(time_temp); } } index = 0; function _f(){ if(index === story_arr.length){ index = 0; } if(txt.value === ''){//输入框中有内容时等待用户发送完成后再继续 txt.value = story_arr[index]; if (btn.innerHTML === '发送') { if(website === 1) btn.setAttribute('class', 'btn-sendMsg hiido_stat enable'); btn.click(); clearInterval(interval); cycle_time = time_arr[index++]; interval = setInterval(_f, cycle_time); } } } interval = setInterval(_f, 100); } } else { if(_value === '1') get_better_sentence(); else multiple(); let len = story_arr.length; index = 0; interval = setInterval(() => { if(txt.value === ''){//输入框中有内容时等待用户发送完成后再继续 if(index === len){//小说循环 index = 0; } txt.value = story_arr[index++]; if (btn.innerHTML === '发送') { if(website === 1) btn.setAttribute('class', 'btn-sendMsg hiido_stat enable'); btn.click(); } } }, cycle_time); } } //结束发射 function finish() { document.getElementById('DuLunCheBtn').innerText = '出动'; clearInterval(interval); story_arr = []; time_arr = []; } //小说分段 function get_better_sentence() { let len = story.length; let flag = 0;//引号标记 let str = ''; for (let i = 0; i < len; i++) { if((story.charAt(i) === '。' || story.charAt(i) === '!' || story.charAt(i) === '?' || story.charAt(i) === '…' || story.charAt(i) === ' ') && str.length >= min_danmu_long && !flag) { str += story.charAt(i); story_arr.push(str); str = ''; }else if(story.charAt(i) === '“' || story.charAt(i) === '『' || story.charAt(i) === '「') { str += story.charAt(i); flag = 1; }else if(story.charAt(i) === '”' || story.charAt(i) === '』' || story.charAt(i) === '」') { str += story.charAt(i); flag = 0; }else if((story.charAt(i) === ',' || story.charAt(i) === ';' || story.charAt(i) === ':' || story.charAt(i) === '。' || story.charAt(i) === '!' || story.charAt(i) === '?' || story.charAt(i) === '…') && str.length >= error_danmu_long) { str += story.charAt(i); story_arr.push(str); str = ''; }else if(i === len - 1 || str.length >= max_danmu_long) { str += story.charAt(i); story_arr.push(str); str = ''; }else if(story.charAt(i) === ' ' && i < len - 1 && story.charAt(i + 1) === ' ') { continue; }else { str += story.charAt(i); } } } //转轮填充 function multiple() { let len = story.length; let str = ''; let flag = true; for (let i = 0; i < len; i++){ if((story.charAt(i) === '\n') && str.length){ story_arr.push(str); str = ''; }else if((!website && str.length >= 43) || (website === 1 && str.length >= 30)){ continue; }else{ str += story.charAt(i); if(i === len - 1){ story_arr.push(str); } } } } })();