最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python解析最簡(jiǎn)單的驗(yàn)證碼

 更新時(shí)間:2016年01月07日 09:43:45   作者:jerrylsxu  
最近在學(xué)python,正好遇到學(xué)校需要選宿舍,就用python寫了一個(gè)搶宿舍的軟件。下面通過本文給大家介紹python解析最簡(jiǎn)單的驗(yàn)證碼,對(duì)python解析驗(yàn)證碼相關(guān)知識(shí)感興趣的朋友一起學(xué)習(xí)吧

最近在學(xué)python,正好遇到學(xué)校需要選宿舍,就用python寫了一個(gè)搶宿舍的軟件。其中有一個(gè)模塊是用來登陸的,登陸的時(shí)候需要輸入驗(yàn)證碼,不過后來發(fā)現(xiàn)了直接可以繞過驗(yàn)證碼直接登陸的bug。不過這是另外的話題,開始的時(shí)候我并沒有發(fā)現(xiàn)這個(gè)隱藏起來的秘密,所以我就寫了這個(gè)python代碼段用來實(shí)現(xiàn)解析驗(yàn)證碼的功能。

  我們學(xué)校的驗(yàn)證碼是最簡(jiǎn)單的驗(yàn)證碼,形式大概如下:

  其中這個(gè)圖片的大小是60X24像素的,大概每個(gè)數(shù)字的大小是15X24像素。

  觀察這個(gè)驗(yàn)證碼之后可以發(fā)現(xiàn),驗(yàn)證碼中只有數(shù)字而且數(shù)字的字體很規(guī)范,只不過每個(gè)數(shù)字的顏色不同而已。

  當(dāng)時(shí)有2個(gè)思路

  1.將整張照片平均切片成四分,每個(gè)數(shù)字一個(gè)圖片,然后掃描每張照片的每個(gè)像素,為每個(gè)數(shù)字初始化一個(gè)特征碼buff,大小為15X24的byte,即總共45Byte。

  先取背景色,可以知道(0,0)位置是背景色。然后掃描數(shù)字的每個(gè)像素和背景色對(duì)比如果相同則為1不同則為0。然后分析出0-9這10個(gè)字符的特征值。等需要解析驗(yàn)證碼的時(shí)候直接將驗(yàn)證碼圖片分片取特征值跟標(biāo)準(zhǔn)特征值對(duì)比就可以了。

  2.我們可以想象0-9這10個(gè)字符每個(gè)字符的字形都不一樣,則有可能比如9這個(gè)數(shù)字在像素(2,12)(1,13)這個(gè)位置是獨(dú)有的,也就是說分片圖片中假如(2,12)位置的像素點(diǎn)和背景色一致,則該分片圖片一定不是9否則一定是9。

  上面兩種方法有一個(gè)bug就是這個(gè)圖片的第一個(gè)數(shù)字有一定的偏移,比如其他位置的數(shù)字是從第3列開始的,它可能從第4列,這個(gè)我就沒具體分析了。不過這個(gè)也有辦法解決,我用的辦法就是從第一列非背景色的地方算起。不管什么圖片怎么偏移,它x軸向?qū)τ谧约鹤钭筮叺狞c(diǎn)的x方向的差值是不變的。

  最后我的實(shí)現(xiàn)方法就是按第二種,因?yàn)檫@種方法是最快的,只需要取特征像素處的點(diǎn)就可以。

我的方法是這樣的,首先選用材料圖片三張,包含0-9這10個(gè)字符,然后校驗(yàn)他們每個(gè)像素與背景色是否一致,如果一致則把這個(gè)數(shù)字放到對(duì)應(yīng)這個(gè)像素的hash表里面。

  最后分析這個(gè)hash表找出哪個(gè)像素是1個(gè)數(shù)字獨(dú)有的,哪個(gè)像素是2個(gè)數(shù)字獨(dú)有的,哪個(gè)像素3個(gè)數(shù)字獨(dú)有的,最后解析這個(gè)表。

  找到可以唯一確定一個(gè)數(shù)字的方法,比如(0,18),(0,19)這兩個(gè)數(shù)字可以唯一確定數(shù)字1。

  然后得出一個(gè)hash字典:

