原材料价格查询网站,500强企业排名一览表,如何查看网站开发单位,成都小程序制作开发随着互联网的不断发展#xff0c;安全性问题日益突出。为了保障用户账号的安全性#xff0c;很多网站都引入了验证码机制。验证码是一种区分用户是计算机还是人的公共全自动程序#xff0c;可以有效防止恶意攻击和自动化脚本的滥用。本文将介绍如何使用Python生成随机图片验…随着互联网的不断发展安全性问题日益突出。为了保障用户账号的安全性很多网站都引入了验证码机制。验证码是一种区分用户是计算机还是人的公共全自动程序可以有效防止恶意攻击和自动化脚本的滥用。本文将介绍如何使用Python生成随机图片验证码提高网站的安全性。
效果图 一、准备工作
在生成随机图片验证码之前我们需要准备一些必要的库和工具。首先我们需要安装Python环境然后使用pip安装以下库
PILPython Imaging Library用于图像处理和操作。random用于生成随机数。下载字体文件字体文件
可以通过以下命令安装这些库
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(modeRGB, size(120, 30), color(255, 255, 255))with open(code.png,wb) as f:img.save(f,formatpng)通过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), width5) # 从(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), fillNone, outline(0, 0, 255), width3) # 画一个红色的矩形框位置由左上角和右下角坐标定义 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)], fillself.random_color())# 写干扰圆圈
for i in range(20):draw.point([random.randint(0, self.width), random.randint(0, self.height)], fillself.random_color())x random.randint(0, self.width)y random.randint(0, self.height)draw.arc((x, y, x 4, y 4), 0, 90, fillself.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), fillself.random_color())
# 应用模糊滤镜增加干扰效果
self.img self.img.filter(ImageFilter.EDGE_ENHANCE_MORE)更换了字体后安全性也不是很高需要在图片上增加一些干扰的元素防止爬虫失败到图片中的验证码。
未增加干扰和增加干扰的对比 三、使用示例
现在我们可以将上述函数结合起来生成一个随机图片验证码并将其保存为文件或直接在网页上显示。
import random
import string
from PIL import Image, ImageDraw, ImageFilter, ImageFontclass ImageCode:def __init__(self, width120, height30, char_length5, font_filekumo.ttf, font_size28):self.width widthself.height heightself.char_code Noneself.char_length char_lengthself.font_file font_fileself.font_size font_sizeself.img Image.new(modeRGB, 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_codestaticmethoddef 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, fontfont, fillself.random_color())def add_interfere(self, draw):添加干扰# 写干扰点for i in range(20):draw.point([random.randint(0, self.width), random.randint(0, self.height)], fillself.random_color())# 写干扰圆圈for i in range(20):draw.point([random.randint(0, self.width), random.randint(0, self.height)], fillself.random_color())x random.randint(0, self.width)y random.randint(0, self.height)draw.arc((x, y, x 4, y 4), 0, 90, fillself.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), fillself.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, formatpng)def get_image_code(self):self.char_code self.random_code()draw ImageDraw.Draw(self.img, modeRGB)self.draw_code(draw)self.add_interfere(draw)image_file image_code.pngself.save_image(image_file)return image_file, self.char_codeif __name__ __main__:img_code ImageCode()image_file, image_code img_code.get_image_code()print(image_file, image_code) 运行上述代码后将生成一个名为image_code.png的图片文件其中包含了随机生成的验证码。你可以将此图片嵌入到你的网站中要求用户输入验证码以进行验证。
四、总结
本文介绍了如何使用Python生成随机图片验证码的过程。通过生成随机字符串和绘制干扰线我们可以创建一个安全可靠的验证码系统提高网站的安全性。你可以根据自己的需求进行进一步的扩展和优化例如添加更多的干扰元素、调整字体和颜色等。希望本文对你有所帮助