- 手艺 tags:
- captcha
- python
- web published: true comments: true
某人已经发展到上班时间写blog了。
继续说验证码服务,找到两个比较典型的。recaptcha非常著名,是twitter和facebook使用的验证码服务(不知道现在的情况。。。),vidoop提供了一种很有特点的验证码机制。
两个服务都提供了python的接口封装便于接入,通过api接口可以管中窥豹,大致了解这两个验证服务的机制。
recaptcha
下面是一段结合了web.py的简单调用public_key = "******" private_key = "********" class Recaptcha(object): def GET(self): r = recaptcha.displayhtml(public_key) return render.recapt(r)
def POST(self):
params = web.input()
recaptcha_challenge_field, recaptcha_response_field = params.recaptcha_challenge_field, params.recaptcha_response_field
remote_ip = web.ctx.ip
result = recaptcha.submit(recaptcha_challenge_field, recaptcha_response_field, private_key, remote_ip)
return result.is_valid
我在GET请求中获取验证码,在POST请求中提交验证码。
recaptcha返回的是一段recaptcha自己风格的html片段,效果大家参考twitter的验证码,实际上是一个iframe,iframe的url中包含了哈希串。其中的字段名也自然被写死成recaptcha_challenge_field和recaptcha_response_field,考虑到应用服务器无需验证这两个field的输入,所以也无可厚非。recaptcha_response_field用于输入字符,recaptcha_challenge_field在载入时被修改为一个唯一key。
提交验证时,recaptcha需要提供以上两个用户输入和应用的privatekey以及浏览器ip。recaptcha通过recaptcha_challenge_field 应用的private key以及用户出口ip可以唯一标示用户,并包含一些冗余实现安全相关策略。
Vidoop
Vidoop提供的服务机制与recaptcha大同小异customer_id = "***" site_id = "localtest" api_username = "******" api_password = "******" vdp = VidoopSecure(api_username, api_password, customer_id, site_id)
class Vidoop(object):
def GET(self):
captcha_id, captcha_url, captcha_categories, captcha_text = vdp.create_captcha()
return render.vidoop(captcha_id, captcha_url, captcha_categories, captcha_text)
def POST(self):
params =web.input()
captcha_id, captcha_code = params.id, params.code
try:
vdp.submit_captcha(captcha_id, captcha_code)
return True
except:
return False
提交验证时只需要要captcha_id和用户输入,这里相对recaptcha做了简化,但已经足够验证需要了。