Greasy Fork

Greasy Fork is available in English.

斗鱼自动发弹幕

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

当前为 2019-03-18 提交的版本,查看 最新版本

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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