我前一篇帖子是增强用户屏蔽,经过测试效果不错。本贴是绞杀广告帖子。
我去年减肥的时候顺便做了个减肥论坛,多日未打理,发帖还不少,每天数十篇,但发现80%以上的都是广告贴,都是来卖减肥药的.如此大数量的广告贴就算斑竹尽职尽责也难管理,因此希望从技术上加强识别和屏蔽。
广告贴一般有特征,就是用户一开贴就留qq号码\留qq群\留手机或者电话,根据这些特征,一个用户发帖时,如果是最开始的5篇帖子,进行识别,如果是广告贴,则自动进入审核,并且10小时内对该会员一直会进行审核。
通过以上操作,广告识别率可以达到90%以上,准确率也有90%以上。因此这个方法我已经在动网论坛上用了数年!
当然也可能错杀,不过对于一个长久论坛来说,错杀几个会员微不足道,这是必须付出的代价。而且,根据我的经验,凡是一上来就发qq群、qq号码的会员,决不是好会员,留着必是祸害。qq群兴起则论坛败,qq群灭亡则论坛兴。
下面是posttopic.aspx.cs中增加的代码,加入位置应该是原始代码判断审核后,大约440行后:
bool canPost=true;
if (usergroupinfo.Groupid == 4 || Utils.GetCookie("userstat") == "1")
canPost = false;
else
{
UserInfo __userinfo = new UserInfo();
__userinfo = UserFactoryAdmin.GetUserInfo(userid);
if (__userinfo.Posts<5 )
if (System.Text.RegularExpressions.Regex.IsMatch(postinfo.Message, @"(电话|qq|q|手机|群).{0,10}[0-90123456789\-]{6}",System.Text.RegularExpressions.RegexOptions.IgnoreCase)
|| System.Text.RegularExpressions.Regex.IsMatch(postinfo.Message, @"[11][3355][0-90123456789]{9}") //手机
|| System.Text.RegularExpressions.Regex.IsMatch(postinfo.Message, @"[00][0-90123456789]{2,3}[\-]{0,1}[0-90123456789]{7}") //带区号的电话号码
)
canPost = false;
}
if (!canPost)
{
Database.ExecuteNonQuery(CommandType.Text, "update " + BaseConfigFactory.GetTablePrefix + "topics set displayorder=-2 where tid=" + topicid); //postreply.aspx.cs中这句要删除
postinfo.Invisible = 1;//加入审核
Utils.WriteCookie("userstat", "1", 600); //10小时内都需要审核
}
postreply.aspx.cs文件也要加入和上面一样的代码,只把Database开头的那句删除。
另外,对于已经存在的广告贴,我还做了个批处理,我在后台论坛维护页面加了个按钮,按钮代码如下:
protected void ClearAd_Click(object sender, EventArgs e)
{
foreach (DataRow druser in AdminDatabase.ExecuteDataset("SELECT * FROM [" + BaseConfigFactory.GetTablePrefix + "users ] where groupid >=10").Tables[0].Rows)
{
foreach (DataRow drpost in AdminDatabase.ExecuteDataset("SELECT top 5 * FROM [" + BaseConfigFactory.GetTablePrefix + "posts1 ] where posterid="+druser["uid"].ToString()+" order by pid").Tables[0].Rows)
{
string Message = drpost["message"].ToString();
if (System.Text.RegularExpressions.Regex.IsMatch(Message, @"(电话|qq|q|手机|群).{0,10}[0-90123456789\-]{6}",System.Text.RegularExpressions.RegexOptions.IgnoreCase)
|| System.Text.RegularExpressions.Regex.IsMatch(Message, @"[11][3355][0-90123456789]{9}") //手机
|| System.Text.RegularExpressions.Regex.IsMatch(Message, @"[00][0-90123456789]{2,3}[\-]{0,1}[0-90123456789]{7}")
)
{
AdminDatabase.ExecuteNonQuery("UPDATE [" + BaseConfigFactory.GetTablePrefix + "posts1] set [invisible]=1 WHERE [layer]>0 and [posterid]=" + druser["uid"].ToString());
AdminDatabase.ExecuteNonQuery("update [" + BaseConfigFactory.GetTablePrefix + "topics] set [displayorder]=-2 WHERE [posterid]=" + druser["uid"].ToString());
AdminDatabase.ExecuteNonQuery("update [" + BaseConfigFactory.GetTablePrefix + "users] set groupid=6 WHERE [uid]=" + druser["uid"].ToString());
break;
}
}
}
}
进入后台点击这个按钮,清除历史广告帖子。
通过这些操作,论坛已经基本干净,重新起航。