亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Python > 正文

Python解析最簡單的驗證碼

2020-01-04 17:52:02
字體:
來源:轉載
供稿:網友
最近在學python,正好遇到學校需要選宿舍,就用python寫了一個搶宿舍的軟件。下面通過本文給大家介紹python解析最簡單的驗證碼,對python解析驗證碼相關知識感興趣的朋友一起學習吧
 

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

  我們學校的驗證碼是最簡單的驗證碼,形式大概如下:

Python解析最簡單的驗證碼

  其中這個圖片的大小是60X24像素的,大概每個數字的大小是15X24像素。

  觀察這個驗證碼之后可以發現,驗證碼中只有數字而且數字的字體很規范,只不過每個數字的顏色不同而已。

  當時有2個思路

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

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

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

  上面兩種方法有一個bug就是這個圖片的第一個數字有一定的偏移,比如其他位置的數字是從第3列開始的,它可能從第4列,這個我就沒具體分析了。不過這個也有辦法解決,我用的辦法就是從第一列非背景色的地方算起。不管什么圖片怎么偏移,它x軸向對于自己最左邊的點的x方向的差值是不變的。

  最后我的實現方法就是按第二種,因為這種方法是最快的,只需要取特征像素處的點就可以。

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

  最后分析這個hash表找出哪個像素是1個數字獨有的,哪個像素是2個數字獨有的,哪個像素3個數字獨有的,最后解析這個表。

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

  然后得出一個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)]} 

  使用的時候,只需依次比對這些像素點就可以判斷這張圖片的驗證碼值了。

下面介紹具體代碼

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

from PIL import Imageimport os#存放材料圖片的路徑path="C://vaildpic//"#取得材料圖片images=os.listdir(path)存放數字的切片,0-9的圖片nubimgs=[]#存放背景色backpixels=[]#存放像素對應表pixDir={}#首非背景色偏移值pixBlankEndPos=[]#這個函數用來取得這個圖片中數字結構的偏移值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#因為只是解析沒有寫的很嚴謹,這個地方#取得目標文件夾的圖片for image in images:if os.path.isdir(path+image):continueimage=Image.open(path+image)#對于每張圖片切成四份,存到字典中,取得相應的背景色,首非背景色偏移x,接下來計算用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#對于每個數字圖片的每個像素,如果對應位置非背景色,將該圖片放到該位置的字典中,其結構如下,接下來用下面的數據統計來取得每個數字的特征像素'''  pixDir[pixel(x-x_offset,y),imgSeq]=picture<br>'''for i in range(15):for j in range(24):ai=Noneaj=NonepixDir[(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個數字有的像素存到對應的文件夾中'''for pix in pixDir.items():if pix[1].__len__()<=6:print pixi=0for pic in pix[1].items():i+=1if 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"))

材料圖片:

Python解析最簡單的驗證碼Python解析最簡單的驗證碼 Python解析最簡單的驗證碼

解析結果如下

Python解析最簡單的驗證碼

對應的文件夾中就放著n個圖片共享的像素,接下來的分析我是手動分析的,其實也可以用程序寫,不過要預先告訴程序哪個片段是什么數字,可以通過把圖片名起為對應驗證碼來解析。因為這是后想到的,就沒有實現了。

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

下面的方法用來取得背景色,方法同上面解析一樣,沿圖片最上面一層取顏色,因為最上面不繪制

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

解析驗證碼,利用特征嗎判斷

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

從網絡抓取驗證碼,使用的是httplib,其中我們學校名我已替代為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) 

