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自动化工具日志查询分析脚本代码实现
Nov 26 Python
KMP算法精解及其Python版的代码示例
Jun 01 Python
Python+matplotlib绘制不同大小和颜色散点图实例
Jan 19 Python
Python编程求质数实例代码
Jan 31 Python
win10下tensorflow和matplotlib安装教程
Sep 19 Python
python把1变成01的步骤总结
Feb 27 Python
python跳出双层for循环的解决方法
Jun 24 Python
Python完成哈夫曼树编码过程及原理详解
Jul 29 Python
用python实现前向分词最大匹配算法的示例代码
Aug 06 Python
Pandas中DataFrame交换列顺序的方法实现
Dec 14 Python
Python 虚拟环境工作原理解析
Dec 24 Python
pytorch 如何把图像数据集进行划分成train,test和val
May 31 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
收音机鉴频器对声音的影响和频偏分析
2021/03/02 无线电
php从数组中随机选择若干不重复元素的方法
2015/03/14 PHP
xml 与javascript结合的问题解决方法
2007/03/24 Javascript
番茄的表单验证类代码修改版
2008/07/18 Javascript
JQUERY 实现窗口滚动搜索框停靠效果(类似滚动停靠)
2013/03/27 Javascript
js实现不重复导入的方法
2016/03/02 Javascript
jQuery事件委托之Safari
2016/07/05 Javascript
jQuery实现简单漂亮的Nav导航菜单效果
2017/03/29 jQuery
JavaScript装饰器函数(Decorator)实例详解
2017/03/30 Javascript
让微信小程序支持ES6中Promise特性的方法详解
2017/06/13 Javascript
VUE利用vuex模拟实现新闻点赞功能实例
2017/06/28 Javascript
vue-router 前端路由之路由传值的方式详解
2019/04/30 Javascript
vue项目或网页上实现文字转换成语音播放功能
2020/06/09 Javascript
python 动态获取当前运行的类名和函数名的方法
2014/04/15 Python
在Python中关于中文编码问题的处理建议
2015/04/08 Python
tensorflow中next_batch的具体使用
2018/02/02 Python
Python 3.x基于Xml数据的Http请求方法
2018/12/28 Python
django使用xadmin的全局配置详解
2019/11/15 Python
tensorflow常用函数API介绍
2020/04/19 Python
python如何提升爬虫效率
2020/09/27 Python
Python获取android设备cpu和内存占用情况
2020/11/15 Python
HTML5的Geolocation地理位置定位API使用教程
2016/05/12 HTML / CSS
科颜氏加拿大官方网站: Kiehl’s加拿大
2016/08/16 全球购物
如何打印出当前源文件的文件名以及源文件的当前行号
2015/04/05 面试题
高中的自我鉴定
2013/12/16 职场文书
管理学院毕业生自荐信范文
2014/03/10 职场文书
网站美工岗位职责
2014/04/02 职场文书
2013年最新自荐信范文
2014/06/23 职场文书
2014党员民主评议个人总结
2014/09/10 职场文书
2015年公务员转正工作总结
2015/04/24 职场文书
2015年女职工工作总结
2015/05/15 职场文书
邓小平文选读书笔记
2015/06/29 职场文书
倡议书怎么写?
2019/04/11 职场文书
工作简历的自我评价
2019/05/16 职场文书
MySQL索引知识的一些小妙招总结
2021/05/10 MySQL
一篇文章带你搞懂Python类的相关知识
2021/05/20 Python