您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
增强论坛用户体验
// ==UserScript== // @name bbs7070增强开发版 // @namespace https://bbs7070.com/ // @version 1.3 // @description 增强论坛用户体验 // @author viewtheard // @license GPL-3.0 // @match https://qq9090.com/thread-* // @match https://yy9090.top/thread-* // @match https://yy7070.top/thread-* // @match https://bbs7070.net/thread-* // @match https://bbs7070.com/thread-* // @match https://154.17.228.98/thread-* // @icon https://www.google.com/s2/favicons?sz=64&domain=bbs7070.com // @grant GM_addStyle // @grant GM_deleteValue // @grant GM_setValue // @grant GM_getValue // ==/UserScript== // ==== Tips ===== // 建议搭配使用我的stylus里的bbs7070绿色版获得最佳体验 // https://userstyles.world/style/7069/bbs7070 // 您自行修改的代码会在更新的时候被覆盖,建议您备份您修改的内容 // 遇到问题请立即反馈 // === 更新日志 === // 2025.6.4 - 1.3 // 增加了多个域名支持。 // 修正了简讯窗口未加载标记为蓝色用户的bug。 // === 更新日志 === // 2025.6.4 - 1.2 // 修正了论坛更新后脚本失效的问题。 // === 更新日志 === // 2022.12.21 - 1.1 // 1、完善简约统计模式,给各类用户做颜色分类标识 // 2、修复快速查看帖子未生效的bug // 2022.11.16 - 1.0 // 提供了3大功能: // 1、登录(不可用)用户(就是你)的头像会增加图形边框装饰。 // 2、指定用户的头像提供模糊处理的能力。 // 3、主题贴进行回复统计的功能。对三大类用户(红[模糊处理的用户], // 蓝[未做处理的用户],绿[我])提供了两种模式,一种是简约模式(对3 // 类用户回复数的最多人的统计),另一种是完整统计。 // ================ 'use strict'; var statisticsSwitch=false; //查找身份 var o=document.getElementsByClassName("vwmy")[0]; var k=o.children[0]; var myHref=k.href;//https://bbs7070.com/home.php?mod=space&uid=9795 //var myShortHref=myHref.substr(19,myHref.length); var lastSlashIndex = myHref.lastIndexOf('/'); var myShortHref = lastSlashIndex !== -1 ? myHref.substr(lastSlashIndex + 1) : ''; var mysHref=[].concat(myShortHref); console.log(myShortHref);//home.php?mod=space&uid=9795 //给自己头像加装饰边框 var myImg=document.querySelector("#um .avt.y.t9_img_360 img"); myImg.style.borderImage="url(https://www.w3school.com.cn/i/css/border.png) 11 round" ; //获取楼层中的某个用户名 var storeyUser=document.getElementsByClassName(".xw1"); //获取总楼层 var totalStorey; totalStorey=document.querySelectorAll(".pls.t9_pls .authi"); console.log("总楼层数是"+totalStorey.length); //初始化总楼层超链接集合 var totalStoreyA; totalStoreyA=document.querySelectorAll(".pls.t9_pls .authi a"); var shortTotalStoreyURL; var sTotalStoreyURL=[]; let storeyUsers=[]; let UserAssembly; //读取存储的统计图状态 if(GM_getValue('saveStatisticsSwitch')) { statisticsSwitch=GM_getValue('saveStatisticsSwitch'); } //读取存储的用户名 if(GM_getValue('saveStoreyUsers')) { storeyUsers=GM_getValue('saveStoreyUsers'); } let i; let mynum=0; //处理头像 function handleImage(){ let btnID=document alert("点击了handleImage!"); console.log('点击了按钮'); } for (i = 0; i < totalStorey.length; i++) { //获得总楼层url集合 let totalStoreyURL=totalStoreyA[i].href; //shortTotalStoreyURL=totalStoreyURL.substr(19,totalStoreyURL.length); let lastSlashIndex = totalStoreyURL.lastIndexOf('/'); let shortTotalStoreyURL = lastSlashIndex !== -1 ? totalStoreyURL.substr(lastSlashIndex + 1) : ''; sTotalStoreyURL.push(shortTotalStoreyURL); //console.log(shortTotalStoreyURL); //生成按钮 let btn=document.createElement('button'); btn.innerText='模糊'; btn.setAttribute('class','hideBtn'+i); //注入样式 let style=document.createElement('style'); style.innerText='.hideBtn'+i+'{border:1px solid #FFEBCD;height:20px;padding:0px;}'; btn.appendChild(style); //document.querySelectorAll(".pls.t9_pls .authi")[i].appendChild(btn); //插入按钮的位置 let insertPlace=document.querySelectorAll(".pls.t9_pls .xl.xl2.o.cl")[i]; if (insertPlace!=null) { insertPlace.appendChild(btn); document.querySelector('.hideBtn'+i).addEventListener('click', (el)=>{ let storeyUsername=el.srcElement.parentNode.parentNode.querySelector(".xw1").text; let storeyUserlink=el.srcElement.parentNode.parentNode.querySelector(".xw1").href; //let shortUserlink=storeyUserlink.substr(19,storeyUserlink.length); let lastSlashIndex = storeyUserlink.lastIndexOf('/'); let shortUserlink = lastSlashIndex !== -1 ? storeyUserlink.substr(lastSlashIndex + 1) : ''; let storeyUserImg=el.srcElement.parentNode.parentNode.querySelector(".avtm>img"); //获取点击楼层的头像 //alert(storeyUserImg); console.log(storeyUserImg); //为楼层的头像注入样式 //filter: grayscale(90%);-webkit-filter: grayscale(90%);-moz-filter: grayscale(90%);-ms-filter: grayscale(90%);-o-filter: grayscale(90%);filter: progid:DXImageTransform.Microsoft.BasicImage(grayscale=0.9);-webkit-filter: grayscale(0.9); //检查是否保存过 var isSave=new Boolean(false); for(let j = 0; j < storeyUsers.length; j++) { if (storeyUsers[j]==shortUserlink) { isSave=true; storeyUserImg.style.filter="blur(0px)"; //去掉点击的项目 storeyUsers.splice(j,1); console.log('保存过'); //console.log(storeyUsers); break; } } if(isSave==false) { //保存楼层用户数组 storeyUserImg.style.filter="blur(10px)"; storeyUsers.push(shortUserlink); } //存储短链接 GM_setValue('saveStoreyUsers',storeyUsers); console.log(storeyUserImg.parentNode); //获取点击的楼层用户名 console.log(storeyUsername); //获取点击的楼层用户个人空间超链接 console.log(storeyUserlink); //alert(el.srcElement.parentNode.parentNode.id); console.log(el.target); console.log(el.target.className); //获取点击的楼层用户ID console.log(el.srcElement.parentNode.parentNode); }) } else { mynum++;//获取我回复的数量 console.log('不能插入按钮'+i); } } console.log('我回复了:'+mynum+'次'); //处理我回复楼层的头像边框 let myStoreys; for(i=0;i<mynum;i++) { myStoreys= document.querySelectorAll(".pls.t9_pls .avtm[href='"+myShortHref+"']"); console.log("myStoreys"+i); let myImg=myStoreys[i].firstChild; myImg.style.borderImage="url(https://www.w3school.com.cn/i/css/border.png) 11 round" ; console.log(myStoreys); } //解析出所有存储的用户URL let d=0;//平衡去掉的数组项下标 let currentHandleUser=[].concat(storeyUsers);//当前页面中所有处理过保存的图像初始化赋值 let sUsersLength=storeyUsers.length; for (let i = 0; i < sUsersLength; i++) { let storeyUserURL=storeyUsers[i]; //获取当前页面当前取出用户URL的数量 //let storeyUserURL=document.evaluate("//*[text()='将单车骑到年底']",document,null,XPathResult.ANY_TYPE,null).iterateNext().href; //let pageStoreUserNum=document.querySelectorAll("a.xw1[href='home.php?mod=space&uid=129']").length; let pageStoreUser=document.querySelectorAll("a.xw1[href='"+storeyUserURL+"']"); let pageStoreUserNum=pageStoreUser.length; //将所有存储的用户头像做处理 let storeyUserImg; for (let j=0;j<pageStoreUserNum;j++) { storeyUserImg=pageStoreUser[j].parentNode.parentNode.parentNode.querySelector(".avtm>img"); //console.log(storeyUserImg); storeyUserImg.style.filter="blur(10px)"; } if (pageStoreUserNum==0) { currentHandleUser.splice(i-d,1);//当前页面中所有处理过保存的图像 d++; console.log('删除数组项'+i+storeyUserURL); } //document.querySelectorAll("a.xw1")[i].text; } ////计算当前用户回帖数量 //console.log('当前处理过的用户头像集合:'+currentHandleUser); //statistical(currentHandleUser,10,'red'); ////获取未处理的回复用户数组 let nohandleUser=[]; let TotalUserlist=[].concat(repeatHandle(sTotalStoreyURL)); //console.log('总用户列表'+TotalUserlist); nohandleUser=compNohanderUserList(TotalUserlist,currentHandleUser); //去除我的元素 RemoveGroupOne(nohandleUser,myShortHref); ////对未处理过回复的用户计算每人回帖次数 //计算当前页面所有用户数无重复 var userCount; if(mynum>0) { userCount=currentHandleUser.length+nohandleUser.length+1; } else { userCount=currentHandleUser.length+nohandleUser.length; } ////统计最外窗口容器 let bd=document.getElementsByTagName('body')[0]; let bdLastChild=bd.childNodes[19]; let w_div=document.createElement('div'); w_div.setAttribute('class','sdiv'); w_div.innerText='w_div!!'; let style=document.createElement('style'); const wWidth=userCount*50; //w_div.innerHTML='<div id="sdiv" style="border:5px solid rgb(199, 209, 148);width:350px;height:150px;position:fixed;zindex:99;margin-Left:950px;margin-Top:-12211px;">test</div>'; style.innerText='.sdiv{border:3px solid rgb(199, 209, 148);width:'+wWidth+';height:110px;position:fixed;zindex:99;float:right;top:363px;right:45px;}'; w_div.appendChild(style); bd.insertBefore(w_div,bdLastChild); //绘制绘图板 w_div.innerHTML='<canvas id="userCont" width="'+wWidth+'" height="180px" style="border:3px solid #aaa;position:fixed;z-index:99;float:right;top:363px;right:45px;">请换个浏览器再试!</canvas>'; //简讯统计窗口 var brif_group=new Map();//简讯统计用户 //计算单列统计条宽度 let lineWidth=(wWidth-20)/(userCount); //绘图初始位置X let X=10+lineWidth*currentHandleUser.length; console.log('当前处理过的用户头像集合:'+currentHandleUser); statistical(currentHandleUser,10,'red'); console.log('获取未处理的回复用户数组'+nohandleUser); statistical(nohandleUser,X,'blue'); X=X+lineWidth*nohandleUser.length; statistical(mysHref,X,'green'); let brif_string=""; let brif_num=brif_group.size; brif_group.forEach((value,key,map)=>{ brif_string+=key+':'+value+'次<br>'; }) let brief_div=document.createElement('div'); brief_div.setAttribute('class','briefdiv'); brief_div.innerHTML=brif_string; let brief_style=document.createElement('style'); brief_style.innerText='.briefdiv{box-shadow:5px 5px 10px gray;border-radius: 5px;font-size:11px;border:1px solid rgb(199, 209, 148);background:linear-gradient(to right,rgb(199, 209, 149), #d7edff); color:#5f84a8;width:120px;height:'+10*brif_num+';position:fixed;z-index:3;float:right;top:283px;right:15px;}' if(statisticsSwitch==false) { w_div.style.display='none'; } else { w_div.style.display='block'; } function StatisSW () { if(w_div.style.display != "none") { w_div.style.display='none'; statisticsSwitch=false; } else { w_div.style.display='block'; statisticsSwitch=true; } GM_setValue('saveStatisticsSwitch',statisticsSwitch); } brief_div.onclick = StatisSW; brief_div.appendChild(brief_style); bd.insertBefore(brief_div,bdLastChild); ////在返回顶部条中加入统计功能按钮 //创建span let statisticsSpan=document.createElement('span'); //statisticsSpan.innerText='计统'; statisticsSpan.setAttribute('class','statsSpan'); //获取插入位置 let inertPlace=document.querySelector('#scrolltop'); inertPlace.appendChild(statisticsSpan); //创建超链接 let a=document.createElement('a'); a.id='statsA'; a.innerText="统"; //a.href="http://bing.com"; a.title="用户统计"; a.setAttribute("onclick","alert('备用,待开发!');"); let innerPlace=document.querySelector('.statsSpan'); innerPlace.appendChild(a); //去一楼广告 let css= ` .a_p{ display:none; } ` GM_addStyle(css) //统计每类用户组的每个用户回复数 function statistical(usersArr,startX,groupColor) { var canvas=document.querySelector('#userCont'); var ctx=canvas.getContext('2d'); var replyNum; let CurrentmaxUser; let ReplyCurrentGroupMap=new Map(); let ReplyCurrentGroup=[]; for(let i=0;i<usersArr.length;i++) { let UserName; let UserAssembly=document.querySelectorAll("a.xw1[href='"+usersArr[i]+"']"); replyNum=UserAssembly.length; if(usersArr[i]!=myShortHref) { UserName=UserAssembly[0].text;//获取用户名 } else { UserName='我'; } ReplyCurrentGroupMap.set(UserName,replyNum); //将数量写入回复量数组中 ReplyCurrentGroup.push(replyNum); //console.log(ReplyCurrentGroup); let height=15*replyNum; //console.log(UserName+' 有 '+replyNum+' 次回复'); ctx.fillStyle=groupColor; ctx.fillRect(startX+lineWidth*i,185-height-20,lineWidth-5,height); ctx.fillText(UserName,startX+lineWidth*i,185-10,lineWidth-5); ctx.fillStyle='gold'; ctx.fillText(replyNum,startX+lineWidth*i+20,185-23,lineWidth-5); // 将所有用户添加到 brif_group if (replyNum > 0) { brif_group.set(UserName, replyNum); } } console.log(ReplyCurrentGroup.length); //对当前回复数组取出最大值 CurrentmaxUser=Math.max(...ReplyCurrentGroup); console.log('对当前回复数组取出最大值'+CurrentmaxUser); //反查用户名 ReplyCurrentGroupMap.forEach((value,key,map)=> { if (CurrentmaxUser==value) { brif_group.set(key,value); console.log('对当前回复数组取出最大值的用户名是:'+key); } }); } //删除数组中一个元素 function RemoveGroupOne(arr,item){ const index = arr.indexOf(item); if (index > -1) { arr.splice(index, 1); } } //取出两个数组中不同的元素 function compNohanderUserList(arr1,arr2) { return arr1.concat(arr2).filter(function(item,index,arr){ return arr.indexOf(item)===arr.lastIndexOf(item); }) } //为当前页中所有用户名称数组去重 function repeatHandle(arr){ return arr.filter(function(item,index,arr){ return arr.indexOf(item,0)===index; }); } //保存头像边框 function saveCFG(){ GM_setValue('myImgBorder','https://www.w3school.com.cn/i/css/border.png'); } saveCFG(); //读取设置 console.log(GM_getValue('myImgBorder')); function delAllSaveData(){ //删除saveStoreyUsers GM_deleteValue('saveStoreyUsers'); //删除click_num GM_deleteValue('click_num'); //删除saveStatisticsSwitch GM_deleteValue('saveStatisticsSwitch'); } //delAllSaveData();
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址