Zeray Rice

..

reCAPTCHA-client With Web.py

嘛 最近写 web.py 写的多- - 验证码部分自然要用 reCAPTCHA 了… 搜了下 reCAPTCHA-client 这个包是官方提供的 SDK … 但是基本没有什么文档… 下面是探索结果:

安装:

1
# easy_install recaptcha-client 

关于这个包的其他信息见这里.

先扔代码再讲:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import os
import web
from web.contrib.template import render_jinja
from recaptcha.client import captcha

BasePATH = os.path.dirname(__file__)

render = render_jinja(os.path.join(BasePATH, 'tpl'),
                      encoding = 'utf-8')

def GetIP():
    if 'X-REAL-IP' in web.ctx.environ:
        return web.ctx.environ['X-REAL-IP']
    else:
        return web.ctx.environ['REMOTE_ADDR']

class reCAPTCHAHandler(object):
    def GET(self):
        captcha.API_SERVER = "http://api.recaptcha.net"
        chtml = captcha.displayhtml(public_key = RECAPTCHA_PUBLIC_KEY, \
                                    use_ssl = False, \
                                    error = None)
    return render.recaptcha(locals())
    def POST(self):
        data = web.input()
        challenge = data['recaptcha_challenge_field']
        response = data['recaptcha_response_field']
        remoteip = GetIP()
        cResponse = captcha.submit(challenge, \
                                   response, \
                                   RECAPTCHA_PRIVATE_KEY, \
                                   remoteip)
        if cResponse.is_valid:
            return "Success!"
        else:
            error = cResponse.error_code
            recaptcha = captcha.displayhtml(public_key = RECAPTCHA_PUBLIC_KEY, \
                                            use_ssl = False, \
                                            error = error)
            return render.signup(locals())

urls = (
    '/', 'reCAPTCHAHandler',
)
app = web.application(urls, globals())
application = app.wsgifunc()

先说 GET 部分, captcha.API_SERVER 可以指定 reCAPTCHA 调用的 API 地址, 默认用的是 http://www.google.com/recaptcha/api ( 还有一个 API_SSL_SERVER 用来指定 use_ssl = True 的时候访问的服务器 )

由于众所周知的原因… www.google.com 会不稳定… 所以换到 http://api.recaptcha.net 会好一点..

captcha.displayhtml 用来返回 reCAPTCHA 的显示代码 直接插入到模板就好了

然后是 POST 部分..

GetIP() 是写的一个获取 IP 的函数.. 貌似在 django 里面用的是 os.environ[“remote_addr”] 不知道为何我本机测试没有这个值 囧..

submit 函数用来向 reCAPTCHA 服务器发起验证. 验证之后可以根据返回的对象的 is_vaild 来判断是否正确..

返回的 error_code 是用于错误的时候让 reCAPTCHA 显示错误信息…嗯 = =

嘛 于是又结束了 - -

Comments