生成随机图片验证码

随着互联网的不断发展,安全性问题日益突出。为了保障用户账号的安全性,很多网站都引入了验证码机制。验证码是一种区分用户是计算机还是人的公共全自动程序,可以有效防止恶意攻击和自动化脚本的滥用。本文将介绍如何使用Python生成随机图片验证码,提高网站的安全性。

效果图

在这里插入图片描述

一、准备工作

在生成随机图片验证码之前,我们需要准备一些必要的库和工具。首先,我们需要安装Python环境,然后使用pip安装以下库:

  1. PIL(Python Imaging Library):用于图像处理和操作。
  2. random:用于生成随机数。
  3. 下载字体文件:字体文件

可以通过以下命令安装这些库:

pip install pillow

二 功能介绍

1. 生成随机验证码

import random  
import string  
  
# 生成指定长度的随机验证码
all_chars = string.ascii_letters + string.digits  # 包含大小写字母和数字  
random_code = ''.join(random.choice(all_chars) for _ in range(4))  
print(random_code)

通过string生成随机大小字母数组长度为4的字符串

2. 创建图片

from PIL import Image
img = Image.new(mode='RGB', size=(120, 30), color=(255, 255, 255))
 
with open('code.png','wb') as f:
    img.save(f,format='png')

在这里插入图片描述

通过pillow模块可以创建图片, 如图可以指定图片的大小和颜色。

3. 创建画笔

from PIL import Image, ImageDraw

# 创建一个新的白色图像,大小为200x200像素  
image = Image.new('RGB', (200, 200), color=(255, 255, 255))

# 创建一个可以在给定图像上绘图的对象  
draw = ImageDraw.Draw(image)

# 画线  
# 参数分别为:起始点的x坐标,起始点的y坐标,结束点的x坐标,结束点的y坐标,线条颜色,线条宽度  
draw.line((0, 0, 200, 200), fill=(0, 0, 0), width=5)  # 从(0, 0)到(200, 200)画一条黑色线条,宽度为5  

# 画点  
# 参数分别为:点的x坐标,点的y坐标,点的颜色  
draw.point((100, 100), fill=(255, 0, 0))  # 在(100, 100)处画一个红色点  

# 画圆  
# 参数分别为:圆心的x坐标,圆心的y坐标,半径,填充颜色(可选),线条颜色(可选),线条宽度(可选)  
draw.ellipse((50, 50, 150, 150), fill=(0, 255, 0), outline=(0, 0, 255))  # 画一个绿色的圆,边缘为红色,位置由矩形的左上角和右下角坐标定义  

# 画矩形  
# 参数分别为:矩形左上角的x坐标,矩形左上角的y坐标,矩形右下角的x坐标,矩形右下角的y坐标,填充颜色(可选),线条颜色(可选),线条宽度(可选)  
draw.rectangle((10, 10, 190, 190), fill=None, outline=(0, 0, 255), width=3)  # 画一个红色的矩形框,位置由左上角和右下角坐标定义  

draw.text([100,100],'python',"red")
# 显示图像  
image.show()

在这里插入图片描述

创建画笔之后,就能在上一个步骤中创建的图片中根据自己的需要将生成的验证码画在图片上

4. 添加文字资源

font = ImageFont.truetype("kumo.ttf", 28)

使用pillow中的默认字体是正常的字体,但是这种字体容易被爬虫给破解,需要更换字体

5. 添加干扰

# 写干扰点
for i in range(20):
    draw.point([random.randint(0, self.width), random.randint(0, self.height)], fill=self.random_color())

# 写干扰圆圈
for i in range(20):
    draw.point([random.randint(0, self.width), random.randint(0, self.height)], fill=self.random_color())
    x = random.randint(0, self.width)
    y = random.randint(0, self.height)
    draw.arc((x, y, x + 4, y + 4), 0, 90, fill=self.random_color())

# 画干扰线
for i in range(5):
    x1 = random.randint(0, self.width)
    y1 = random.randint(0, self.height)
    x2 = random.randint(0, self.width)
    y2 = random.randint(0, self.height)

    draw.line((x1, y1, x2, y2), fill=self.random_color())
# 应用模糊滤镜,增加干扰效果
self.img = self.img.filter(ImageFilter.EDGE_ENHANCE_MORE)

更换了字体后安全性也不是很高,需要在图片上增加一些干扰的元素,防止爬虫失败到图片中的验证码。

未增加干扰和增加干扰的对比

在这里插入图片描述

三、使用示例

现在我们可以将上述函数结合起来,生成一个随机图片验证码,并将其保存为文件或直接在网页上显示。

import random
import string
from PIL import Image, ImageDraw, ImageFilter, ImageFont