NumberKeyPixel={
[(7,10),(0,12),(0,10),(0,11),(0,8),(1,14),(1,15)],
[(4,8)],
[(0,18),(0,19)],
 [], 
[(5,7)],
[(0,4),(0,10)],
[(2,6)],
[(2,16)],
[(0,12)],
[(2,13)]
} 

  使用的時(shí)候,只需依次比對(duì)這些像素點(diǎn)就可以判斷這張圖片的驗(yàn)證碼值了。

下面介紹具體代碼

1.首先是分析的時(shí)候的代碼,用來獲得數(shù)字的特征像素:

from PIL import Image
import os
#存放材料圖片的路徑
path="C:\\vaildpic\\"
#取得材料圖片
images=os.listdir(path)
存放數(shù)字的切片,0-9的圖片
nubimgs=[]
#存放背景色
backpixels=[]
#存放像素對(duì)應(yīng)表
pixDir={}
#首非背景色偏移值
pixBlankEndPos=[]
#這個(gè)函數(shù)用來取得這個(gè)圖片中數(shù)字結(jié)構(gòu)的偏移值
def GetLastBlankPosition(materialPic,x=0):
bc=materialPic.getpixel((0,0))
for i in range(15):
for j in range(24):
if materialPic.getpixel((i+x,j))!=bc:
return i
#因?yàn)橹皇墙馕鰶]有寫的很嚴(yán)謹(jǐn),這個(gè)地方
#取得目標(biāo)文件夾的圖片
for image in images:
if os.path.isdir(path+image):
continue
image=Image.open(path+image)
#對(duì)于每張圖片切成四份,存到字典中,取得相應(yīng)的背景色,首非背景色偏移x,接下來計(jì)算用
for i in range(4):
ma=image.crop((i*15,0,(i+1)*15,24))
nubimgs.append(ma)
backpixels.append(image.getpixel((0,0)))
pixBlankEndPos.append(GetLastBlankPosition(ma))
print pixBlankEndPos
#對(duì)于每個(gè)數(shù)字圖片的每個(gè)像素,如果對(duì)應(yīng)位置非背景色,將該圖片放到該位置的字典中,其結(jié)構(gòu)如下,接下來用下面的數(shù)據(jù)統(tǒng)計(jì)來取得每個(gè)數(shù)字的特征像素
'''  pixDir[pixel(x-x_offset,y),imgSeq]=picture<br>'''
for i in range(15):
for j in range(24):
ai=None
aj=None
pixDir[(i,j)]={}
for imgNum in range(nubimgs.__len__()):
if(nubimgs[imgNum].getpixel((i,j))!=backpixels[imgNum]):
pixDir[(i-pixBlankEndPos[imgNum],j)][imgNum]=nubimgs[imgNum]
"""nubimgs[0].putpixel ((i,j),nubimgs[imgNum].getpixel((i,j)))"""
'''下面將只有n個(gè)數(shù)字有的像素存到對(duì)應(yīng)的文件夾中'''
for pix in pixDir.items():
if pix[1].__len__()<=6:
print pix
i=0
for pic in pix[1].items():
i+=1
if not os.path.exists(path+str(pix[1].__len__())):
os.mkdir(path+str(pix[1].__len__()))
pic[1].save(os.path.join(path+str(pix[1].__len__()),str(pix[0][0])+"_"+str(pix[0][1])+"__"+str(i)+".bmp"))

材料圖片:

 

解析結(jié)果如下


