用python实现一个简单的验证码

我们经常在登录一个网站,或者注册的时候需要输入一个验证码,有时候觉得很烦,因为有些验证码不仅复杂还看不清,许多用户就会因为这些而懒得再登录或者注册之类的。
既然验证码会造成流失用户的风险,为什么大家都还要使用验证码呢?
这是验证码在一定程度上起到保护网站安全的作用,比如防止大规模恶意注册(比如手机验证码形式,一机一户),再比如反爬虫(至少不会轻易让你爬取数据)等,你看用户基数最大的12306,就会有各种验证码。
既然验证码这么重要,它的原理是什么?是怎么实现的?
它的原理其实很简单,就是在服务器端生成验证码,发送给客户端,并以图像格式显示。客户端提交所显示的验证码,服务端接收并进行比较,若比对失败则不能实现登录或注册,反之成功后跳转相应界面。

我们知道了其原理,实现起来就很简单了,现在网络上也有各种各样已经做好的验证码,我们完全可以拿来即用。但是为了更好的理解其原理,我们来手撸一个简单的验证码,以下是在Django中实现。

简单的验证码

(1)、我们在urls.py中定义一条路由,如下:

url(r'getcode', views.get_code, name="get_code"),

(2)、我们定义一个视图函数get_code(),如下:

from io import BytesIO

from PIL import Image, ImageDraw, ImageFont
from django.conf import settings
from django.shortcuts import render, HttpResponse, redirect
def get_code(request):
  """
  手撸一个验证码
  """
  # 定义图像颜色模型
  mode = "RGB"
  # 定义图像尺寸
  size = (200, 100)
  # 定义背景色
  bg_color = (255, 0, 0)
  # 创建图像
  image = Image.new(mode=mode, size=size, color=bg_color)
  # 创建画布
  image_draw = ImageDraw.Draw(image, mode=mode)
  # 创建字体,第一个参数是字体,第二个参数是字体大小
  image_font = ImageFont.truetype(settings.FONT_PATH, 100)
  # 创建一个验证码
  verify_code = "Joke"
  # 生成验证码
  fill_color = (255,255,255)
  for i in range(4):
    image_draw.text(xy=(50 * i, 0), text=verify_code[i], font=image_font, fill=fill_color)
  # 保存图像
  fp = BytesIO()
  image.save(fp, "png")
  return HttpResponse(fp.getvalue(), content_type="image/png")

其中settings.FONT_PATH是我预先定义好的字段,如下

STATICFILES_DIRS = [  os.path.join(BASE_DIR, "statics"),]
FONT_PATH = os.path.join(os.path.join(STATICFILES_DIRS[0], "fonts"),"constan.ttf")

然后我们我们启动服务python manager.py runserver,在浏览器上就可以看到验证码生成了

能是实现了,但是我们现在是自定义了一个验证码字段,我们是需要随机生成验证码,而且字体颜色,背景颜色这些也不要定死了,然后我们再生成一些干扰点,我们对代码进行如下重构:

def get_code(request):
  """
  手撸一个验证码
  """
  # 定义图像颜色模型
  mode = "RGB"
  # 定义图像尺寸
  size = (200, 100)
  # 定义背景色
  bg_color = (get_color(), get_color(), get_color())
  # 创建图像
  image = Image.new(mode=mode, size=size, color=bg_color)
  # 创建画布
  image_draw = ImageDraw.Draw(image, mode=mode)
  # 创建字体,第一个参数是字体,第二个参数是字体大小
  image_font = ImageFont.truetype(settings.FONT_PATH, 100)
  # 创建一个验证码
  # verify_code = "Joke"
  verify_code = get_verify_code()
  # 生成验证码
  # fill_color = (255,255,255)
  for i in range(4):
    fill_color = (get_color(),get_color(),get_color())
    image_draw.text(xy=(50 * i, 0), text=verify_code[i], font=image_font, fill=fill_color)
  # 加入干扰点
  for i in range(10000):
    fill_color = (get_color(),get_color(),get_color())
    xy = (random.randrange(200), random.randrange(100))
    image_draw.point(xy=xy,fill=fill_color)
  # 保存图像
  fp = BytesIO()
  image.save(fp, "png")
  return HttpResponse(fp.getvalue(), content_type="image/png")

def get_color():
  """随机获取颜色"""
  return random.randrange(256)