class ImageCode:
    def __init__(self, width=120, height=30, char_length=5, font_file='kumo.ttf', font_size=28):
        self.width = width
        self.height = height
        self.char_code = None
        self.char_length = char_length
        self.font_file = font_file
        self.font_size = font_size
        self.img = Image.new(mode='RGB', size=(self.width, self.height), color=(255, 255, 255))

    def random_code(self):
        """生成指定长度的随机验证码"""
        all_chars = string.ascii_letters + string.digits  # 包含大小写字母和数字
        random_code = ''.join(random.choice(all_chars) for _ in range(self.char_length))
        return random_code

    @staticmethod
    def random_color():
        """生成随机颜色"""
        return (random.randint(0, 255), random.randint(10, 255), random.randint(64, 255))

    def draw_code(self, draw):
        """画随机码"""
        font = ImageFont.truetype(self.font_file, self.font_size)
        for i in range(self.char_length):
            char = self.char_code[i]
            h = random.randint(0, 4)
            draw.text([i * self.width / self.char_length, h], char, font=font, fill=self.random_color())

    def add_interfere(self, draw):
        """添加干扰"""
        # 写干扰点
        for i in range(20):
            draw.point([random.randint(0, self.width), random.randint(0, self.height)], fill=self.random_color())

        # 写干扰圆圈
        for i in range(20):
            draw.point([random.randint(0, self.width), random.randint(0, self.height)], fill=self.random_color())
            x = random.randint(0, self.width)
            y = random.randint(0, self.height)
            draw.arc((x, y, x + 4, y + 4), 0, 90, fill=self.random_color())

        # 画干扰线
        for i in range(5):
            x1 = random.randint(0, self.width)
            y1 = random.randint(0, self.height)
            x2 = random.randint(0, self.width)
            y2 = random.randint(0, self.height)

            draw.line((x1, y1, x2, y2), fill=self.random_color())
        # 应用模糊滤镜,增加干扰效果
        self.img = self.img.filter(ImageFilter.EDGE_ENHANCE_MORE)

    def save_image(self, image_file):
        f = open(image_file, "wb")
        self.img.save(f, format="png")

    def get_image_code(self):
        self.char_code = self.random_code()
        draw = ImageDraw.Draw(self.img, mode='RGB')
        self.draw_code(draw)
        self.add_interfere(draw)
        image_file = "image_code.png"
        self.save_image(image_file)
        return image_file, self.char_code


if __name__ == '__main__':
    img_code = ImageCode()
    image_file, image_code = img_code.get_image_code()
    print(image_file, image_code)

在这里插入图片描述
在这里插入图片描述
运行上述代码后,将生成一个名为image_code.png的图片文件,其中包含了随机生成的验证码。你可以将此图片嵌入到你的网站中,要求用户输入验证码以进行验证。

四、总结

本文介绍了如何使用Python生成随机图片验证码的过程。通过生成随机字符串和绘制干扰线,我们可以创建一个安全可靠的验证码系统,提高网站的安全性。你可以根据自己的需求进行进一步的扩展和优化,例如添加更多的干扰元素、调整字体和颜色等。希望本文对你有所帮助!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/531699.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

技术小课堂:100%CC防护是怎么实现的?

大家好,今天我们深入探讨的是如何有效地实现CC攻击的100%防护,以及传统防护手段存在的局限性和我们的定制化解决方案的优势。 传统的CC防护措施通常依赖于全局性的访问频率控制或在防火墙级别设置固定的访问次数限制。这种方式看似简单直接,…

数据挖掘实战-基于机器学习的垃圾邮件检测模型(文末送书)

🤵‍♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞&#x1f4…

day13-实战:商城首页(上)

