// ==UserScript== // @name 斗鱼自动发弹幕 // @namespace http://tampermonkey.net/ // @version 0.4.0 // @icon http://www.douyutv.com/favicon.ico // @description 自动发弹幕,参与弹幕抽奖 // @author H2P // @require https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js // @match *://*.douyu.com/0* // @match *://*.douyu.com/1* // @match *://*.douyu.com/2* // @match *://*.douyu.com/3* // @match *://*.douyu.com/4* // @match *://*.douyu.com/5* // @match *://*.douyu.com/6* // @match *://*.douyu.com/7* // @match *://*.douyu.com/8* // @match *://*.douyu.com/9* // @match *://*.douyu.com/topic/* // @note 2019.3.18-V0.2.0 循环弹幕可以设置多条,随机发送;新增弹幕倒计时;界面美化一下?抽奖弹幕新增一种查询类型 // @note 2019.3.18-V0.3.0 界面修改;界面可隐藏;可以设置是否发送默认弹幕 // @note 2019.3.18-V0.3.1 小 BUG 修复 // @note 2019.3.19-V0.4.0 用 JQuery 改写,还没改完;更新了弹幕抽奖元素获取(因为斗鱼改了);增加设置抽奖弹幕次数;发送弹幕时可以修改循环弹幕 // @grant none // @downloadURL none // ==/UserScript== (function() { 'use strict'; // Your code here... var interval_autoSendBarrage = undefined; // 自动发弹幕 var interval_countDownOfBarrage = undefined; // 弹幕倒计时 var interval = 0; // 弹幕发送间隔时间 var interval_default = 5; // 弹幕发送默认间隔时间 var luckDrawCountDown = 0; // 弹幕抽奖活动倒计时 var barrageCountDown = 0; // 弹幕倒计时 var barrageLuckDraw = ''; // 抽奖弹幕内容 var count_luckDraw = 0; // 抽奖弹幕实际发送次数 var count_luckDrawTotal = 0; // 抽奖弹幕总共发送次数 var count_luckDrawDefault = 5; // 抽奖弹幕默认发送次数 var color_input_input = '#f5f5f5'; var color_input_disabled = '#DCDCDC'; var fontSize_input = '12px'; var input_checkBok_left_style = { 'position' : 'absolute', 'top' : '0', 'bottom' : '0', 'left' : '0', 'margin' : 'auto', }; var initView = function(){ var div_sendBarrage = document.createElement('div'); $(div_sendBarrage).attr('id', 'div-sendBarrage'); $(div_sendBarrage).css({ 'position' : 'absolute', 'bottom' : '1px', 'min-width' : '315px', 'max-width' : '315px', 'padding' : '10px', 'border' : '1px solid #DCDCDC', 'borderRadius' : '2px', 'margin' : '0 0 0 -1px', 'boxShadow' : '#A9A9A9 5px 0 10px 0', 'fontSize' : '14px', 'backgroundColor': color_input_input, 'display' : 'none', 'z-index' : '999', }); // 发送弹幕的速度 =============================================================== var div_first = document.createElement('div'); $(div_first).css({ 'position' : 'relative', 'width' : '100%', 'height' : '24px', 'verticalAlign' : 'center', }); var div_speed = document.createElement('div'); $(div_speed).css({ 'position' : 'absolute', 'width' : '50%', 'height' : '24px', }); var label_speed = document.createElement('label'); label_speed.innerHTML = '间隔:'; $(div_speed).append(label_speed); var input_speed = document.createElement('input'); $(input_speed).attr('id', 'input-sendBarrage-speed'); $(input_speed).css({ 'width' : '65px', 'height' : '22px', 'padding' : '0 3px', 'border' : '1px solid #708090', 'borderRadius' : '5px', 'margin' : '0 5px 0 0', 'fontSize' : fontSize_input, 'background' : color_input_input }); $(input_speed).attr('placeholder', '默认 5'); input_speed.onblur = input_speed.onkeyup = function(){ var value = this.value; value = value.replace(/[^\d]/g,''); while( value.length > 0 && value[0] == '0' ){ value = value.substr(1, value.length); } if( value.length > 3 ){ value = value.substr(0, 3); } this.value = value; } $(div_speed).append(input_speed); var label_unit = document.createElement('label'); $(label_unit).css({ 'height' : '22px', }); $(label_unit).text('秒'); $(div_speed).append(label_unit); $(div_first).append(div_speed); // 发送弹幕倒计时 var div_countDown = document.createElement('div'); $(div_countDown).css({ 'position' : 'absolute', 'left' : '50%', 'height' : '24px', 'color' : '#228B22', }); var label_countDown = document.createElement('label'); $(label_countDown).css({ 'min-width' : '106px', 'max-width' : '106px', 'margin' : '0', }); $(label_countDown).text('弹幕倒计:'); $(div_countDown).append(label_countDown); var input_numOfCountDown = document.createElement('input'); $(input_numOfCountDown).attr('id', 'input-countDown'); $(input_numOfCountDown).css({ 'width' : '77px', 'height' : '22px', 'padding' : '0 3px', 'border' : '1px solid #708090', 'borderRadius' : '5px', 'fontSize' : fontSize_input, 'background' : color_input_disabled, }); $(input_numOfCountDown).attr('disabled', true); $(div_countDown).append(input_numOfCountDown); $(div_first).append(div_countDown); // 是否发送默认弹幕 =============================================================== var div_defaultBarrage = document.createElement('div'); $(div_defaultBarrage).css({ 'position' : 'relative', 'margin' : '0', }); var input_defaultBarrage = $(''); $(input_defaultBarrage).attr('id', 'input-isDefaultBarrage'); $(input_defaultBarrage).css(input_checkBok_left_style); $(div_defaultBarrage).append(input_defaultBarrage); var label_defaultBarrage = document.createElement('label'); $(label_defaultBarrage).css({ 'margin' : '0 0 0 20px', }); label_defaultBarrage.innerHTML = '发送默认弹幕'; $(div_defaultBarrage).append(label_defaultBarrage); // 是否发送循环弹幕 =============================================================== var div_barrage = document.createElement('div'); $(div_barrage).css({ 'position' : 'relative', 'margin' : '0', }); var input_isLoop = $(''); $(input_isLoop).attr('id', 'input-isLoop'); $(input_isLoop).css(input_checkBok_left_style); $(div_barrage).append(input_isLoop); var input_barrage = document.createElement('textarea'); $(input_barrage).attr('id', 'input-sendBarrage-content'); $(input_barrage).css({ 'min-width' : '286px', 'max-width' : '286px', 'min-height' : '90px', 'max-height' : '90px', 'padding' : '3px', 'border' : '1px solid #708090', 'borderRadius' : '5px', 'margin' : '0 0 0 20px', 'fontSize' : fontSize_input, 'background' : color_input_input, }); input_barrage.placeholder = '循环弹幕'; $(div_barrage).append(input_barrage); // 是否参加弹幕抽奖 =============================================================== var div_luckDraw = document.createElement('div'); $(div_luckDraw).css({ 'position' : 'relative', 'width' : '100%', 'height' : '24px', 'verticalAlign' : 'center', }); var div_isLuckDraw = document.createElement('div'); $(div_isLuckDraw).css({ 'position' : 'absolute', 'width' : '50%', 'height' : '24px', }); var input_luckDraw = $(''); $(input_luckDraw).attr('id', 'input-isLuckDraw'); $(input_luckDraw).css(input_checkBok_left_style); $(div_isLuckDraw).append(input_luckDraw); var label_luckDraw = document.createElement('label'); $(label_luckDraw).css({ 'margin' : '0 0 0 20px', }); label_luckDraw.innerHTML = '参与抽奖弹幕'; $(div_isLuckDraw).append(label_luckDraw); var input_luckDrawHide = document.createElement('input'); $(input_luckDrawHide).css({ 'width' : '1px', 'height' : '22px', 'padding' : '0 3px', 'border' : '1px solid #708090', 'borderRadius' : '5px', 'margin' : '0 5px 0 0', 'fontSize' : fontSize_input, 'visibility' : 'hidden', }); $(div_isLuckDraw).append(input_luckDrawHide); $(div_luckDraw).append(div_isLuckDraw); // 抽奖弹幕发送次数 var div_luckDrawCount = document.createElement('div'); $(div_luckDrawCount).css({ 'position' : 'absolute', 'left' : '50%', 'height' : '24px', 'color' : '#228B22', }); var label_luckDrawCount = document.createElement('label'); $(label_luckDrawCount).css({ 'min-width' : '106px', 'max-width' : '106px', 'margin' : '0', }); $(label_luckDrawCount).text('抽奖发送:'); $(div_luckDrawCount).append(label_luckDrawCount); var input_luckDrawCount = document.createElement('input'); $(input_luckDrawCount).attr('id', 'input-luckDrawCount'); $(input_luckDrawCount).css({ 'width' : '57px', 'height' : '22px', 'padding' : '0 3px', 'border' : '1px solid #708090', 'borderRadius' : '5px', 'margin' : '0 5px 0 0', 'fontSize' : fontSize_input, 'background' : color_input_input, }); $(input_luckDrawCount).attr('placeholder', '默认 5'); input_luckDrawCount.onblur = input_luckDrawCount.onkeyup = function(){ var value = this.value; value = value.replace(/[^\d]/g,''); while( value.length > 0 && value[0] == '0' ){ value = value.substr(1, value.length); } if( value.length > 2 ){ value = value.substr(0, 2); } this.value = value; } $(div_luckDrawCount).append(input_luckDrawCount); var label_luckDrawUnit = document.createElement('label'); $(label_luckDrawUnit).text('次'); $(div_luckDrawCount).append(label_luckDrawUnit); $(div_luckDraw).append(div_luckDrawCount); // 弹幕发送按钮 =============================================================== var div_sendBtn = document.createElement('div'); $(div_sendBtn).css({ 'position' : 'relative', 'margin' : '0', }); var btn_send = document.createElement('button'); $(btn_send).attr('id', 'btn-send'); btn_send.innerHTML = '发送'; $(btn_send).css({ 'width' : '293px', 'height' : '100%', 'padding' : '4px 0', 'border' : 'none', 'borderRadius' : '5px', 'margin' : '0 0 0 20px', 'fontSize' : fontSize_input, 'background' : '#00ddbb', 'cursor' : 'pointer', }); btn_send.onclick = function(){ clearInterval_barrageCountDown(); if( interval_autoSendBarrage == undefined ){ setInterval_autoSendBarrage(); setInterval_barrageCountDown(); } else { clearInterval_autoSendBarrage(); } } btn_send.onmouseover = function(){ this.style.background = '#00d1b2'; } btn_send.onmouseout = function(){ this.style.background = '#00ddbb'; } $(div_sendBtn).append(btn_send); // hr =============================================================== var hr_style = '
'; // add all elements to document.body =============================================================== $(div_sendBarrage).append(div_first); $(div_sendBarrage).append($(hr_style)); $(div_sendBarrage).append(div_defaultBarrage); $(div_sendBarrage).append($(hr_style)); $(div_sendBarrage).append(div_barrage); $(div_sendBarrage).append($(hr_style)); $(div_sendBarrage).append(div_luckDraw); $(div_sendBarrage).append($(hr_style)); $(div_sendBarrage).append(div_sendBtn); var checkShow_1 = setInterval( function(){ if( $('div.layout-Player-asideMainTop')[0] ){ setTimeout( function(){ $('div.layout-Player-asideMainTop')[0].append(div_sendBarrage); }, 3000); window.clearInterval( checkShow_1 ); } }, 1000); // 斗鱼弹幕输入框按钮 var checkShow_2 = setInterval( function(){ if( document.getElementById('div-sendBarrage') && document.getElementsByClassName('ChatToolBar')[0] ){ var div_sign = document.createElement('div'); $(div_sign).css({ 'width' : '18px', 'height' : '18px', 'margin' : '-8px 0 0 -5px' }); div_sign.style.display = 'inline-block'; div_sign.style.verticalAlign = 'middle'; var btn_sign = document.createElement('span'); $(btn_sign).attr('id', 'button-sign'); $(btn_sign).css({ 'fontSize' : '18px', 'cursor' : 'pointer', }); $(btn_sign).text('📢'); btn_sign.onclick = function(){ $('div#div-sendBarrage').toggle(); }; $(div_sign).append(btn_sign); $('div.ChatToolBar')[0].append(div_sign); window.clearInterval( checkShow_2 ); } }, 1000); } function sendBarrage(){ var barrage = ''; var isLuckDrawBarrage = 0; // 优先抽奖弹幕 if( document.getElementById('input-isLuckDraw') && document.getElementById('input-isLuckDraw').checked ){ var temp1 = document.getElementsByClassName('UPlayerLotteryEnter-deadsec')[0]; if( temp1 ){ var minute = parseInt( temp1.textContent.split(':')[0] ); var second = parseInt( temp1.textContent.split(':')[1] ); var nowLuckDrawCountDown = minute * 60 + second; if( nowLuckDrawCountDown > luckDrawCountDown ){ // 新一轮抽奖弹幕 count_luckDraw = 0; temp1.click(); barrageLuckDraw = document.getElementsByClassName('ULotteryStart-danmuDesc UserLottery-ellipse is-coping')[0].textContent; barrageLuckDraw = barrageLuckDraw.split(':')[1]; $('span.LotteryContainer-close').click(); } barrage = count_luckDraw < count_luckDrawTotal ? barrageLuckDraw : ''; if( barrage != undefined && barrage.length > 0 ){ isLuckDrawBarrage = 1; count_luckDraw++; } luckDrawCountDown = nowLuckDrawCountDown; } } // 循环发送自定义弹幕 if( ( barrage == undefined || barrage.length == 0 ) && document.getElementById('input-isLoop') && document.getElementById('input-isLoop').checked ){ var barrageLoop = new Array(); barrageLoop = document.getElementById('input-sendBarrage-content').value.split('\n'); let index = Math.round( Math.random()*barrageLoop.length ); barrage = barrageLoop[index] ? barrageLoop[index] : barrageLoop[0]; } // 代码内置弹幕 if( ( barrage == undefined || barrage.length == 0 ) && document.getElementById('input-isDefaultBarrage') && document.getElementById('input-isDefaultBarrage').checked ){ var praise = [ ',我们一起手牵手走过很多路,我们一起手牵手唱了很多歌,我们也手牵手爱了彼此很久很久。', ',遇见你本身就是一个错误,爱上你便是一错再错,离开你的时候我才明白,这才是错上加错。', '追我追了三条街;谢霆锋昨天看见我后,立即宣布要在9月份退出演艺圈!不为别的,就是因为我长得实在是太帅了!', ',每次你凶我的时候,我都觉得你有病,面对这么帅气的我,你居然还能发脾气。', '一直承受着这个年纪不该有的帅气,好累。', '只恨自己太倔强,明明可以靠脸吃饭,却偏偏要靠才华。', '帅到走在街上开车的人看了都会发生交通事故,汽车追尾;路人看了都有迷倒晕倒~~', '人见人爱,鸟见鸟呆,风靡万千少女,刺激帅哥市场,挽救无数,一支梨花压海棠……', '你是花丛中的蝴蝶,是百合花中的蓓蕾。无论什么衣服穿到你的身上,总是那么端庄好看。', '你也许没有若隐若现的酒窝,但你的微笑一定是月闭花羞,鱼沉雁落。', ',在人流中,我一眼就发现了你。我不敢说你是她们中最漂亮的一个,可是我敢说,你是她们中最出色的一个。','求你不要再打扮了,给其他的女人留点自信吧。', 'skr~skr~skr~', '的美由骨到皮,感天动地,此情可待成追忆', '蹦蹦跳跳地走进来,一件红尼大衣,紧束着腰带,显得那么轻盈,那么矫健,简直就像天边飘来一朵红云。', '一张坏坏的笑脸,连两道浓浓的眉毛也泛起柔柔的涟漪,好像一直都带着笑意,弯弯的,像是夜空里皎洁的上弦月。白皙的皮肤衬托着淡淡桃红色的嘴唇,俊美突出的五官,完美的脸型,特别是左耳闪着炫目光亮的钻石耳钉,给他的阳光帅气中加入了一丝不羁。', '真是个聪明的孩子!', '是花丛中的蝴蝶,是百合花中的蓓蕾。无论什么衣服穿到你的身上,总是那么端庄、好看。', '全身充溢着少女的纯情和青春的风采。留给我印象最深的是你那双湖水般清澈的眸子,以及长长的、一闪一闪的睫毛。像是探询,像是关切,像是问候。', ',只有莲花才能比得上你的圣洁,只有月亮才能比得上你的冰清。', ',我不知道该怎样表达你留在我心中最强最深的印象,是你丰满颀长的身材,白皙的皮肤。乌黑幽深的眼睛,小巧红润的嘴唇,但还有一种说不出,捉不到的丰仪在煽动着我的心。', '表现的很勇敢,是一个真正的男子汉!', '想法很有创意!', '瀑布一般的长发,淡雅的连衣裙,标准的瓜子脸,聪明的杏仁眼,那稳重端庄的气质,再调皮的人见了你都会小心翼翼。', '娉婷婉约的风姿,娇艳俏丽的容貌,妩媚得体的举止,优雅大方的谈吐,一开始就令我刮目相看。', '像一片轻柔的云在我眼前飘来飘去,你清丽秀雅的脸上荡漾着春天般美丽的笑容。', '说话得体,举止大方。不要吝啬赞美!因为你的赞美,对他人是一种鼓励,一种信任。', '思维太活跃了,我根本就跟不上。', '是那样地美,美得象一首抒情诗。', '远近书疏,莫不手答,笔翰如流未尝壅滞。', '双目似有千情万怨,道不尽也诉不完,一句巧笑倩兮,美目盼兮可能描述碧瑶盈盈眼波。', '双眉有如柳叶刀裁,盈盈笑意眉上来,一句云髻峨峨,修眉联娟得以道出碧瑶云云细眉。', '那红嘟嘟地脸蛋闪着光亮,像九月里熟透地苹果一样。', '像那沾满露珠的花瓣,给我带来一室芳香;你像那划过蓝天的鸽哨,给我带来心灵的静远和追求。', '乌灵的眼眸,倏地笼上层嗜血的寒意,仿若魔神降世一般,一双冰眸轻易贯穿人心,刺透心底最柔弱,舞衣的角落。', '眼神优雅、娴静,双眼回盼流波,像是俏丽的江南女子;但又挂着一丝倔犟的波纹,又带着北国女儿的神韵。', '清水出芙蓉,天然去雕饰。', '刹那芳华,犹如指尖流砂。灿烂烟花,终究剪不下。', '不必假装有深度,只要懂得欣赏别人的深度,已经是 一种美德了。', '言谈中可以看出,我今天遇到的都是有修养的人。', '白皙的皮肤衬托着淡淡桃红色的嘴唇,俊美突出的五官,完美的脸型,特别是左耳闪着炫目光亮的钻石耳钉,给他的阳光帅气中加入了一丝不羁。', '真是一位家庭、事业有成的人,非常令人羡慕。', '一席话,胜读十年书,今天与您交谈,我受益匪浅。', '真幽默,话从您口中说出来就是不一样。', '在午后的阳光下,没有丝毫红晕,清秀的脸上只显出了一种病态的苍白,却无时不流露出高贵淡雅的气质,配合他颀长纤细的身材。', '那双圆溜溜的大眼睛,镶了一圈乌黑闪亮的长睫毛,眨动之间,透出一股聪明伶俐劲儿。', '目光深邃,一看您就是一位有思想的人。', '语调独特,言谈话语中充满了感染力。', '别开玩笑了,看您的容貌,肯定不到四十岁。', '立体的五官刀刻般俊美,整个人发出一种威震天下的王者之气,邪恶而俊美的脸上此时噙着一抹放荡不拘的微笑。', '好像是上品的西湖龙井那种淡淡的苦涩是你的成熟越品你越有味道。', '浓密的眉毛叛逆地稍稍向上扬起,长而微卷的睫毛下,有着一双像朝露一样清澈的眼睛,英挺的鼻梁,像玫瑰花瓣一样粉嫩的嘴唇,还有白皙的皮肤。', '可以夸,但没必要。。。', '游戏打的不错', '英俊潇洒', '风流倜傥', '玉树临风', '遇见你之后,再看别的女人,就好象在侮辱自己的眼睛!', '神勇威武', '你笑起来的样子最为动人,两片薄薄的嘴唇在笑,长长的眼睛在笑,腮上两个陷得很举动的酒窝也在笑。', '宇内第一寂寞高手', '满腹经纶!这果然是奥妙!我等佩服!', '天资聪颖,文思敏捷,下笔成章,将来未可限量!', '玉面郎君', '仁者无敌', '那瓜子形的脸,那么白净,弯弯的一双眉毛,那么修长;水汪汪的一对眼睛,那么明亮!', '金刚不坏', '英明神武']; var subject = "主播"; let index = Math.round( Math.random()*praise.length ); barrage = subject + praise[index]; } if( barrage != undefined && barrage.length > 0 ){ if( isLuckDrawBarrage === 1 ){ $('#input-luckDrawCount').val( count_luckDraw + ' / ' + count_luckDrawTotal ); } $( $('textarea.ChatSend-txt ')[0] ).val(barrage); document.getElementsByClassName('ChatSend-button')[0].click(); } if( interval_countDownOfBarrage == undefined ){ setInterval_barrageCountDown(); } } function setInterval_autoSendBarrage(){ var input_speed = document.getElementById('input-sendBarrage-speed'); var btn_send = document.getElementById('btn-send'); interval = parseInt( input_speed.value ) >= 2 ? parseInt( input_speed.value ) : interval_default; $(input_speed).attr('disabled', true); $(input_speed).css({ 'background' : color_input_disabled, 'cursor' : 'default', }); btn_send.innerHTML = '停止发送'; interval_autoSendBarrage = setInterval(sendBarrage, interval * 1000); count_luckDraw = 0; count_luckDrawTotal = parseInt( $('#input-luckDrawCount').val() ); count_luckDrawTotal = count_luckDrawTotal ? count_luckDrawTotal : count_luckDrawDefault; $('#button-sign').text('🔥'); } function clearInterval_autoSendBarrage(){ window.clearInterval(interval_autoSendBarrage); var input_speed = document.getElementById('input-sendBarrage-speed'); var btn_send = document.getElementById('btn-send'); interval_autoSendBarrage = undefined; $(input_speed).attr('disabled', false); $(input_speed).css({ 'background' : color_input_input, 'cursor' : 'text', }); btn_send.innerHTML = '发送'; $('#input-luckDrawCount').val(count_luckDrawTotal); $('#button-sign').text('📢'); } function showBarrageCountDown(){ if( barrageCountDown <= 0 ){ barrageCountDown = interval; } barrageCountDown--; var label_countDown = document.getElementById('input-countDown'); label_countDown.value = barrageCountDown; } function setInterval_barrageCountDown(){ barrageCountDown = interval; interval_countDownOfBarrage = setInterval(showBarrageCountDown, 1000); } function clearInterval_barrageCountDown(){ window.clearInterval(interval_countDownOfBarrage); document.getElementById('input-countDown').value = ''; } initView(); })();