Greasy Fork is available in English.

QQ群高级管理——筛选清理增强

QQ群高级管理,筛选工具增强工具,用于清理Q群成员

// ==UserScript==
// @name            QQ群高级管理——筛选清理增强
// @author			极品小猫
// @version         0.8
// @description     QQ群高级管理,筛选工具增强工具,用于清理Q群成员
// @include			http://qun.qq.com/member.html*
// @icon			http://mail.qq.com/favicon.ico
// @run-at			document-idle
// @grant			none
// @grant			GM_addStyle
// @homepage		https://greasyfork.org/zh-CN/scripts/12063-qq%E7%BE%A4%E9%AB%98%E7%BA%A7%E7%AE%A1%E7%90%86-%E7%AD%9B%E9%80%89%E6%B8%85%E7%90%86%E5%A2%9E%E5%BC%BA
// @namespace		https://greasyfork.org/zh-CN/scripts/12063-qq%E7%BE%A4%E9%AB%98%E7%BA%A7%E7%AE%A1%E7%90%86-%E7%AD%9B%E9%80%89%E6%B8%85%E7%90%86%E5%A2%9E%E5%BC%BA
// // ==/UserScript==
// 
// 更新日志
// v0.0.8 【2016.05.18】
// 1、删除清除选项
// 2、调整删除成员时的UI位置
// 3、兼容新版QQ群高级管理页面
// 
// v0.0.7 【2015.10.15】
// 1、加入清理日志功能
// 2、加入筛选模式提示
// 3、部分UI调整
// 
// v0.0.6 【2015.09.21】
// 1、调整删除成员时的UI位置
// 2、在删除成员时,保存当前筛选的值
// 3、筛选条件修改,允许先筛选加入时间,后筛选最后发言时间
// 
// v0.0.5 【2015.09.17】
// 1、删除成员时,显示详细的成员名字及QQ号
// 2、增加【白名单】成员功能,白名单信息写入浏览器的 localStorage 中
// 
// v0.0.4 【2015.09.01】
// 1、优化加入日期筛选
// 
// v0.0.3 【2015.08.30】
// 1、增加条件筛选不可用提示
// 2、增加【加入天数】筛选
// 
// v0.0.2 【2015.08.27】
// 1、增加【最后发言日期】筛选
// 2、清理新人不清理当天加入的
 
var host=location.hostname;
var hash=location.hash;
var PreExcludeQQ='';//预设白名单QQ号,多个号码使用英文逗号分隔

//if(!localStorage['CleanLog']) localStorage['CleanLog']='"'+Dates()+'":[]]';
//if(!JSON.parse("{"+localStorage["CleanLog"]+"}")[Dates()]) localStorage['CleanLog']+=','+'"'+Dates()+'":[]';
if(!localStorage['CleanLog']) localStorage['CleanLog']='[{"date":"'+Dates()+'","list":[]}]';
var CleanLogData=eval(localStorage['CleanLog']);
if(CleanLogData[CleanLogData.length-1]['date']!==Dates()) CleanLogData.push({"date":Dates(),"list":[]}),localStorage['CleanLog']=JSON.stringify(CleanLogData);

GM_addStyle('\
.foot{top:-20px;position: relative;}');

