python如何识别验证码中的图片,python3识别图片验证码

  python如何识别验证码中的图片,python3识别图片验证码

  本文主要详细介绍了利用python生成图像验证码的方法。本文中的示例代码非常详细,具有一定的参考价值。感兴趣的朋友可以参考一下。

  

背景

  在注册或登陆场景中,经常会遇到需要输入图片验证码的情况。最经典的是12306买火车票。验证码还是很难破解的,如果用时间和次数验证,可以大大防止模拟登录或者暴力破解,保护用户信息,同时也可以大大减少对服务器的恶意请求。今天,我们将使用python的django框架PIL来实现一个简单的图片验证码。

  

环境

  python:3.6.5

  姜戈:3.1.6

  枕头:5.2.0

  【说明】:你需要有django基础,比如路由,查看功能,启动命令等。

  

代码

  check_code.py文件:

  功能:

  生成一个4位随机串,并将随机串写在图片上;将随机字符串和图片格式的字符串作为返回值。# -*-编码:utf-8 -*-

  随机导入

  从PIL导入图像,图像绘制,图像字体,图像过滤器

  #小写字母,去掉可能造成干扰的I,L,O,Z

  _ letter _ cases= abcdefghjkmnpqrstuvwxy

  #大写字母

  _ upper _ cases=_ letter _ cases . upper()

  #数字

  _numbers=“”。join(map(str,range(3,10)))

  init_chars=“”。join((_letter_cases,_大写,_numbers))

  定义创建验证代码(

  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=Monaco.ttf ,

  长度=4,

  draw_lines=True,

  n_line=(1,2),

  draw_points=True,

  点_机会=2):

  @ todo3360生成验证码图片

  @param size:图片的大小、格式(宽度、高度),默认为(120,30)

  @param chars:允许的字符集,格式字符串

  @param img_type:图片保存格式,默认为GIF,可选为GIF、JPEG、TIFF、PNG。

  @ parammode3360图片模式,默认是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图像实例

  @return: [1]:验证码图片中的字符串

  #宽度和高度

  宽度、高度=尺寸

  #创建图形

  img=Image.new(模式、大小、背景颜色)

  #创建画笔

  draw=ImageDraw。绘制(img)

  def get_chars():

  生成指定长度的字符串并返回列表格式

  返回random.sample(字符,长度)

  定义创建行():

  画干涉线

  #干扰线数量

  line _ num=random . randint(* n _ line)

  对于范围(line_num):内的I

     # 起始点

              begin = (random.randint(0, size[0]), random.randint(0, size[1]))

              # 结束点

              end = (random.randint(0, size[0]), random.randint(0, size[1]))

              draw.line([begin, end], fill=(0, 0, 0))

      def create_points():

          """绘制干扰点"""

          # 大小限制在[0, 100]

          chance = min(100, max(0, int(point_chance)))

          for w in range(width):

              for h in range(height):

                  tmp = random.randint(0, 100)

                  if tmp > 100 - chance:

                      draw.point((w, h), fill=(0, 0, 0))

      def create_strs():

          """绘制验证码字符"""

          c_chars = get_chars()

          # 每个字符前后以空格隔开

          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 draw_lines:

          create_line()

      if draw_points:

          create_points()

      strs = create_strs()

      # 图形扭曲参数

      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

  

路由:

  

from django.urls import path

  from web.views import home, account

  urlpatterns = [

      path(code/, home.code),

      path(test/, home.test),

  ]

  

视图函数:

  

# encoding=utf-8

  import json

  import io

  from django.shortcuts import render, HttpResponse, redirect

  import check_code as CheckCode

  def code(req):

      """

      获取验证码

      :param req:

      :return:

      """

      stream = io.BytesIO()

      # 创建随机字符串code

      # 创建一张图片格式的字符串,将随机字符串写到图片上

      img, code = CheckCode.create_validate_code()

      print([check_code][code]:, code)

      # 保存到内存中

      img.save(stream, PNG)

      req.session[CheckCode] = code

      return HttpResponse(stream.getvalue())

  def test(req):

      """通过请求头获取用户设备信息"""

      print(type(req))

      return render(req, test.html)

  html文件:

  功能:

  

  • 给图片绑定onclick事件,这样每点击一次就重新生成一个验证码;
  • img标签的src属性可以是字节流形式的图片,每次请求check_code视图函数,浏览器会将返回的图片字符串解析为图片作为src属性。

  

<!DOCTYPE html>

  <html lang="en">

  <head>

      <meta charset="UTF-8">

      <title>test</title>

  </head>

  <body>

      <h1>图片验证码</h1>

      <img src="/check_code/" alt="验证码" onclick="ChangeCode(this);">

      <script>

          function ChangeCode(ths) {

              ths.src += ?;

          }

      </script>

  </body>

  </html>

  

结果

  启动django项目,浏览器访问http://127.0.0.1:8000/test/,可以看到图片验证码:

  

  以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持盛行IT软件开发工作室。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • qq短信验证码发送失败怎么回事,qq验证码失败是怎么回事
  • ,,使用阿里大于(大鱼)平台进行发送手机验证码的流程
  • ,,SpringSceurity实现短信验证码登陆
  • android读取短信验证码,
  • android读取短信验证码,,Android使用MobSDK短信验证
  • android自动获取短信验证码功能在哪,安卓自动获取短信验证码
  • android自动获取短信验证码功能在哪,android自动获取短信验证码功能失效,Android自动获取短信验证码功能
  • android实现短信验证码自动填写功能是什么,安卓短信验证码自动填充 实现
  • android实现短信验证码自动填写功能是什么,安卓短信验证码自动填充 实现,Android实现短信验证码自动填写功能
  • android如何通过手机自动获取短信验证码信息,安卓自动获取短信验证码
  • android如何通过手机自动获取短信验证码信息,安卓自动获取短信验证码,Android如何通过手机自动获取短信验证码
  • ,,python网络爬虫实现发送短信验证码的方法
  • ,,Python实现滑块拼图验证码详解
  • ,,python3 破解 geetest(极验)的滑块验证码功能
  • 发验证码不在桌面显示,验证码能收到桌面上不显示怎么回事
  • 留言与评论(共有 条评论)
       
    验证码: