今天上班,因为与基础架构部的同事用邮件商讨公事,结果竟然意外发现一位校友。原来这位哥们把我们系主任的名言作为邮件签名,结果被我发现非常眼熟,一问之下,果然是校友,真是一个serendipity啊。
一个很好的在线创建矢量图的网站:http://vectormagic.com
来看看效果怎样:

与Symfony的sfCaptcha不同,Django框架里没有自带Captcha组件,不过从google结果来看,这两个似乎还可以用:
1、Google Django Captcha Code
2、Django and Captcha images
但是我还是觉得太复杂,更多的时候我们只是需要一个能显示防止自动注册的图片而已,于是恶补了一下PIL,自己写了一个简单的Captcha,效果图如下:

view.py:
from django.shortcuts import render_to_response from django.template import RequestContext from django.http import HttpResponse, HttpResponse import django.utils.simplejson as json from django.contrib.auth.models import User import Image, ImageFont, ImageDraw, ImageFilter from django.conf import settings import glob, random def captcha(request): """ Generate a captcha image. """ response = HttpResponse() chars, msg = 'abcdefghkmnpqrstuvwxyz23456789', '' for i in range(4): msg += chars[random.randint(0, len(chars) - 1)] request.session['captcha'] = msg # get available fonts and backgroup images fonts = glob.glob(settings.MEDIA_ROOT + '/fonts/*.ttf') bgs = glob.glob(settings.MEDIA_ROOT + '/captcha/*.jpeg') im = Image.new('RGB', (128, 128)) font = ImageFont.truetype(fonts[random.randint(0, len(fonts) - 1)], 32) bg = Image.open(bgs[random.randint(0, len(bgs) - 1)]) # draw text draw = ImageDraw.Draw(im) color = (random.randint(128, 255), random.randint(128, 255), random.randint(128, 255)) draw.text((20,40), msg, font = font, fill = color) im = im.rotate(random.randint(-30, 30)) # setup mask image def convert_mask(p): if p > 0: return 0 else: return 255 mask = im.convert('L').point(convert_mask) # blend image Image.composite(bg, im, mask).save(response, 'PNG') del draw, font, im, bg, mask response['Content-Type'] = 'image/png' return response
算法很简单,使用随机的背景图和字体,并对字体进行简单的旋转,应该能挡住大部分的机器人了。声明一下,这里的字体和图片来自pyCaptcha,如果有什么版权问题,请自己负责。
使用方法:
自己定义img,src属性指向上面列出的view:captcha,然后取request.session['captcha']就可以了,每访问一次图片,request.session['captcha']值就自动置为当时的图片值。注意,使用之前要保证已经安装了Python图片库:PIL
完整的程序和资源下载:captcha.rar
Unix里面有一个很实用的工具:whereis,用来显示命令的路径,可惜windows没有这个功能,不过,用下面的这段代码可以实现和whereis同样的功能:
@for %%e in (%PATHEXT%) do @for %%i in (%1%%e) do @if NOT "%%~$PATH:i"=="" echo %%~$PATH:i
把上面的代码存成bat文件就行了,调用的格式与whereis或者which一样。