document.head.innerHTML+="<style>\
.ui-dialog {width:780px!important;}\
.ui-dialog-cnt{margin:20px 40px!important;}\
/*表格宽度*/#DelQQList {border-collapse:collapse;width:650px;}\
#DelQQList tr:nth-child(1) td{background-color:#eef0f4;text-align:center;}\
#DelQQList td{border-bottom:dotted 2px;}\
/*Q名单元格*/#DelQQList tr:not(:nth-child(1)) td:last-child {padding:0 20px;}\
/*单元格列宽+分栏线*/#DelQQList td:not(:last-child) {width:100px;line-height:25px;border-right:solid 2px;text-align:center;}\
/*活跃度单元格列宽*/#DelQQList td:nth-child(3) {width:60px;}\
#CleanMode{color:red;}\
.newButton{color:#fff;border:0px;margin:5px 10px;font-size:18px;}\
</style>\
";
$('#groupMemberTit').style.height="auto";
$('#groupMemberTit').addEventListener('DOMSubtreeModified',function(){
	if($('#groupMemberTit').children.length>=3&&!$('#cleanMember')) {
		$('#groupMemberTit').innerHTML+='\
<button id="cleanMember" class="add-member" data-tag="addmember">清理死人</button>\
<button id="cleanLog" class="add-member">清理日志</button>\
<br>\
当前筛选模式:<span id="CleanMode"></span>\
<div style="padding: 5px 0;">\
最后发言日期筛选:<input id="endDate" placeholder="格式:2015/08/05">\
 活跃度筛选:<input id="degree" placeholder="数值" style="width:50px;">\
 加入天数死人筛选:<input id="joinDate" placeholder="数值" style="width:50px;" onkeyup="this.value=this.value.replace(/[^\\d]/g,\'\')">天前\
 <a href="'+hash+'" onclick="alert(this.title)" title="=====使用方法=====\r\n1、打开QQ群高级管理页面\r\n2、点击最后发言列标题,此时可进行【升序】(列标题下的第二个)或【降序】(列标题下的第一个)的排序\r\n3、点击清理死人按钮(系统限制只能20人)\r\n4、删除成员\r\n \r\n=====使用条件=====\r\n 1、最后发言筛选:【最后发言日期】与【活跃度】筛选同时使用\r\n 2、无任何筛选条件:清理活跃度:0,无发言时间,非今天加入的人(该条件限倒序时有效)\r\n 3、加入日期筛选:清理活跃度:0,无发言时间,指定天数前加入的人(该条件限倒序时有效)\r\n 4、加入日期+最后发言筛选:允许以上2种条件同时筛选">帮助</a>\
<br>\
白名单成员:<input id="excludeQQ" placeholder="白名单QQ号,多个使用英文逗号分隔" style="width:650px;" onkeyup="this.value=this.value.replace(\',\',\',\').replace(/[^\\d,]/g,\'\')">\
	<button id="SaveExclude" class="add-member">保存白名单</button>\
</div>\
';
		$('#excludeQQ').value=!localStorage['excludeQQ']?PreExcludeQQ:localStorage['excludeQQ'];		//加载白名单信息
		if(!localStorage['ToDay']||localStorage['ToDay']!=ToDay().toDateString()) localStorage['ToDay']=ToDay().toDateString();
			$('#endDate').value=localStorage['endDate'];
			$('#degree').value=localStorage['degree'];
				
		var obj;
		$('#cleanMember').addEventListener('click',function(){
			var Count=0;
			
			if($('#joinDate').value!=='' && ($('#endDate').value!=='' || $('#degree').value!=='')){
				$('#CleanMode').textContent='【加入日期】+【最后发言日期】';
			} else if($('#endDate').value!=='' && $('#degree').value!=='') {
				$('#CleanMode').textContent='【最后发言日期】';
			} else if($('#endDate').value!=='' && $('#degree').value==='') {
				alert('【活跃值】未输入,无法使用清理功能');
				return false;
			} else if($('#endDate').value==='' && $('#degree').value!==''){
				alert('【最后发言日期】未输入,无法使用清理功能');
				return false;
			}
			
			$('#selectAll').click();$('#selectAll').click();

			for(i=0;Count<20&&i<$('.mb').length;i++){
              var obj=$('.mb')[i].children;
              var joinDate=obj[8].textContent;			//成员加入日期
              var Level=obj[9].textContent;				//成员等级积分
              var QQNumber=obj[5].textContent;			//QQ号
              var LastDate=obj[10].textContent;			//最后发言时间

				if($('#joinDate').value!==''&&(Dateif(ToDay())-Dateif(ToDay(joinDate)))>Number($('#joinDate').value)&&Level=='潜水(0)'&&/[^\/]*\-[^/]*/.test(LastDate)) {
					//加入日期筛选
					if(obj[0].children[0]&&checkExcludeQQ(QQNumber)) obj[0].children[0].checked=true;
					Count++;
				} else if(Date.parse($('#endDate').value)>=Date.parse(LastDate)&&
						  parseInt($('#degree').value)>Level.match(/\d+/)[0]){
					//使用活跃度或日期筛选
					if(obj[0].children[0]&&checkExcludeQQ(QQNumber)) obj[0].children[0].checked=true;
					Count++;
				} else if($('#endDate').value===''&&$('#joinDate').value===''&&!isToDay(joinDate)&&Level=='潜水(0)'&&/[^\/]*\-[^/]*/.test(LastDate)) {
					//选择条件:活跃度:0,无发言时间,非今天加入,未使用日期筛选
					if(obj[0].children[0]&&checkExcludeQQ(QQNumber)) obj[0].children[0].checked=true;
					Count++;
				}
			}

			
			$('.del-member')[0].disabled=false;
			$('.del-member')[0].className='del-member';
		});
		
		$('button[cmd="del"]')[0].addEventListener('click',function(){
			localStorage['joinDate']=$('#joinDate').value;
			localStorage['endDate']=$('#endDate').value;
			localStorage['degree']=$('#degree').value;
			
			var DelSelect=$('input[class="check-input"]:checked');
			var QQArr=[];
			for(i=0;i<DelSelect.length;i++){
				var QQNum=DelSelect[i].value;
				var QQName=$('#useIcon'+QQNum).nextElementSibling.textContent.replace(/(?:<br>|[\r\n\t])/gm,'');
				var LastDate=$('.mb'+QQNum)[0].children[10].textContent.replace(/[\r\n\t]/igm,'');
				var JoinDate=$('.mb'+QQNum)[0].children[8].textContent.replace(/[\r\n\t]/igm,'');
				var Activity=$('.mb'+QQNum)[0].children[9].textContent.match(/\d+/)[0];
					//QQArr.push(QQNum+" —— "+QQName+LastDate);
					QQArr.push({QQNum:QQNum,QQName:QQName,LastDate:LastDate,JoinDate:JoinDate,Activity:Activity});
			}
			setTimeout(function(){
				var td='';
				for(var i in QQArr){
					td+="<tr><td>"+QQArr[i].JoinDate+"</td><td>"+QQArr[i].LastDate+"</td><td>"+QQArr[i].Activity+"</td><td>"+QQArr[i].QQNum+"</td><td>"+QQArr[i].QQName+"</td></tr>";
				}
				var newMsg="确定将以下共 "+QQArr.length+" 位成员从本群中删除吗?<br><table id=\"DelQQList\"><tr><td>加入日期</td><td>最后发言</td><td>活跃度</td><td>QQ号</td><td>QQ名</td></tr>"+td+"</table>"
				//var newMsg="确定将<p>"+QQArr.join("<BR>").replace(/<br>/g,'')+"<p>共 "+QQArr.length+" 位成员从本群中删除吗?";
				
				$('.msg')[0].innerHTML=$('.msg')[0].innerHTML.replace(/^.*删除吗?\s*<br>/,newMsg);
				$('.ui-dialog')[0].style.top='5px';
				//$('.ui-dialog')[0].style.width='600px';
				$('.ui-dialog')[0].style.left=(document.body.clientWidth-$('.ui-dialog')[0].offsetWidth)/2+"px";
				
				$('.btn-submit')[0].addEventListener('click',function(){
					CleanLogData[CleanLogData.length-1].list=CleanLogData[CleanLogData.length-1].list.concat(QQArr);	//
					localStorage['CleanLog']=JSON.stringify(CleanLogData);
				});
			},100);
		});


		$(document).keydown(function(e){		//监听回车键操作,点击确定按钮
			console.log(e.keyCode);
			if(e.keyCode==13) $('.btn-submit').click();
		});
		
		$('#SaveExclude').addEventListener('click',function(){
			localStorage['excludeQQ']=$('#excludeQQ').value;
			alert('保存成功');
		});
		
		//清理日志部分
		$('#cleanLog').addEventListener('click',function(){
			if(!$('#CleanLogUI')||$('.ui-dialog')[0].className!=''){
				var a=document.createElement('div');
					a.id='CleanLogUI';
					a.className='ui-dialog on'
					a.style.cssText='height: auto; top: 40px; left: 308px;';
					a.innerHTML+='\
<div class="head"><h2>清理成员日志</h2><a class="icon-close" onclick="document.body.removeChild(this.parentNode.parentNode)"></a></div>\
<div class="body-content">\
<div class="ui-dialog-cnt">\
	<select id="selectCleanLog" style="font-size:22px;"><option value="选择日期" selected>选择日期</option></select>\
	<button id="DeleteLog" class="add-member newButton">清空所有记录</button>\
<div id="msg" style="overflow-y: auto;height:500px"></div>\
</div>\
</div>\
';
				document.body.appendChild(a);
			}
			for(var i in CleanLogData){
				$('#selectCleanLog').innerHTML+='<option value="'+CleanLogData[i].date+'">'+CleanLogData[i].date+'</option>';
			}
			$('#selectCleanLog').addEventListener('change',function(){
				var newMsg;
				console.log($('#selectCleanLog').selectedIndex);
				var QQArr=CleanLogData[($('#selectCleanLog').selectedIndex-1)].list;
				console.log(CleanLogData[($('#selectCleanLog').selectedIndex-1)].list)
				if(QQArr.length!==0) {
					for(i in QQArr){
						var td='';
						for(var i in QQArr){
							td+="<tr><td>"+QQArr[i].JoinDate+"</td><td>"+QQArr[i].LastDate+"</td><td>"+QQArr[i].Activity+"</td><td>"+QQArr[i].QQNum+"</td><td>"+QQArr[i].QQName+"</td></tr>";
						}
						newMsg="已删除 "+QQArr.length+" 位成员!<br><table id=\"DelQQList\" width=\"100%\"><tr><td>加入日期</td><td>最后发言</td><td>活跃度</td><td>QQ号</td><td>QQ名</td></tr>"+td+"</table>";
					}
				} else {
					newMsg='当天没有清理记录';
				}
				$('#msg').innerHTML=newMsg;
			});
			
			$('#DeleteLog').addEventListener('click',function(){
				if(confirm("确认要清空所有的【清理日志】吗?")) {
					localStorage['CleanLog']='[{"date":"'+Dates()+'","list":[]}]';
					CleanLogData=eval(localStorage['CleanLog']);
					$('#selectCleanLog').innerHTML='<option value="选择日期" selected>选择日期</option><option value="'+CleanLogData[0].date+'">'+CleanLogData[0].date+'</option>';
					$('#msg').innerHTML='';
				}
			})
		});
	}
});

