Greasy Fork

Greasy Fork is available in English.

快手弹幕语音助手

获取快手弹幕转语音 朗读弹幕

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @icon  https://www.kuaishou.com/favicon.ico
// @name  快手弹幕语音助手
// @namespace  [url=mailto:[email protected]][email protected][/url]
// @author 文超
// @description  获取快手弹幕转语音 朗读弹幕
// @match  https://live.kuaishou.com/u/*
// @version  2.1.4
// @grant GM_addStyle
// ==/UserScript==
(function() {
	'use strict';
	setInterval(DelayGet, 50); //定时器 1s 10次=1000ms/100
	//document.documentElement.webkitRequestFullscreen(); //chrome 全屏
	var LastLiNum = 0;

	//删除无用元素 延时点击流程
	setTimeout(del_elm, 3000);
	//自动点亮红心
	//setInterval(lightHearts, 1000);
	//弹幕转语音
	function DelayGet() {
		//console.log("======================================");
		var chatUI = document.getElementsByClassName("chat-info");

		for (var i = LastLiNum; i < chatUI.length; i++) {
			LastLiNum = chatUI.length;

			var elmName = chatUI[i].getElementsByClassName("username");

			var chatHtml = chatUI[i].innerHTML;
			var giftNum = chatUI[i].getElementsByClassName("comment")[1];
			var nameTxt = elmName[0].innerText;
			var tmp_Data = chatUI[i].innerText;
			var tmp_Text = tmp_Data.replace(nameTxt, "");
			nameTxt = nameMake(nameTxt); //用户名处理
			var readTxt = '';
			if (tmp_Text.search("点亮了") != -1) { //*********点亮红心
				readTxt = '感谢 ' + nameTxt + '点亮小红心';
			} else if (tmp_Text.search("送") != -1) { //*********送礼物
				if (chatHtml.search(fans[0]) != -1) { //加入粉丝团
					readTxt = '感谢 ' + nameTxt + fans[1];
				} else { //礼物
					var giftNumTxt = "";
					if (giftNum) {
						giftNumTxt = ChinaCost(giftNum.innerText.replace("×", ""));
					}

					var knowGift = false;
					for (var j = 0; j < giftLink.length; j++) {
						if (chatHtml.search(giftLink[j]) != -1) { //已知礼物
							readTxt = '感谢 ' + nameTxt + '送的' + giftNumTxt + giftName[j];
							knowGift = true;
							break;
						}
					}
					if (!knowGift) { //未知礼物
						readTxt = '感谢 ' + nameTxt + giftNumTxt + '送的礼物';
					}
				}
			} else if (tmp_Text === '一') {
				readTxt = nameTxt + '扣一';
			} else {
				tmp_Text = txt_make(tmp_Text); //弹幕内容处理
				readTxt = nameTxt + '说:' + tmp_Text;
			}
			if (nameTxt.search("快手官方") != -1) {
				readTxt = "";
			}

			console.log(readTxt); //输出控制台
			console.log("============================");
			TTSread(readTxt); //文字转TTS语音
		}

	}; //弹幕转语音
	//功能函数
	function del_elm() { //删除无用元素
		//移除元素
		document.querySelector("#app > div.live-detail > div.sidebar").remove(); //左边栏
		document.querySelector("#app > div.live-detail > div.live-detail-container > div.more-recommend-live").remove(); //直播推荐
		document.querySelector("#app > div.live-detail > div.live-detail-container > div.work-list").remove(); //主播作品
		//document.querySelector("#app > div.live-detail > div.header-placeholder").remove();	//顶边栏
		document.querySelector("#app > div.live-detail > div.header-placeholder > header > div > div.left-part > ul").remove(); //顶栏>导航
		document.querySelector("#app > div.live-detail > div.header-placeholder > header > div > div.right-part > div.search-input.search.pl-input-container.readonly.placeholder-center").remove(); //顶栏>搜索框
		document.querySelector("#app > div.live-detail > div.header-placeholder > header > div > div.right-part > span.follow-item").remove(); //顶栏>关注
		document.querySelector("#app > div.live-detail > div.header-placeholder > header > div > div.right-part > span.history-item").remove(); //顶栏>观看历史
		document.getElementsByClassName('live-detail-player')[0].remove(); //视频框
		//修改样式-聊天室宽度
		var Fstyle = document.createElement('style');
		var Fcss = '';
		Fcss += '.liveroom-sidebar[data-v-267931b0]{top:80px;width:100%}'; //聊天框
		Fcss += '.profile[data-v-4e9b4918]{width:80px;height:80px}'; //在线观众 头像
		Fcss += '.billboard h3[data-v-4e9b4918]{font-size:36px}'; //'在线观众'字体
		Fcss += '.chat h3[data-v-267931b0]{font-size:36px}'; //'聊天室' 字体
		Fcss += '.username[data-v-1adf6c6d]{font-size:42px}'; //用户名 字体
		Fcss += '.comment[data-v-1adf6c6d]{font-size:42px}'; //聊天内容 字体
		Fcss += '.chat-info[data-v-67866bb7]{line-height:36px}'; //聊天 行距
		Fcss += '.emoji[data-v-9631c5fc]{width:42px}'; //聊天内容 红心大小
		Fcss += '.gift-comment .gift-img[data-v-1adf6c6d]{width:42px;height:42px}'; //礼物大小
		Fcss += '.textarea[data-v-7e0b9386]{font-size:42px;max-height:200px;line-height:50px;width:80%}'; //聊天输入框
		Fcss += '.filter-gift-show[data-v-2d9bf7e0],.filter-gift[data-v-2d9bf7e0],.filter-thumbup[data-v-2d9bf7e0]{height:50px;line-height:50px}'; //聊天室 设置面板 行距
		Fcss += '.filter-gift span[data-v-2d9bf7e0],.filter-gift-show span[data-v-2d9bf7e0],.filter-thumbup span[data-v-2d9bf7e0]{font-size:42px}'; //聊天室 设置面板 字体
		Fcss += '.chat-setting-panel[data-v-2d9bf7e0]{width:500px}'; //聊天室 设置面板 宽度
		Fcss += '.submit-button[data-v-7e0b9386]{font-size:42px;line-height:42px;width:20%}'; //聊天室 发送按钮
		Fcss += '.header-main[data-v-48567108] .user-info-name-display{font-size:42px;display:inline}'; //顶栏 用户名
		Fcss += '.user-info-profile[data-v-4064f1ec]{width:64px;height:64px;border-radius:50%;vertical-align:middle;margin:10px}'; //顶栏 用户头像
		Fcss += '.header-adapt[data-v-48567108] .header-main .right-part{margin-right:30% !important}'; //顶栏 右栏
		Fcss += '.user-info img[data-v-521ea27d]{margin-right:50px;width:200px;height:200px;border-radius:12%}'; //用户信息 头像
		Fcss += '.user-info-intro[data-v-521ea27d]{width:300px;font-size:25px}'; //用户信息 用户名字体
		Fcss += '.user-detail-name[data-v-521ea27d]{font-size:42px;line-height:42px}'; //用户信息 关注数字体
		Fcss += '.user-card-tooltip[data-v-521ea27d]{width:600px}'; //用户信息 宽度
		Fcss += '.otherdetail-cc[data-v-521ea27d]{font-size:24px}'; //用户信息 地域
		Fcss += '.otherdetail-desc[data-v-521ea27d]{font-size:24px}'; //用户信息 签名
		Fcss += '';
		Fcss += '';
		Fstyle.innerHTML = Fcss;
		console.log(Fstyle);
		document.body.appendChild(Fstyle);

		document.querySelector("#app > div.live-detail > div.liveroom-sidebar.light > div.chat > div.chat-actions > div.chat-input > div > textarea").style.height = '50px';

	}; //删除无用元素
	function txt_make(txt) { //弹幕内容处理
		txt = txt.replace(/1/g, '一');
		txt = txt.replace(/2/g, '二');
		txt = txt.replace(/3/g, '三');
		txt = txt.replace(/4/g, '四');
		txt = txt.replace(/5/g, '五');
		txt = txt.replace(/6/g, '六');
		txt = txt.replace(/7/g, '七');
		txt = txt.replace(/8/g, '八');
		txt = txt.replace(/9/g, '九');

		txt = txt.replace(/(😂|🤣)+/g, '哭笑哭笑');
		txt = txt.replace(/(😀|😃|😄|😁|😆|😊|😇|🙂|😉)+/g, '哈哈');
		txt = txt.replace(/(😘|😗|😙)+/g, '么么哒');

		return txt;
	}; //弹幕内容处理
	function nameMake(txt) { //用户名处理 去掉名字中特殊符号
		txt = txt.replace(/[0-9]/g, '');
		txt = txt.replace(/[😀😃😄😁😆😅😂🤣☺️😊😇🙂🙃😉😌😍🥰😘😗😙😚😋😛]/g, '');
		txt = txt.replace(/[△▽○◇□☆▷◁♤♡♢♧▲▼●◆■★▶◀♠♥♦♣☼☽♀☺◐☑√✔☜☝☞㏂☀☾♂☹◑☒×✘☚☟☛㏘▪•‥…▁▂▃▄▅▆▇█∷※░▒▓▏▎▍▌▋▊▉]/g, '');
		txt = txt.replace(/[♩♪♫♬§〼◎¤۞℗®©♭♯♮‖¶卍卐▬〓℡™㏇☌☍☋☊㉿◮◪◔◕@㈱№♈♉♊♋♌♎♏♐♑♓♒♍]/g, '');
		txt = txt.replace(/[↖↑↗▨▤▧◤㊤◥☴☲☷←㊣→▩▦▥㊧㊥㊨☳☯☱↙↓↘▫◈▣◣㊦◢☶☵☰↕↔⊱⋛⋌⋚⊰¬¬▔†‡]/g, '');
		txt = txt.replace(/[**✲❈❉✿❀❃❁☸✖✚✪❤ღ❦❧ி₪✎✍✌✁✄☁☂☃☄♨☇☈☡➷⊹✉☏]/g, '');
		txt = txt.replace(/[@$&☢✈♟♙〠☣☠۩♜♖✙☭☄♨❂✟♞♘☤☪☮☥♝♗☦〄➹☧♛♕☨☩ஐ☫♚♔☬☎]/g, '');
		txt = txt.replace(/丨/g, '');
		txt = txt.replace(/:/g, '');
		txt = txt.replace(/ /g, '');
		txt = txt.replace(/,/g, '');

		return txt;
	}; //用户名处理
	function TTSread(txt) { //文字转TTS语音
		var tts = new SpeechSynthesisUtterance(txt);
		tts.rate = 1.2;
		window.speechSynthesis.speak(tts);
	}; //文字转TTS语音
	function ChinaCost(numberValue) { //数字转中文
		var numberValue = new String(Math.round(numberValue * 100)); // 数字金额
		var chineseValue = ""; // 转换后的汉字金额
		var String1 = "零壹贰叁肆伍六柒捌玖"; // 汉字数字
		var String2 = "万仟佰拾亿仟佰拾万仟佰拾个  "; // 对应单位
		var len = numberValue.length; // numberValue 的字符串长度
		var Ch1; // 数字的汉语读法
		var Ch2; // 数字位的汉字读法
		var nZero = 0; // 用来计算连续的零值的个数
		var String3; // 指定位置的数值
		if (len > 15) {
			//alert("超出计算范围");
			return "";
		}
		/*
		if (numberValue == 0) {
			chineseValue = "零元整";
			return chineseValue;
		}
	*/
		String2 = String2.substr(String2.length - len, len); // 取出对应位数的STRING2的值
		for (var i = 0; i < len; i++) {
			String3 = parseInt(numberValue.substr(i, 1), 10); // 取出需转换的某一位的值
			if (i != (len - 3) && i != (len - 7) && i != (len - 11) && i != (len - 15)) {
				if (String3 == 0) {
					Ch1 = "";
					Ch2 = "";
					nZero = nZero + 1;
				} else if (String3 != 0 && nZero != 0) {
					Ch1 = "零" + String1.substr(String3, 1);
					Ch2 = String2.substr(i, 1);
					nZero = 0;
				} else {
					Ch1 = String1.substr(String3, 1);
					Ch2 = String2.substr(i, 1);
					nZero = 0;
				}
			} else { // 该位是万亿,亿,万,元位等关键位
				if (String3 != 0 && nZero != 0) {
					Ch1 = "零" + String1.substr(String3, 1);
					Ch2 = String2.substr(i, 1);
					nZero = 0;
				} else if (String3 != 0 && nZero == 0) {
					Ch1 = String1.substr(String3, 1);
					Ch2 = String2.substr(i, 1);
					nZero = 0;
				} else if (String3 == 0 && nZero >= 3) {
					Ch1 = "";
					Ch2 = "";
					nZero = nZero + 1;
				} else {
					Ch1 = "";
					Ch2 = String2.substr(i, 1);
					nZero = nZero + 1;
				}
				if (i == (len - 11) || i == (len - 3)) { // 如果该位是亿位或元位,则必须写上
					Ch2 = String2.substr(i, 1);
				}
			}
			chineseValue = chineseValue + Ch1 + Ch2;
		}
		/*
		if (String3 == 0) { // 最后一位(分)为0时,加上“整”
			chineseValue = chineseValue + "整";
		}
	*/
		if (chineseValue.substr(0, 2) == "壹拾") { // 如果 以"壹拾"开头 去掉"壹"
			chineseValue = chineseValue.substr(1);
		}

		return chineseValue;
	}; //数字转汉字
	function lightHearts() { //点亮小红心
		document.getElementsByClassName('like-btn')[0].click();
	}; //点亮小红心
	//变量
	var giftLink = new Array("2019/12/31/14/BMjAxOTEyMzExNDExMDNfMF9nNjNfbHY", "2019/12/31/14/BMjAxOTEyMzExNDA5MjVfMF9nMTU4X2x2", "2019/01/11/15/BMjAxOTAxMTExNTAxMzRfMF9nMTQ3X2x2", "2018/12/27/17/BMjAxODEyMjcxNzU5MDNfMF9nMTUwX2x2", "2018/12/27/17/BMjAxODEyMjcxNzU5MDRfMF9nMTQ5X2x2", "2019/01/11/14/BMjAxOTAxMTExNDI4MzhfMF9nMTQ1X2x2", "2019/01/09/15/BMjAxOTAxMDkxNTA5MTdfMF9nN19sdg==", "2019/01/03/15/BMjAxOTAxMDMxNTU4NTdfMF9nOV9sdg==", "2019/10/31/15/BMjAxOTEwMzExNTA0MTNfMF9nMjM1X2x2", "2019/10/24/11/BMjAxOTEwMjQxMTI0MDFfMF9nMjI2X2x2", "2019/08/22/15/BMjAxOTA4MjIxNTM4NDdfMF9nMl9sdg==", "2019/10/16/10/BMjAxOTEwMTYxMDE2NTJfMF9nMjE3X2x2", "2019/01/11/15/BMjAxOTAxMTExNTAyMzdfMF9nMTE0X2x2", "2019/01/23/15/BMjAxOTAxMjMxNTE5NDRfMF9nMTY4X2x2", "2019/01/16/17/BMjAxOTAxMTYxNzIxMjlfMF9nMTZfbHY=", "2018/01/05/15/BMjAxODAxMDUxNTE1MzdfMF9nMzNfbHY=", "2018/07/27/14/BMjAxODA3MjcxNDE3NTRfMF9nMTQ2X2x2", "2017/09/29/09/BMjAxNzA5MjkwOTUwNDNfMF9nMjVfbHY=", "2018/04/18/14/BMjAxODA0MTgxNDU0MDJfMF9nMTEzX2x2", "2019/09/05/14/BMjAxOTA5MDUxNDUxNDhfMF9nNDFfbHY=", "2018/03/22/14/BMjAxODAzMjIxNDA2NTlfMF9nOTRfbHY=", "2019/04/11/11/BMjAxOTA0MTExMTU4NDVfMF9nMTY0X2x2", "2019/11/19/10/BMjAxOTExMTkxMDE0NThfMF9nMjQ5X2x2", "2019/11/12/10/BMjAxOTExMTIxMDAxMDBfMF9nMjQxX2x2", "2019/11/01/14/BMjAxOTExMDExNDQwMjVfMF9nMTBfbHY=", "2019/11/19/10/BMjAxOTExMTkxMDE2MjVfMF9nMjQ4X2x2", "2019/11/19/10/BMjAxOTExMTkxMDE1NDdfMF9nMjQ3X2x2", "2019/01/23/15/BMjAxOTAxMjMxNTExMjZfMF9nMTY1X2x2", "2019/11/19/10/BMjAxOTExMTkxMDE2MDVfMF9nMjQ2X2x2");
	var giftName = new Array("发财", "鼠钱啦", "赞", "carry全场", "血瓶", "西瓜", "么么哒", "啤酒", "爆单", "金话筒", "棒棒糖", "辛苦了", "玫瑰花", "爱的信号", "皇冠", "烟花", "怦然心动", "凤冠", "火箭", "跑车", "穿云箭", "猫粮", "巧克力", "四叶草", "甜甜圈", "铃铛", "福袋", "爱心", "金莲");
	var fans = new Array("2019/11/06/10/BMjAxOTExMDYxMDQ4MzFfMF9nMjM2X2x2", "加入粉丝团!直播间因为有你而精彩");

})();

/*
		//刷新网页
		if (LastLiNum > 200) {
			window.location.reload(true);
		}
*/