import random
from pil import image, imagedraw, imagefont, imagefilter
_letter_cases = "abcdefghjkmnpqrstuvwxy" # 小寫字母,去除可能干擾的i,l,o,z
_upper_cases = _letter_cases.upper() # 大寫字母
_numbers = ''.join(map(str, range(3, 10))) # 數字
init_chars = ''.join((_letter_cases, _upper_cases, _numbers))
def create_validate_code(size=(120, 30),
chars=init_chars,
img_type="gif",
mode="rgb",
bg_color=(255, 255, 255),
fg_color=(0, 0, 255),
font_size=18,
font_type="monaco.ttf",
length=4,
draw_lines=true,
n_line=(1, 2),
draw_points=true,
point_chance=2):
@todo: 生成驗證碼
@param size: 的大小,格式(寬,高),預設為(120, 30)
@param chars: 允許的字元集合,格式字串
@param img_type: 儲存的格式,預設為gif,可選的為gif,jpeg,tiff,png
@param mode: 模式,預設為rgb
@param bg_color: 背景顏色,預設為白色
@param fg_color: 前景色,驗證碼字元顏色,預設為藍色#0000ff
@param font_size: 驗證碼字型大小
@param font_type: 驗證碼字型,預設為 ae_alarabiya.ttf
@param length: 驗證碼字元個數
@param draw_lines: 是否劃干擾線
@param n_lines: 干擾線的條數範圍,格式元組,預設為(1, 2),只有draw_lines為true時有效
@param draw_points: 是否畫干擾點
@param point_chance: 干擾點出現的概率,大小範圍[0, 100]
@return: [0]: pil image例項
@return: [1]: 驗證碼中的字串
width, height = size # 寬高
# 建立圖形
img = image.new(mode, size, bg_color)
draw = imagedraw.draw(img) # 建立畫筆
def get_chars():
"""生成給定長度的字串,返回列**式"""
return random.sample(chars, length)
def create_lines():
"""繪製干擾線"""
line_num = random.randint(*n_line) # 干擾線條數
for i in range(line_num):
# 起始點
begin = (random.randint(0, size[0]), random.randint(0, size[1]))
# 結束點
end = (random.randint(0, size[0]), random.randint(0, size[1]))
draw.line([begin, end], fill=(0, 0, 0))
def create_points():
"""繪製干擾點"""
chance = min(100, max(0, int(point_chance))) # 大小限制在[0, 100]
for w in range(width):
for h in range(height):
tmp = random.randint(0, 100)
if tmp > 100 - chance:
draw.point((w, h), fill=(0, 0, 0))
def create_strs():
"""繪製驗證碼字元"""
c_chars = get_chars()
strs = ' %s ' % ' '.join(c_chars) # 每個字元前後以空格隔開
font = imagefont.truetype(font_type, font_size)
font_width, font_height = font.getsize(strs)
draw.text(((width - font_width) / 3, (height - font_height) / 3),
strs, font=font, fill=fg_color)
return ''.join(c_chars)
if draw_lines:
create_lines()
if draw_points:
create_points()
strs = create_strs()
# 圖形扭曲引數
params = [1 - float(random.randint(1, 2)) / 100,
0,0,
0,1 - float(random.randint(1, 10)) / 100,
float(random.randint(1, 2)) / 500,
0.001,
float(random.randint(1, 2)) / 500
img = img.transform(size, image.perspective, params) # 建立扭曲
img = img.filter(imagefilter.edge_enhance_more) # 濾鏡,邊界加強(閾值更大)
return img, strs
Python 生成驗證碼
import random import string 因為驗證碼是由字母和數字組成,所以使用string包中的ascii letters和digits將所有的儲存到乙個字串中 從此字串中隨機選取幾個作為目標的驗證碼 s string.ascii letters string.digits prin...
python生成驗證碼
生成4位驗證碼 import random import string 此函式可以生成數字和字母 code str string.ascii letters string.digits 生成字母 大小寫 數字 print code str def gen code len 4 構造乙個函式 code...
驗證碼一(驗證碼生成)
根據手機好查詢密碼 return type description code for i 0 i 6 i 4位驗證碼也可以用rand 1000,9999 直接生成 將生成的驗證碼寫入session,備驗證時用 session start session verify num code 建立,定義顏色...