function $(obj) {//ID, Class选择器
	var objF=obj.replace(/^[#\.]/,'');
	return (/^#/.test(obj)) ? document.getElementById(objF):(/^\./.test(obj)) ? document.getElementsByClassName(objF) : document.querySelectorAll(obj);
}
function isToDay(date){
	return new Date().toDateString() === new Date(date).toDateString();
}
function ToDay(date){
	date=date!==undefined?new Date(date):new Date();
	return new Date(date);
}
function addDay(i){
	var Dates=new Date();
	return new Date(Dates.setDate(Dates.getDate() + Number(i)));
}
function Dateif(date){
	return date.getTime()/(1000*60*60*24);
}
function Dates(date){
	date=date!==undefined?new Date(date):new Date();
	return date.getFullYear()+'/'+date.getMonth()+'/'+date.getDate();
}
function checkExcludeQQ(QQ){
	var i;
		QQ=QQ.replace(/\s/g,'');
	var testQQ=new RegExp('[^\\d,]?'+QQ+'[^\\d,]?');
	console.log(testQQ,$('#excludeQQ').value);
	if(testQQ.test($('#excludeQQ').value)) return false;
		
		/*
	var excQQArr=$('#excludeQQ').value.split(',');
	for(i=0;i<excQQArr.length;i++){
		console.log(QQ,excQQArr[i]);
		if(QQ===excQQArr[i]) return false;
	}
	*/
	return true;
}