Discuz!NT 2.5 正式版 下载
beta、RC版升级补丁
Comsenz 招聘信息
首届Discuz!NT 模板大赛圆满结束
著名音乐网站SoGua网、分贝网
采用Discuz!NT搭建社区
FIFA Online2官网论坛使用Discuz!NT
游戏城寨论坛使用Discuz!NT搭建
第二届优秀版主评选揭晓
Discuz!NT 2.5正式开源 Discuz!NT文档中心
用户整合说明文档
Discuz!NT亮相微软Tech-Ed 2007
Discuz!NT情景搞笑短片抢先看
1/2页12 跳转到查看:8470
发新话题 回复该主题

[经验] 我的源代码修改2:绞杀广告帖子

我的源代码修改2:绞杀广告帖子

我前一篇帖子是增强用户屏蔽,经过测试效果不错。本贴是绞杀广告帖子。

我去年减肥的时候顺便做了个减肥论坛,多日未打理,发帖还不少,每天数十篇,但发现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;
                    }

                }
            }
        }


进入后台点击这个按钮,清除历史广告帖子。

通过这些操作,论坛已经基本干净,重新起航。
本帖被评分 1 次
最后编辑又一村 最后编辑于 2007-06-16 15:54:54

TOP

 

回复:我的源代码修改2:绞杀广告帖子

很不错

TOP

 

回复:我的源代码修改2:绞杀广告帖子

赞一个!
生命不止,BT不休.浮生如梦,夜夜南柯.

TOP

 

回复:我的源代码修改2:绞杀广告帖子

这样做有一定的局限性,比如一些帖子里需要有电话号码怎么办呢?

TOP

 

回复:我的源代码修改2:绞杀广告帖子

楼主不是说了吗
广告贴一般有特征,就是用户一开贴就留qq号码\留qq群\留手机或者电话,根据这些特征,一个用户发帖时,如果是最开始的5篇帖子,进行识别,如果是广告贴,则自动进入审核,并且10小时内对该会员一直会进行审核。

5篇以上才会进入审核.

TOP

 

回复:我的源代码修改2:绞杀广告帖子

这个……我建议采用对开始的一定数量的帖子的内容进行匹配,如果内容完全一样,才视为广告帖,因为广告帖另外一个重要特征是内容一致性,发广告的人要的就是效率,肯定采用COPY进行,是吧?试想,如果一个正常发帖的会员,怎么可能发出内容完全一样的多篇帖子,(鉴定数量可以定为5篇以上),还有一方面,从程序运行的效率来说,用正则一个一个地匹配,肯定不如直接将两个内容比较来得快~~~,个人意见,欢迎指正。

TOP

 

回复: 我的源代码修改2:绞杀广告帖子



引用:
原帖由 cobrayang 于 2007-6-16 21:330 发表
这个……我建议采用对开始的一定数量的帖子的内容进行匹配,如果内容完全一样,才视为广告帖,因为广告帖另外一个重要特征是内容一致性,发广告的人要的就是效率,肯定采用COPY进行,是吧?试想,如果一个正常发帖的......


你说的不具有操作性,做广告的确实有很多重复发的,但是它只要加上一个标点,两个帖子就不是一样了,很难判定。
至于正则匹配影响效率更无从谈起,论坛的速度主要体现在浏览上,发帖慢上几个毫秒忽略不计。而且效率的影响主要是数据库操作,我的代码基本没有数据库操作。

TOP

 

回复:我的源代码修改2:绞杀广告帖子

特征码识别 ,很不错的办法  感谢楼主
看到的去帮我点那个google广告啊www.cnblogs.com/zjneter

TOP

 

回复:我的源代码修改2:绞杀广告帖子

这方法也有不完善的地方,因为我们论坛经常搞活动,都要留下联系方式,如果采用楼主的方法就麻烦了

TOP

 

回复: 我的源代码修改2:绞杀广告帖子



引用:
原帖由 又一村 于 2007-6-19 11:250 发表
我另外一个论坛自生自灭,自己几乎不过问。但在相关人群中有口皆碑,历史悠久,是他们的道路和方向。然而一直以来不温不火,托dnt开源的福,我用这个论坛作测试,无意中发现很多人发qq群,于是大开杀戒。利用上面的代码......


今天到现在的发贴量已经过150了,看来今天会突破200,就像股市一样创历史新高,而我前面的大开杀戒就相当于股改。

TOP

 
1/2页12 跳转到
发表新主题 回复该主题