存档

‘micolog’ 分类的存档

再再次升级micolog的垃圾评论屏蔽功能

2009年11月6日 闫鹏 5 条评论

上次升级后,垃圾评论确实休息了很一段时间,但一个月不到,又多了起来,看来对方升级了系统呀。昨天晚上忙乎了快两个小时,在原有的基础上增加了:屏蔽ip功能

在原来的SinglePost类中,如果发现请求的ip是已经被屏蔽的,就不给插入memcache。

升级的内容如下:

1.评论中,记录用户的ip地址,后台评论查看页面中,通过点击ip地址,可以创建一个新屏蔽的的ip

2.增加一个管理屏蔽ip的页面,来新增或者删除被屏蔽的ip

被屏蔽的ip存在库里面,平时通过memcache来缓存。google的文档中说是可以设置为永久存储,但也不排除内存不够删除的可能性。先用memcache试试,不行的话就直接查库嘿嘿

核心思想早就这些了,代码比较分散,不贴上来了,又需要的朋友给我留言,我把整个micolog的代码发给你。

分类: micolog 标签:

再次升级micolg的留言验证,防止垃圾评论

2009年10月12日 闫鹏 15 条评论

最近发垃圾评论的实在太猖獗了,gae提供的图片模块又没法支撑captcha的能力,个人又不太喜欢直接删除所有纯英文评论的做法,其它的验证码服务搭建起来会使micolog依赖性增强,再加上我懒…

一系列原因,导致我今天做了个小升级,看是否有效果。原理是根据文章id与访客的ip地址生成一个随机数加在网页中,访客通过网页留言的话是正常的,但如果通过工具进行留言,就必须每次重新获取一下随机数。为了增加工具的门槛,以后需要在页面上增加一个js来对随机数混淆,先放上这个简单的看看效果如何:)

blog.py中把这两个类列出来,就不多说了

[code lang='python' style='vs']

class SinglePost(BasePublicPage):
    @cache()
    def get(self,slug=None,postid=None):

        if postid:
            entries = Entry.all().filter("published =", True).filter('post_id =', postid).fetch(1)
        else:
            slug=urldecode(slug)
            entries = Entry.all().filter("published =", True).filter('link =', slug).fetch(1)
            if not entries or len(entries) == 0:
                return self.error(404)

        entry = entries[0]
        addReadTime(entry)
        makeHighlight(entry)

        comments = Comment.all().filter("entry =",entry)
        commentuser = ['','','']
        checknum = random.randint(1, 100000)
        memcache.set(str(entry.key())+self.request.remote_addr, str(checknum), 900)

        tpl_vars = {
            'entry':entry,
            'relateposts':entry.relateposts,
            'comments':comments,
            'user_name':commentuser[0],
            'user_email':commentuser[1],
            'user_url':commentuser[2],
            'checknum':checknum
        }

        if entry.entrytype=='post':
            self.render('single', tpl_vars)
        else:
            self.render('page', tpl_vars)

 

class Post_comment(BaseRequestHandler):
    #@printinfo
    def post(self,slug=None):
        useajax=self.param('useajax')=='1'
        name=self.param('author')
        email=self.param('email')
        url=self.param('url')

        key=self.param('key')
        content=self.param('comment')
        checknum=self.param('checknum')

        saved_checknum = memcache.get(key+self.request.remote_addr)
        if (not saved_checknum) or (str(saved_checknum) <> checknum):
            if useajax:
                self.write(simplejson.dumps((False,-102,_('Checknum not correct .'))))
            else:
                self.error(-102,_('Checknum not correct .'))
            return
        memcache.delete(key+self.request.remote_addr)

        content=content.replace('\n','<br>')
        content=myfilter.do_filter(content)
        name=cgi.escape(name)[:20]
        url=cgi.escape(url)[:100]

        if not (name and email and content):
            if useajax:
                self.write(simplejson.dumps((False,-101,_('Please input name, email and comment .'))))
            else:
                self.error(-101,_('Please input name, email and comment .'))
        else:
            comment=Comment(author=name,
                            content=content.replace('^~','<img src="http://' + g_blog.domain + "/static/images/icons/icon_").replace('~^','.gif" />'),
                            email=email,
                            entry=Entry.get(key))
            if url:
                try:
                    comment.weburl=url
                except:
                    comment.weburl='http://'+url

            #name=name.decode('utf8').encode('gb2312')

            info_str='#@#'.join([urlencode(name),urlencode(email),urlencode(url)])
            logging.info("info:"+info_str)
            #info_str='#@#'.join([name,email,url.encode('utf8')])
  
60;         cookiestr='comment_user=%s;expires=%s;domain=%s;path=/'%(info_str,(datetime.now()+timedelta(days=100)).strftime("%a, %d-%b-%Y %H:%M:%S GMT"),'')
            comment.save()
            memcache.delete("/"+comment.entry.link)

            self.response.headers.add_header('Set-Cookie', cookiestr)
            if useajax:
                comment_c = self.get_render('comment',{'comment':comment})
                self.write(simplejson.dumps((True,comment_c.decode('utf8'))))
            else:
                self.redirect(self.referer)

[/code]

最后,要记得更新你的comments.html文件,提交的form里面带上checknum

分类: micolog 标签:

修复micolog的一个bug:Entry.publish函数

2009年9月21日 闫鹏 11 条评论

我错了,大家千万不要被我误导,尤其对houkai同学深表抱歉!我没有仔细看代码,随手改了一下,结果引入了bug,其实原来的基础上加了entrycount已经是正确的了,附上代码

