您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
dellll
当前为
// ==UserScript== // @name youtube live chat script: report comment&&block user // @namespace null // @version 2.0.0 // @description dellll // @author null // @match *://*.youtube.com/* // @grant GM_registerMenuCommand // @grant GM_unregisterMenuCommand // @grant GM_addStyle // ==/UserScript== (function () { 'use strict'; if (window.location.pathname !== "/live_chat"&&window.location.pathname !== "/live_chat_replay") return; if (window.location.pathname!=window.parent.location.pathname)window.parent.document.querySelector("YTD-LIVE-CHAT-FRAME#chat").style.minHeight= "850px"; let language = navigator.language,sc const SET = GM_registerMenuCommand(language_("Detailed Settings&Log","详细设置&Log","詳細設定&Log"), () => { Set_() }); let Anemati=[],Node_List=[],Node_Log_List = [],Del_List = [],KeyItemList = [] let ONOff=true,Achan=null,Mod_dell=null let Mod_Runing=0,Ch_m = 0,Node_List_index=0,Delete_interval = 1500,BC= 0 ,Pageleng=0,Spam=0,Normal=0,Untreated=0,doc = Number(localStorage.getItem("doc"))||5,AutoReport=false let prpr,Kirara,Ame,Gura,color,Yagoo,Itemslist,color_ames,end,aki,korone let Key_l = Number(localStorage.getItem("Key_l"))||16,BBQ = Number(localStorage.getItem("BBQ"))||3 let Isblock=localStorage.getItem("IsBlock"),Isreplace=localStorage.getItem("Isreplace")||"checked" let Main_Menu_Box, Dialogs_Confirm ,Report_Menu_report,Report_Menu_Item,index_dell,WTF_1,WTF_2,YMD,YMD_Type,Deleting,Delet_mes,X,AutoR let re = /[\u1F601-\u1F64F]|[\u0E00-\u0E7F]|<img.*src.*alt.*>|\[.{1,5}\]|[\[\]\-\_\,\!\|\.\~\`\(\)\#\$\%\^\&\*\+\-\{\}\:\;\"\<\>\@\?\\\/\s\=]|\’|\'/g let PageMode = doc ,pages=doc,Page=0,PageN = 1 //css GM_addStyle(".mes_log_class{font-size:12px;line-height: 25px;text-indent:25px;color: #aaaaaa;}") GM_addStyle(".item_class{text-indent:15px;display:inline-block;width:100%}") GM_addStyle(".P_key{cursor:pointer;text-indent:25px;width:100%;height:100%;display:inline-block;font-size:12px}") GM_addStyle("#key_mes{height:100%;overflow :scroll;overflow-x:auto}") GM_addStyle(".Title_top{width:100%;height:100%;text-align:center;display:inline-block;cursor:pointer}") GM_addStyle("#keyword_frame{overflow-y:auto;width:100%;height:100%;max-height:350px;overflow-x:hidden}") GM_addStyle("#new_div_chat{overflow-y:auto;height:175px;overflow:scroll}") GM_addStyle("#settingitem{user-select:none}") GM_addStyle("#ChatMes,#Log,#dad:hover{cursor:pointer}") GM_addStyle(".pro{color: #93d2ff;font-size: 13px;text-align: center;line-height:15px}") GM_addStyle(".ppts{font-size: 14px;line-height: 25px;text-indent:25px;color: #aaaaaa;}") GM_addStyle("#Set_off{font-size: 14px;line-height: 21px;text-align:center}") GM_addStyle(".shion_P{display:inline-block;text-indent: 0px;}") GM_addStyle("#Y{user-select:none;cursor:pointer}") function css_white(){ color = "rgba(0, 0, 0, 0.23)" GM_addStyle(".set_list{width:50%;height:25px;display:inline-block;background-color:rgba(75, 75, 75, 0.2);text-align:center;user-select:none;line-height:25px;cursor:pointer}") GM_addStyle(".set_item_list{height :25px;background-color:rgba(0, 0, 0, 0.23);text-indent: 10px;line-height:25px;cursor:pointer;font-size:13px;user-select: none") GM_addStyle(".MainWindow_css{height:250px;overflow:hidden;border-bottom:1px;border-style:solid;border-bottom-color:#0241ff;display:inline-flex;flex-direction:column;overflow:hidden}") GM_addStyle("textarea{resize: none;width:100%;height:169px;overflow-x:hidden;border-left:0px;border-top:0px;border-right:0px;border-bottom:0px;color:#000000;background-color:#f9f9f9}")// } function css_black(){ color = "#4b4b4b" GM_addStyle(".set_list{width:50%;height:25px;display:inline-block;background-color:#363333;text-align:center;user-select:none;line-height:25px;cursor:pointer}") GM_addStyle(".set_item_list{height :25px;background-color:#4b4b4b;text-indent: 10px;;line-height:25px;cursor:pointer;font-size:13px;user-select: none") GM_addStyle(".MainWindow_css{height:250px;overflow:hidden;border-bottom:1px;border-style:solid;border-bottom-color:#ff00006e;display:inline-flex;flex-direction:column;overflow:hidden}") GM_addStyle("textarea{resize: none;width:100%;height:169px;overflow-x:hidden;border-left:0px;border-top:0px;border-right:0px;border-bottom:0px;color:#FFFFFF;background-color:#181818}")// } /////////////////////////////////////////////////language///////////////////////////////////// function language_(en,zh,jp) { switch (language) { case "en-US": return en case "zh-CN": return zh case "ja": return jp default: return en } } ////////////////////////////////////////////////////////////////////////////////////////////// launch() function launch() { let Y = document.createElement("div"); Y.innerHTML =' <span id = "Y" style="height: 24px;width: 24px;background: #0ff0;">◺</span> ' Y.title = language_("Turn on detailed settings and log(","打开详细设置和log","詳細設定とログを開く") Y.onclick = ()=>{ Set_() } const New_Chat_Frame = document.querySelector("#contents.yt-live-chat-renderer"); if (New_Chat_Frame){ switch (window.getComputedStyle(New_Chat_Frame, null)?.getPropertyValue('border-color')) { case "rgb(255, 255, 255)": css_black() color_ames="#ffffff" WTF_1 = "#303030" WTF_2 = "#202020" break; case "rgb(3, 3, 3)": css_white() color_ames="#000000" WTF_1 = "#d6d6d6" WTF_2 = "#eeeeee" break; } } Itemslist = document.querySelector("#items.yt-live-chat-item-list-renderer"); if (!Itemslist) return; const Important_Frame = document.createElement("div"); Important_Frame.id = "MainWindow"; Important_Frame.setAttribute("class","MainWindow_css"); const shion = document.createElement("div"); const shion_P1 = document.createElement("div"); const shion_P2 = document.createElement("div"); const Setting = document.createElement("div"); const Settinglist = document.createElement("div"); const SettingItem = document.createElement("div") const O_Item = document.createElement("div"); const shion_p = document.createElement("span"); const GetNewMes = document.createElement("input") const DellMes = document.createElement("input") O_Item.style.flexGrow="1"; O_Item.style.height = "175px"; Setting.id = "setting"; shion.id="state" shion.setAttribute("class","set_item_list") shion_p.id="tex" shion_P1.setAttribute("class","shion_P") shion_P1.style.width = "60%"; shion_P2.setAttribute("class","shion_P") Settinglist.id = "settinglist"; SettingItem.id = "settingitem"; GetNewMes.type = "button" GetNewMes.style.visibility = "hidden" DellMes.type = "button" DellMes.style.visibility = "hidden" DellMes.value = language_("Report","举报","報告") DellMes.title = language_("arrow key →","方向键 →","矢印キー →"); GetNewMes.title = language_("arrow key ←","方向键 ←","矢印キー ←"); shion_P2.appendChild(GetNewMes); shion_P2.appendChild(DellMes); for (let i=0;i<2;i++){ const set_List = document.createElement("div"); const set_Item_List = document.createElement("div"); const Title = document.createElement("span"); Title.setAttribute("class","Title_top"); set_List.setAttribute("class","set_list"); set_Item_List.setAttribute("class","set_item_list"); set_Item_List.style.display = "none"; switch (i) { case 0: set_List.id = "Input_Key_List"; set_Item_List.id = "Input_Key_Item"; set_Item_List.style.display = ""; Title.innerHTML = language_("Keys","关键词","キーワード") Title.id = "T1"; break; case 1: set_List.id = "gauging"; set_Item_List.id = "gauging_Item"; Title.innerHTML = language_("Comment","评论","コメント"); Title.id = "T2"; break; } Settinglist.appendChild(set_List); set_List.appendChild(Title); SettingItem.appendChild(set_Item_List); } shion_P1.appendChild(shion_p); shion.appendChild(shion_P1); shion.appendChild(shion_P2); Setting.appendChild(Settinglist); Setting.appendChild(SettingItem); Important_Frame.appendChild(Setting); Important_Frame.appendChild(shion); New_Chat_Frame.before(Important_Frame); const MainWindow = document.getElementById("MainWindow"); const self= document.querySelector("div#top")?.querySelector("yt-live-chat-author-chip") AutoR = document.createElement("div"); let my = self?.querySelector("#chat-badges") AutoR.style.cursor = "pointer" AutoR.style.fontSize="16px"; AutoR.innerText = "♲" AutoR.style.userSelect="none" AutoR.title = language_("Enable/disable automatic reporting","开启/关闭自动举报功能","自動レポートをオン/オフにする"); AutoR.onclick = (e)=>{ AutoReport=AutoReport?false:true AutoR.style.color=AutoReport?"aqua":"" } const Inputs = document.getElementById("Input_Key_Item"); const gauging_Item = document.getElementById("gauging_Item"); let Null_div = document.createElement("div"); Null_div.style.display = "none"; Inputs.style.display="none" gauging_Item.style.display="" const TItle_1= document.getElementById("Input_Key_List"); const TItle_2= document.getElementById("gauging"); const Report_key_mes = document.createElement("div"); const gauging_0 = document.createElement("div"); const gauging_1 = document.createElement("div"); const gauging_00 = document.createElement("span"); const gauging_01 = document.createElement("span"); const gauging_02 = document.createElement("span"); const gauging_10 = document.createElement("span"); const gauging_11 = document.createElement("span"); const gauging_12 = document.createElement("div"); const gauging_dell = document.createElement("input"); gauging_0 .style.display = "inline-block"; gauging_0.id = "Key_l" gauging_00.innerText = language_("Filter comment greater than:","过滤留言的字数:","コメントの長さ:"); gauging_01.innerText = Key_l gauging_01.setAttribute('contenteditable', 'true') gauging_01.addEventListener('keydown', function (e) {if(e.keyCode == 13)gauging_01.blur()}) gauging_0.style.textIndent="0px"; gauging_1.style.display = "inline-block"; gauging_1.id = "BBQ" gauging_10.innerText = language_("Consecutive Times:","连续次数:","連打回数:"); gauging_11.innerText = BBQ gauging_11.setAttribute('contenteditable', 'true') gauging_12.style.display = "inline-block"; gauging_12.style.visibility = "hidden" gauging_dell.setAttribute("type","checkbox"); gauging_dell.id = "ALL_Del" gauging_11.addEventListener('keydown', function (e) {if(e.keyCode == 13)gauging_11.blur()}) gauging_0.appendChild(gauging_00); gauging_0.appendChild(gauging_01); gauging_0.appendChild(gauging_02); gauging_1.appendChild(gauging_10); gauging_1.appendChild(gauging_11); gauging_12.appendChild(gauging_dell); gauging_Item.appendChild(gauging_0); gauging_Item.appendChild(gauging_1); gauging_Item.appendChild(gauging_12); MainWindow.appendChild(O_Item); const New_Chat = document.createElement("div"); const Keyword_Frame = document.createElement("div"); const Keyword_Frame_Textarea = document.createElement("textarea"); Keyword_Frame_Textarea.id = "keys" New_Chat.id = "new_div_chat"; Keyword_Frame.style.display = "none"; Keyword_Frame.id = "keyword_frame"; Keyword_Frame_Textarea.placeholder = language_("Paste keywords here and click Add","复制关键词到这后点添加","ここにキーワードを貼り付けて、[Add]をクリックします"); Keyword_Frame_Textarea.style.overflowY="scroll" Keyword_Frame_Textarea.style.overflowX="scroll" Keyword_Frame_Textarea.style.whiteSpace="pre" Keyword_Frame.appendChild(Keyword_Frame_Textarea); O_Item.appendChild(Keyword_Frame); O_Item.appendChild(New_Chat); const Add_Input_Key = document.createElement("input") Add_Input_Key.id = "add_i_key"; Add_Input_Key.type = "text"; Add_Input_Key.placeholder = language_("Enter keyword","输入单条关键词","キーワードを入力してください"); Add_Input_Key.maxlength = "500" Inputs.appendChild(Add_Input_Key) const Add_Button = document.createElement("input") Add_Button.type = "button" Add_Button.value = "Add" Add_Button.id = "add_b_key" Inputs.appendChild(Add_Button) const Del_Button = document.createElement("input") Del_Button.type = "button" Del_Button.value = "Delete" Del_Button.id = "delete_key" Inputs.appendChild(Del_Button) const Addrun = document.getElementById("overflow") const Re = document.createElement("input") Re.type = "button" Re.id = "on_off" Re.value = language_("Hide","Hide","Hide"); Addrun.before(Re) let counter = document.createElement("span") counter.id = "miko" counter.innerHTML = 0 let kanata = document.createElement("div") kanata.style.display="inline-block" let kanata_1 = document.createElement("div") kanata.style.cssText+="font-size:12px" Re.before(kanata) const rami_1 = document.createElement("span") rami_1.innerText="MSG:" kanata_1.appendChild(rami_1) kanata_1.appendChild(counter) kanata.appendChild(kanata_1) /////////////////////////Detailed settings ///////////////////////////////// let bo =document.querySelector("yt-live-chat-app") let TOP_div = document.createElement("div") TOP_div.id = "TOPdiv" TOP_div.style.position="absolute" TOP_div.style.background="rgba(33, 33, 33,0.92)" TOP_div.style.visibility="hidden" let IsTaKo = '<div style="height: 50px;">' + '<div style="color: rgb(255, 255, 255);text-align:right;padding-top: 5px;padding-right: 10px;">' + '<span id="Set_off" style="display: inline-block;cursor:pointer;width: 21px;height: 21px">×</span>' + '</div>' + '</div>' + '<div style="overflow-y: scroll;overflow-x: hidden;">' + '<div style="height: 30px;width: 100%;display: inline-flex">' + '<div class="ppts" style="width: 85%;">' + '<span>' + language_("Block Users", "屏蔽用户", "ユーザーをブロックする") + '</span>' + '</div>' + '<div class="ppts" style="width: 15%">' + '<input id="ISblock" disabled type="checkbox" ' + Isblock + '>' + '</div>' + '</div>' + '<div style="height: 30px;width: 100%;display: inline-flex">' + '<div class="ppts" style="width: 85%;"><span>' + language_("Replace chat comments", "替换聊天评论", "チャットコメントを置き換える") + '</span>' + '</div>' + '<div class="ppts" style="width: 15%">' + '<input id="ISreplace" type="checkbox" ' + Isreplace + '>' + '</div>' + '</div>' + '<div style="height: 30px;width: 100%;display: inline-flex">' + '<div class="ppts" style="width: 85%;">' + '<span>' + language_("Show Log", "输出log", "ログを表示") + '</span>' + '</div>' + '<div class="ppts" style="width: 15%">' + '<input id="Log_Show" type="checkbox">' + '</div>' + '</div>' + '</div>' + '<div style="width: 100%;height: 10px;background-color:#f9f9f947">' + '</div>' + '<div id="antetype_mes" style="display: none;border-bottom: 1px solid #666;border-top-width: 1px; border-left-width: 1px;border-left-style: solid;border-top-style: solid;">' + '<div style="display: inline-flex; width: 100%">' + '<div id="Log_Name" class="ppts" style="width: 85%;color:#ffffff"> =_________________________________=' + '</div>' + '<div id="antetype" class="ppts" style="width: 15%;display: none" >' + '<input id="Unblock" type="checkbox" >' + '</div>' + '</div>' + '<div id = "mes_log" class = "mes_log_class" style="display: none">' + '</div>' + '</div>' + '<div id = "AllLog" style=" border-bottom-width: 0px; width: 100%;height: 25px;background-color:#f9f9f930" >' + '<div class="ppts">' + language_("Sort type", "排序:", "ソートタイプ") + '<select id="Category_sort">' + '<option value="name">' + language_("Name", "名字", "名前")+ '</option>' + '<option value="name_abc">' + language_("First letter", "首字母", "頭文字") + '</option>' + '<option value="Mes_length">' + language_("Comment Word Count", "评论字数", "コメントの文字数") + '</option>' + '<option value="Blocked">' + language_("Blocked", "已屏蔽", "Blocked") + '</option>' + '</select>' + '</div>' + '<div id="Block_Logs" style="overflow-y: scroll;overflow-x: hidden;">' + '</div>' +'<div id = "Options" class="ppts">' +'<input id="up_" type="button" value="<" >' +'<input id ="page_" type="text" style=" width:35px" value = "1">' +'<input id="dow_" type="button" value=">" > ' +'<input id="max_"type="button" value="Max:1">' +' <input id="Untreated_"type="button" value=' + language_("Untreated", "未处理", "未処理") +' >' +' <input id ="isco" type="text" style=" width:20px" value = "'+doc+'">/Page' +'</div>' + '</div>' + '<div id="Dump" style="display:none">' + '</div>' TOP_div.innerHTML = IsTaKo bo.appendChild(TOP_div) document.querySelector("yt-icon-button#overflow").after(Y) document.querySelector("yt-icon-button#overflow").before(AutoR) let pro = document.createElement("div") pro.id = "Pro" pro.style.position="absolute" pro.style.background="rgba(0, 0, 0,0)" MainWindow.appendChild(pro) pro.innerHTML = '<div style="height: 235px;"></div><div id="PRO_1" class="pro" style="height: 15px;background:rgba(75,75,75,0.7)"></div>' /////////////////////function///////////////// function Report(mes,cdk,index){ Node_List[index].Isspam=true; Node_List[index].act = "Report" KeyItemList.some((item)=>{ let Key_On = new RegExp(item.regexp).test(cdk) if(Key_On)item.spam=true; return Key_On; }) shion_p.innerText=count() AutoReport&&Queue(mes,index) } function pekoname(name,mes_,Timer,index){ let repeat=index-BBQ for (let i = index,L = repeat<0?0:repeat;i>=L;i--){ if (Node_List[i].name_src == name &&i!=index&&Node_List[i].Isspam != true){ let cdk=Node_List[i].Message.trim() Report(Node_List[i].node,cdk,i) } } } function Getmes(){ if(BC>299){ for(let i = 299;i>=99;i--){ New_Chat.children[i].remove() BC-- } } for(let i=Node_List.length-1;i>=0;i--){ if (Node_List[i].Isspam===null){ index_dell=i break } } if (index_dell!=null){ Mod_dell = Node_List[index_dell].node let Item = document.createElement("div") Item.id = index_dell Item.innerText =Node_List[index_dell].Message Item.setAttribute("class","item_class"); Item.style.fontWeight="bold" Item.style.backgroundColor=BC%2==0?WTF_1:WTF_2 New_Chat.prepend(Item) BC++ GetNewMes.value = language_("Skip","跳过","スキップ") DellMes.style.visibility = "visible" Reset() }else{ Mes(language_("No Comment!","没有评论!","コメントなし!")) GetNewMes.style.visibility = "hidden" } } function Action(){ let cdk=Mod_dell.querySelector("#message").innerText.trim() KeyItemList.some((item)=>{ let Key_On = new RegExp(item.regexp).test(cdk) if(Key_On)item.spam=true; return Key_On; }) Node_List[index_dell].act = "Report" let first =New_Chat.firstElementChild first.style.textDecoration="line-through" first.style.fontWeight="normal" first.style.opacity = 0.5 Node_List[index_dell].Isspam = true; Queue(Mod_dell,index_dell) Mod_dell=null index_dell=null shion_p.innerText=count() if(Untreated){ Getmes() }else{ GetNewMes.style.visibility = "hidden" DellMes.style.visibility = "hidden" } } function skip(){ Mes(language_("Comment skipped","已跳过评论","スキップしました")) Node_List[index_dell].Isspam = false; New_Chat.firstElementChild.style.color="green" New_Chat.firstElementChild.style.fontWeight="normal" New_Chat.firstElementChild.style.opacity = 0.5 Mod_dell=null index_dell=null shion_p.innerText=count() if(Untreated){ Getmes() }else{ GetNewMes.style.visibility = "hidden" DellMes.style.visibility = "hidden" } } function Reset(){ clearTimeout(korone);korone=null korone=setTimeout(()=>{ if(!Untreated){ GetNewMes.style.visibility = "hidden" DellMes.style.visibility = "hidden" } if(index_dell===null)return; New_Chat.firstElementChild.remove() BC-- Mod_dell=null index_dell=null Getmes() },15000) } //===================================================onev=============================================================================== let up_ = document.getElementById("up_"); let max_ =document.getElementById("max_"); let page_= document.getElementById("page_"); let dow_ = document.getElementById("dow_"); let isco_ = document.getElementById("isco"); let Untreated_ = document.getElementById("Untreated_"); let Category = document.querySelector("#Category_sort") dow_.onclick = function(){ if(PageN<Math.ceil(Pageleng/PageMode)) PageN++ if(pages<Pageleng){ Page=Number(Page)+Number(PageMode); pages=Number(pages)+Number(PageMode) } page_.value = PageN Log_List(YMD,Page,pages) show_l() } up_.onclick = function(){ if(Page-PageMode>=0){ Page=Page-PageMode; pages=pages-PageMode; if(PageN>1) PageN-- } page_.value = PageN Log_List(YMD,Page,pages) show_l() } isco_.oninput = ()=>{ if(!isco_.value)return doc = isco_.value<1?5:Number(isco_.value) isco_.value = doc localStorage.setItem("doc",doc) PageMode = doc;pages = doc;Page=0;PageN = 1 page_.value=PageN Log_List(YMD,Page,pages) show_l() } page_.oninput = ()=>{ pages=doc if (page_.value<=Math.ceil(Pageleng/PageMode)){ if(page_.value<1)page_.value=1 pages = pages * page_.value }else{ page_.value = Math.ceil(Pageleng/PageMode) pages = pages * page_.value } Page=pages-PageMode let max =Math.ceil(Pageleng/PageMode) Log_List(YMD,Page,pages) show_l() } max_.onclick = function(){ PageMode = doc;pages=doc;Page=0;PageN = 1 let max =Math.ceil(Pageleng/PageMode) PageN = max pages = pages * max Page=pages-PageMode page_.value = PageN Log_List(YMD,Page,pages) show_l() } Untreated_.onclick = function(){ Node_Log_List = Node_List.filter((item)=>{ return (item.Isspam === null) }) if(!Node_Log_List.length)return; page_.value = 1 Category.selectedIndex=2 Category.disabled = true Untreated_.value = Untreated+ " " + language_("Untreated", "未处理", "未処理") Page= 0;pages=doc;PageN = 1 sort(false,"Mes_length",Node_Log_List) Log_List(Node_Log_List,Page,pages,"mes",false) show_l() } document.addEventListener('keyup', logKey); shion_p.innerText=count() function logKey(e) { switch (e.code) { case "ArrowRight": Mod_dell?Action():Getmes(); break; case "ArrowLeft": Mod_dell?skip():Getmes() } } Add_Button.onclick = function addkey() { let KeyItemList_="" if (Add_Input_Key.value != ""){ let cdk = Add_Input_Key.value.trim() KeyItemList.push({regexp:GetKey(cdk),proto:cdk,spam:true}) Add_Input_Key.value = "" }else if (Keyword_Frame_Textarea.value!=""){ KeyItemList=[] let Keylist=Keyword_Frame_Textarea.value.trim().split('\n') DellArray("",Keylist) Keylist=[...new Set(Keylist)] Keylist.forEach((cdk)=>{ KeyItemList.push({regexp:GetKey(cdk.trim()),proto:cdk.trim(),spam:true}) }) } DellArray("",KeyItemList) let ShowList = KeyItemList.filter((item)=>{ return item.spam }) for (let i=0,l=ShowList.length;i<l;i++){ KeyItemList_+=(i+1== l)?ShowList[i].proto:ShowList[i].proto+"\n"; } Keyword_Frame_Textarea.value = KeyItemList_ Del_Button.value = "Delete" } Del_Button.onclick = function () { KeyItemList = [] Del_Button.value = "Delete" Add_Input_Key.value = "" Keyword_Frame_Textarea.value = "" } GetNewMes.onclick = function () { Mod_dell?skip():Getmes() } DellMes.onclick = function () { Mod_dell&&Action() } Re.onclick = function () { switch (Re.value) { case "Hide": MainWindow.style.display = "none" Re.value = "View" break; case "View": MainWindow.style.display = "" Re.value = "Hide" } } Settinglist.onclick = function (e){ switch (e.target.id) { case "T1": if(Inputs.style.display="none" )Inputs.style.display=""; if (Inputs.style.display==""){ TItle_1.style.backgroundColor=color TItle_2.removeAttribute("style") gauging_Item.style.display = "none" New_Chat.style.display = "none" Report_key_mes.style.display = "none" Keyword_Frame.style.display = "" let KeyItemList_ = "" let ShowList = KeyItemList.filter((item)=>{ return item.spam }) for (let i=0,l=ShowList.length;i<l;i++){ KeyItemList_+=(i+1== l)?ShowList[i].proto:ShowList[i].proto+"\n"; } Keyword_Frame_Textarea.value = KeyItemList_ Del_Button.value = "Delete" } break; case "T2": if(gauging_Item.style.display="none")gauging_Item.style.display=""; if (gauging_Item.style.display==""){ TItle_1.removeAttribute("style") TItle_2.style.backgroundColor=color Inputs.style.display = "none" New_Chat.style.display = "" Report_key_mes.style.display = "none" Keyword_Frame.style.display = "none" } break; } } SettingItem.onclick =function(e){ if(e.target.nodeName=="SPAN"){ switch (e.target.parentNode.id) { case "Key_l": gauging_01.focus(); gauging_01.innerText= ""; break; case "BBQ": gauging_11.focus(); gauging_11.innerText= ""; } } } SettingItem.onmouseover = function(e){ if(e.target.nodeName=="SPAN"){ switch (e.target.parentNode.id) { case "Key_l": e.target.title = language_("Set a number greater than 10","设置大于10的数","10より大きい数を設定"); break; case "BBQ": e.target.title = language_("Set a number greater than 1 and less than 10","设置大于1小于10的数字","1より大きく10より小さい数値を設定して"); } } } gauging_01.onblur = ()=>{ let x=gauging_01.innerText let xx=parseInt(x) typeof xx=='number'&&x!=""&&!isNaN(xx)&&Math.abs(xx)>10?Key_l=Math.abs(xx):Key_l= Key_l gauging_01.innerText=Key_l localStorage.setItem("Key_l",Key_l) } gauging_11.onblur = ()=>{ let x=gauging_11.innerText let xx=parseInt(x) typeof xx=='number'&&x!=""&&!isNaN(xx)&&Math.abs(xx)>1?BBQ=Math.abs(xx):BBQ= BBQ gauging_11.innerText=BBQ localStorage.setItem("BBQ",BBQ) } const ALL_Del = document.getElementById("ALL_Del"); let del_all ALL_Del.onclick = ()=>{ del_all = ALL_Del.checked } //===================================================filter================================================================================ Yagoo = new MutationObserver((Guestbook) => { Guestbook.forEach(function (MessageList) { MessageList.addedNodes.forEach(function (node,Timer) { if (node.nodeName!="YT-LIVE-CHAT-TEXT-MESSAGE-RENDERER"||node.nodeName=="DIV")return; const Messages_EL = node.querySelector("#message"); const Tname = node.querySelector("#author-photo").querySelector("#img"); const Yname = node.querySelector("#author-name") const may = node.querySelector("#chip-badges").children.length; if (!Yname||!Messages_EL||may) return; let Tname_T = Tname.src,Tname_=Yname.innerText const Cdk = Messages_EL.innerText.trim() if(Cdk.replace(re, "").length < Key_l){Ch_m += 1;return} if (node.querySelector("#card") || node.querySelector(".member")) return; let Key_On = false,Peko = false let get_time =new Date().getSeconds() KeyItemList.length&&KeyItemList.some((item)=>{ Key_On = new RegExp(item.regexp).test(Cdk) if(Key_On)item.spam=true; return Key_On; }) Peko = Anemati.includes(Tname_T) !Key_On&&KeyItemList.push({regexp:GetKey(Cdk),proto:Cdk,spam:false}) Node_List.push({node:node,name:Tname_,name_src:Tname_T,index:Node_List_index,Isblock:false,Isspam:null,Message:Messages_EL.innerText,Time:get_time,interval:Ch_m,act:null}) if(Ame){ let zoo = document.createElement("span"); zoo.id = "ZOO" zoo.innerHTML = Zoo(); Messages_EL.style.visibility = "hidden" Messages_EL.before(zoo) } if (Peko||Key_On) { Report(node,Cdk,Node_List_index) } else { let a=Node_List.length-1,b=Node_List.length-1-BBQ,Iscar=0 for(let i=a,c=b<0?0:b;i>=c;i--){ if(Node_List[i].name_src==Tname_T) Iscar++ } if (Iscar>=BBQ&&Ch_m<=BBQ) { Anemati.push(Tname_T) Peko = true Report(node,Cdk,Node_List_index) pekoname(Tname_T,Cdk,Timer,Node_List_index) }else{ if(Mod_Runing&&del_all){ Node_List[Node_List_index].act = "Delete" Queue(node,Node_List_index) }else if(!Mod_dell){ GetNewMes.style.visibility = "visible" Getmes() } } } Ch_m=0;Node_List_index++ counter.innerText = Node_List_index shion_p.innerText=count() Untreated_.value =Untreated+ " " + language_("Untreated", "未处理", "未処理") }); }); }); Yagoo.observe(Itemslist, { childList: true, }); } //end// let sb = document.getElementById("send-button") let Set_off=document.getElementById("Set_off") let ISblock=document.getElementById("ISblock") let ISreplace=document.getElementById("ISreplace") let BlockLogs=document.querySelector("#Block_Logs") let LogShow=document.querySelector("#Log_Show") let Dump = document.querySelector("#Dump") let Category = document.querySelector("#Category_sort") let Report_key_mes= document.querySelector("#key_mes") let Report_SET_2_p=document.querySelector("#dad") let Coco=document.getElementById("antetype_mes"); const pro=document.getElementById("Pro") const pro_mes=document.getElementById("PRO_1") const MainWindow = document.getElementById("MainWindow"); const point=document.getElementById("state") const AllLog=document.querySelector("#AllLog") const max_=document.getElementById("max_") const Untreated_=document.getElementById("Untreated_") const shion_p=document.getElementById("tex") let TOPdiv=document.getElementById("TOPdiv") let Report_Menu_Fram,Dialogs_Confirm_Fram,Main_Menu_Fram,MenuOperationing=false,wi=MainWindow.clientWidth AllLog.style.visibility = "hidden" Kirara=ISblock.checked Ame = ISreplace.checked function Menu_Set() { let Menu_black = new MutationObserver((node) => { for (let item of node){ for (let op of item.addedNodes){ if (op.nodeName=="TP-YT-IRON-OVERLAY-BACKDROP")op.style.visibility = "hidden" } } }); Menu_black.observe(document.querySelector("body"), {childList: true,}); let Mumei =document.querySelector("yt-live-chat-app") let Menu_Set = new MutationObserver((node) => { for (let item of node){ for (let op of item.addedNodes){ switch (op?.children[0]?.nodeName) { case "YT-REPORT-FORM-MODAL-RENDERER": Report_Menu.disconnect() Report_Menu.observe(op,{attributeFilter:[ "style"],}) Report_Menu_report=op.querySelector("#submit-button") Report_Menu_Item=op.querySelector(".radio.style-scope.yt-options-renderer") Report_Menu_Fram = op break; case "YT-CONFIRM-DIALOG-RENDERER": Dialogs.disconnect() Dialogs.observe(op,{attributeFilter:[ "style"],}); Dialogs_Confirm=op.querySelector("#confirm-button") Dialogs_Confirm_Fram = op break; case "DIV": if(op?.children[0].children[0].nodeName!="YTD-MENU-POPUP-RENDERER") return Main_Menu.disconnect() Main_Menu.observe(op,{attributeFilter:[ "style"],}); Main_Menu_Box = op.querySelector("#items").children Main_Menu_Fram = op break; } } } }); Menu_Set.observe(Mumei, { childList: true, }); let Main_Menu = new MutationObserver((E) => { if(Achan===null)return if (Main_Menu_Fram.style.display=="none")return Main_Menu_Fram.style.display = "none" Node_List[Achan].Isspam = true; Node_List[Achan].node.querySelector("#message").style.opacity = 0.3 let Main_Menu_Click switch (Node_List[Achan].act){ case "Block": Main_Menu_Click= Main_Menu_Box[1] Mes(language_("User has been blocked","用户已屏蔽","ユーザーがブロックされました")) break; case "Unblock": Main_Menu_Click= Main_Menu_Box[1] Mes(language_("Unblocked","已解除封锁","ブロック解除")) Achan=null Main_Menu_Click&&Main_Menu_Click.children[0].children[0].click() return break; case "Report": Main_Menu_Click= Main_Menu_Box[0] Mes(language_("Comment has been reported","已举报评论","コメントが報告されました")) } if(window.getComputedStyle(Node_List[Achan].node.querySelector("#deleted-state"), null).getPropertyValue('display')!="none")return Achan=null Main_Menu_Click&&Main_Menu_Click.children[0].children[0].click() }); let Dialogs = new MutationObserver((E) => { if (Dialogs_Confirm_Fram.style.display=="none")return Dialogs_Confirm_Fram.style.display="none" Dialogs_Confirm.children[0].children[0].click(); }); let Report_Menu = new MutationObserver((E) => { if (Report_Menu_Fram.style.display=="none")return Report_Menu_Fram.style.display="none" Report_Menu_Item.click() Report_Menu_Item.setAttribute('class', 'radio style-scope yt-options-renderer iron-selected') Report_Menu_Item.setAttribute('aria-checked', 'true') Report_Menu_Item.setAttribute('aria-selected', 'true') Report_Menu_Item.setAttribute('checked', '') Report_Menu_Item.setAttribute('active', '') Report_Menu_Item.setAttribute('focused', '') Report_Menu_report.click(); }); } function DellArray(V,Array){ let Fubigi = []; for (let i= Array.length-1;i>=0;i--){ if(Array[i].proto==V){ Array.splice(i, 1) } } Array = Array.filter((item)=>{ let Na=Fubigi.includes(item.proto) !Na&&Fubigi.push(item) return !Na }) return Array } function GetKey(en) { en=en.replace(re, "") let items=Array.from(en,(x,i)=>".*"+x).join("") return items+".*" } pro.style.width=wi+"px"; pro.setAttribute('class', 'pro') pro.style.visibility = "hidden" TOPdiv.onmouseout = function(e){ let meslog if(e.target.id=="Log_Name"||e.target.id=="Log_Message"){ clearTimeout(korone);korone=null meslog = e.target.parentNode.nextElementSibling if (meslog.children.length){ if (meslog.style.display == ""){ setTimeout(()=>{ meslog.style.display="none" },10000) } }else{ e.target.style.background="" } } } TOPdiv.onmouseover =function(e){ let mes_log_div,meslog,I=0,ISBBQ = 0,LogN = [] switch (e.target.id) { case "Log_Name": meslog = e.target.parentNode.nextElementSibling meslog.innerHTML= "" ShowGO(e.target.parentNode.id,meslog,"Name") e.target.nextElementSibling.style.display="" clearTimeout(korone);korone=null korone=setTimeout(()=>{ meslog.style.display="" },400) break; case "Log_Message": meslog = e.target.parentNode.nextElementSibling meslog.innerHTML= "" ShowGO(e.target.innerText,meslog,"Mes") e.target.nextElementSibling.style.display="" clearTimeout(korone);korone=null korone=setTimeout(()=>{ meslog.style.display="" },400) } } TOPdiv.onclick=(e)=>{ let GTA,LogNames = [],logn,mes_log_div,meslog,E,ssd,max switch (e.target.id) { case "Set_off": TOPdiv.style.visibility="hidden"; AllLog.style.visibility = "hidden" Category.disabled = false Category.selectedIndex=0 document.getElementById("Untreated_").value =Untreated+ " " + language_("Untreated", "未处理", "未処理") BlockLogs.innerHTML=null LogShow.checked =false break; case "ISblock": Isblock = ISblock.checked?"checked":" " Kirara=ISblock.checked localStorage.setItem("IsBlock",Isblock) break; case "ISreplace": Isreplace = ISreplace.checked?"checked":" " Ame=ISreplace.checked localStorage.setItem("Isreplace",Isreplace) break; case "Log_Show": Node_Log_List= Node_List.filter((item)=>{ let Na = true if (item.Isspam&&!item.Isblock){ Na=LogNames.includes(item.name_src) !Na&&LogNames.push(item.name_src) } return !Na }) Gura =LogShow.checked Untreated_.value = Untreated+ " " + language_("Untreated", "未处理", "未処理") if(!Gura){ BlockLogs.innerHTML=null AllLog.style.visibility = "hidden" Category.selectedIndex=0 Category.disabled = false return } BlockLogs.style.height = "414px" AllLog.style.visibility = "visible" PageMode = doc;pages=doc;Page=0;PageN = 1 document.getElementById("page_").value = PageN Log_List(Node_Log_List,Page,pages,"name") show_l() BlockLogs.scrollTop=BlockLogs.scrollHeight break; case "IS__Block": Achan=Number(e.target.parentNode.id) GTA=Node_List[Achan] ssd = e.target.parentNode.previousElementSibling if(!GTA.Isblock){ Node_List.forEach((mes)=>{ if (GTA.name_src === mes.name_src){ let cdk=mes.Message.trim() KeyItemList.some((item)=>{ let Key_On = new RegExp(item.regexp).test(cdk) if(Key_On)item.spam=true; return Key_On; }) mes.Isspam=true mes.Isblock =true GTA.act = "Block" } }) }else{ Node_List.forEach((mes)=>{ if (Node_List[Achan].name_src === mes.name_src){ if(mes.Isblock)mes.Isblock = false GTA.act = "Unblock" } }) } if (ssd.id == "Log_Message")ssd.style.opacity=0.3 if (ssd.id == "Log_Message")e.target.disabled = true Queue(GTA.node,Achan) shion_p.innerText=count() Untreated_.value = Untreated+ " " + language_("Untreated", "未处理", "未処理") break; case "IS_All_Block": E=e.target.parentNode.parentNode.nextElementSibling ssd = e.target.parentNode.previousElementSibling for(let i = 0,L= E.children.length;i<L;i++){ let mes = Node_List[E.children[0].id] Node_List.forEach((node)=>{ if(node.name_src == mes.name_src)node.Isblock=true }) mes.act = "Block" Queue(mes.node,E.children[0].id) E.children[0].remove() } shion_p.innerText=count() ssd.style.opacity=0.3 e.target.disabled = true Untreated_.value = Untreated+ " " + language_("Untreated", "未处理", "未処理") } } function Mes(mes){ pro.style.visibility = "visible" pro_mes.innerHTML = mes if(prpr){ clearTimeout(prpr) prpr=null } prpr=setTimeout(()=>{ pro.style.visibility = "hidden" prpr=null },300) } document.querySelector("#Category_sort").onchange=()=>{ BlockLogs.style.height = "414px" BlockLogs.innerHTML=null PageMode = doc;pages=doc;Page=0;PageN = 1 let Selector = document.querySelector("#Category_sort").value if(Selector == "Mes_length"){ let LogMes = [] Node_Log_List = Node_List.filter((item)=>{ let Na = true if(item.Isspam&&!item.Isblock){ Na=LogMes.includes(item.Message) !Na&&LogMes.push(item.Message) } return !Na }) sort(false,Selector,Node_Log_List) Log_List(Node_Log_List,Page,pages,"mes",true) show_l() }else if(document.querySelector("#Category_sort").value == "Blocked"){ let Na = true,LogNames= [] Node_Log_List=Node_List.filter((item)=>{ Na = true if (item.Isblock){ Na=LogNames.includes(item.name_src) !Na&&LogNames.push(item.name_src) } return !Na }) Log_List(Node_Log_List,Page,pages,"name") show_l() }else{ let LogNames= [] Node_Log_List = Node_List.filter((item)=>{ let Na = true if (item.Isspam){ Na=LogNames.includes(item.name_src) !Na&&LogNames.push(item.name_src) } return !Na }) sort(false,Selector,Node_Log_List) Log_List(Node_Log_List,Page,pages,"name") show_l() } document.querySelector("#page_").value = 1 BlockLogs.scrollTop=BlockLogs.scrollHeight } function Log_List(Log_ty,Page,pages,Name,Is_a_d){ BlockLogs.innerHTML=null let Fragment = document.createDocumentFragment(),BB=0 if(Name)YMD_Type = Name; YMD = Log_ty; Pageleng = Log_ty.length for(let i = Page;i<pages;i++){ let div = Coco.cloneNode(true); let ms_item_list=div.querySelector("#mes_log") if(!Log_ty[i])break; div.querySelector("#antetype").parentNode.id = Log_ty[i].name_src div.querySelector("#antetype").id= Log_ty[i].index div.style.backgroundColor=BB%2==0?WTF_1:WTF_2 let logn=div.querySelector("#Log_Name") logn.innerText = Log_ty[i].name; if (YMD_Type=="mes"){ logn.id = "Log_Message" logn.innerText = Log_ty[i].Message } let input =div.querySelector("#Unblock") input.title = language_("Unblock or block users","解除或屏蔽用户","ユーザーのブロックを解除またはブロックする") Is_a_d?input.id="IS_All_Block":input.id="IS__Block" if(!Is_a_d&&Log_ty[i].Isblock&&YMD_Type=="mes"){ div.querySelector("#IS__Block").setAttribute('checked', ''); input.disabled = true div.style.opacity=0.3 }else if(Is_a_d&&Is_a_d&&Log_ty[i].Isblock&&YMD_Type=="mes"){ div.querySelector("#IS__Block").setAttribute('checked', ''); input.disabled = true div.style.opacity=0.3 } else if(Log_ty[i].Isblock){ div.querySelector("#IS__Block").setAttribute('checked', ''); } div.style.display = ""; BB++ Fragment.appendChild(div) } shion_p.innerText=count() Untreated_.value =Untreated+ " " + language_("Untreated", "未处理", "未処理") BlockLogs.appendChild(Fragment) max_.value = "Max:"+ Math.ceil(Pageleng/PageMode) BlockLogs.scrollTop=BlockLogs.scrollHeight } function show_l(){ for(let i = 0 ,I=BlockLogs.children.length;i<I;i++){ let it = YMD_Type=="mes" ? BlockLogs.children[i].querySelector("#Log_Message").innerText:BlockLogs.children[i]?.querySelector("#Log_Name")?.parentNode?.id let name = YMD_Type=="mes" ? "Mes":"Name" let add=BlockLogs.children[i].querySelector("#mes_log") ShowGO(it,add,name) add.previousElementSibling.children[1].style.display="" add.style.display="" } } function ShowGO(it,add,name){ let LogN =[] if(name=="Name"){ Node_List.forEach((mes,i)=>{ if(mes.Isspam&&mes.name_src===it){ let Na=LogN.includes(mes.Message) !Na&&LogN.push(mes.Message) if(Na)return; let mes_log_div = document.createElement("div"); mes_log_div.innerText = mes.Message if(mes.interval<2)add.parentNode.style.background="rgba(255, 218, 74, 0.2) " add.appendChild(mes_log_div) } }) }else if(name=="Mes"){ Node_List.forEach((mes,i)=>{ if(!mes.Isblock&&it === mes.Message){ let Na=LogN.includes(mes.name_src) !Na&&LogN.push(mes.name_src) if(Na)return; let mes_log_div = document.createElement("div"); mes_log_div.innerText = mes.name mes_log_div.id = mes.index if(mes.interval<2)add.parentNode.style.background="rgba(255, 218, 74, 0.2) " add.appendChild(mes_log_div) } }) }else{ } } function count(){ Untreated = 0;Spam = 0; Normal = 0 for (let i =0,L=Node_List.length;i<L;i++ ){ if(Node_List[i].Isspam ===null){ Untreated++ }else if(Node_List[i].Isspam){ Spam++ }else if(!Node_List[i].Isspam){ Normal++ } } return "Spam:"+Spam+" |Normal:"+ Normal + " |Untreated:"+ Untreated } function sort(Sort,type,arr){ arr.sort((a,b)=>{ let x, y switch (type) { case "name": x = a.name.length y = b.name.length break case "Mes_length": x = a.Message.length y = b.Message.length break case "name_abc": x = a.name.toLowerCase() y = b.name.toLowerCase() } if (x < y) return Sort?-1:1 if (x > y) return Sort?1:-1 return 0; }) } function Set_(){ let wi=window.innerWidth let hi=window.innerHeight-169; TOPdiv.style.width=wi+"px"; TOPdiv.style.height=hi+"px"; TOPdiv.style.visibility = "visible" } function Zoo(){ let zoo=["にゃん","モグ","ワン","パチ","ピカ","ガオ"] let i=Math.floor(Math.random()*6) let b=zoo[i]+zoo[i] for(let n=0;n<=Math.floor(Math.random()*2);n++){ b+=zoo[i] } return b } function Queue(mes,index){ if(mes){ Del_List.push({node:mes,index:index}) !Deleting&&Queue() }else{ Delet_mes = Del_List.pop() Achan = Delet_mes.index if(!document.body.contains(Node_List[Achan].node))Dump.appendChild(Node_List[Achan].node) Delet_mes.node.querySelector("#button.yt-icon-button").click() Deleting = setTimeout(()=>{ Del_List.length?Queue():Deleting=null },Delete_interval) } } const nullll = GM_registerMenuCommand("┏━━━━━━━━━━━━━━━━━━━━┓", () => { }); const AR = GM_registerMenuCommand("AutoReport", () => { AutoReport=AutoReport?false:true }); const nullll1 = GM_registerMenuCommand("┣━━━━━━━━━━━━━━━━━━━━┫", () => { }); const Start = GM_registerMenuCommand(language_("Click this to restart after Top chat/Live chat","切换重要/实时聊天后单击这里重启","上位チャット/チャット変更後にクリックして再起動"), () => { if(!(document.body.contains(Itemslist))){ Itemslist = document.querySelector("#items.yt-live-chat-item-list-renderer"); Yagoo.observe(Itemslist, { childList: true, }) } }); const nullll11 = GM_registerMenuCommand("┗━━━━━━━━━━━━━━━━━━━━┛", () => { }); Menu_Set() })();
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址