一、寫在前面
現(xiàn)在無論大大小小的網(wǎng)站,基本上都會(huì)使用驗(yàn)證碼,登錄的時(shí)候要驗(yàn)證,下載的時(shí)候要驗(yàn)證,而使用的驗(yàn)證碼也從那些簡簡單單的字符圖形驗(yàn)證碼“進(jìn)化”成了需要進(jìn)行圖文識(shí)別的驗(yàn)證碼、需要拖動(dòng)滑塊的滑動(dòng)驗(yàn)證碼、甚至還有手機(jī)驗(yàn)證碼。當(dāng)你與之打交道的時(shí)候,有沒有考慮過其背后的原理呢?當(dāng)然了,對(duì)于那些復(fù)雜的驗(yàn)證碼我們想要弄得一清二楚還是很難的,但是可以挑軟柿子捏嘛--字符圖形驗(yàn)證碼,就這樣,我決定用 Python + Flask 制作出一個(gè)簡單的驗(yàn)證碼系統(tǒng)來,話不多說,擼起袖子加油干!
二、基本思路
一個(gè)簡單的驗(yàn)證碼系統(tǒng),要實(shí)現(xiàn)的目標(biāo)包括能夠不斷刷新驗(yàn)證碼和對(duì)用戶輸入的內(nèi)容進(jìn)行驗(yàn)證,若驗(yàn)證成功則進(jìn)行后續(xù)操作,若失敗則給出提示信息并要求重新輸入。
但是沒有大量驗(yàn)證碼圖片怎么辦呢?正所謂“自己動(dòng)手,豐衣足食”,Python 所具有的豐富的第三方庫使得產(chǎn)生大量驗(yàn)證碼圖片這一需求變得甚是簡單了,這里主要使用的模塊是 pillow。
有了驗(yàn)證碼圖片之后,要做的就是將其顯示在前端頁面上,并且要能夠更新驗(yàn)證碼,這利用 Flask 可以很方便地實(shí)現(xiàn)。然后就是輸入驗(yàn)證碼和對(duì)輸入的內(nèi)容進(jìn)行驗(yàn)證了,這里我是用 JS 實(shí)現(xiàn)驗(yàn)證的。
三、具體步驟
1.生成驗(yàn)證碼圖片
前面已經(jīng)提過這一步主要使用的模塊是 pillow,沒有安裝的話可以使用 pip install pillow 進(jìn)行安裝。
PIL:Python Image Library,是 Python 處理圖片的標(biāo)準(zhǔn)庫,不過 PIL 僅支持到 Python2.7,之后有人在其基礎(chǔ)上創(chuàng)建了兼容的版本,名字就叫做 pillow。
新建一個(gè) Flask 項(xiàng)目:CaptchaTest,然后創(chuàng)建一個(gè) generate.py。要生成一個(gè)驗(yàn)證碼圖片,首先得創(chuàng)建一張圖片,可以用 pillow 模塊中的 Image.new() 實(shí)現(xiàn)。然后需要生成驗(yàn)證碼文本并將其寫入到前面生成的圖片上,除此之外,我們還可以加入一些干擾元素增加識(shí)別的難度。下面是幾張生成的驗(yàn)證碼圖片:
最終得到的生成驗(yàn)證碼圖片的代碼如下:
from random import randint from PIL import Image, ImageDraw, ImageFont def get_random_color(): # 隨機(jī)顏色RGB return randint(120, 200), randint(120, 200), randint(120, 200) def get_random_code(): # 隨機(jī)字符 codes = [[chr(i) for i in range(48, 58)], [chr(i) for i in range(65, 91)], [chr(i) for i in range(97, 123)]] codes = codes[randint(0, 2)] return codes[randint(0, len(codes)-1)] def generate_captcha(width=140, height=60, length=4): # 生成驗(yàn)證碼 img = Image.new("RGB", (width, height), (250, 250, 250)) draw = ImageDraw.Draw(img) font = ImageFont.truetype("static/font/font.ttf", size=36) # 驗(yàn)證碼文本 text = "" for i in range(length): c = get_random_code() text += c rand_len = randint(-5, 5) draw.text((width * 0.2 * (i+1) + rand_len, height * 0.2 + rand_len), c, font=font, fill=get_random_color()) # 加入干擾線 for i in range(3): x1 = randint(0, width) y1 = randint(0, height) x2 = randint(0, width) y2 = randint(0, height) draw.line((x1, y1, x2, y2), fill=get_random_color()) # 加入干擾點(diǎn) for i in range(16): draw.point((randint(0, width), randint(0, height)), fill=get_random_color()) # 保存圖片 img.save("static/captcha/" + text + ".jpg") return text + ".jpg" if __name__ == "__main__": for i in range(1000): generate_captcha()
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。