您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
贵物班友会(bgm.tv、bangumi.tv、chii.in)
当前为
// ==UserScript== // @name 贵物班友会 // @namespace http://tampermonkey.net/ // @version 2.0.0 // @description 贵物班友会(bgm.tv、bangumi.tv、chii.in) // @author 老悠 // @include https://bgm.tv/* // @include https://bangumi.tv/* // @match https://chii.in/* // @grant GM_addStyle // @grant GM_getResourceText // @license MIT // ==/UserScript== (function() { 'use strict'; GM_addStyle('.dialog { width: 100%; height: 100vh; background-color: rgba(0, 0, 0, 0.5); position: absolute; top: 0; left: 0;line-height: 30px; display: none; } .dialog .container {width: 220px;height: 100px; background-color: #fff;margin: calc((100vh - 100px)/2) auto; position: relative;} .dialog .container .dialog_footer { position: absolute; bottom: 0; } .dialog .container .dialog_footer button {position: relative;left: 50px;display: inline-block;width: 50px;bottom: 10px;} .monster-tooltip {display: none;position: absolute;background-color: #f9f9f9;border: 1px solid #ccc;padding: 5px 10px;border-radius: 5px;font-size: 14px;}') $.ajaxSettings.async = false; let yodbUrl="https://ly.syaro.io:380/yodb/api/"; //let yodbUrl="http://192.168.224.134:8080/yodb/"; let myBgmId; let myBgmId2; $.get("https://bgm.tv/home",function(html,status){ let $html=$(html); let $avatar=$html.find("#headerProfile .avatar:first"); let bgImgSplit=$avatar.html().split(".jpg")[0].split("/"); let split=$avatar.prop("href").split("/"); myBgmId=split[split.length-1]; myBgmId2=bgImgSplit[bgImgSplit.length-1]; }); $.ajaxSettings.async = true; let modalHtml='<div id="markModal" class="dialog">' +' <div class="container">' +' <div class="dialog_header">' +' </div>' +' <div class="dialog_center">' +' 颜色:<input id="markColor" type="text" list="colors">' +'<datalist id="colors">' +'<option value="red">' +'<option value="yellow">' +'<option value="blue">' +'<option value="green">' +'</datalist>' +'<br>' +' 备注:<input id="markMark" type="text" ><br>' +' </div>' +' <div style="justify-content: center;display: flex;margin-top:10px;">' +' <button class="cancel">取消</button>' +' <button class="submit">确定</button>' +' </div>' +' </div>' +' </div>'; let modalHtml2='<div id="markModal" class="dialog">' +' <div class="container" style="height:220px">' +' <div class="dialog_header">' +' </div>' +' <div class="dialog_center">' +' bgmId:<input id="markBgmId" type="text" style="width:140px" disabled>' +'<br>' +' 名称:<input id="markName" type="text" style="width:150px">' +'<br>' +' 淳朴度:<input id="markScore" max="5" min="-5" type="number" style="width:138px">' +'<br>' +' 简介:<textarea id="markCont" type="text" style="width:150px;white-space:pre-wrap" rows="5"></textarea><br>' +' </div>' +' <div style="justify-content: center;display: flex;margin-top:10px;">' +' <button class="cancel">取消</button>' +' <button class="submit">确定</button>' +' </div>' +' </div>' +' </div>'; $('body').append(modalHtml2); let initModalVal=function(){ let ava=$("#headerProfile a.avatar"); if(!ava){ return; } let hrefVal=ava.attr("href"); if(!hrefVal){ return; } let newBgmId; let oldBgmId; if(hrefVal.indexOf("/user/")>-1){ let split=hrefVal.split("/"); newBgmId=split[split.length-1]; let imgUrl=ava.find("span").css("background-image"); if(imgUrl){ let oldSplit=imgUrl.split("/"); let oldTempSplit=oldSplit[oldSplit.length-1].split("."); oldBgmId=oldTempSplit[0]; //没有头像无法获得原始bgmId if(oldBgmId=='icon'){ oldBgmId=newBgmId; } } } $("#markBgmId").val(newBgmId); $.get(yodbUrl+'anon/vulgar/monsterScore/detailByBgmId/'+newBgmId+"?newMyBgmId="+myBgmId+"&oldMyBgmId="+myBgmId2, function(res){ if(!res||!res.data){ if(newBgmId!=oldBgmId){ $.get(yodbUrl+'anon/vulgar/monsterScore/detailByBgmId/'+oldBgmId+"?newMyBgmId="+myBgmId+"&oldMyBgmId="+myBgmId2, function(res){ setModalVal(res.data); }); } }else{ setModalVal(res.data); } }); } let setModalVal=function(modalData){ console.log(modalData) $("#markBgmId").val(modalData.monster.bgmId); $("#markName").val(modalData.name); $("#markScore").val(modalData.score); $("#markCont").text(modalData.cont); } initModalVal(); let marksModalHtml='<div id="marksModal" class="dialog">' +' <div class="container" style="height: 500px;width: 500px;margin: calc((100vh - 500px)/2) auto;">' +' <div class="dialog_header">' +' </div>' +' <div class="dialog_center">' +' <div style="justify-content: center;display: flex;">' +' 全量傻逼备注JSON:<br>' +' </div>' +' <div style="justify-content: center;display: flex;">' +' <textarea id="userMark" type="text" style="width:90%;height:420px;"/><br>' +' </div>' +' </div>' +' <div style="justify-content: center;display: flex;margin-top:10px;">' +' <button class="cancel">取消</button>' +' <button class="submit">确定</button>' +' </div>' +' </div>' +' </div>'; // $('body').append(marksModalHtml); let tooltipHtml='<div class="monster-tooltip" id="monsterTooltip">无信息</div>'; $('body').append(tooltipHtml); $(document).on("mouseenter",".monsterTipBtn",function(e){ var tooltip = $('#monsterTooltip'); let tempBgmId=$(this).attr("bgmId"); let tempMonster=monsterMap[tempBgmId].data; let tempMyMonster=myMonsterMap[tempBgmId].data; let tempHtml=''; console.log("tempMyMonster",tempMyMonster) if(tempMyMonster){ tempMyMonster.color=getColor(tempMyMonster.score); tempHtml+= '私有标记:<br><span style="color:'+tempMyMonster.color+'">贵物:'+tempMyMonster.name+'</span>'+"<br>" +'<span style="color:'+tempMyMonster.color+'">淳朴度:'+tempMyMonster.score+'</span><br>' +'<span style="color:'+tempMyMonster.color+'">简介:</span><br>' +'<span style="white-space: pre;color:'+tempMyMonster.color+'">'+(tempMyMonster.cont?tempMyMonster.cont:'无')+'</span>'; } if(tempMonster&&tempMonster.name){ if(tempHtml.length>0){ tempHtml+='<br><br>'; } tempHtml+= '公共标记:<br><span style="color:'+tempMonster.color+'">贵物:'+tempMonster.name+'</span>'+"<br>" +'<span style="color:'+tempMonster.color+'">淳朴度:'+tempMonster.score+'</span><br>' +'<span style="color:'+tempMonster.color+'">简介:</span><br>' +'<span style="white-space: pre;color:'+tempMonster.color+'">'+(tempMonster.cont?tempMonster.cont:'无')+'</span>'; } if(tempHtml.length>0){ $("#monsterTooltip").html(tempHtml); } tooltip.css({ top: e.pageY + 'px', left: e.pageX + 'px', display: 'block' }); }); $(document).on("mouseenter",".cliqueTipBtn",function(e){ var tooltip = $('#monsterTooltip'); let tempCliqueId=$(this).attr("cliqueId"); let tempClique=cliqueMap[tempCliqueId]; let color=getColor(tempClique.score); let tempHtml= '<span style="color:'+color+'">小圈子:'+tempClique.name+'</span>'+"<br>" +'<span style="color:'+color+'">淳朴度:'+tempClique.score+'</span><br>' +'<span>简介:</span><br>' +'<span style="white-space: pre;">'+(tempClique.cont?tempClique.cont:'无')+'</span>'; $("#monsterTooltip").html(tempHtml); tooltip.css({ top: e.pageY + 'px', left: e.pageX + 'px', display: 'block' }); }); $(document).on("mouseleave",".monsterTipBtn,.cliqueTipBtn",function(e){ $('#monsterTooltip').hide(); }); //$("#headerProfile").find("div.actions").append('<a id="addMark" href="javascript:void(0)" class="chiiBtn" data-toggle="modal" data-target="#markModal"><span>添加/修改备注</span></a>' // +'<a id="addMarks" href="javascript:void(0)" class="chiiBtn" data-toggle="modal" data-target="#marksModal"><span>批量添加/修改备注</span></a>'); $("#headerProfile").find("div.actions").append('<a id="addMark" href="javascript:void(0)" class="chiiBtn" data-toggle="modal" data-target="#markModal"><span>添加/修改备注</span></a>'); let id1=$("#headerProfile").find("div.name small.grey").text().replace("@",""); let userMark=localStorage.getItem('userMark'); if(!userMark){ userMark={}; }else{ try{ userMark=JSON.parse(userMark); } catch(e){ userMark={}; } } $("#addMark").click(function(){ $('#markModal').show(1000); }); $("#addMarks").click(function(){ $("#userMark").val(JSON.stringify(userMark)); $('#marksModal').show(1000); }); // 确定按钮的操作 $('#markModal .submit').click(function () { //userMark[id1]={"color":$("#markColor").val(),"mark":$("#markMark").val()}; //let json=JSON.stringify(userMark); //localStorage.setItem('userMark', json, { expires: 999999999 }); //{"newMyBgmId":myBgmId,"oldMyBgmId":myBgmId2,"name":$("#markName").val(),"score":$("#markScore").val(),"cont":$("#markCont").text()} //$.post(yodbUrl+'anon/vulgar/monsterScore/save/'+$("#markBgmId").val()+"?newMyBgmId="+myBgmId+"&oldMyBgmId="+myBgmId2+"&name="+$("#markName").val()+"&score="+$("#markScore").val()+"&cont="+$("#markCont").val(), // function(res){ $.post(yodbUrl+'anon/vulgar/monsterScore/save/'+$("#markBgmId").val(), {"newMyBgmId":myBgmId,"oldMyBgmId":myBgmId2,"name":$("#markName").val(),"score":$("#markScore").val(),"cont":$("#markCont").val()}, function(res){ console.log(res) if(!res.success){ alert(res.message+"\n"+"未在https://ly.syaro.io:380/注册并绑定bgmId无法使用私有标记功能"); }else{ $('#markModal').fadeToggle(1000); location.reload(); } }); }); // 取消按钮的操作 $('#markModal .cancel').click(function () { $('#markModal').hide(1000) }); // 批量模态框确定按钮的操作 $('#marksModal .submit').click(function () { let json=$("#userMark").val(); localStorage.setItem('userMark', json, { expires: 999999999 }); $('#marksModal').fadeToggle(1000); location.reload(); }); // 批量模态框取消按钮的操作 $('#marksModal .cancel').click(function () { $('#marksModal').hide(1000) }); var url = window.location.href; var urlstr = url.split("/"); var urls = ''; if (urlstr[2]) { urls = urlstr[0]+'//'+urlstr[2]; } // 外部标记初始化 let initVulgar=function(){ let len=$("a.avatar").length; for(let i=0;i<len;i++){ let ava=$("a.avatar").eq(i); let hrefVal=ava.attr("href"); if(hrefVal.indexOf("/user/")==-1){ continue; } let split=hrefVal.split("/"); let newIndex=split[split.length-1]; let imgUrl=ava.find("span").css("background-image"); if(!imgUrl){ continue; } let oldSplit=imgUrl.split("/"); let oldTempSplit=oldSplit[oldSplit.length-1].split("."); let index=oldTempSplit[0]; //没有头像无法获得原始bgmId if(index=='icon'){ index=newIndex; } initMonster(index,newIndex); } } let setMonsterHtml=function(monster,myMonster,bgmId,newBgmId){ let $user2=$("a[href='/user/"+newBgmId+"']:not(.avatar,.focus,.monster)"); let $$user2=$("a[href='"+urls+"/user/"+bgmId+"']:not(.avatar,.focus,.monster)"); if(monster){ let monsterHtml=getMonsterHtml(monster,myMonster,newBgmId); if($user2.length> 0){ if(monster.color){ $user2.css({"color":monster.color}); } $user2.addClass("monster"); $user2.after(monsterHtml); } if($$user2.length> 0){ if(monster.color){ $$user2.css({"color":monster.color}); } $user2.addClass("monster"); $$user2.after(monsterHtml); } } } let getColor=function(score){ let color="black"; if(score==-4||score==-5){ color="red"; }else if(score==-3||score==-2){ color="hotPink"; }else if(score==-1){ color="lightPink"; }else if(score==0){ color="black"; }else if(score==1){ color="lightGreen"; }else if(score==2||score==3){ color="lawnGreen"; }else if(score==4||score==5){ color="green"; } return color; } let getMonsterHtml=function(monster,myMonster,newBgmId){ if(monster){ if(!monster.score){ monster.score=0; } let nameColor=getColor(monster.score); monster.color=nameColor; let type=""; if(monster.type.field=="SLAVE"){ type=",主号:"; if(monster.masterId){ type+='<a href="/user/'+monster.master.bgmId+'">'+monster.master.name+'</a>'; }else{ type+="未知"; } } let mcs=""; if(monster.mcs&&monster.mcs.length>0){ mcs=' '; let high=''; let middle=''; let low=''; let unknown=''; for(let i=0;i<monster.mcs.length;i++){ let mc=monster.mcs[i]; cliqueMap[mc.clique.id]=mc.clique; let mCStatus=''; if(mc.mCStatus.field=="JOIN"){ }else if(mc.mCStatus.field=='SUS_JOIN'){ mCStatus='疑似'; }else{ continue; } if(mc.level.field=='HIGH'){ high+='<span style="color:red" class="cliqueTipBtn" cliqueId="'+mc.clique.id+'">'+mCStatus+'【'+mc.clique.name+'】高级成员</span>,'; }else if(mc.level.field=='MIDDLE'){ middle+='<span style="color:hotPink" class="cliqueTipBtn" cliqueId="'+mc.clique.id+'">'+mCStatus+'【'+mc.clique.name+'】中级成员</span>,'; }else if(mc.level.field=='LOW'){ low+='<span style="color:lightPink" class="cliqueTipBtn" cliqueId="'+mc.clique.id+'">'+mCStatus+'【'+mc.clique.name+'】低级成员</span>,'; }else if(mc.level.field=='UNKNOWN'){ unknown+='<span style="color:black" class="cliqueTipBtn" cliqueId="'+mc.clique.id+'">'+mCStatus+'【'+mc.clique.name+'】成员</span>,'; } } mcs+=high+middle+low+unknown; mcs=mcs.substring(0, mcs.length - 1); } let name=monster.name; if(!name){ if(!myMonster||!myMonster.name){ return ''; } name=myMonster.name+'[暂无公共标记]'; } return '<span style="color:'+nameColor+'" class="monsterTipBtn" bgmId="'+monster.bgmId+'">('+name+type+')</span>'+mcs+' '; }else{ return ""; } } let monsterMap={}; let myMonsterMap={}; let cliqueMap={}; let initMonster=function(bgmId,newBgmId){ if(!bgmId||!newBgmId){ return; } let monster=monsterMap[newBgmId]; if(!monster){ monsterMap[newBgmId]={data:null}; $.get(yodbUrl+'anon/vulgar/monster/vo/detailByBgmId/'+bgmId, function(res){ if(!res||!res.data){ if(newBgmId!=bgmId){ $.get(yodbUrl+'anon/vulgar/monster/vo/detailByBgmId/'+newBgmId, function(res){ monsterMap[newBgmId]=res; initMyMonster(res.data,bgmId,newBgmId); }); } }else{ monsterMap[newBgmId]=res; initMyMonster(res.data,bgmId,newBgmId); } }); } } let initMyMonster=function(monsterData,bgmId,newBgmId){ let myMonster=myMonsterMap[newBgmId]; if(!myMonster){ myMonsterMap[newBgmId]={data:null}; $.get(yodbUrl+'anon/vulgar/monsterScore/detailByBgmId/'+bgmId+"?newMyBgmId="+myBgmId+"&oldMyBgmId="+myBgmId2, function(res){ if(!res||!res.data){ if(newBgmId!=bgmId){ $.get(yodbUrl+'anon/vulgar/monsterScore/detailByBgmId/'+newBgmId+"?newMyBgmId="+myBgmId+"&oldMyBgmId="+myBgmId2, function(res){ myMonsterMap[newBgmId]=res; setMonsterHtml(monsterData,res.data,bgmId,newBgmId); }); }else{ setMonsterHtml(monsterData,res.data,bgmId,newBgmId); } }else{ myMonsterMap[newBgmId]=res; setMonsterHtml(monsterData,res.data,bgmId,newBgmId); } }); } } async function executeAsyncTask() { await initVulgar(); } executeAsyncTask(); })();