中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何用Python生成隨機驗證碼

發布時間:2020-06-24 09:56:05 來源:億速云 閱讀:322 作者:清晨 欄目:編程語言

小編給大家分享一下如何用Python生成隨機驗證碼,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討方法吧!

準備工作

好了,下面進入正題,我們來實現這個功能。首先這個是使用Python3進行開發的,我們需要用到一個PIL的庫,這里安裝庫的pip3命令

為:pip3 install pillow。這里如果超時報錯的話,我們可以使用cch。

然后我們創建一個captcha.py文件用來存放生成隨機驗證碼的代碼。這里面captcha的意思是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自動區分計算機和人類的圖靈測試)的縮寫,也就是我們俗稱的驗證碼。

這里我們將隨機生成驗證碼的這個功能寫成一個類Captcha,然后我們通過這個類的方法來生成隨機圖片驗證碼。使用類進行封裝的話,可以對類內的部分私有方法進行封裝,提高安全性。下面我們就來一步一步的實現生成隨機驗證碼的各個功能。

我們本功能將會使用到3個庫,我們先進行導入。

我們從PIL中導入Image,ImageDraw,ImageFont:

import random
import string
from PIL import Image,ImageDraw,ImageFont
# 這里面Image是PIL中的畫布,ImageDraw是畫筆,ImageFont是畫筆的字體

設置我們類的一些基礎參數

我們這里將生成隨機驗證碼寫成了一個Captcha類,下面我們來設置一些他的基礎參數,

我們一般需要設置的有圖像驗證碼的寬、高,驗證碼位數、干擾線條數量、驗證碼大小、然后我們還需要構建一個驗證碼字符的源文件,這里各個部分在代碼中進行了詳細的注釋,我們邊看代碼邊看看注釋!

import random
import string
from PIL import Image, ImageDraw, ImageFont
# 這里面Image是PIL中的畫布,ImageDraw是畫筆,ImageFont是畫筆的字體
class Captcha(object):
    # 生成隨機驗證碼的位數,可以根據需要進行修改
    number = 4
    # 干擾線條的條數
    line_number = 2
    # 生成驗證碼圖片的寬和高,可以根據需要進行修改
    size = (100,40)
    # 驗證碼字的大小,可以根據需要進行修改
    fontsize = 24
    # 建立驗證碼源文本
    # list(string.ascii_letters) ASCII碼中所有的字母
    SOURCE = list(string.ascii_letters)
    # 再加入'0'到'9'
    for index in range(10):
        SOURCE.append(str(index))

生成隨機驗證碼文本

這里生成隨機驗證碼的文本,我們只需要在SOURCE中隨機的選取number個字符即可。

# 生成驗證碼文本
@classmethod
def __gene_random_captcha(cls,number):
    # number為驗證碼位數,返回字符串
    return ''.join(random.sample(cls.SOURCE,number))

生成隨機字體

這里我們來實現生成隨機字體的函數,因為同樣的字,不同的字體,他的形狀也是不一樣的,所以這里我們的字體也是采用隨機的。

那么要生成隨機的字體,那么首先我們就要先要有字體的文件。

Windows下的字體文件路徑為C/Windows/Fonts/,MacBook下的字體文件路徑為/System/Library/Fonts/,如果找不到的話,可以看之前的一篇博文,內有詳細的介紹:在Windows下和MacBook中如何查找本地的字體文件

在找到我們的字體文件之后,我們將它拖入到一個固定的文件夾,便于我們后面去獲取這些字體文件。

這里由于我這邊是在之前OnlineForumPlatform項目中做的,所以這里將它放在了/static/font/文件夾下。

下面我們來實現我們的隨機生成字體的函數。首先我們寫一個fonts列表,存放所有我們有的字體的文件名稱,這里大家根據自己的字體文件而定。代碼為:

# 生成隨機字體
@classmethod
def __generate_random_font(cls):
    # 這里的fonts即是我們所有字體文件的名稱,這里我是只復制過來了這么多,所以他的列表的這樣,大家根據自己他字體文件來寫這個fonts
    fonts = [
        'Palatino.ttc',
        'PingFang.ttc',
        'STHeiti Light.ttc',
        'STHeiti Medium.ttc',
        'Thonburi.ttc',
        'Times.ttc'
    ]
    font = random.choice(fonts)
    # 這里前面的字符為我們字符文件的文件夾位置
    return '/static/font/'+font

生成隨機顏色

這里由于我們是使用RGBA來表示顏色,所以我們在各個顏色的值的范圍為[0,255],我們這里可以設置默認的值為0和255,然后我們返回3種顏色的隨機數值即可;

