虎牙自动禁言
// ==UserScript== // @name H2P: 虎牙自动禁言 // @namespace http://tampermonkey.net/ // @version 0.0.6 // @icon https://a.msstatic.com/huya/h5player/room/2006231627/src/img/output/replay-fornotice-icon.png // @description 虎牙自动禁言 // @author H2P // @compatible chrome // @require https://greasyfork.org/scripts/411278-h2p-utils/code/H2P:%20utils.js?version=847435 // @require https://greasyfork.org/scripts/411280-h2p-notify-util/code/H2P:%20notify%20util.js?version=847422 // @match *://*.huya.com/* // @note 2020.09.24-V0.0.06 修复虎牙禁言(禁言更新) // ==/UserScript== (($util, $H2P, $notifyMgr) => { 'use strict'; const HuyaMute = 'h2p-huya-config-mute'; let config_mute_pre = { // 恶意刷屏 EYiShuaPing: { time : '1800', keyWords: [], }, // 谩骂 ManMa: { time : '1800', keyWords: [], }, // 刷广告 ShuaGuangGao: { time : '1800', keyWords: [], }, // 色情 SeQing: { time : '1800', keyWords: [], } }; let config_mute = {}; Object.assign(config_mute, config_mute_pre); let config_mute_tmp = JSON.parse(localStorage.getItem(HuyaMute)) || {}; Object.assign(config_mute, config_mute_tmp); for (let key in config_mute) { if (!(key in config_mute_pre)) { delete config_mute[key]; } } localStorage.removeItem(HuyaMute); localStorage.setItem(HuyaMute, JSON.stringify(config_mute)); const muteTimes = ['300', '1800', '86400', '604800', '2592000', '31104000']; const muteTimes2 = ['5分钟', '30分钟', '1天', '7天', '1个月', '1年']; const muteTypes = ['恶意刷屏', '谩骂', '刷广告', '色情']; new Promise((resolve, reject) => { let style = document.createElement('style'); style.innerHTML = ` #h2p-huya-script { position : fixed; top : 60px; left : 0; width : 600px; height : 325px; border-radius : 0 0 10px 0; padding : 10px; background : #eeeeee; z-index : 100000; } .h2p-huya-div { display : flex; flex-flow : row wrap; justify-content : space-between; } .h2p-huya-layer { justify-content : flex-start; width : 140px; } .h2p-huya-textarea { width : 130px; height : 265px; padding : 5px; margin : 5px 0 0; resize : none; font-size : 10px; line-height : 15px; } .h2p-huya-button { width : 100%; height : 25px; border : none; border-radius : 5px; background-color: #00deba; cursor : pointer; outline : none; transition : all 0.5s; } .h2p-huya-button:hover { background-color: #00ccaa; } .h2p-huya-button-active { background-color: #99aaff; transition : all 0.5s; } .h2p-huya-button-active:hover { background-color: #8899cc; } `; document.body.appendChild(style); let div = document.createElement('div'); div.id = 'h2p-huya-script'; div.style = 'display: none'; div.innerHTML = ` <div class="h2p-huya-div"> <div class="h2p-huya-layer"> <label>恶意刷屏:</label> <select id="h2p-huya-select-EYiShuaPing"> <option value="300">5 分钟</option> <option value="1800">30 分钟</option> <option value="86400">1 天</option> <option value="604800">7 天</option> <option value="2592000">1 个月</option> <option value="31104000">1 年</option> </select> <textarea id="h2p-huya-textarea-EYiShuaPing" class="h2p-huya-textarea"></textarea> </div> <div class="h2p-huya-layer"> <label>谩骂:</label> <select id="h2p-huya-select-ManMa"> <option value="300">5 分钟</option> <option value="1800">30 分钟</option> <option value="86400">1 天</option> <option value="604800">7 天</option> <option value="2592000">1 个月</option> <option value="31104000">1 年</option> </select> <textarea id="h2p-huya-textarea-ManMa" class="h2p-huya-textarea"></textarea> </div> <div class="h2p-huya-layer"> <label>刷广告:</label> <select id="h2p-huya-select-ShuaGuangGao"> <option value="300">5 分钟</option> <option value="1800">30 分钟</option> <option value="86400">1 天</option> <option value="604800">7 天</option> <option value="2592000">1 个月</option> <option value="31104000">1 年</option> </select> <textarea id="h2p-huya-textarea-ShuaGuangGao" class="h2p-huya-textarea"></textarea> </div> <div class="h2p-huya-layer"> <label>色情:</label> <select id="h2p-huya-select-SeQing"> <option value="300">5 分钟</option> <option value="1800">30 分钟</option> <option value="86400">1 天</option> <option value="604800">7 天</option> <option value="2592000">1 个月</option> <option value="31104000">1 年</option> </select> <textarea id="h2p-huya-textarea-SeQing" class="h2p-huya-textarea"></textarea> </div> </div> <div class="h2p-huya-div"> <button id="h2p-huya-button" class="h2p-huya-button">启动</button> </div> `; document.body.appendChild(div); resolve(); }) .then(() => { let div = $H2P('div#h2p-huya-script'); div.addEventListener('change', (e) => { const target = e.target; if (target.tagName.toLowerCase() !== 'select') return; const value = target.selectedOptions[0].value; if (target.id === 'h2p-huya-select-EYiShuaPing') { config_mute.EYiShuaPing.time = value; } else if (target.id === 'h2p-huya-select-ManMa') { config_mute.ManMa.time = value; } else if (target.id === 'h2p-huya-select-ShuaGuangGao') { config_mute.ShuaGuangGao.time = value; } else if (target.id === 'h2p-huya-select-SeQing') { config_mute.SeQing.time = value; } localStorage.setItem(HuyaMute, JSON.stringify(config_mute)); }); div.addEventListener('input', (e) => { const target = e.target; if (target.tagName.toLowerCase() !== 'textarea') return; const value = target.value; if (target.id === 'h2p-huya-textarea-EYiShuaPing') { config_mute.EYiShuaPing.keyWords = value.split('\n'); } else if (target.id === 'h2p-huya-textarea-ManMa') { config_mute.ManMa.keyWords = value.split('\n'); } else if (target.id === 'h2p-huya-textarea-ShuaGuangGao') { config_mute.ShuaGuangGao.keyWords = value.split('\n'); } else if (target.id === 'h2p-huya-textarea-SeQing') { config_mute.SeQing.keyWords = value.split('\n'); } localStorage.setItem(HuyaMute, JSON.stringify(config_mute)); }); let button = $H2P('button#h2p-huya-button'); button.addEventListener('click', () => { button.classList.toggle('h2p-huya-button-active'); button.textContent = button.classList.contains('h2p-huya-button-active') ? '启动中' : '启动'; setINVL_checkMsg(); }); }) .then(() => { // 显示设置的禁言时长 for (let i = 0; i < muteTimes.length; i++) { if (config_mute.EYiShuaPing.time === muteTimes[i]) { $H2P('select#h2p-huya-select-EYiShuaPing').selectedIndex = i; } if (config_mute.ManMa.time === muteTimes[i]) { $H2P('select#h2p-huya-select-ManMa').selectedIndex = i; } if (config_mute.ShuaGuangGao.time === muteTimes[i]) { $H2P('select#h2p-huya-select-ShuaGuangGao').selectedIndex = i; } if (config_mute.SeQing.time === muteTimes[i]) { $H2P('select#h2p-huya-select-SeQing').selectedIndex = i; } } // 显示禁言内容 $H2P('textarea#h2p-huya-textarea-EYiShuaPing').value = Array.isArray(config_mute.EYiShuaPing.keyWords) ? config_mute.EYiShuaPing.keyWords.join('\n') : ''; $H2P('textarea#h2p-huya-textarea-ManMa').value = Array.isArray(config_mute.ManMa.keyWords) ? config_mute.ManMa.keyWords.join('\n') : ''; $H2P('textarea#h2p-huya-textarea-ShuaGuangGao').value = Array.isArray(config_mute.ShuaGuangGao.keyWords) ? config_mute.ShuaGuangGao.keyWords.join('\n') : ''; $H2P('textarea#h2p-huya-textarea-SeQing').value = Array.isArray(config_mute.SeQing.keyWords) ? config_mute.SeQing.keyWords.join('\n') : ''; }) .then(() => { document.addEventListener('keydown', (e) => { if (e.shiftKey && e.which == $util.keyCode.j) { $H2P('div#h2p-huya-script').style.display = $H2P('div#h2p-huya-script').style.display === 'none' ? '' : 'none'; } }); }) let checkMsg = null; let muteUser = null; let minDataID = -1; // 检测弹幕开始编号 function setINVL_checkMsg() { if (checkMsg) { window.clearInterval(checkMsg); window.clearInterval(muteUser); checkMsg = null; muteUser = null; return; } checkMsg = setInterval(() => { if (muteUser) { return; } let msgs = $H2P('ul#chat-room__list > li', false).filter(ele => Number(ele.getAttribute('data-id')) > minDataID); let index = -1; let timeIndex = -1; for (let i = 0; i < msgs.length; i++) { let ele = msgs[i]; minDataID = Number(ele.getAttribute('data-id')); if (ele.querySelector('span.msg') && ele.querySelector('span.name.J_userMenu')) { let user = ele.querySelector('span.name.J_userMenu').textContent; let msg = ele.querySelector('span.msg').textContent.replace(/\s*/g, ''); console.log(`检测[${user}]发的弹幕:${msg}`) // 判断是否存在满足禁言的弹幕 for (let j = 0; j < config_mute.EYiShuaPing.keyWords.length && timeIndex < 0; j++) { let keyWord = config_mute.EYiShuaPing.keyWords[j]; if (keyWord.length > 0 && msg.includes(keyWord)) { index = 0; timeIndex = muteTimes.indexOf(config_mute.EYiShuaPing.time); break; } } for (let j = 0; j < config_mute.ManMa.keyWords.length && timeIndex < 0; j++) { let keyWord = config_mute.ManMa.keyWords[j]; if (keyWord.length > 0 && msg.includes(keyWord)) { index = 1; timeIndex = muteTimes.indexOf(config_mute.ManMa.time); break; } } for (let j = 0; j < config_mute.ShuaGuangGao.keyWords.length && timeIndex < 0; j++) { let keyWord = config_mute.ShuaGuangGao.keyWords[j]; if (keyWord.length > 0 && msg.includes(keyWord)) { index = 2; timeIndex = muteTimes.indexOf(config_mute.ShuaGuangGao.time); break; } } for (let j = 0; j < config_mute.SeQing.keyWords.length && timeIndex < 0; j++) { let keyWord = config_mute.SeQing.keyWords[j]; if (keyWord.length > 0 && msg.includes(keyWord)) { index = 3; timeIndex = muteTimes.indexOf(config_mute.SeQing.time); break; } } } if (timeIndex > -1) { ele.querySelector('span.name.J_userMenu').click(); // 开始禁言 muteUser = setInterval(() => { // 禁言后没有该按钮 const ele_openMute = $H2P('div[class^=user-viewer-content] i[class^=mute-icon]'); if (ele_openMute) { window.clearInterval(muteUser); muteUser = null; // 该用户已被禁言 if (ele_openMute.nextSibling.textContent === '解除禁言') { } else if (ele_openMute.nextSibling.textContent === '禁止发言') { // 隐藏禁言选项框 let style = document.createElement('style'); style.id = 'h2p-huya-style-mute'; style.innerHTML = ` #duya-header, #J_mainWrap, #J_roomBd, .mod-sidebar, .duya-header-wrap { z-index : 99999; } #J_mainWrap, #main_col { background-color: #f4f5f8; } .dlg { display: none!important; } `; !$H2P('style#h2p-huya-style-mute') && document.body.appendChild(style); ele_openMute.click(); muteUser = setInterval(() => { const muteTime = $H2P(`div[class^=mute-add] div[class^=form-item--]:nth-child(3) p[class^=radio--]`, false); const muteType = $H2P(`div[class^=mute-add] div[class^=form-item--]:nth-child(4) p[class^=radio--]`, false); if (muteTime) { window.clearInterval(muteUser); muteUser = null; // 选择禁言时间和类型 muteTime[timeIndex].click(); muteType[index].click(); muteUser = setInterval(() => { if ($H2P(`a[class^=modal-btn--]`)) { window.clearInterval(muteUser); muteUser = null; console.log(`${new Date().$formatTime()} -- 【${ele.querySelector('span.name.J_userMenu').textContent}】【${muteTypes[index]}】:${ele.querySelector('span.msg').textContent.replace(/\s*/g, '')} -- 禁言【${muteTimes2[timeIndex]}】`); $H2P(`a[class^=modal-btn--]`).click(); $H2P('style#h2p-huya-style-mute') && $H2P('style#h2p-huya-style-mute').remove(); $H2P('i[class^=ucard-x]').click(); // 关闭个人资料 } }, 50); } }, 50); } } else if ($H2P('i[class^=ucard-x]')) { window.clearInterval(muteUser); muteUser = null; console.log(`无法禁言 ${ele.querySelector('span.name.J_userMenu').textContent}`); $H2P('i[class^=ucard-x]').click(); } }, 50); break; }; } }, 500); } })($util, $H2P, $notifyMgr);