Python生成验证码实例讲解

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

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

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

代码如下:

#!/usr/bin/env python#coding=utf-8import randomimport 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]

登录后复制

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2284200.html

(0)
上一篇 2025年2月27日 20:37:50
下一篇 2025年2月25日 12:37:59

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 使用python发送邮件和接收邮件

    发邮件是大家工作中最常用到的。今天来看一下怎么用python来发送和接收邮件。 python实现发送和接收邮件功能主要用到poplib和smtplib模块。 poplib用于接收邮件,而smtplib负责发送邮件。 代码如下: #! /us…

    编程技术 2025年2月27日
    200
  • Python简单两步实现天气爬虫采集器

    说道爬虫大家或许感觉非常神秘,其实它没有我们想象的那么神奇(当然,google和baidu的爬虫是一场复杂和强大的,它的强大不是爬虫本身强大,而是后台的数据处理和数据挖掘算法非常强大),今天我们就来揭开它神秘的面纱。呵呵,简单两步就可以实现…

    编程技术 2025年2月27日
    200
  • python使用matplotlib绘图详解

    matplotlib是python最著名的绘图库,它提供了一整套和matlab相似的命令api,十分适合交互式地进行制图。而且也可以方便地将它作为绘图控件,嵌入gui应用程序中。它的文档相当完备,并且gallery页面中有上百幅缩略图,打开…

    2025年2月27日 编程技术
    200
  • python中json对象转换出错解决方法

    今天在使用python中的json转换碰到一个问题: 接收一个post的json字符串: s={“username”:”admin”,”password”:&#8221…

    编程技术 2025年2月27日
    200
  • python批量抓取美女图片

    学了python以后,知道python的抓取功能其实是非常强大的,当然不能浪费,呵呵。我平时很喜欢美女图,呵呵,程序员很苦闷的,看看美女,养养眼,增加点乐趣。好,那就用python写一个美女图自动抓取程序吧~~ 其中用到urllib2模块和…

    编程技术 2025年2月27日
    200
  • Python中map filter reduce的递归实现

    map2=lambda f,seq: [] if seq==[] else [f(seq[0])] + map2(f, seq[1:])  filter2=lambda f, seq: [] if seq==[] else ( [seq[0…

    编程技术 2025年2月27日
    200
  • 如何让python变得更快?

    python和其他脚本语言通常会被摒弃,因为它们相对于一些类似于c语言的编译型的语言来说效率很低。比如下面的斐波纳契数的例子: C语言中: int fib(int n){   if (n Python中:def fib(n):  if n …

    编程技术 2025年2月27日
    200
  • 教你用100多行写一个数据库

    本文介绍的是以为中国的it资深人士写的一个简单的数据库,没有我们使用的数据库那么强大,但是值得大家借鉴。可以用在特定环境中,更加灵活方便。 数据库的名字叫WawaDB,是用python实现的。由此可见python是灰常强大啊! 简介 记录日…

    编程技术 2025年2月27日
    200
  • linux及windows下使用Python获取IP地址

    使用python可以用很简单的方法得到本机ip地址,不过在windows和linux下的方法稍有不一样的,下面就来详细介绍下: Windows下获得IP地址的方法 方法一 使用socket模块 使用拨号上网的话,一般都有一个本地ip和一个外…

    编程技术 2025年2月27日
    200
  • PYTHON如何在内存中生成ZIP文件

    如题,代码如下: class MemoryZipFile(object):   def __init__(self):       #创建内存文件       self._memory_zip = StringIO.StringIO()  …

    编程技术 2025年2月27日
    200

发表回复

登录后才能评论