Python编写生成验证码的脚本的教程


Posted in Python onMay 04, 2015

在web开发中经常用到验证码,为了防止机器人注册或者恶意登陆和查询等,作用不容小觑

但是验证码其实不是一个函数就能搞定的,它需要生成图片和水印,其实每种语言都有相关的函数生成图片和文字水印。包括我熟悉的php,呵呵,今天主要来分享如何用python生成验证码。

python生成验证码主要用到如下模块:Image, ImageDraw, ImageFont, ImageFilter和随机数生成模块Random。

代码如下:

#!/usr/bin/env python
#coding=utf-8
import random
import Image, ImageDraw, ImageFont, ImageFilter
 
_letter_cases = "abcdefghjkmnpqrstuvwxy" # 小写字母,去除可能干扰的i,l,o,z
_upper_cases = _letter_cases.upper() # 大写字母
_numbers = ''.join(map(str, range(3, 10))) # 数字
init_chars = ''.join((_letter_cases, _upper_cases, _numbers))
fontType="/usr/share/fonts/truetype/freefont/FreeSans.ttf"
 
def create_validate_code(size=(120, 30),
               chars=init_chars,
               img_type="GIF",
               mode="RGB",
               bg_color=(255, 255, 255),
               fg_color=(0, 0, 255),
               font_size=18,
               font_type=fontType,
               length=4,
               draw_lines=True,
               n_line=(1, 2),
               draw_points=True,
               point_chance = 2):
 '''
 @todo: 生成验证码图片
 @param size: 图片的大小,格式(宽,高),默认为(120, 30)
 @param chars: 允许的字符集合,格式字符串
 @param img_type: 图片保存的格式,默认为GIF,可选的为GIF,JPEG,TIFF,PNG
 @param mode: 图片模式,默认为RGB
 @param bg_color: 背景颜色,默认为白色
 @param fg_color: 前景色,验证码字符颜色,默认为蓝色#0000FF
 @param font_size: 验证码字体大小
 @param font_type: 验证码字体,默认为 ae_AlArabiya.ttf
 @param length: 验证码字符个数
 @param draw_lines: 是否划干扰线
 @param n_lines: 干扰线的条数范围,格式元组,默认为(1, 2),只有draw_lines为True时有效
 @param draw_points: 是否画干扰点
 @param point_chance: 干扰点出现的概率,大小范围[0, 100]
 @return: [0]: PIL Image实例
 @return: [1]: 验证码图片中的字符串
 '''
 
 width, height = size # 宽, 高
 img = Image.new(mode, size, bg_color) # 创建图形
 draw = ImageDraw.Draw(img) # 创建画笔
 if draw_lines:
  create_lines(draw,n_line,width,height)
 if draw_points:
  create_points(draw,point_chance,width,height)
 strs = create_strs(draw,chars,length,font_type, font_size,width,height,fg_color)
 
 # 图形扭曲参数
 params = [1 - float(random.randint(1, 2)) / 100,
      0,
      0,
      0,
      1 - float(random.randint(1, 10)) / 100,
      float(random.randint(1, 2)) / 500,
      0.001,
      float(random.randint(1, 2)) / 500
      ]
 img = img.transform(size, Image.PERSPECTIVE, params) # 创建扭曲
 
 img = img.filter(ImageFilter.EDGE_ENHANCE_MORE) # 滤镜,边界加强(阈值更大)
 
 return img, strs
 
 
def create_lines(draw,n_line,width,height):
 '''绘制干扰线'''
 line_num = random.randint(n_line[0],n_line[1]) # 干扰线条数
 for i in range(line_num):
  # 起始点
  begin = (random.randint(0, width), random.randint(0, height))
  #结束点
  end = (random.randint(0, width), random.randint(0, height))
  draw.line([begin, end], fill=(0, 0, 0))
 
def create_points(draw,point_chance,width,height):
 '''绘制干扰点'''
 chance = min(100, max(0, int(point_chance))) # 大小限制在[0, 100]
  
 for w in xrange(width):
  for h in xrange(height):
   tmp = random.randint(0, 100)
   if tmp > 100 - chance:
    draw.point((w, h), fill=(0, 0, 0))
 
def create_strs(draw,chars,length,font_type, font_size,width,height,fg_color):
 '''绘制验证码字符'''
 '''生成给定长度的字符串,返回列表格式'''
 c_chars = random.sample(chars, length)
 strs = ' %s ' % ' '.join(c_chars) # 每个字符前后以空格隔开
  
 font = ImageFont.truetype(font_type, font_size)
 font_width, font_height = font.getsize(strs)
 
 draw.text(((width - font_width) / 3, (height - font_height) / 3),strs, font=font, fill=fg_color)
  
 return ''.join(c_chars)
 
 