def get_verify_code():
  """随机获取验证码"""
  verify_code = ''.join(random.choice(string.ascii_uppercase + string.digits + string.ascii_lowercase) for x in range(4))
  return verify_code

然后我们重启应用,刷新页面如下

是不是有点神似了?下面我们创建一个简单的login页面,来实际应用一下验证码。

简单的登录页面

(1)、创建一个路由

url(r'login',views.login, name="login"),

(2)、创建一个Login的视图函数

def login(request):
  """登录页面"""
  if request.method == "POST":
    pass
  return render(request, "login.html")

(3)、创建一个login.html的template

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Login</title>
</head>
<body>
<form action="{% url 'app01:login' %}" method="post">
	{% csrf_token %}
  <span>用户名:</span><input type="text" name="username">
  <br>
  <span>验证码:</span><input type="text" name="verify_code">
  <br>
  <img src="{% url 'app01:get_code' %}" alt="">
  <br>
  <button>登录</button>
</form>

</body>
</html>

然后重启服务,浏览器访问如下

现在我们只是简单的搭建起了流程,我们需要的功能还没有实现,我们需要的功能有:
1、验证码校验
2、点击图片自动刷新验证码
3、忽略大小写

我们现在对项目进行重构,如下:
(1)、我们在get_code视图函数添加一行代码,如下

# 创建一个验证码
  # verify_code = "Joke"
  verify_code = get_verify_code()
# 加入session
  request.session['verify_code'] = verify_code
  ......

(2)、修改login视图函数,如下

def login(request):
  """登录页面"""
  if request.method == "POST":
    storage_code = request.session.get("verify_code")
    submit_code = request.POST.get("verify_code")
    if storage_code.lower() == submit_code.lower():
      return HttpResponse("登录成功")
  return render(request, "login.html")

(3)、修改login.html代码如下

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Login</title>
</head>
<body>
<form action="{% url 'app01:login' %}" method="post">
  {% csrf_token %}
  <span>用户名:</span><input type="text" name="username">
  <br>
  <span>验证码:</span><input type="text" name="verify_code">
  <br>
  <img src="{% url 'app01:get_code' %}" alt="" name="verify_image">
  <br>
  <button>登录</button>
</form>
<script src="https://cdn.bootcss.com/jquery/3.2.0/jquery.js"></script>
<script>
  $(function () {
    $("img").on("click", function () {
      console.log("来了啊")
      $(this).attr("src","{% url 'app01:get_code' %}"+"?id="+Math.random())
    })
  })
</script>
</body>
</html>

然后就可以愉快的玩耍了,是不是很简单呢?

以上就是用python实现一个简单的验证码的详细内容,更多关于python 实现验证码的资料请关注我们其它相关文章!

(0)