[code lang='python' style='vs']

def publish(self,newval=True):
    if newval:

        if not self.is_saved():
            self.save()

        if not self.is_wp:
            self.post_id=self.key().id()

        #fix for old version
        if not self.postname:
            self.setpostname(self.slug)

        vals={'year':self.date.year,'month':str(self.date.month).zfill(2),'day':self.date.day,
              'postname':self.postname,'post_id':self.post_id}

        if self.entrytype=='page':
            if self.slug:
                self.link=self.postname
            else:
                self.link='?p=%(post_id)s'%vals
        else:
            if self.slug:
                self.link=self.slug
            else:
                self.link=g_blog.link_format.strip()%vals

        if (not self.published) and (self.entrytype == 'post'):
            g_blog.entrycount+=1
            self.published=True

        g_blog.save()
        self.save()
    else:
        self.published=False
        if self.published:
            g_blog.entrycount-=1
            g_blog.save()
            self.save()
            self.removecache()
            if g_blog.sitemap_ping:

[/code]

唉,惨,打算不天天折腾这个了,还是开始研究mysql吧

今天发现iNove主题的page.html的三个js没有标明type,导致评论出现问题,追查问题的过程中,在测试环境中,又发现添加页面后,总是无法在主页上显示。顺手修正了这个python代码中的bug:

model.py中,Entry的publish函数,观察最前面5行,只是做了将Entry存储的功能,如果再调用publish函数之前没有设置publish状态为true,就不会降文章设置到发布状态。修正办法也简单,在那个if语句上面添加一行:

self.published = True

分类: micolog, 软件 标签:

gae micolog 验证码

2009年9月19日 闫鹏 7 条评论

今天又遭到了新的一轮垃圾评论,愤怒之下,开始折腾pycaptcha的验证码功能,结果发现gae提供的image模块功能太简单了,没有ImageFont与ImgageDraw的相关能力。通过gae的python运行环境实现验证码看来是不可能了。

调研了一下目前提供验证码的服务,有下面两个,但是验证码的样子都太丑了,不喜欢,就放弃了

1.http://captcha.net/

2.http://captchas.net/

现在就暂时先优化一下micolog自己的验证码服务,避免人家直接发post请求就能发评论吧。观察comments.html文件,注释掉检查验证码的那个js函数,就会发现不填写验证码也能够直接发表评论了。修改blog.py文件,注释掉这一行:

if not (self.request.cookies.get(‘comment_user’, ”)):

再试试看,是不是不输入验证码的话,会提示错误?

惨,就先这样临时解决一下吧,记得要吧comments.html中的js注释恢复哦

分类: micolog 标签:

升级并小修正micolog相关文章功能

2009年9月9日 闫鹏 没有评论

搞这个玩意的主要原因是我通常都是用live writer写文章到micolog上面,而live writer是配置的word press的2.2+接口,怎么也没搞明白文章的tag是怎么添加上去的。word press 2.3才开始提供的tag功能,看来不升级micolog的rpc处理是不行了。

而micolog中的相关文章与支持搜索引擎的meta keyword功能,就是根据tag来做的,没有这个东东真是痛苦,rpc那边又一时半会没时间搞,就先顺手在category上面搞个山寨的吧

修改model.py文件中Entry的relatepost函数为下面这个样子:

[code lang='python' style='vs']

@property
def relateposts(self, num = 10):
    if  self._relatepost:
        return self._relatepost
    else:
        result = []
        self._relatepost = []
        find_from_tags = 0
        if self.tags:
            result = Entry.all().filter('tags IN', self.tags).order('-date').fetch(num)
            find_from_tags = len(result)

        if find_from_tags < num and self.categorie_keys:
            result = result + Entry.all().filter('categorie_keys IN ', self.categories).order('-date').fetch(num - find_from_tags)

        for entry in result:
            if entry.post_id != self.post_id:
                self._relatepost.append(entry)
        return self._relatepost

[/code]                                                                                      

里面那个for循环来去掉文章自己的方式更山寨了,不过这个是因为google的限制搞的,如果配置上filter为post_id !=就会出现拒绝服务的情况,要求order必须使用post_id,这就是我标题“小修正”的原因了,如果没有这个小修正,micolog 0.5版将会导致相关文章都是post_id为较小的那几篇。

修改indel.yaml文件,增加如下内容

[code lang='yaml' style='vs']

- kind: Entry
   properties:
   - name: tags
   - name: date
      direction: desc

- kind: Entry
   properties:
   - name: categorie_keys
   - name: date
      direction: desc

[/code]

上传到服务器后,记得要等待dashboard中的索引状态为serving,要不然会报没有索引的错误

分类: micolog 标签:

增加head请求处理,避免micolog出现405错误

2009年9月9日 闫鹏 6 条评论

最近发现micolog总是会出现一些抓虾与soso发过来的head请求,造成405错误,解决办法也简单:在base.py的BaseRequestHandler增加一个函数来讲head请求按照get请求处理

[code lang='python' style='vs']

def head(self, *args):

      return self.get(*args)

[/code]

最近总是有人在我blog上面发广告,真是气愤,今天到家一看,122条留言…怀疑micolog的留言验证机制太原始了,得找个时间整一下,简单看了下,python中处理captcha的有这么几个库

1.captchaimage:这个玩意据说性能不错,但貌似有c语言实现的部分,不知道gae能不能用

2.http://captchas.net/sample/python/:这个使用起来比较简单,但是貌似验证码图片里面有captchas的logo

3.pycaptcha,目前比较倾向于这个

分类: micolog 标签: