Python 生成验证码
CAPTCHA,短语表示 完全自动化的图灵测试,用于区分计算机和人类 是许多网站中使用的重要测试,用于检查访问网站的人是人还是机器人。这主要是出于安全考虑,以防止机器人侵入网站并引发虚假统计数据和扭曲网络流量。
其主要目的是生成对人类来说易于理解,但对机器人或其他计算机来说难以解决的测试。它们提供利用用户的认知和思维能力的测试。
有各种类型的CAPTCHA可用。最常见的CAPTCHA类型包括:
- 基于图像的CAPTCHA :向人类提供图像,并对特征进行扭曲,以使计算机的图像识别变得困难。
-
基于文本的CAPTCHA :提供一系列模糊字符,通过扭曲特征和随机噪声使字符识别变得困难。
-
基于音频的CAPTCHA :向人类提供已朗读的字符或片段的音频记录,需要正确输入系统。
-
行为CAPTCHA :执行对机器人难以复制/自动化的特定操作。
要在Python中生成CAPTCHA,我们需要在系统中安装PIL(Python Imaging Library)库。为此,我们安装PIL库的一个分支叫做Pillow。为此,我们在命令提示符中键入:
pip install Pillow
然后我们可以在Python中导入PIL来生成我们的验证码代码。
示例1
在本例中,我们将学习使用Python生成基于文本的验证码。
步骤
- 导入所需的库。
-
创建一个带有任意颜色背景的空白图像。
-
定义验证码的长度并连接一个随机单词的字符串。
-
自定义生成文本的字体和字体大小。
-
计算文本大小并将其居中。
-
使用需要在中心打印的值来绘制计算的文本图像。
-
在图像上添加一些随机噪声并填充黑色。
-
定义验证码图像的宽度、高度和字符串长度。
-
保存验证码图像。
import random
from PIL import Image, ImageDraw, ImageFont
def generate_captcha(width, height, length):
# Create a blank image with a yellow background
image = Image.new('RGB', (width, height), 'yellow')
draw = ImageDraw.Draw(image)
# Define the characters to be used in the CAPTCHA
characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890'
# With a given length a random string is generated
captcha_text = ''.join(random.sample(characters, length))
# Define the font and its size
font = ImageFont.truetype('arial.ttf', 72)
# Calculate the text size and position it in the center
t_width, t_height = draw.textsize(captcha_text, font)
text_x = (width - t_width) / 2
text_y = (height - t_height) / 2
#Text is drawn in the image
draw.text((text_x, text_y), captcha_text, font=font, fill='black')
# Noise is added to create image distortion
for x in range(width):
for y in range(height):
if random.random() < 0.1:
draw.point((x, y), fill='black')
# Return the generated CAPTCHA image and the corresponding text
return image, captcha_text
width = 700 # Width of the CAPTCHA image
height = 350 # Height of the CAPTCHA image
length = 6 # Length of the CAPTCHA text
captcha_image, captcha_text = generate_captcha(width, height, length)
captcha_image.save('captcha.png')
我们将需要用于生成CAPTCHA的所有字符定义为一个字符串变量。在定义字体(Arial)和CAPTCHA图像的字体大小之后,将其定位在图像的中心是很重要的。然后,我们使用draw()函数将这段文字绘制在空白图像上,并将颜色填充为“黑色”(可以更改为不同的颜色)。
然后,我们需要向图像中添加噪声。这是通过在整个图像上启动一个for循环来完成的,并检查随机值是否小于0.1(如果大于0.1,那么它将非常明显)。然后,这些位置被填充为黑色,以创建图像失真,众所周知,计算机软件目前无法处理非常嘈杂的数据。
输出
结论
生成CAPTCHA是防止恶意和可疑机器人访问网站的有效方法。在这个充满技术蓬勃发展的世界中,每个网站都需要拥有CAPTCHA,因为它比以往任何时候都更容易受到攻击和黑客的威胁。
因此,由于技术的进步和实施了更高准确性的OCR(光学字符识别)技术,一些机器人可能能够相对容易地绕过CAPTCHA。另一个问题是恶意用户可以构建机器学习算法,并根据CAPTCHA训练模型以绕过测试。