python 圖片驗(yàn)證碼代碼
更新時(shí)間:2008年12月07日 20:05:33 作者:
在網(wǎng)絡(luò)應(yīng)用中,驗(yàn)證碼常常作為一個(gè)必備的手段,用來避免機(jī)器人惡意注冊(cè),保證坐在瀏覽器前的是一個(gè)人。
下面是一個(gè)實(shí)戰(zhàn)項(xiàng)目的結(jié)果。
#coding: utf-8
import Image,ImageDraw,ImageFont,os,string,random,ImageFilter
def initChars():
"""
允許的字符集合,初始集合為數(shù)字、大小寫字母
usage: initChars()
param: None
return: list
返回允許的字符集和
for: picChecker類初始字符集合
todo: Nothing
"""
nums = [str(i) for i in range(10)]
letterCase = [
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k',
'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
'w', 'x', 'y', 'z'
]
upperCase = [
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K',
'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V',
'W', 'X', 'Y', 'Z',
]
return(nums+letterCase+upperCase)
class picChecker():
"""
圖片驗(yàn)證代碼:
1) 用戶注冊(cè)需填寫圖片驗(yàn)證碼,以阻止機(jī)器人注冊(cè)
2) 圖片驗(yàn)證碼字符數(shù)為 4 位(大小寫字母與數(shù)字,不區(qū)分大小寫)。
用戶如果沒有填寫驗(yàn)證碼或沒有填寫正確的驗(yàn)證碼,
頁面友好性提示用戶填寫(同時(shí)程序方面也做相應(yīng)限制)
usage: pc = picChecker().createChecker()
param: 很多,如下
chars 允許的字符集合,
類型 list
默認(rèn)值 initChars()
例子 ['1','2','3']
length 字符串長度
類型 integer
默認(rèn)值 4
size 圖片大小
類型 tutle
默認(rèn)值 (120,30)
例子 (120,30)
fontsize 字體大小
類型 integer
默認(rèn)值 25
begin 字符其實(shí)位置,即左上角位置
類型 tutle
默認(rèn)值 (5,-2)
outputType 輸出類型
類型 string
默認(rèn)值 GIF
可選值 GIF JPEG TIFF PNG
mode 圖片模式
類型 string
可選值 RGB L (還有其他模式,但只推薦這2種)
默認(rèn)值 RGB
backgroundColor 背景色
foregroundColor 前景色
當(dāng)mode=RGB時(shí),backgroundColor,foregroundColor為tutle類型
取值為(integer,integer,integer)
表示RGB顏色值
當(dāng)mode=L時(shí),backgroundColor,foregroundColor為數(shù)字,表示黑白模式
取值為0-255
表示灰度
fonttype 字體路徑
類型 string
默認(rèn)值 "simsum.ttc"
jamNum 干擾線條數(shù)
類型 (int1,int1)
int1 干擾線條數(shù)下限,包含
int2 干擾線條數(shù)上線,包含
pointBorder 散點(diǎn)噪音
構(gòu)造方法:對(duì)每個(gè)像素點(diǎn)使用隨機(jī)函數(shù)確定是否在該像素上畫散點(diǎn)噪音
類型 (int1,int2)
int1越大 散點(diǎn)越多
int2越大 散點(diǎn)越少
return: [picCheckerStr,pic]
picCheckerStr: 表示返回圖片中對(duì)應(yīng)的字符串,可用于session驗(yàn)證以及其他用途
pic : 返回的圖片,類型為Image
for :
todo : Nothing
"""
#默認(rèn)字體路徑
#DEFAULT_FONT_PATH = os.path.join(os.path.dirname(__file__),'simsun.ttc').replace('\\','/')
def __init__(self,chars = initChars(),size = (120,30),fontsize = 25,
begin = (5,-2),outputType = 'GIF',mode = 'RGB' ,
backgroundColor = (255,255,255), foregroundColor = (0,0,255),
fonttype = "simsun.ttc",length = 4,jamNum = (1,2),
pointBorder = (40,39)):
"""
初始化配置
"""
#驗(yàn)證碼配置
#允許的字符串
self.chars = chars
#圖片大小
self.size = size
#字符起始插入點(diǎn)
self.begin = begin
#字符串長度
self.length = length
#輸出類型
self.outputType = outputType
#字符大小
self.fontsize = fontsize
#圖片模式
self.mode = mode
#背景色
self.backgroundColor = backgroundColor
#前景色
self.foregroundColor = foregroundColor
#干擾線條數(shù)
self.jamNum = jamNum
#散點(diǎn)噪音界限
self.pointBorder = pointBorder
#字體庫路徑
self.fonttype = fonttype
#設(shè)置字體,大小默認(rèn)為18
self.font = ImageFont.truetype(self.fonttype, self.fontsize)
def getPicString(self):
"""
usage: getPicString()
return: string
for : 生成給定長度的隨機(jī)字符串
todo: Nothing
"""
#初始化字符串長度
length = self.length
#初始化字符集合
chars = self.chars
#獲得字符集合
selectedChars = random.sample(chars,length)
charsToStr = string.join(selectedChars,'')
return(charsToStr)
def createChecker(self):
"""
usage: createChecker()
return: [str,pic]
str:對(duì)應(yīng)的字符串
pic:對(duì)應(yīng)的圖片
for:
todo:
"""
#獲得驗(yàn)證碼字符串
randStr = self.getPicString()
#將字符串加入空格
randStr1 = string.join([i+" " for i in randStr],"")
#創(chuàng)建圖形
im = Image.new(self.mode,self.size,self.backgroundColor)
#創(chuàng)建畫筆
draw = ImageDraw.Draw(im)
#輸出隨機(jī)文本
draw.text(self.begin, randStr1, font=self.font,fill=self.foregroundColor)
#im = self.drawText(draw,randStr,im)
#干擾線
self.createJam(draw)
#散點(diǎn)噪音
self.createPoints(draw)
#圖形扭曲
para = [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
]
#print randStr,para
im = im.transform(im.size, Image.PERSPECTIVE,para)
#圖像濾鏡
im=im.filter(ImageFilter.EDGE_ENHANCE_MORE)
im.save("checker.jpg",self.outputType)
return([randStr,im])
def createJam(self,draw):
"""
usage: 創(chuàng)建干擾線
para: draw 表示畫筆
return: None
for:
todo:
"""
#干擾線條數(shù)
lineNum = random.randint(self.jamNum[0],self.jamNum[1])
for i in range(lineNum):
begin = (random.randint(0,self.size[0]),random.randint(0,self.size[1]))
end = (random.randint(0,self.size[0]),random.randint(0,self.size[1]))
draw.line([begin,end],fill = (0,0,0))
def createPoints(self,draw):
"""
usage: 創(chuàng)建散點(diǎn)噪音
para: draw 表示畫筆
return: None
for:
todo:
"""
#散點(diǎn)噪音
for x in range(self.size[0]):
for y in range(self.size[1]):
flag = random.randint(0,self.pointBorder[0])
if flag > self.pointBorder[1]:
draw.point((x,y),fill = (0,0,0))
del flag
if __name__ == '__main__':
c=picChecker()
t=c.createChecker()
print(t)
復(fù)制代碼 代碼如下:
#coding: utf-8
import Image,ImageDraw,ImageFont,os,string,random,ImageFilter
def initChars():
"""
允許的字符集合,初始集合為數(shù)字、大小寫字母
usage: initChars()
param: None
return: list
返回允許的字符集和
for: picChecker類初始字符集合
todo: Nothing
"""
nums = [str(i) for i in range(10)]
letterCase = [
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k',
'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
'w', 'x', 'y', 'z'
]
upperCase = [
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K',
'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V',
'W', 'X', 'Y', 'Z',
]
return(nums+letterCase+upperCase)
class picChecker():
"""
圖片驗(yàn)證代碼:
1) 用戶注冊(cè)需填寫圖片驗(yàn)證碼,以阻止機(jī)器人注冊(cè)
2) 圖片驗(yàn)證碼字符數(shù)為 4 位(大小寫字母與數(shù)字,不區(qū)分大小寫)。
用戶如果沒有填寫驗(yàn)證碼或沒有填寫正確的驗(yàn)證碼,
頁面友好性提示用戶填寫(同時(shí)程序方面也做相應(yīng)限制)
usage: pc = picChecker().createChecker()
param: 很多,如下
chars 允許的字符集合,
類型 list
默認(rèn)值 initChars()
例子 ['1','2','3']
length 字符串長度
類型 integer
默認(rèn)值 4
size 圖片大小
類型 tutle
默認(rèn)值 (120,30)
例子 (120,30)
fontsize 字體大小
類型 integer
默認(rèn)值 25
begin 字符其實(shí)位置,即左上角位置
類型 tutle
默認(rèn)值 (5,-2)
outputType 輸出類型
類型 string
默認(rèn)值 GIF
可選值 GIF JPEG TIFF PNG
mode 圖片模式
類型 string
可選值 RGB L (還有其他模式,但只推薦這2種)
默認(rèn)值 RGB
backgroundColor 背景色
foregroundColor 前景色
當(dāng)mode=RGB時(shí),backgroundColor,foregroundColor為tutle類型
取值為(integer,integer,integer)
表示RGB顏色值
當(dāng)mode=L時(shí),backgroundColor,foregroundColor為數(shù)字,表示黑白模式
取值為0-255
表示灰度
fonttype 字體路徑
類型 string
默認(rèn)值 "simsum.ttc"
jamNum 干擾線條數(shù)
類型 (int1,int1)
int1 干擾線條數(shù)下限,包含
int2 干擾線條數(shù)上線,包含
pointBorder 散點(diǎn)噪音
構(gòu)造方法:對(duì)每個(gè)像素點(diǎn)使用隨機(jī)函數(shù)確定是否在該像素上畫散點(diǎn)噪音
類型 (int1,int2)
int1越大 散點(diǎn)越多
int2越大 散點(diǎn)越少
return: [picCheckerStr,pic]
picCheckerStr: 表示返回圖片中對(duì)應(yīng)的字符串,可用于session驗(yàn)證以及其他用途
pic : 返回的圖片,類型為Image
for :
todo : Nothing
"""
#默認(rèn)字體路徑
#DEFAULT_FONT_PATH = os.path.join(os.path.dirname(__file__),'simsun.ttc').replace('\\','/')
def __init__(self,chars = initChars(),size = (120,30),fontsize = 25,
begin = (5,-2),outputType = 'GIF',mode = 'RGB' ,
backgroundColor = (255,255,255), foregroundColor = (0,0,255),
fonttype = "simsun.ttc",length = 4,jamNum = (1,2),
pointBorder = (40,39)):
"""
初始化配置
"""
#驗(yàn)證碼配置
#允許的字符串
self.chars = chars
#圖片大小
self.size = size
#字符起始插入點(diǎn)
self.begin = begin
#字符串長度
self.length = length
#輸出類型
self.outputType = outputType
#字符大小
self.fontsize = fontsize
#圖片模式
self.mode = mode
#背景色
self.backgroundColor = backgroundColor
#前景色
self.foregroundColor = foregroundColor
#干擾線條數(shù)
self.jamNum = jamNum
#散點(diǎn)噪音界限
self.pointBorder = pointBorder
#字體庫路徑
self.fonttype = fonttype
#設(shè)置字體,大小默認(rèn)為18
self.font = ImageFont.truetype(self.fonttype, self.fontsize)
def getPicString(self):
"""
usage: getPicString()
return: string
for : 生成給定長度的隨機(jī)字符串
todo: Nothing
"""
#初始化字符串長度
length = self.length
#初始化字符集合
chars = self.chars
#獲得字符集合
selectedChars = random.sample(chars,length)
charsToStr = string.join(selectedChars,'')
return(charsToStr)
def createChecker(self):
"""
usage: createChecker()
return: [str,pic]
str:對(duì)應(yīng)的字符串
pic:對(duì)應(yīng)的圖片
for:
todo:
"""
#獲得驗(yàn)證碼字符串
randStr = self.getPicString()
#將字符串加入空格
randStr1 = string.join([i+" " for i in randStr],"")
#創(chuàng)建圖形
im = Image.new(self.mode,self.size,self.backgroundColor)
#創(chuàng)建畫筆
draw = ImageDraw.Draw(im)
#輸出隨機(jī)文本
draw.text(self.begin, randStr1, font=self.font,fill=self.foregroundColor)
#im = self.drawText(draw,randStr,im)
#干擾線
self.createJam(draw)
#散點(diǎn)噪音
self.createPoints(draw)
#圖形扭曲
para = [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
]
#print randStr,para
im = im.transform(im.size, Image.PERSPECTIVE,para)
#圖像濾鏡
im=im.filter(ImageFilter.EDGE_ENHANCE_MORE)
im.save("checker.jpg",self.outputType)
return([randStr,im])
def createJam(self,draw):
"""
usage: 創(chuàng)建干擾線
para: draw 表示畫筆
return: None
for:
todo:
"""
#干擾線條數(shù)
lineNum = random.randint(self.jamNum[0],self.jamNum[1])
for i in range(lineNum):
begin = (random.randint(0,self.size[0]),random.randint(0,self.size[1]))
end = (random.randint(0,self.size[0]),random.randint(0,self.size[1]))
draw.line([begin,end],fill = (0,0,0))
def createPoints(self,draw):
"""
usage: 創(chuàng)建散點(diǎn)噪音
para: draw 表示畫筆
return: None
for:
todo:
"""
#散點(diǎn)噪音
for x in range(self.size[0]):
for y in range(self.size[1]):
flag = random.randint(0,self.pointBorder[0])
if flag > self.pointBorder[1]:
draw.point((x,y),fill = (0,0,0))
del flag
if __name__ == '__main__':
c=picChecker()
t=c.createChecker()
print(t)
相關(guān)文章
Python流行ORM框架sqlalchemy安裝與使用教程
這篇文章主要介紹了Python流行ORM框架sqlalchemy安裝與使用,結(jié)合具體實(shí)例形式分析了sqlalchemy的安裝及ORM映射、查詢等相關(guān)操作技巧,需要的朋友可以參考下2019-06-06
Python3.6連接Oracle數(shù)據(jù)庫的方法詳解
這篇文章主要介紹了Python3.6連接Oracle數(shù)據(jù)庫的方法,較為詳細(xì)的分析了cx_Oracle模塊安裝及Python3.6使用cx_Oracle模塊操作Oracle數(shù)據(jù)庫的具體操作步驟與相關(guān)注意事項(xiàng),需要的朋友可以參考下2018-05-05
Django-Xadmin后臺(tái)首頁添加小組件報(bào)錯(cuò)的解決方案
這篇文章主要介紹了Django-Xadmin后臺(tái)首頁添加小組件報(bào)錯(cuò)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08
python 實(shí)現(xiàn)turtle畫圖并導(dǎo)出圖片格式的文件
今天小編就為大家分享一篇python 實(shí)現(xiàn)turtle畫圖并導(dǎo)出圖片格式的文件,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-12-12
Pandas對(duì)DataFrame單列/多列進(jìn)行運(yùn)算(map, apply, transform, agg)
這篇文章主要介紹了Pandas對(duì)DataFrame單列/多列進(jìn)行運(yùn)算(map, apply, transform, agg),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06
使用Python實(shí)現(xiàn)屏幕截圖的兩種方法
Python作為一種高效的編程語言,可以通過一些庫來實(shí)現(xiàn)對(duì)屏幕的截圖操作,本文主要介紹了使用Python實(shí)現(xiàn)屏幕截圖的兩種方法,具有一定的 參考價(jià)值,感興趣的可以了解一下2023-12-12

