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 url 参数修改方法
Dec 26 Python
使用Python向DataFrame中指定位置添加一列或多列的方法
Jan 29 Python
详细介绍Python进度条tqdm的使用
Jul 31 Python
python编写简单端口扫描器
Sep 04 Python
Python 中如何实现参数化测试的方法示例
Dec 10 Python
python中的split()函数和os.path.split()函数使用详解
Dec 21 Python
Python 模拟生成动态产生验证码图片的方法
Feb 01 Python
解决Django提交表单报错:CSRF token missing or incorrect的问题
Mar 13 Python
python模块如何查看
Jun 16 Python
如何使用Python自动生成报表并以邮件发送
Oct 15 Python
pytorch中的numel函数用法说明
May 13 Python
python开发制作好看的时钟效果
May 02 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
《魔兽争霸3:重制版》翻车了?你想要的我们都没有
2019/11/07 魔兽争霸
php cli 方式 在crotab中运行解决
2010/02/08 PHP
Blitz templates 最快的PHP模板引擎
2010/04/06 PHP
php生成二维码的几种方式整理及使用实例
2013/06/03 PHP
Yii使用find findAll查找出指定字段的实现方法
2014/09/05 PHP
Yii框架中 find findAll 查找出制定的字段的方法对比
2014/09/10 PHP
Netbeans 8.2与PHP相关的新特性介绍
2016/10/08 PHP
laravel实现图片上传预览,及编辑时可更换图片,并实时变化的例子
2019/11/14 PHP
如何在centos8自定义目录安装php7.3
2019/11/28 PHP
javascript 写类方式之六
2009/07/05 Javascript
基于Jquery插件开发之图片放大镜效果(仿淘宝)
2011/11/19 Javascript
jQuery对checkbox 复选框的全选全不选反选的操作
2016/08/09 Javascript
全面了解函数声明与函数表达式、变量提升
2016/08/09 Javascript
js中数组的常用方法小结
2016/12/30 Javascript
全站最详细的Vuex教程
2018/04/13 Javascript
Vue框架TypeScript装饰器使用指南小结
2019/02/18 Javascript
javascript设计模式 ? 中介者模式原理与用法实例分析
2020/04/20 Javascript
Python批量按比例缩小图片脚本分享
2015/05/21 Python
浅谈python实现Google翻译PDF,解决换行的问题
2018/11/28 Python
python中Django文件上传方法详解
2020/08/05 Python
python 日志模块logging的使用场景及示例
2021/01/04 Python
与世界上最好的跑步专业品牌合作:Fleet Feet
2019/03/22 全球购物
物流司机岗位职责
2013/12/28 职场文书
社区母亲节活动记录
2014/03/06 职场文书
彩妆大赛策划方案
2014/05/13 职场文书
应届大专生自荐书
2014/06/16 职场文书
小学课外阅读总结
2014/07/09 职场文书
六查六看六改心得体会
2014/10/14 职场文书
2014年化工厂工作总结
2014/11/25 职场文书
保送生自荐信
2015/03/06 职场文书
婚前协议书怎么写,才具有法律效力呢 ?
2019/06/28 职场文书
大学生创业计划书常用模板
2019/08/07 职场文书
python实战之一步一步教你绘制小猪佩奇
2021/04/22 Python
Go语言应该什么情况使用指针
2021/07/25 Golang
Nginx虚拟主机的配置步骤过程全解
2022/03/31 Servers
Mongodb 迁移数据块的流程介绍分析
2022/04/18 MongoDB