Python 学习之生成图形验证码

news/2024/9/29 18:48:01/

一、 如何生成图形验证码?

新建一个captcha 的python 文件包,在__init__.py 文件中写入生成图形验证码的代码,将字体文件也放入这个文件包中 。

python">import random
from PIL import Image, ImageDraw, ImageFont, ImageFilter
import stringclass Captcha(object):# 生成几位的验证码number = 4# 验证码图片的宽度和高度size = (110, 38)# 验证码字体的大小fontsize = 25# 加入干扰线的条数line_number = 2# 构建一个验证码源文本source = list(string.ascii_letters)source.extend(map(lambda x: str(x), range(10)))# 用户绘制干扰线@classmethoddef _gene_line(cls, draw, width, height):begin = (random.randint(0, width), random.randint(0, height))end = (random.randint(0, width), random.randint(0, height))draw.line([begin, end], fill=cls._gene_random_color(), width=2)# 用于绘制干扰点@classmethod# cls, draw, point_chance, width, heightdef _gene_points(cls, draw, width, height, rate):# chance = min(100, max(0, int(point_chance)))  #大小限制在0-100# for w in range(width):#     for h in range(height):#         tmp = random.randint(0, 100)#         if tmp > chance:#             draw.point((w, h), fill=cls._gene_random_color())# 因为width为图形验证码的宽,height为图形验证码的高,整个图都是由点组成的# 点的x坐标范围:[0, 图形的宽度], y的坐标范围:[0, 图形的高度], 这样就能遍历图像的每一个像素点# rate 用来控制点生成的概率,大约100个点有rate个点被选中# point方法用来画点,参数1:点的坐标, 参数2:点的颜色for x in range(width):for y in range(height):if random.randint(1, 100) <= rate:draw.point((x, y), fill=cls._gene_random_color())# 随机生成颜色@classmethoddef _gene_random_color(cls, start=0, end=255):random.seed()return (random.randint(start, end), random.randint(start, end), random.randint(start, end))# 随机选择一个字体@classmethoddef _gene_random_font(cls):fonts = ["AlimamaShuHeiTi-Bold.ttf","AlimamaDaoLiTi.ttf","AlimamaDongFangDaKai-Regular.ttf",]font = random.choice(fonts)return f"utils/captcha/{font}"#     随机生成一个字符串(包括英文和数字)@classmethoddef gene_text(cls, number):return ''.join(random.sample(cls.source, number))#     生成验证码@classmethoddef gene_graph_captcha(cls):# 验证码图片的宽和高width, height = cls.size# 创建图片image = Image.new('RGBA', (width, height), cls._gene_random_color(0, 100))# 验证码字体font = ImageFont.truetype(cls._gene_random_font(), cls.fontsize)# 创建画笔draw = ImageDraw.Draw(image)# 生成字符串text = cls.gene_text(cls.number)# font.getsize(text)获取字体的尺寸# pillow 版本10 会报这个错误, AttributeError: 'FreeTypeFont' object has no attribute 'getsize'# 降低版本为9.5,但是安装一直报Read timed out,所以直接取消掉# font_width, font_height = font.getsize(text)# 填充字符串draw.text((30, 5), text, font=font,fill=cls._gene_random_color(150, 255))# 绘制干扰线for x in range(0, cls.line_number):cls._gene_line(draw, width, height)# 绘制噪点cls._gene_points(draw, width, height, 20)with open('utils/captcha/captcha.png', 'wb') as fp:image.save(fp)return text, image# if __name__ == '__main__':# Captcha.gene_graph_captcha()

二、 后端如何将图形验证码传给前端?

python">from utils.captcha import Captcha
from io import BytesIO
from flask import Blueprint, make_response
bp = Blueprint('common', __name__, url_prefix='/common')
@bp.route('/graph_captcha/')
def graph_captcha():# 获取验证码text, image = Captcha.gene_graph_captcha()# BytesIO 二进制流数据out = BytesIO()# 将image 指定保存在out 二进制流里面image.save(out, 'PNG')# 由于添加了图片数据进去,指针会指向文件流最后,所以需要将文件流指针指到0,跟操作文件类似out.seek(0)resp = make_response(out.read())resp.content_type = "image/png"cache.set(text.lower(), text.lower())return resp