對(duì)應(yīng)的文件夾中就放著n個(gè)圖片共享的像素,接下來的分析我是手動(dòng)分析的,其實(shí)也可以用程序?qū)?,不過要預(yù)先告訴程序哪個(gè)片段是什么數(shù)字,可以通過把圖片名起為對(duì)應(yīng)驗(yàn)證碼來解析。因?yàn)檫@是后想到的,就沒有實(shí)現(xiàn)了。

2.接下來就是使用得到的特征值來解析驗(yàn)證碼

下面的方法用來取得背景色,方法同上面解析一樣,沿圖片最上面一層取顏色,因?yàn)樽钌厦娌焕L制

def getBackColors(bmp):
list=[]
for i in range(60):
if bmp.getpixel((i,0)) not in list:
list.append(bmp.getpixel((i,0)))
return list

同上面解析一樣,取得首繪偏移值

def GetLastBlankPosition(materialPic,x=0):
bc=getBackColors(materialPic)
for i in range(15):
for j in range(24):
if materialPic.getpixel((i+x,j)) not in bc:
return i

解析驗(yàn)證碼,利用特征嗎判斷

def GetVaildJpgNumber(bmp):
print 'GetVaildJpgNumber'
vaildStr="";
backColors=getBackColors(bmp)<br>  #對(duì)于一個(gè)驗(yàn)證碼的4個(gè)數(shù)字分別驗(yàn)證,其x范圍為n*15~(n+1)*15
for pos in range(4):<br>    #取得對(duì)應(yīng)位置的首繪偏移值
offset=GetLastBlankPosition(bmp,pos*15)<br>     #對(duì)于0-9,分別判斷對(duì)應(yīng)的特征是否為背景色,如果不是解析完成,是背景色則判斷下一個(gè)數(shù)字,因?yàn)?的像素基本和其他圖像共享,所以如果最后沒有找到特定的數(shù)字,就是3
for nr in range(0,10):
isthisNr=True
for pix in NumberKeyPixel[nr]:
if pix[0]+offset>=15:
isthisNr=False
break
if bmp.getpixel((pix[0]+offset+pos*15,pix[1])) in backColors :
isthisNr=False
break;
if isthisNr and NumberKeyPixel[nr].__len__()!=0 :
vaildStr+=str(nr)
break
if vaildStr.__len__()==pos:
vaildStr+='3'
print vaildStr
return vaildStr

從網(wǎng)絡(luò)抓取驗(yàn)證碼,使用的是httplib,其中我們學(xué)校名我已替代為myschool

def GetVaildJpg ():
print 'GetVaildJpg'
headers={
'Accept': 'image/png, image/svg+xml, image/*;q=0.8, */*;q=0.5',
'Referer': 'http://zcc.myschool.edu.cn/',
'Accept-Language': 'zh-Hans-CN,zh-Hans;q=0.8,en-US;q=0.5,en;q=0.3',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko',
'Accept-Encoding': 'gzip, deflate',
'Host': 'zcc.myschool.edu.cn',
'DNT': '1',
'Connection': 'Keep-Alive',
'Cookie': sessionId
}
httpClient=httplib.HTTPConnection('zcc.myschool.edu.cn',80,timeout=300)
httpClient.request("GET",'http://zcc.myschool.edu.cn/image.jsp',None,headers)
response=httpClient.getresponse()
'''print response.getheaders()'''
stBmp=response.read()
bmp=Image.open(BytesIO(stBmp))
bmp.save('D:\PROJECT\PYTHON\catchDorm\catch.bmp')
'''bmp.show()'''
return GetVaildJpgNumber(bmp) 

以上內(nèi)容給大家介紹了Python解析最簡(jiǎn)單的驗(yàn)證碼的相關(guān)知識(shí),希望大家喜歡。

