斗鱼自动发弹幕

自动发弹幕,参与弹幕抽奖

目前为 2019-03-18 提交的版本。查看 最新版本

// ==UserScript==
// @name         斗鱼自动发弹幕
// @namespace    http://tampermonkey.net/
// @version      0.3.1
// @description  自动发弹幕,参与弹幕抽奖
// @author       H2P
// @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 修复
// @grant        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 barrageLoop = new Array();

	var color_input_input = '#f5f5f5';
	var color_input_disabled = '#DCDCDC';
	var fontSize_input = '12px';

	var initView = function(){
		var div_sendBarrage = document.createElement('div');
		div_sendBarrage.setAttribute('id', 'div-sendBarrage');
		div_sendBarrage.style.cssText = 'position: absolute; bottom: 1px; min-width: 315px; max-width: 315px; padding: 10px; margin: 0 0 0 -1px; z-index: 999;';
		div_sendBarrage.style.border = '1px solid #DCDCDC';
		div_sendBarrage.style.borderRadius = '2px';
		div_sendBarrage.style.boxShadow = '#A9A9A9 5px 0 10px 0';
		div_sendBarrage.style.fontSize = '14px';
		div_sendBarrage.style.backgroundColor = color_input_input;
		div_sendBarrage.style.display = 'none';


		// set the speed of sending barrage  ===============================================================
		var div_first = document.createElement('div');
		div_first.style.cssText = 'position: relative; width: 100%; height: 24px;';
		div_first.style.verticalAlign = 'center';

		var div_speed = document.createElement('div');
		div_speed.style.cssText = 'position: absolute; width: 50%;';

		var label_speed = document.createElement('label');
		label_speed.style.cssText = 'height: 22px;';
		label_speed.innerHTML = '间隔:';
		div_speed.appendChild(label_speed);

		var input_speed = document.createElement('input');
		input_speed.id = 'input-sendBarrage-speed';
    	input_speed.style.cssText = 'width: 65px; height: 22px; padding: 0 3px; margin: 0 5px';
		input_speed.style.border = '1px solid #708090';
		input_speed.style.borderRadius = '5px';
		input_speed.style.fontSize = fontSize_input;
		input_speed.style.background = color_input_input;
		input_speed.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.appendChild(input_speed);

		var label_unit = document.createElement('label');
		label_unit.style.cssText = 'height: 22px;';
		label_unit.innerHTML = '秒';
		div_speed.appendChild(label_unit);

		div_first.appendChild(div_speed);

		// the count down of sending barrage
		var div_countDown = document.createElement('div');
		div_countDown.style.cssText = 'position: absolute; left: 50%; height: 24px';
		
		div_countDown.style.color = '#228B22';

		var label_countDown = document.createElement('label');
		label_countDown.style.cssText = 'min-width: 106px; max-width: 106px; margin: 0';
		label_countDown.innerHTML = '弹幕倒计时:';
		div_countDown.appendChild(label_countDown);

		var input_numOfCountDown = document.createElement('input');
		input_numOfCountDown.id = 'input-countDown';
		input_numOfCountDown.style.cssText = 'width: 65px; height: 22px; padding: 0 3px;';
		input_numOfCountDown.style.border = '1px solid #708090';
		input_numOfCountDown.style.borderRadius = '5px';
		input_numOfCountDown.style.fontSize = fontSize_input;
		input_numOfCountDown.style.background = color_input_disabled;
		input_numOfCountDown.disabled = true;
		div_countDown.appendChild(input_numOfCountDown);

		div_first.appendChild(div_countDown);


		// if send the default barrage  ===============================================================
		var div_defaultBarrage = document.createElement('div');
		div_defaultBarrage.style.cssText = 'position: relative; margin: 0;';

		var input_defaultBarrage = document.createElement('input');
		input_defaultBarrage.id = 'input-isDefaultBarrage';
		input_defaultBarrage.style.cssText = 'position: absolute; top: 0; bottom: 0; left: 0; margin: auto';
		input_defaultBarrage.name = 'defaultBarrage';
		input_defaultBarrage.type = 'checkbox';
		input_defaultBarrage.value = '';
		div_defaultBarrage.appendChild(input_defaultBarrage);

		var label_defaultBarrage = document.createElement('label');
		label_defaultBarrage.style.cssText = 'margin: 0 0 0 20px';
		label_defaultBarrage.innerHTML = '发送默认弹幕';
		div_defaultBarrage.appendChild(label_defaultBarrage);

		// set if send any barrage circularly  ===============================================================
		var div_barrage = document.createElement('div');
		div_barrage.style.cssText = 'position: relative; margin: 0;';

		var input_isLoop = document.createElement('input');
		input_isLoop.id = 'input-isLoop';
		input_isLoop.style.cssText = 'position: absolute; top: 0; bottom: 0; left: 0; margin: auto';
		input_isLoop.name = 'barrageLoop';
		input_isLoop.type = 'checkbox';
		input_isLoop.value = '';
		div_barrage.appendChild(input_isLoop);

		var input_barrage = document.createElement('textarea');
		input_barrage.id = 'input-sendBarrage-content';
		input_barrage.style.cssText = 'min-width: 286px; max-width: 286px; min-height: 90px; max-height: 90px; padding: 3px; margin: 0 0 0 20px';
		input_barrage.style.border = '1px solid #708090';
		input_barrage.style.borderRadius = '5px';
		input_barrage.style.background = color_input_input;
		input_barrage.style.fontSize = fontSize_input;
		input_barrage.placeholder = '循环弹幕';
		div_barrage.appendChild(input_barrage);


		// if send the barrage for luck draw  ===============================================================
		var div_luckDraw = document.createElement('div');
		div_luckDraw.style.cssText = 'position: relative; margin: 0;';

		var input_luckDraw = document.createElement('input');
		input_luckDraw.id = 'input-isLuckDraw';
		input_luckDraw.style.cssText = 'position: absolute; top: 0; bottom: 0; left: 0; margin: auto';
		input_luckDraw.name = 'luckDraw';
		input_luckDraw.type = 'checkbox';
		input_luckDraw.value = '';
		div_luckDraw.appendChild(input_luckDraw);

		var label_luckDraw = document.createElement('label');
		label_luckDraw.style.cssText = 'margin: 0 0 0 20px';
		label_luckDraw.innerHTML = '参与抽奖弹幕';
		div_luckDraw.appendChild(label_luckDraw);


		// the button of sending barrage  ===============================================================
		var div_sendBtn = document.createElement('div');
		div_sendBtn.style.cssText = 'position: relative; margin: 0;';

		var btn_send = document.createElement('button');
		btn_send.id = 'btn-send';
		btn_send.innerHTML = '发送';
		btn_send.style.cssText = 'width: 293px; height: 100%; padding: 4px 0; margin: 0 0 0 20px';
		btn_send.style.border = 'none';
		btn_send.style.borderRadius = '5px';
		btn_send.style.cursor = 'pointer';
		btn_send.style.background = '#00ddbb';
		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.appendChild(btn_send);


		// hr  ===============================================================
		var hr_style = 'margin: 2px -10px; border: 1px solid transparent;';

		var hr_1 = document.createElement('hr');
		hr_1.style.cssText = hr_style;

		var hr_2 = document.createElement('hr');
		hr_2.style.cssText = hr_style;

		var hr_3 = document.createElement('hr');
		hr_3.style.cssText = hr_style;

		var hr_4 = document.createElement('hr');
		hr_4.style.cssText = hr_style;


		// add all elements to document.body  ===============================================================
		div_sendBarrage.appendChild(div_first);
		div_sendBarrage.appendChild(hr_1);
		div_sendBarrage.appendChild(div_defaultBarrage);
		div_sendBarrage.appendChild(hr_2);
		div_sendBarrage.appendChild(div_barrage);
		div_sendBarrage.appendChild(hr_3);
		div_sendBarrage.appendChild(div_luckDraw);
		div_sendBarrage.appendChild(hr_4);
		div_sendBarrage.appendChild(div_sendBtn);

		var checkShow_1 = setInterval( function(){
			if( document.getElementsByClassName('layout-Player-asideMainTop')[0] ){
				setTimeout( function(){
					document.getElementsByClassName('layout-Player-asideMainTop')[0].appendChild(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.style.cssText = '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.id = 'button-sign';
				btn_sign.style.cursor = 'pointer';
				btn_sign.style.fontSize = '18px';
				btn_sign.innerHTML = '📢';
				btn_sign.onclick = function(){
					div_sendBarrage = document.getElementById('div-sendBarrage');
					if( div_sendBarrage.style.display == 'none' ){
						div_sendBarrage.style.display = 'inline';
					}
					else {
						div_sendBarrage.style.display = 'none';
					}
				};

				div_sign.appendChild(btn_sign);

				document.getElementsByClassName('ChatToolBar')[0].appendChild(div_sign);
				window.clearInterval( checkShow_2 );
			}		
		}, 1000);
	}

	function sendBarrage(){

		var barrage = '';

		var element = document.getElementsByClassName('ChatSend-txt')[0];

		// 优先抽奖弹幕
		if( document.getElementById('input-isLuckDraw') && document.getElementById('input-isLuckDraw').checked ){
			var temp1 = document.getElementsByClassName('custom_p-a19f30')[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 ){
					temp1.click();
					temp2 = document.getElementsByClassName('b_input-6be2de')[0];
					if( temp2 == undefined ){
						var temp2 = document.getElementsByClassName('b_input-5b256b')[0];
					}

					barrageLuckDraw = temp2.value;

					if( document.getElementsByClassName('b_close-f6b89a')[0] ){
						document.getElementsByClassName('b_close-f6b89a')[0].click();
					}
					else {
						document.getElementsByClassName('b_close-e33408')[0].click();
					}
				}
				barrage = barrageLuckDraw;
				luckDrawCountDown = nowLuckDrawCountDown;
			}
		}

		// 循环发送自定义弹幕
		if( ( barrage == undefined || barrage.length == 0 ) && document.getElementById('input-isLoop') && document.getElementById('input-isLoop').checked ){
			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 ){
			element.value = barrage;

			var btn = document.getElementsByClassName('ChatSend-button')[0];
			btn.click();
		}

		if( interval_countDownOfBarrage == undefined ){
			setInterval_barrageCountDown();
		}
	}

	function setInterval_autoSendBarrage(){
		var input_speed = document.getElementById('input-sendBarrage-speed');
		var input_barrage = document.getElementById('input-sendBarrage-content');
		var btn_send = document.getElementById('btn-send');

		interval = parseInt( input_speed.value ) >= 2 ? parseInt( input_speed.value ) : interval_default;
		input_speed.disabled = true;
		input_speed.style.background = color_input_disabled;
		input_speed.style.cursor = 'default';
		barrageLoop = input_barrage.value.split('\n');
		input_barrage.disabled = true;
		input_barrage.style.background = color_input_disabled;
		input_barrage.style.cursor = 'default';
		btn_send.innerHTML = '停止发送';
		interval_autoSendBarrage = setInterval(sendBarrage, interval * 1000);

		document.getElementById('button-sign').innerHTML = '🔥';
	}

	function clearInterval_autoSendBarrage(){
		window.clearInterval(interval_autoSendBarrage);

		var input_speed = document.getElementById('input-sendBarrage-speed');
		var input_barrage = document.getElementById('input-sendBarrage-content');
		var btn_send = document.getElementById('btn-send');

		interval_autoSendBarrage = undefined;
		input_speed.disabled = false;
		input_speed.style.background = color_input_input;
		input_speed.style.cursor = 'text';
		input_barrage.disabled = false;
		input_barrage.style.background = color_input_input;
		input_barrage.style.cursor = 'text';
		btn_send.innerHTML = '发送';

		document.getElementById('button-sign').innerHTML = '📢';
	}

	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();
})();