资讯专栏INFORMATION COLUMN

python:使用PIL,制作并验证图片验证码

laznrbfe / 442人阅读

摘要:验证码制作模块自带数字字母特殊字符变量集合,不需要我们手写集合生成随机生成数字或字母生成干扰字符定义干扰字符颜色生成验证码建议下载几款字体,变换下风格,我在粒定义了路径,这里就直接导入了填充颜色填充验证码填充验证码路由配置前端配置邮

验证码制作
#string模块自带数字、字母、特殊字符变量集合,不需要我们手写集合
import string
import random
import os
import uuid

import settings
from  PIL import Image, ImageDraw, ImageColor, ImageFilter, ImageFont


class Code(object):
    # 生成随机生成数字或字母
    def random_hexdigits(self, len=1):
        return random.sample(string.hexdigits, len)
    
    # 生成干扰字符
    def punctuation(self, len=1):
        return tuple(random.sample(string.punctuation, len))
    
    # 定义干扰字符颜色
    def random_color(self, min=64, max=255):
        return tuple((random.randint(min, max) for i in range(3)))
    
    # 生成验证码
    def creat_code(self, width=80, height=24, color=(192, 192, 192)):
        image = Image.new("RGB", (width, height), color)
        #建议下载几款字体,变换下风格,我在setting粒定义了static路径,这里就直接导入了
        font = ImageFont.truetype(os.path.join(settings.STATICPATH, "fonts/Lora-Regular.ttf"), 20)
        draw = ImageDraw.Draw(image)
        self.fill_color(draw, image, 5)
        self.fill_dischar(draw, image, 10)
        code = self.fill_char(draw, image, 4, 10, font)
        image_name = "{}.jpeg".format(uuid.uuid4().hex)
        image_path = os.path.join(settings.STATICPATH, "code/{}".format(image_name))
        print(image_path)
        image.save(image_path)
        return {"code": code, "image_path": image_path}
    
    # 填充颜色
    def fill_color(self, draw, image, interval):
        for i in range(0, image.width, interval):
            for j in range(0, image.height, interval):
                draw.point((i, j), fill=self.random_color())
    
    # 填充验证码
    def fill_dischar(self, draw, image, interval):
        for i in range(0, image.width, interval):
            dis = self.punctuation()
            j = random.randrange(3, image.height - 3)
            draw.text((i, j), dis[0], fill=self.random_color(64, 255))
    
    # 填充验证码
    def fill_char(self, draw, image, num, interval, font):
        code = ""
        for i in range(num):
            cha = self.random_hexdigits()
            code += str(cha[0])
            j = random.randrange(0, 5)
            # print(cha)
            # print(image.width*(i/num)+interval,j)
            draw.text((image.width * (i / num) + interval, j), cha[0], fill=self.random_color(32, 127), font=font)
        return code


if __name__ == "__main__":
    code = Code()
    print(code.creat_code())
flask路由配置
import os
from flask import Flask, Response
from flask import render_template
from utils.code import Code

app = Flask(__name__)


@app.route("/")
def Register():
    return render_template("verify.html")


@app.route("/codes/")
def code():
    infor = Code().creat_code()
    image_path = infor["image_path"]
    code = infor["code"]
    
    print(image_path)
    with open(image_path, "rb") as f:
        image_content = f.read()
    os.remove(image_path)
    return Response(image_content, mimetype="jpeg")


if __name__ == "__main__":
    app.run(debug=True)
前端配置
 
引用

github源码

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/44623.html

相关文章

  • 纯代系列:Python实现验证图片(PIL库经典用法用法,爬虫12306思路)

    摘要:现在的网页中,为了防止机器人提交表单,图片验证码是很常见的应对手段之一。现在就给出用的库实现验证码图片的代码。代码中有详细注释。生成的验证码图片效果这时候,细心的同学可能要问,如果每次生成验证码,都要先保存生成的图片,再显示到页面。 现在的网页中,为了防止机器人提交表单,图片验证码是很常见的应对手段之一。这里就不详细介绍了,相信大家都遇到过。 现在就给出用Python的PIL库实现验证...

    teren 评论0 收藏0
  • 使用Flask-WTF制作一个带验证的登陆表单

    摘要:目前还不是很熟悉的验证表单的原理,比如验证应该是用,这种就是放在后端处理的。此时就需要手动控制表单的生成。如果表单验证失败,失败的消息保存在中。 Flask-WTF遇到的坑 在使用Flask-WTF的时候,使用qucik_form()快速生成表单的确是很爽,但是生成的表单的样式并不是想要的,这个时候就不能使用qucik_form()了。 PS:目前还不是很熟悉Flask-WTF的验证表...

    i_garfileo 评论0 收藏0
  • python开发时几种安全验证的实现

    摘要:在这两种情况下,如果你签名的都是用户,那么该用户可以在激活账户和升级账户时,复用的可变部分。变量是一个元组,包括一个透视变换的系数。 额,一个突然的交流让我想起来我耽搁许久各种验证的实现迟迟没做过趁着这个机会就搞了一下分为三部分:邮箱验证,短信验证,图片验证码 邮箱验证 这个部分是主要参考的经典书籍-狗书思路就是根据用户某些信息通过JSON Web签名生成token,然后再发送邮件验证...

    int64 评论0 收藏0
  • OCR识别验证

    摘要:识别网站验证码详见维基百科或者百度百科识别的验证码原理采集一批验证码,根据图片特点进行初步处理二值化灰度化滤波降噪等处理然后分割图片,旋转图片,模板选取,训练算法,让它更准确。 最近在爬某网站,老是蹦出来验证码,就想着找个OCR破了这个验证码,然后就开始了OCR探索之旅。 首先简单说一下什么是OCR OCR是(Optical Character Recognition,光学字符识别)的...

    Yangyang 评论0 收藏0
  • 验证识别

    摘要:下面我们便来讲种验证码的识别方式和一些思路。哈哈库其实,验证码识别归根到底还是对各种各样图片的识别和操作,中有很对图像处理的库,其中就是其中之一。所以在处理验证码识别之前,必须先了解库和。第五步,按照规定轨迹进行拖动,完成验证。 写在前面 现在,很多网站采取各种各样的措施来反爬虫,其中之一就是使用验证码。当我们访问网页时,必须先通过验证码才能够访问页面。下面我们便来讲2种验证码的识别方...

    keke 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<