相關(guān)文章

  • python中的集合及集合常用的使用方法

    python中的集合及集合常用的使用方法

    這篇文章主要介紹了python中的集合及集合常用的使用方法,集合是一個(gè)無序的不重復(fù)元素序列,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下
    2022-07-07
  • Python實(shí)現(xiàn)自動(dòng)整理文件的示例代碼

    Python實(shí)現(xiàn)自動(dòng)整理文件的示例代碼

    在我們?nèi)粘I钪?,文件總是雜亂無章的,這個(gè)時(shí)候就需要我們整理一下。但是文件太多的話整理起來是非常麻煩的,因此我們今天就來用Python實(shí)現(xiàn)文件的自動(dòng)整理
    2022-08-08
  • 解決python問題 Traceback (most recent call last)

    解決python問題 Traceback (most recent call&n

    這篇文章主要介紹了解決python問題 Traceback (most recent call last),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • 基于Python制作炸金花游戲的過程詳解

    基于Python制作炸金花游戲的過程詳解

    《詐金花》又叫三張牌,是在全國(guó)廣泛流傳的一種民間多人紙牌游戲。比如JJ比賽中的詐金花(贏三張),具有獨(dú)特的比牌規(guī)則。本文江將通過Python語(yǔ)言實(shí)現(xiàn)這一游戲,需要的可以參考一下
    2022-02-02
  • Python3實(shí)現(xiàn)騰訊云OCR識(shí)別

    Python3實(shí)現(xiàn)騰訊云OCR識(shí)別

    這篇文章主要為大家詳細(xì)介紹了Python3實(shí)現(xiàn)騰訊云OCR識(shí)別,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-11-11
  • 詳解Python修復(fù)遙感影像條帶的兩種方式

    詳解Python修復(fù)遙感影像條帶的兩種方式

    這篇文章主要介紹了詳解Python修復(fù)遙感影像條帶的兩種方式,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • Python機(jī)器學(xué)習(xí)NLP自然語(yǔ)言處理基本操作電影影評(píng)分析

    Python機(jī)器學(xué)習(xí)NLP自然語(yǔ)言處理基本操作電影影評(píng)分析

    本文是Python機(jī)器學(xué)習(xí)NLP自然語(yǔ)言處理系列文章,帶大家開啟一段學(xué)習(xí)自然語(yǔ)言處理 (NLP) 的旅程。本篇文章主要學(xué)習(xí)NLP自然語(yǔ)言處理基本操電影影評(píng)分析
    2021-09-09
  • Python實(shí)現(xiàn)電腦喚醒后自動(dòng)拍照截屏并發(fā)郵件通知

    Python實(shí)現(xiàn)電腦喚醒后自動(dòng)拍照截屏并發(fā)郵件通知

    這篇文章主要為大家詳細(xì)介紹了Python如何實(shí)現(xiàn)電腦喚醒后自動(dòng)拍照截屏并發(fā)郵件通知的功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2023-01-01
  • sqlalchemy對(duì)象轉(zhuǎn)dict的示例

    sqlalchemy對(duì)象轉(zhuǎn)dict的示例

    這篇文章主要介紹了sqlalchemy對(duì)象轉(zhuǎn)dict的示例,需要的朋友可以參考下
    2014-04-04
  • 13個(gè)你可能未使用過的Python特性分享

    13個(gè)你可能未使用過的Python特性分享

    Python?是頂級(jí)編程語(yǔ)言之一,它具有許多程序員從未使用過的許多隱藏功能。在這篇博客中,將和大家分享一下你可能從未使用過的13?個(gè)?Python?特性,感興趣的可以學(xué)習(xí)一下
    2022-11-11

最新評(píng)論

蓝田县| 榆林市| 太康县| 司法| 宜丰县| 平原县| 浙江省| 衢州市| 无极县| 苍南县| 宜丰县| 上犹县| 乌拉特中旗| 本溪| 延川县| 孟津县| 金秀| 合山市| 保亭| 内江市| 江山市| 深州市| 惠州市| 交口县| 临城县| 安平县| 天水市| 若羌县| 汽车| 伊宁县| 定兴县| 永顺县| 万安县| 陆丰市| 河间市| 麟游县| 调兵山市| 天峻县| 墨脱县| 武冈市| 辉县市|