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实现360的字符显示界面
Feb 21 Python
python人人网登录应用实例
Sep 26 Python
跟老齐学Python之使用Python查询更新数据库
Nov 25 Python
python删除列表内容
Aug 04 Python
python实现教务管理系统
Mar 12 Python
python读取文本中的坐标方法
Oct 14 Python
用python建立两个Y轴的XY曲线图方法
Jul 08 Python
将Pytorch模型从CPU转换成GPU的实现方法
Aug 19 Python
基于keras 模型、结构、权重保存的实现
Jan 24 Python
Python GUI库Tkiner使用方法代码示例
Nov 27 Python
python asyncio 协程库的使用
Jan 21 Python
python 如何用urllib与服务端交互(发送和接收数据)
Mar 04 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
PHP通用检测函数集合
2006/11/25 PHP
php获取网页中图片、DIV内容的简单方法
2014/06/19 PHP
PHP错误Allowed memory size of 67108864 bytes exhausted的3种解决办法
2014/07/28 PHP
WordPress后台中实现图片上传功能的实例讲解
2016/01/11 PHP
PHP实现的限制IP投票程序IP来源分析
2016/05/04 PHP
jQuery(1.3.2) 7行代码搞定跟随屏幕滚动的层
2009/05/21 Javascript
js中replace的用法总结
2013/12/27 Javascript
JavaScript的History API使搜索引擎抓取AJAX内容
2015/12/07 Javascript
基于JavaScript实现瀑布流效果(循环渐近)
2016/01/27 Javascript
json对象与数组以及转换成js对象的简单实现方法
2016/06/24 Javascript
js制作网站首页图片轮播特效代码
2016/08/30 Javascript
JavaScript设计模式之策略模式详解
2017/06/09 Javascript
手淘flexible.js框架使用和源代码讲解小结
2018/10/15 Javascript
jQuery操作cookie的示例代码
2019/06/05 jQuery
使用 Angular RouteReuseStrategy 缓存(路由)组件的实例代码
2019/11/01 Javascript
JS addEventListener()和attachEvent()方法实现注册事件
2021/01/11 Javascript
Python 随机生成中文验证码的实例代码
2013/03/20 Python
Python实现基本数据结构中栈的操作示例
2017/12/04 Python
Python字典数据对象拆分的简单实现方法
2017/12/05 Python
python读取word文档,插入mysql数据库的示例代码
2018/11/07 Python
Pandas DataFrame中的tuple元素遍历的实现
2019/10/23 Python
通过Python扫描代码关键字并进行预警的实现方法
2020/05/24 Python
基于Python编写一个计算器程序,实现简单的加减乘除和取余二元运算
2020/08/05 Python
用sleep间隔进行python反爬虫的实例讲解
2020/11/30 Python
深入解读CSS3中transform变换模型的渲染
2016/05/27 HTML / CSS
CSS3旋转——彩色扇子兼容firefox浏览器
2013/06/04 HTML / CSS
SEPHORA新西兰官方网站:购买化妆品和护肤品
2016/12/02 全球购物
新闻记者实习自我鉴定
2013/09/19 职场文书
英文自荐信格式
2013/11/28 职场文书
贷款承诺书范文
2014/05/19 职场文书
2014年内部审计工作总结
2014/12/09 职场文书
幼儿园毕业典礼园长致辞
2015/07/29 职场文书
一个家长教育孩子的心得体会
2016/01/15 职场文书
八年级作文之感恩
2019/11/22 职场文书
redis的list数据类型相关命令介绍及使用
2022/01/18 Redis
Python调用腾讯API实现人脸身份证比对功能
2022/04/04 Python