if __name__ == "__main__":
  code_img = create_validate_code()
  code_img[0].save("validate.gif", "GIF")
  print code_img[1]
Python 相关文章推荐
python实现根据月份和日期得到星座的方法
Mar 27 Python
Python使用urllib2模块实现断点续传下载的方法
Jun 17 Python
Python使用爬虫猜密码
Feb 19 Python
浅析Python中yield关键词的作用与用法
Nov 29 Python
Python编程实现微信企业号文本消息推送功能示例
Aug 21 Python
Python用5行代码写一个自定义简单二维码
Oct 21 Python
python 使用pandas计算累积求和的方法
Feb 08 Python
python 使用plt画图,去除图片四周的白边方法
Jul 09 Python
将python运行结果保存至本地文件中的示例讲解
Jul 11 Python
Django连接数据库并实现读写分离过程解析
Nov 13 Python
Python字节单位转换实例
Dec 05 Python
Pytorch通过保存为ONNX模型转TensorRT5的实现
May 25 Python
使用Python制作获取网站目录的图形化程序
May 04 #Python
使用Python脚本来获取Cisco设备信息的示例
May 04 #Python
用Python脚本来删除指定容量以上的文件的教程
May 04 #Python
编写Python脚本来获取Google搜索结果的示例
May 04 #Python
编写Python脚本来实现最简单的FTP下载的教程
May 04 #Python
Python下线程之间的共享和释放示例
May 04 #Python
简单介绍Python中利用生成器实现的并发编程
May 04 #Python
You might like
destoon实现调用图文新闻的方法
2014/08/21 PHP
mysql_escape_string()函数用法分析
2016/04/25 PHP
php操作redis数据库常见方法实例总结
2020/02/20 PHP
jQuery 判断页面元素是否存在的代码
2009/08/14 Javascript
JS+XML 省份和城市之间的联动实现代码
2009/10/14 Javascript
jQuery DOM操作小结与实例
2010/01/07 Javascript
JavaScript之编码规范 推荐
2012/05/23 Javascript
鼠标滑在标题上显示图片的JS代码
2013/11/19 Javascript
JS+CSS实现弹出全屏灰黑色透明遮罩效果的方法
2014/12/20 Javascript
11种ASP连接数据库的方法
2015/09/18 Javascript
js实现页面a向页面b传参的方法
2016/05/29 Javascript
浅谈jquery的html方法里包含特殊字符的处理
2016/11/30 Javascript
AngularJS服务service用法总结
2016/12/13 Javascript
jQuery点击弹出层弹出模态框点击模态框消失代码分享
2017/01/21 Javascript
JQuery实现图片轮播效果
2017/05/08 jQuery
vue2.0 keep-alive最佳实践
2017/07/06 Javascript
使用Angular CLI进行Build(构建)和Serve详解
2018/03/24 Javascript
详解vue 路由跳转四种方式 (带参数)
2019/04/28 Javascript
vue-cli4项目开启eslint保存时自动格式问题
2020/07/13 Javascript
详解Python中的多线程编程
2015/04/09 Python
微信跳一跳python辅助软件思路及图像识别源码解析
2018/01/04 Python
Python实现的寻找前5个默尼森数算法示例
2018/03/25 Python
python 读取.csv文件数据到数组(矩阵)的实例讲解
2018/06/14 Python
Python错误处理操作示例
2018/07/18 Python
python版opencv摄像头人脸实时检测方法
2018/08/03 Python
Python后台开发Django会话控制的实现
2019/04/15 Python
Django模型修改及数据迁移实现解析
2019/08/01 Python
Python中*args和**kwargs的区别详解
2019/09/17 Python
python路径的写法及目录的获取方式
2019/12/26 Python
python自动打开浏览器下载zip并提取内容写入excel
2021/01/04 Python
娇韵诗加拿大官网:Clarins加拿大
2017/11/20 全球购物
联想新西兰官方网站:Lenovo New Zealand
2018/10/30 全球购物
DC Shoes荷兰官方网站:美国极限运动品牌
2019/10/22 全球购物
美国儿童服装、家具和玩具精品店:Maisonette
2019/11/24 全球购物
贫困证明书范文
2015/06/16 职场文书
建国70周年的心得体会(2篇)
2019/09/20 职场文书