相关推荐

  • python图片验证码识别最新模块muggle_ocr的示例代码

    一.官方文档 https://pypi.org/project/muggle-ocr/ 二模块安装 pip install muggle-ocr # 因模块过新,阿里/清华等第三方源可能尚未更新镜像,因此手动指定使用境外源,为了提高依赖的安装速度,可预先自行安装依赖:tensorflow/numpy/opencv-python/pillow/pyyaml 三.使用代码 # 导入包 import muggle_ocr # 初始化:model_type 包含了 ModelType.OCR/Model

  • Python识别验证码的实现示例

    废话不多说,直接开干! 首先安装库 pip install pytesseract pip install PILLOW 然后按照tesseract程序下载安装 tessercat下载地址:https://digi.bib.uni-mannheim.de/tesseract/ //请依据自己的操作系统下载exe文件安装 用户变量,系统变量都添加:PATH C:\Program Files (x86)\Tesseract-OCR; //这是tesseract的安装目录 系统变量添加:TESSDAT

  • Python利用Pillow(PIL)库实现验证码图片的全过程

    前言 Pillow库有很多用途,本文使用Pillow来生成随机的验证码图片. Pillow的用法参考:https://www.jb51.net/article/196007.htm 验证码是随机的,使用Python内置的random库来生成随机的颜色和随机的字符. random的用法参考:https://www.jb51.net/article/196955.htm 一.验证码图片的效果 # coding=utf-8 import random from PIL import Image, Im

  • python opencv pytesseract 验证码识别的实现

    一.环境配置 需要 pillow 和 pytesseract 这两个库,pip install 安装就好了. install pillow -i http://pypi.douban.com/simple --trusted-host pypi.douban.com pip install pytesseract -i http://pypi.douban.com/simple --trusted-host pypi.douban.com 安装好Tesseract-OCR.exe pytesse

  • Python实现验证码识别

    大致介绍 在python爬虫爬取某些网站的验证码的时候可能会遇到验证码识别的问题,现在的验证码大多分为四类: 1.计算验证码       2.滑块验证码 3.识图验证码 4.语音验证码 这篇博客主要写的就是识图验证码,识别的是简单的验证码,要想让识别率更高,识别的更加准确就需要花很多的精力去训练自己的字体库. 识别验证码通常是这几个步骤: 1.灰度处理 2.二值化 3.去除边框(如果有的话) 4.降噪 5.切割字符或者倾斜度矫正 6.训练字体库 7.识别 这6个步骤中前三个步骤是基本的,4或者5

  • Python生成随机验证码代码实例解析

    生成6位随机验证码的3种实现方式如下: 1. 简单粗暴型:所有数字和字母都放入字符串: 2. 利用ascii编码的规律,遍历获取字符串和数字的字符串格式: 3. 引用string库. 方法1代码: import random _list = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" _result = random.sample(_list, 6) result = ''.join(_result)

  • python识别验证码的思路及解决方案

    1.介绍 在爬虫中经常会遇到验证码识别的问题,现在的验证码大多分计算验证码.滑块验证码.识图验证码.语音验证码等四种.本文就是识图验证码,识别的是简单的验证码,要想让识别率更高,识别的更加准确就需要花很多的精力去训练自己的字体库. 识别验证码通常是这几个步骤: (1)灰度处理 (2)二值化 (3)去除边框(如果有的话) (4)降噪 (5)切割字符或者倾斜度矫正 (6)训练字体库 (7)识别 这6个步骤中前三个步骤是基本的,4或者5可根据实际情况选择是否需要. 经常用的库有pytesseract(

  • python 识别登录验证码图片功能的实现代码(完整代码)

    在编写自动化测试用例的时候,每次登录都需要输入验证码,后来想把让python自己识别图片里的验证码,不需要自己手动登陆,所以查了一下识别功能怎么实现,做一下笔记. 首选导入一些用到的库,re.Image.pytesseract.selenium.time import re # 用于正则 from PIL import Image # 用于打开图片和对图片处理 import pytesseract # 用于图片转文字 from selenium import webdriver # 用于打开网站

  • Python3爬虫中识别图形验证码的实例讲解

    本节我们首先来尝试识别最简单的一种验证码,图形验证码,这种验证码出现的最早,现在也很常见,一般是四位字母或者数字组成的,例如中国知网的注册页面就有类似的验证码,链接为:http://my.cnki.net/elibregister/commonRegister.aspx,页面: 表单的最后一项就是图形验证码,我们必须完全输入正确图中的字符才可以完成注册. 1.本节目标 本节我们就以知网的验证码为例,讲解一下利用 OCR 技术识别此种图形验证码的方法. 2. 准备工作 识别图形验证码需要的库有 T

  • Python实现一个简单的验证码程序

    老师讲完random函数,自己写的,虽然和老师示例的不那么美观,智能,但是也自己想出来的,所以记录一下,代码就需要自己不断的自己练习,实战,才能提高啊!不然就像我们这些大部分靠自学的人,何时能学会.还有就是,这次听老师的,把自己的代码添加注释,所以这次把很简单的代码都写上了注释,而且很大白话,不管有没有接触过python的,我相信仔细看了,肯定能看懂.如果看完,再自己尝试着默写出来,那就是更好到了,好了进入正题: 自己写的: __Author__ = "Zhang Peng" impo

  • 用python实现一个简单的验证码

    我们经常在登录一个网站,或者注册的时候需要输入一个验证码,有时候觉得很烦,因为有些验证码不仅复杂还看不清,许多用户就会因为这些而懒得再登录或者注册之类的. 既然验证码会造成流失用户的风险,为什么大家都还要使用验证码呢? 这是验证码在一定程度上起到保护网站安全的作用,比如防止大规模恶意注册(比如手机验证码形式,一机一户),再比如反爬虫(至少不会轻易让你爬取数据)等,你看用户基数最大的12306,就会有各种验证码. 既然验证码这么重要,它的原理是什么?是怎么实现的? 它的原理其实很简单,就是在服务器

  • Python解析最简单的验证码

    最近在学python,正好遇到学校需要选宿舍,就用python写了一个抢宿舍的软件.其中有一个模块是用来登陆的,登陆的时候需要输入验证码,不过后来发现了直接可以绕过验证码直接登陆的bug.不过这是另外的话题,开始的时候我并没有发现这个隐藏起来的秘密,所以我就写了这个python代码段用来实现解析验证码的功能. 我们学校的验证码是最简单的验证码,形式大概如下: 其中这个图片的大小是60X24像素的,大概每个数字的大小是15X24像素. 观察这个验证码之后可以发现,验证码中只有数字而且数字的字体很规

  • Python + Flask 实现简单的验证码系统

    一.写在前面 现在无论大大小小的网站,基本上都会使用验证码,登录的时候要验证,下载的时候要验证,而使用的验证码也从那些简简单单的字符图形验证码"进化"成了需要进行图文识别的验证码.需要拖动滑块的滑动验证码.甚至还有手机验证码.当你与之打交道的时候,有没有考虑过其背后的原理呢?当然了,对于那些复杂的验证码我们想要弄得一清二楚还是很难的,但是可以挑软柿子捏嘛--字符图形验证码,就这样,我决定用 Python + Flask 制作出一个简单的验证码系统来,话不多说,撸起袖子加油干! 二.基本

  • jQuery实现一个简单的验证码功能

    在学习jQuery过程中,写的一个简单的验证码的小例子,记载下来,方便以后借鉴补充,源码如下: <!DOCTYPE html> <html> <head> <title></title> <style type="text/css"> div{ background-color:blue; width:200px; height:100px; font-size:35px; } </style> <

  • Python实现一个简单的MySQL类

    本文实例讲述了Python实现一个简单的MySQL类.分享给大家供大家参考. 具体实现方法如下: 复制代码 代码如下: #!/usr/bin/env python # -*- coding:utf-8 -*- # Created on 2011-2-19 # @author: xiaoxiao import MySQLdb import sys __all__ = ['MySQL'] class MySQL(object):     '''     MySQL     '''     conn

  • python实现一个简单的并查集的示例代码

    并查集是一种树型的数据结构,用于处理一些不相交集合的合并及查询问题.常常在使用中以森林来表示. 并查集有三种基本操作,获得根节点,判断两节点是否连通,以及将两不连通的节点相连(相当于将两节点各自的集合合并) 用UnionFind类来表示一个并查集,在构造函数中,初始化一个数组parent,parent[i]表示的含义为,索引为i的节点,它的直接父节点为parent[i].初始化时各个节点都不相连,因此初始化parent[i]=i,让自己成为自己的父节点,从而实现各节点不互连. def __ini

  • 如何利用Python开发一个简单的猜数字游戏

    前言 本文介绍如何使用Python制作一个简单的猜数字游戏. 游戏规则 玩家将猜测一个数字.如果猜测是正确的,玩家赢.如果不正确,程序会提示玩家所猜的数字与实际数字相比是"大(high)"还是"小(low)",如此往复直到玩家猜对数字. 准备好Python3 首先,需要在计算机上安装Python.可以从Python官网下载并安装.本教程需要使用最新版的Python 3(版本3.x.x). 确保选中将Python添加到PATH变量的框.如果不这样做,将很难运行该程序.

  • python实现一个简单的ping工具方法

    继上一篇计算checksum校验和,本章通过socket套接字,struct字节打包成二进制,select返回套接字的文件描述符的结合,实现一个简单的ping工具. #!/usr/bin/python3.6.4 #!coding:utf-8 __author__ = 'Rosefinch' __date__ = '2018/5/31 22:27' import time import struct import socket import select import sys def chesks

  • Python实现一个简单的毕业生信息管理系统的示例代码

    写在前面: 从昨晚的梦里回忆起数据管理的作业: 实现一个自己的选题---- 毕业生信息管理系统,实现学生个人信息基本的增删改查, 我想了想前段时间刚学习的列表,这个简单啊 ,设计一个学生信息列表,然后列表里面再存每个学生详细信息的列表,然后来实现一个基本的增删查改,这个不难啊!直接开始撸代码! 上代码! def Menu():##菜单主界面 print('*'*22) print("* 查看毕业生列表输入: 1 *") print("* 添加毕业生信息输入: 2 *"

随机推荐