小編給大家分享一下如何用Python生成隨機(jī)驗(yàn)證碼,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討方法吧!
我們提供的服務(wù)有:網(wǎng)站建設(shè)、成都做網(wǎng)站、微信公眾號(hào)開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、錯(cuò)那ssl等。為近千家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的錯(cuò)那網(wǎng)站制作公司
準(zhǔn)備工作
好了,下面進(jìn)入正題,我們來實(shí)現(xiàn)這個(gè)功能。首先這個(gè)是使用Python3進(jìn)行開發(fā)的,我們需要用到一個(gè)PIL的庫,這里安裝庫的pip3命令
為:pip3 install pillow。這里如果超時(shí)報(bào)錯(cuò)的話,我們可以使用cch。
然后我們創(chuàng)建一個(gè)captcha.py文件用來存放生成隨機(jī)驗(yàn)證碼的代碼。這里面captcha的意思是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自動(dòng)區(qū)分計(jì)算機(jī)和人類的圖靈測(cè)試)的縮寫,也就是我們俗稱的驗(yàn)證碼。
這里我們將隨機(jī)生成驗(yàn)證碼的這個(gè)功能寫成一個(gè)類Captcha,然后我們通過這個(gè)類的方法來生成隨機(jī)圖片驗(yàn)證碼。使用類進(jìn)行封裝的話,可以對(duì)類內(nèi)的部分私有方法進(jìn)行封裝,提高安全性。下面我們就來一步一步的實(shí)現(xiàn)生成隨機(jī)驗(yàn)證碼的各個(gè)功能。
我們本功能將會(huì)使用到3個(gè)庫,我們先進(jìn)行導(dǎo)入。
我們從PIL中導(dǎo)入Image,ImageDraw,ImageFont:
import random import string from PIL import Image,ImageDraw,ImageFont # 這里面Image是PIL中的畫布,ImageDraw是畫筆,ImageFont是畫筆的字體
設(shè)置我們類的一些基礎(chǔ)參數(shù)
我們這里將生成隨機(jī)驗(yàn)證碼寫成了一個(gè)Captcha類,下面我們來設(shè)置一些他的基礎(chǔ)參數(shù),
我們一般需要設(shè)置的有圖像驗(yàn)證碼的寬、高,驗(yàn)證碼位數(shù)、干擾線條數(shù)量、驗(yàn)證碼大小、然后我們還需要構(gòu)建一個(gè)驗(yàn)證碼字符的源文件,這里各個(gè)部分在代碼中進(jìn)行了詳細(xì)的注釋,我們邊看代碼邊看看注釋!
import random import string from PIL import Image, ImageDraw, ImageFont # 這里面Image是PIL中的畫布,ImageDraw是畫筆,ImageFont是畫筆的字體 class Captcha(object): # 生成隨機(jī)驗(yàn)證碼的位數(shù),可以根據(jù)需要進(jìn)行修改 number = 4 # 干擾線條的條數(shù) line_number = 2 # 生成驗(yàn)證碼圖片的寬和高,可以根據(jù)需要進(jìn)行修改 size = (100,40) # 驗(yàn)證碼字的大小,可以根據(jù)需要進(jìn)行修改 fontsize = 24 # 建立驗(yàn)證碼源文本 # list(string.ascii_letters) ASCII碼中所有的字母 SOURCE = list(string.ascii_letters) # 再加入'0'到'9' for index in range(10): SOURCE.append(str(index))
生成隨機(jī)驗(yàn)證碼文本
這里生成隨機(jī)驗(yàn)證碼的文本,我們只需要在SOURCE中隨機(jī)的選取number個(gè)字符即可。
# 生成驗(yàn)證碼文本 @classmethod def __gene_random_captcha(cls,number): # number為驗(yàn)證碼位數(shù),返回字符串 return ''.join(random.sample(cls.SOURCE,number))
生成隨機(jī)字體
這里我們來實(shí)現(xiàn)生成隨機(jī)字體的函數(shù),因?yàn)橥瑯拥淖郑煌淖煮w,他的形狀也是不一樣的,所以這里我們的字體也是采用隨機(jī)的。
那么要生成隨機(jī)的字體,那么首先我們就要先要有字體的文件。
Windows下的字體文件路徑為C/Windows/Fonts/,MacBook下的字體文件路徑為/System/Library/Fonts/,如果找不到的話,可以看之前的一篇博文,內(nèi)有詳細(xì)的介紹:在Windows下和MacBook中如何查找本地的字體文件
在找到我們的字體文件之后,我們將它拖入到一個(gè)固定的文件夾,便于我們后面去獲取這些字體文件。
這里由于我這邊是在之前OnlineForumPlatform項(xiàng)目中做的,所以這里將它放在了/static/font/文件夾下。
下面我們來實(shí)現(xiàn)我們的隨機(jī)生成字體的函數(shù)。首先我們寫一個(gè)fonts列表,存放所有我們有的字體的文件名稱,這里大家根據(jù)自己的字體文件而定。代碼為:
# 生成隨機(jī)字體 @classmethod def __generate_random_font(cls): # 這里的fonts即是我們所有字體文件的名稱,這里我是只復(fù)制過來了這么多,所以他的列表的這樣,大家根據(jù)自己他字體文件來寫這個(gè)fonts fonts = [ 'Palatino.ttc', 'PingFang.ttc', 'STHeiti Light.ttc', 'STHeiti Medium.ttc', 'Thonburi.ttc', 'Times.ttc' ] font = random.choice(fonts) # 這里前面的字符為我們字符文件的文件夾位置 return '/static/font/'+font
生成隨機(jī)顏色
這里由于我們是使用RGBA來表示顏色,所以我們?cè)诟鱾€(gè)顏色的值的范圍為[0,255],我們這里可以設(shè)置默認(rèn)的值為0和255,然后我們返回3種顏色的隨機(jī)數(shù)值即可;
# 生成隨機(jī)顏色 @classmethod def __gene_random_color(cls,start=0,end=255): # start為最小值,end為最大值,這里因?yàn)槭荝GB格式的,我們每個(gè)顏色的值最小為0,最大為255,所以這里默認(rèn)為0和255 random.seed() # 返回3種顏色的值 return (random.randint(start,end),random.randint(start,end),random.randint(start,end))
生成隨機(jī)干擾線
繪制干擾線可以讓我們的驗(yàn)證碼不那么容易被軟件輕松的破解,添加他的干擾項(xiàng)。
# 繪制干擾線 @classmethod def __gene_line(cls,draw,width,height): # 干擾性的開始位置和結(jié)束位置 begin = (random.randint(0,width),random.randint(0,height)) end = (random.randint(0,width),random.randint(0,height)) # 第一個(gè)參數(shù)為開始的位置和結(jié)束的位置,第二個(gè)參數(shù)的線的顏色,第三個(gè)參數(shù)為寬度 draw.line([begin,end],fill = cls.__gene_random_color(0,255),width=2)
生成隨機(jī)干擾點(diǎn)
繪制干擾點(diǎn)可以讓我們的驗(yàn)證碼不那么容易被軟件輕松的破解,添加他的干擾項(xiàng)。
# 繪制干擾點(diǎn)
@classmethod def __gene_points(cls,draw,ponit_chance,width,height): # chance為界限,如果當(dāng)前隨機(jī)數(shù)大于他,則繪制一個(gè)干擾電 chance = min(100,max(0,int(ponit_chance))) # 遍歷圖 for i in range(height): for j in range(width): temp = random.randint(0,100) if temp > chance: # 繪制干擾點(diǎn),第一個(gè)參數(shù)為位置,第二個(gè)參數(shù)為顏色 draw.point((j,i),fill = cls.__gene_random_color(0,255))
生成隨機(jī)圖片驗(yàn)證碼
在完成各個(gè)功能函數(shù)之后,最后我們來實(shí)現(xiàn)我們生成隨機(jī)圖片驗(yàn)證碼的函數(shù)。這里我們邊看代碼邊解釋各個(gè)的原理,在代碼中進(jìn)行了非常詳細(xì)的一個(gè)注釋說明。
# 生成圖片驗(yàn)證碼 @classmethod def generate_graph_captcha(cls): # 驗(yàn)證碼圖片的寬和高,這里的size是我們上面進(jìn)行設(shè)置的寬和高 width,height = cls.size # 創(chuàng)建一個(gè)畫布 # 第一個(gè)參數(shù)為顏色的類型RGBA型,第二個(gè)參數(shù)為寬和高,第三個(gè)參數(shù)為顏色的值,這里調(diào)用__gene_random_color,這里我們參數(shù)顏色值可以自己進(jìn)行修改 image = Image.new('RGBA',(width,height),cls.__gene_random_color(0,100)) # 設(shè)置驗(yàn)證碼的字體 # 第一個(gè)參數(shù)為字體的值,即我們使用什么字體,我們調(diào)用生成隨機(jī)字體的函數(shù)。第二個(gè)參數(shù)為字體大小,在上面我們?cè)O(shè)置了默認(rèn)值,可以進(jìn)行修改 font = ImageFont.truetype(cls.__generate_random_font(),cls.fontsize) # 創(chuàng)建畫筆,并且綁定到上面創(chuàng)建的畫布image上 draw = ImageDraw.Draw(image) # 生成隨機(jī)驗(yàn)證碼文本,參數(shù)為驗(yàn)證碼位數(shù) captcha_str = cls.__gene_random_captcha(cls.number) # 獲取字體的尺寸 font_width,font_height = font.getsize(captcha_str) # 設(shè)置我們繪制的位置,這里為了驗(yàn)證碼盡量在中間,我們選擇了中間點(diǎn),大家可以根據(jù)需要進(jìn)行修改 position = ((width - font_width)/2, (height - font_height)/2) # 填充字符串 # 第一個(gè)參數(shù)為繪制的位置,第二個(gè)參數(shù)為文本,這里使用生成的驗(yàn)證碼文本,第三個(gè)參數(shù)為字體,第四個(gè)參數(shù)為文字的顏色 draw.text(position, captcha_str,font = font,fill = cls.__gene_random_color(150,255)) # 繪制干擾性 for i in range(cls.line_number): cls.__gene_line(draw,width,height) # 繪制干擾點(diǎn) cls.__gene_points(draw,90,width,height) # open的第一個(gè)參數(shù)的文件名稱,在這里也可以在前面加上文件夾的名,例如/static/captcha.png,第二個(gè)參數(shù)為打開方式 with open('captcha.png','wb') as fp: image.save(fp) return (captcha_str,image)
調(diào)用方法,生成隨機(jī)驗(yàn)證碼
??到這里我們的功能已經(jīng)完全的實(shí)現(xiàn)啦,然后我們只需要?jiǎng)?chuàng)建我們的對(duì)象,然后調(diào)用方法Captcha.generate_graph_captcha()即可在指定的位置生成我們的驗(yàn)證碼圖像。
看完了這篇文章,相信你對(duì)如何用Python生成隨機(jī)驗(yàn)證碼有了一定的了解,想了解更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!
當(dāng)前名稱:如何用Python生成隨機(jī)驗(yàn)證碼
轉(zhuǎn)載來于:http://vcdvsql.cn/article48/gjcdep.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信小程序、外貿(mào)網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)、網(wǎng)站策劃、網(wǎng)站維護(hù)、企業(yè)建站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)