# 生成隨機顏色
@classmethod
def __gene_random_color(cls,start=0,end=255):
    # start為最小值,end為最大值,這里因為是RGB格式的,我們每個顏色的值最小為0,最大為255,所以這里默認為0和255
    random.seed()
    # 返回3種顏色的值
    return (random.randint(start,end),random.randint(start,end),random.randint(start,end))

生成隨機干擾線

繪制干擾線可以讓我們的驗證碼不那么容易被軟件輕松的破解,添加他的干擾項。

# 繪制干擾線
@classmethod
def __gene_line(cls,draw,width,height):
    # 干擾性的開始位置和結束位置
    begin = (random.randint(0,width),random.randint(0,height))
    end = (random.randint(0,width),random.randint(0,height))
    # 第一個參數為開始的位置和結束的位置,第二個參數的線的顏色,第三個參數為寬度
    draw.line([begin,end],fill = cls.__gene_random_color(0,255),width=2)

生成隨機干擾點

繪制干擾點可以讓我們的驗證碼不那么容易被軟件輕松的破解,添加他的干擾項。

# 繪制干擾點

@classmethod
def __gene_points(cls,draw,ponit_chance,width,height):
    # chance為界限,如果當前隨機數大于他,則繪制一個干擾電
    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:
                # 繪制干擾點,第一個參數為位置,第二個參數為顏色
                draw.point((j,i),fill = cls.__gene_random_color(0,255))

生成隨機圖片驗證碼

在完成各個功能函數之后,最后我們來實現我們生成隨機圖片驗證碼的函數。這里我們邊看代碼邊解釋各個的原理,在代碼中進行了非常詳細的一個注釋說明。

# 生成圖片驗證碼
@classmethod
def generate_graph_captcha(cls):
    # 驗證碼圖片的寬和高,這里的size是我們上面進行設置的寬和高
    width,height = cls.size
    # 創建一個畫布
    # 第一個參數為顏色的類型RGBA型,第二個參數為寬和高,第三個參數為顏色的值,這里調用__gene_random_color,這里我們參數顏色值可以自己進行修改
    image = Image.new('RGBA',(width,height),cls.__gene_random_color(0,100))
    # 設置驗證碼的字體
    # 第一個參數為字體的值,即我們使用什么字體,我們調用生成隨機字體的函數。第二個參數為字體大小,在上面我們設置了默認值,可以進行修改
    font = ImageFont.truetype(cls.__generate_random_font(),cls.fontsize)
    # 創建畫筆,并且綁定到上面創建的畫布image上
    draw = ImageDraw.Draw(image)
    # 生成隨機驗證碼文本,參數為驗證碼位數
    captcha_str = cls.__gene_random_captcha(cls.number)
    # 獲取字體的尺寸
    font_width,font_height = font.getsize(captcha_str)
    # 設置我們繪制的位置,這里為了驗證碼盡量在中間,我們選擇了中間點,大家可以根據需要進行修改
    position = ((width - font_width)/2, (height - font_height)/2)
    # 填充字符串
    # 第一個參數為繪制的位置,第二個參數為文本,這里使用生成的驗證碼文本,第三個參數為字體,第四個參數為文字的顏色
    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)
    # 繪制干擾點
    cls.__gene_points(draw,90,width,height)
    # open的第一個參數的文件名稱,在這里也可以在前面加上文件夾的名,例如/static/captcha.png,第二個參數為打開方式
    with open('captcha.png','wb') as fp:
        image.save(fp)
    return (captcha_str,image)

調用方法,生成隨機驗證碼

??到這里我們的功能已經完全的實現啦,然后我們只需要創建我們的對象,然后調用方法Captcha.generate_graph_captcha()即可在指定的位置生成我們的驗證碼圖像。

如何用Python生成隨機驗證碼

看完了這篇文章,相信你對如何用Python生成隨機驗證碼有了一定的了解,想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

仲巴县| 丹江口市| 靖西县| 苍山县| 仪征市| 依安县| 元氏县| 景泰县| 永昌县| 深圳市| 文水县| 定安县| 如皋市| 会泽县| 板桥市| 扶余县| 县级市| 孟村| 海城市| 肇源县| 齐河县| 上犹县| 巴东县| 秭归县| 黄陵县| 岗巴县| 平南县| 常德市| 柘荣县| 磴口县| 息烽县| 云安县| 卢湾区| 永靖县| 双桥区| 上虞市| 娄烦县| 南溪县| 景德镇市| 巴楚县| 永泰县|