以上內容給大家介紹了Python解析最簡單的驗證碼的相關知識,希望大家喜歡。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久精品国产99国产精品澳门| 自拍偷拍亚洲精品| 91国内揄拍国内精品对白| 欧美亚洲视频在线观看| 欧美成人在线免费| 在线观看日韩av| xxav国产精品美女主播| 国产视频综合在线| 亚洲欧美另类国产| 成人97在线观看视频| 精品国产91久久久| 深夜福利91大全| 亚洲社区在线观看| 欧美日韩精品在线播放| 日韩美女在线播放| 亚洲欧美999| 丝袜情趣国产精品| 中文国产亚洲喷潮| 97国产一区二区精品久久呦| 成人中心免费视频| 欧美第一黄网免费网站| 国产精品美女久久久免费| 欧美视频精品一区| 欧美精品久久久久久久免费观看| 国产精品劲爆视频| 亚洲一区二区三区乱码aⅴ| 亚洲人成啪啪网站| 国产亚洲精品久久久久久777| 6080yy精品一区二区三区| 欧美在线视频在线播放完整版免费观看| 国产香蕉97碰碰久久人人| 中文字幕亚洲欧美一区二区三区| 欧美日韩成人网| 久久久久久久久久婷婷| 久久免费少妇高潮久久精品99| 欧美亚州一区二区三区| 欧美日韩国产123| 欧美日韩亚洲一区二| 日韩在线视频网站| 国产区亚洲区欧美区| 91精品国产成人www| 日韩免费精品视频| 国产成人亚洲综合青青| 欧美日韩不卡合集视频| 超薄丝袜一区二区| 国产精品精品一区二区三区午夜版| 国产亚洲人成a一在线v站| 久久人人爽国产| 国产精品欧美一区二区三区奶水| 精品欧美aⅴ在线网站| 日韩精品视频免费专区在线播放| 国产精品成人v| 国产精品一区二区性色av| 亚洲老头同性xxxxx| 国产日韩欧美在线视频观看| 97超碰蝌蚪网人人做人人爽| 久久综合网hezyo| 日韩欧美第一页| 成人国产精品免费视频| 久久中文字幕视频| 欧美巨乳美女视频| 国内精品久久影院| 日韩av中文字幕在线免费观看| 日韩成人av网址| 欧美性猛交xxxx乱大交蜜桃| 欧美黑人巨大xxx极品| 日本亚洲欧美成人| 亚洲精品电影久久久| 欧美午夜片欧美片在线观看| 精品国产1区2区| 久久国产天堂福利天堂| 亚洲jizzjizz日本少妇| 欧美三级xxx| 成人久久久久久| 国产精品av在线| 亚洲国产成人精品久久久国产成人一区| 日韩在线视频免费观看| 久久久这里只有精品视频| 亚洲一区二区三区久久| 国产精品久久久久久久久久尿| 欧美亚洲视频在线看网址| 日本中文字幕成人| 欧美重口另类videos人妖| 亚洲精品中文字幕有码专区| 成人黄色片网站| 欧美视频在线视频| 91网站在线免费观看| 亚洲www在线| 久久全国免费视频| 亚洲xxxxx性| 欧美福利小视频| 青青草99啪国产免费| 国产午夜精品理论片a级探花| 国模精品一区二区三区色天香| 亚洲精品久久久久久久久久久| 国产精品久久久av久久久| 国产日韩亚洲欧美| 中文字幕亚洲综合久久筱田步美| 亚洲国产精品人久久电影| 欧美精品videos另类日本| 久久天堂电影网| 欧美日韩中文字幕日韩欧美| 亚洲精品乱码久久久久久按摩观| 亚洲第一男人天堂| 欧美一级在线亚洲天堂| 国产精品高精视频免费| 日本午夜人人精品| 日韩专区在线观看| 热门国产精品亚洲第一区在线| 91精品国产91久久久久福利| 国产精品日韩av| 最近中文字幕mv在线一区二区三区四区| 亚洲综合自拍一区| 亚洲夜晚福利在线观看| 亚洲精品国产拍免费91在线| 国产成人亚洲精品| 日韩中文av在线| 亚洲精品久久久久中文字幕二区| 欧美激情一区二区三区久久久| 伊人亚洲福利一区二区三区| 97色在线视频观看| 成人激情综合网| 亚洲女性裸体视频| 国产欧美最新羞羞视频在线观看| 欧美性xxxx18| 久久国产天堂福利天堂| 亚洲人成欧美中文字幕| 国产日韩精品综合网站| 91精品国产综合久久香蕉最新版| 中文字幕精品影院| 韩日欧美一区二区| 欧美—级高清免费播放| 亚洲片在线资源| 久久精品国产成人精品| 欧美激情一区二区三区高清视频| 国内外成人免费激情在线视频网站| 欧美最猛黑人xxxx黑人猛叫黄| 国产精品久久久久久久久久东京| 在线亚洲午夜片av大片| 色婷婷综合久久久久中文字幕1| 狠狠躁夜夜躁人人爽超碰91| xvideos国产精品| 久久久久久国产| 欧美午夜www高清视频| 国产亚洲精品va在线观看| 日韩av有码在线| 国产成人avxxxxx在线看| 九九视频这里只有精品| 色妞久久福利网| 欧美日韩精品二区| 亚洲三级黄色在线观看| 国产精品午夜国产小视频| 国产成人精品日本亚洲| 51午夜精品视频| 日韩国产激情在线| 亚洲综合在线做性| 日韩在线观看免费全集电视剧网站| 亚洲第一区中文字幕| 欧美极品少妇xxxxⅹ免费视频| 尤物yw午夜国产精品视频| 欧美孕妇毛茸茸xxxx| 国产精品扒开腿做爽爽爽男男| 欧美国产日韩一区二区在线观看| 久久久成人的性感天堂|