个人主页:学习前端的小z 个人专栏:HTML5和CSS3悦读 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结,欢迎大家在评论区交流讨论! 文章目录 作业 作业 .bg-backward {width: 60px; height: 60px;background: url(../ima…

超越常规:用PHP抓取招聘信息

在人力资源管理方面,有效的数据采集可以为公司提供宝贵的人才洞察。通过分析招聘网站上的职位信息,人力资源专员可以了解市场上的人才供给情况,以及不同行业和职位的竞争状况。这样的数据分析有助于企业制定更加精准的招聘策略,从…

springboot+jsp幼儿园综合管理系统1m341

jdk版本:1.8 及以上 ide工具:IDEA 或者eclipse 数据库: mysql 编程语言: java 框架:SSM/springboot都有 maven: 3.6.1 前端:layuibootstrapjsp 详细技术:HTMLCSSJSjspspringmvcmybatisMYSQLMAVENtomcat贝儿米幼儿教育…

vue2实现wangEditor富文本便捷器的封装使用--真实项目

基于wangEditor 5实现一个简单的富文本编辑器组件,实现自定义上传图片。 官网地址:https://www.wangeditor.com/v5/for-frame.html#%E9%85%8D%E7%BD%AE 1. 安装依赖包: npm i wangeditor/editor --save npm i wangeditor/editor-for-vue --…

windows组播发不出去解决办法

由于开启了虚拟网卡,安装VMWare虚拟化软件,可能会通过虚拟网卡发送组播,需要禁用虚拟化网卡。

c++作业day4

头文件&#xff1a; #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTimer> #include <QTime> #include <QTextToSpeech> #include <QMessageBox> QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass…

通过Telnet访问网络设备

要通过 Telnet 访问网络设备&#xff0c;需要通过Console端口对网络设备进行基本配置&#xff0c;例如&#xff0c;IP地址、子网掩码、用户名和登录密码等。本实验以路由器为例&#xff0c;交换机远程管理只是接口名字不同而已&#xff0c;路由器用物理接口&#xff0c;交换机用…

自己写的组件中使用v-model双向绑定

这里的时间选择表单是我写的一个组件&#xff0c;我想用v-model获取到实时的ref值。 代码&#xff1a; //父组件<TimePickerModal v-model:value"time" label-text"计划客面时间" /> const time ref(2024-04-09 15:20:00);//子组件<template>…

虚拟化性能计数器需要至少一个可正常使用的计数器

VMware 虚拟机报错&#xff1a;虚拟化性能计数器需要至少一个可正常使用的计数器。 截图如下&#xff1a; 解决方式参考下图操作即可

飞桨Ai(一)基于训练后的模型进行信息提取

基准 本博客基于如下视频&#xff1a; 发票抬头信息抽取之环境搭建 - 基于飞浆开源项目发票抬头信息抽取之数据标准模型训练 - 基于飞浆开源项目 步骤 1、准备工作 下载python&#xff1a;【Python】Windows&#xff1a;Python 3.9.2 下载和安装&#xff08;建议3.9&#…

蓝桥杯真题 字串简写 前缀和

&#x1f468;‍&#x1f3eb; Acwing 字串简写 输入 4 abababdb a b输出 6&#x1f496; 前缀和 import java.util.Scanner;public class Main {static int N (int) 5e5 10;static int[] l new int[N];// l[i] 表示 i 以及 i 左边包含多少个字符 apublic static void …

CesiumJS内置三维数字地球,你都不知道效果有多炫酷。

CesiumJS是一个开源的JavaScript库&#xff0c;用于在Web浏览器中创建高性能的3D地球和地理空间应用程序。它提供了强大的工具和API&#xff0c;使开发者能够构建具有交互性、可视化和地理空间分析功能的应用。 以下是CesiumJS的一些主要特点和功能&#xff1a; 3D地球可视化&…

基于RF的时间序列预测模型matlab代码

整理了基于RF的时间序列预测模型matlab代码&#xff0c; 包含数据集。采用了四个评价指标R2、MAE、MBE、MAPE对模型.效果优异 训练集数据的R2为&#xff1a;0.99656 测试集数据的R2为&#xff1a;0.94944 训练集数据的MAE为&#xff1a;0.0042509 测试集数据的MAE为&#x…

HarmonyOS 开发-Worker子线程中解压文件

介绍 本示例介绍在Worker 子线程使用ohos.zlib 提供的zlib.decompressfile接口对沙箱目录中的压缩文件进行解压操作&#xff0c;解压成功后将解压路径返回主线程&#xff0c;获取解压文件列表。 效果图预览 使用说明 点击解压按钮&#xff0c;解压test.zip文件&#xff0c;显…

基于Web的农产品销售管理系统

1 课题简介 1.1 选题背景 自宇宙出现盘古开天依赖&#xff0c;万事万物就在不断的进步更新淘汰弱者&#xff0c;现在到了如今人们进入了互联网上帝世纪&#xff0c;越来越多的事物和工作都可以在网上用数据流代替和执行&#xff0c;不必再像以前一样亲自出面和出门做事&#…

第9章 文件和内容管理

思维导图 9.1 引言 文件和内容管理是指针对存储在关系型数据库之外的数据和信息的采集、存储、访问和使用过程的管理。它的重点在于保持文件和其他非结构化或半结构化信息的完整性&#xff0c;并使这些信息能够被访问。文件和非结构化内容也应是安全且高质量的。 确保文件和内容…

0基础入门Playwright框架,赶紧上车!

自从2023年底playwright框架火起来之后&#xff0c;很多小伙伴都会来咨询我们这个框架相关内容&#xff0c;甚至问我们什么时候出这个课程。 这不&#xff0c;新课程终于在大家的千呼万唤中出来啦&#xff01;具体的课程大纲和试听视频&#xff01; Web自动化测试项目实战(Pyte…

【JavaWeb】JSP实现数据传递与保存

目录 JSP内置对象requestrequest对象的常用方法get与post区别 问题解决表单提交时中文乱码的问题 responseresponse对象的常用方法 思考请求的转发示例 转发与重定向的区别会话session对象常用方法session与窗口的关系示例&#xff1a;使用session实现访问控制 思考小结思考JSP…