三、 前端如何使用后端传递过来的图形验证码?

<div class="mb-3 input-group"><input class="form-control" type="text" name="graph_code" placeholder="图形验证码"><span id="graph_captcha_box" class="input-group-text graph_captcha_box"><img id="graph_captcha" src="{{ url_for('common.graph_captcha') }}" alt=""></span>
</div>
window.onload = function () {let graph_captcha_box = document.getElementById('graph_captcha_box')let graph_captcha = document.getElementById('graph_captcha')graph_captcha_box.addEventListener('click', function () {let timeStamps = new Date().getTime();graph_captcha.src = `/common/graph_captcha/?timeStamps=${timeStamps}`})
}


http://www.ppmy.cn/news/1532047.html

相关文章

自学网络安全(黑客技术)2024年 —90天学习计划

&#x1f91f; 基于入门网络安全/黑客打造的&#xff1a;&#x1f449;黑客&网络安全入门&进阶学习资源包 前言 什么是网络安全 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”…

C#案例 | 基于C#语言在Excel中进行二次开发(一):简单系统搭建:打印输出“Hello Excel C#”

基于C#语言在Excel中进行二次开发&#xff08;一&#xff09;&#xff1a;简单系统搭建&#xff1a;打印输出”Hello Excel & C#” 实现效果第一步&#xff1a;前期准备第二步&#xff1a;打开VS 2022&#xff0c;创建项目第三步&#xff1a;程序界面设计 实现效果 在Exce…

加载数据模型:在数据采集中实现动态数据处理

介绍 在现代网络爬虫技术中&#xff0c;数据的动态处理成为了提升采集效率和准确性的重要手段。随着目标网站数据的多样性和复杂性增加&#xff0c;静态数据采集方法逐渐无法满足需求。本文以拼多多为例&#xff0c;探讨如何通过加载数据模型实现动态数据处理&#xff0c;并结…

【C++报错已解决】std::ios_base::sync_with_stdio

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 专栏介绍 在软件开发和日常使用中&#xff0c;BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…

【基础算法总结】分治--快排+归并

目录 一&#xff0c;分治算法介绍二&#xff0c;算法原理和代码实现75.颜色划分912.排序数组-快速排序215.数组中的第k个最大元素(快速选择算法)LCR159.最小的k个数(快速选择算法)912.排序数组-归并排序LCR170.数组中的逆序对315.计算右侧小于当前元素的个数493.翻转对 三&…

【网站架构部署与优化】nginx反向代理

文章目录 nginx反向代理代理服务器正向代理与反向代理Nginx的负载均衡Nginx的动静分离 七层反向代理四层反向代理Nginx负载均衡调度策略1. 轮询&#xff08;Round-Robin, RR&#xff09;2. 加权轮询&#xff08;Weighted Round-Robin, WRR&#xff09;3. 最少连接&#xff08;L…

OpenAPI鉴权(二)jwt鉴权

一、思路 前端调用后端可以使用jwt鉴权&#xff1b;调用三方接口也可以使用jwt鉴权。对接多个三方则与每个third parth都约定一套token规则&#xff0c;因为如果使用同一套token&#xff0c;token串用可能造成权限越界问题&#xff0c;且payload交叉业务不够清晰。下面的demo包…

英特尔®以太网网络适配器E810-CQDA1 / E810-CQDA2 网卡 规格书 e810 网卡 规格书 Intel100G E810 网卡 白皮书

英特尔以太网800系列网络适配器 英特尔以太网网络适配器E810-CQDA1 / CQDA2 在10到100Gbps的以太网速度下实现高效的工作负载优化性能 关键特性 •单、双端口QSFP28 •应用设备队列(ADQ) •PCI Express (PCIe) 4.0 x16 •动态设备个性化(DDP) •以太网端口配置工具(EPC…