Python創(chuàng)建一個(gè)功能齊全的隨機(jī)驗(yàn)證碼生成器
驗(yàn)證碼(CAPTCHA)是一種常用的用于驗(yàn)證用戶身份的技術(shù)。它通過生成一張包含難以識(shí)別的文本、數(shù)字或圖像的圖像,要求用戶正確輸入其中的內(nèi)容,用于驗(yàn)證用戶身份、防止自動(dòng)化攻擊和確保數(shù)據(jù)安全。本篇教程將帶領(lǐng)您一步步使用Python創(chuàng)建一個(gè)功能齊全的隨機(jī)驗(yàn)證碼生成器。我們將通過導(dǎo)入必要的庫、定義輔助函數(shù)以及編寫主函數(shù)check_code(),來實(shí)現(xiàn)生成包含隨機(jī)字符、多彩背景、干擾元素及邊緣增強(qiáng)效果的驗(yàn)證碼圖片。讓我們開始動(dòng)手實(shí)踐吧!
1. 導(dǎo)入所需庫
首先,我們需要引入以下幾個(gè)Python庫來支持驗(yàn)證碼生成過程中的圖像處理和隨機(jī)數(shù)生成:
import random from PIL import Image, ImageDraw, ImageFont, ImageFilter
random庫:用于生成各種隨機(jī)數(shù),包括字符選擇、顏色值確定等。
PIL(Python Imaging Library):這是一個(gè)強(qiáng)大的圖像處理庫,包含Image、ImageDraw、ImageFont和ImageFilter模塊,分別用于創(chuàng)建和操作圖像、繪制圖形、加載字體以及應(yīng)用圖像濾鏡。
2. 定義輔助函數(shù)
為了使代碼更清晰、易讀,我們定義兩個(gè)輔助函數(shù):rndChar() 和 rndColor(),分別用于生成隨機(jī)字符和隨機(jī)顏色。
2.1 rndChar():生成隨機(jī)字母或數(shù)字
def rndChar(): """ 生成隨機(jī)字母或數(shù)字 :return: """ random_char = random.choice( [chr(random.randint(65, 90)), # 字母(大寫) str(random.randint(0, 9))] # 數(shù)字 ) return random_char
此函數(shù)通過random.choice()從一個(gè)列表中隨機(jī)選取一個(gè)元素。列表中包含兩種類型的元素:大寫字母(ASCII碼范圍65到90)和數(shù)字(0到9)。每次調(diào)用rndChar()會(huì)返回一個(gè)隨機(jī)的字母或數(shù)字。
2.2 rndColor():生成隨機(jī)顏色
def rndColor(): """ 生成隨機(jī)顏色 :return: """ return (random.randint(0, 255), random.randint(10, 255), random.randint(64, 255))
該函數(shù)返回一個(gè)包含三個(gè)整數(shù)的元組,分別代表紅、綠、藍(lán)(RGB)通道的顏色值。每個(gè)值都在指定范圍內(nèi)隨機(jī)選取,確保生成的色彩豐富且具有良好的可讀性。
3. 主函數(shù)check_code()
接下來,我們編寫主函數(shù)check_code(),它接受一系列參數(shù)并負(fù)責(zé)整個(gè)驗(yàn)證碼的生成過程,包括創(chuàng)建空白圖像、繪制字符、添加干擾元素,以及最后的圖像濾鏡處理。
3.1 初始化與設(shè)置
def check_code(width=120, height=30, char_length=5, font_file='Monaco.ttf', font_size=28): code = [] # 存儲(chǔ)生成的驗(yàn)證碼字符序列 # 創(chuàng)建一張圖片 img = Image.new(mode='RGB', size=(width, height), color=(255, 255, 255)) draw = ImageDraw.Draw(img, mode='RGB')
函數(shù)接受以下參數(shù):
width和height:驗(yàn)證碼圖片的寬度和高度,默認(rèn)為120像素寬、30像素高。
char_length:驗(yàn)證碼字符數(shù)量,默認(rèn)為5個(gè)。
font_file:字體文件路徑,默認(rèn)使用’Monaco.ttf’。
font_size:驗(yàn)證碼字符的字體大小,默認(rèn)為28像素。
首先創(chuàng)建一個(gè)空白的RGB模式圖像,并設(shè)置其背景色為白色。接著,創(chuàng)建一個(gè)ImageDraw對(duì)象draw,用于在圖像上繪制文本和圖形。
3.2 繪制驗(yàn)證碼字符
def rndChar(): ... def rndColor(): ... font = ImageFont.truetype(font_file, font_size) for i in range(char_length): char = rndChar() code.append(char) h = random.randint(0, 4) # 隨機(jī)字符基線偏移 draw.text([i * width / char_length, h], char, font=font, fill=rndColor())
使用ImageFont.truetype()加載指定的字體文件,并設(shè)置字體大小。然后,循環(huán)char_length次,每次生成一個(gè)隨機(jī)字符、將其添加到code列表中,并在圖像上繪制。字符的位置根據(jù)索引i均勻分布,基線高度有一個(gè)隨機(jī)的小幅偏移(0到4像素),以增加視覺復(fù)雜度。字符顏色由rndColor()函數(shù)隨機(jī)生成。
3.3 添加干擾元素
為了降低機(jī)器識(shí)別的成功率,我們?cè)隍?yàn)證碼圖片中加入多種干擾元素:
3.3.1 干擾點(diǎn)
for i in range(40): draw.point([random.randint(0, width), random.randint(0, height)], fill=rndColor())
隨機(jī)生成40個(gè)點(diǎn),其坐標(biāo)在圖像范圍內(nèi)均勻分布,顏色同樣由rndColor()函數(shù)提供。
3.3.2 干擾圓圈
for i in range(40): draw.point([random.randint(0, width), random.randint(0, height)], fill=rndColor()) x = random.randint(0, width) y = random.randint(0, height) draw.arc((x, y, x + 4, y + 4), 0, 90, fill=rndColor())
除了點(diǎn)狀干擾,還生成40個(gè)直徑為4像素的弧形(近似小圓圈),位置和顏色均為隨機(jī)。
3.3.3 干擾線
for i in range(5): x1 = random.randint(0, width) y1 = random.randint(0, height) x2 = random.randint(0, width) y2 = random.randint(0, height) draw.line((x1, y1, x2, y2), fill=rndColor())
最后,繪制5條隨機(jī)起點(diǎn)、終點(diǎn)和顏色的直線作為干擾線。
3.4 應(yīng)用圖像濾鏡
img = img.filter(ImageFilter.EDGE_ENHANCE_MORE)
為了進(jìn)一步提升驗(yàn)證碼的抗噪聲能力,對(duì)生成的圖像應(yīng)用ImageFilter.EDGE_ENHANCE_MORE濾鏡,增強(qiáng)圖像邊緣對(duì)比度。
3.5 返回結(jié)果
return img, ''.join(code)
函數(shù)返回生成的驗(yàn)證碼圖片以及對(duì)應(yīng)的字符序列。
總結(jié)
通過上述步驟,我們成功創(chuàng)建了一個(gè)Python隨機(jī)驗(yàn)證碼生成器。只需調(diào)用check_code()函數(shù),即可得到一張包含隨機(jī)字符、多種干擾元素及邊緣增強(qiáng)效果的驗(yàn)證碼圖片,同時(shí)返回對(duì)應(yīng)的驗(yàn)證碼字符串。這樣的驗(yàn)證碼設(shè)計(jì)有助于防止自動(dòng)化腳本的破解,提升系統(tǒng)的安全性。您可以根據(jù)實(shí)際需求調(diào)整函數(shù)參數(shù),定制符合項(xiàng)目要求的驗(yàn)證碼樣式?,F(xiàn)在,您可以將此代碼集成到您的應(yīng)用程序中,為用戶登錄、注冊(cè)或其他敏感操作提供可靠的驗(yàn)證碼保護(hù)機(jī)制。
到此這篇關(guān)于Python創(chuàng)建一個(gè)功能齊全的隨機(jī)驗(yàn)證碼生成器的文章就介紹到這了,更多相關(guān)Python生成自定義隨機(jī)驗(yàn)證碼內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Docker制作Python環(huán)境連接Oracle鏡像
這篇文章主要為大家介紹了使用Docker制作Python環(huán)境連接Oracle鏡像示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06Python利用Pytorch實(shí)現(xiàn)繪制ROC與PR曲線圖
這篇文章主要和大家分享一下Python利用Pytorch實(shí)現(xiàn)繪制ROC與PR曲線圖的相關(guān)代碼,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以參考一下2022-12-12Python實(shí)現(xiàn)GIF動(dòng)圖加載和降幀的方法詳解
這篇文章主要為大家詳細(xì)介紹了如何利用Python和Pygame實(shí)現(xiàn)GIF動(dòng)圖加載和降幀的效果,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2023-02-02Python通過paramiko庫實(shí)現(xiàn)遠(yuǎn)程執(zhí)行l(wèi)inux命令的方法
這篇文章主要介紹了Python通過paramiko庫實(shí)現(xiàn)遠(yuǎn)程執(zhí)行l(wèi)inux命令,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-03-03opencv實(shí)現(xiàn)圖像旋轉(zhuǎn)效果
這篇文章主要為大家詳細(xì)介紹了opencv實(shí)現(xiàn)圖像旋轉(zhuǎn)效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-03-03python中編寫config文件并及時(shí)更新的方法
在pytorch或者其他深度學(xué)習(xí)框架中,有許多超參數(shù)需要調(diào)整,包括learning_rate,training_data_path等,因此編寫一個(gè)config文件統(tǒng)一存放這些參數(shù),方便調(diào)用/查看/修改還是很有必要,這篇文章主要介紹了python中一種編寫config文件并及時(shí)更新的方法,需要的朋友可以參考下2023-02-02