本篇主要講述驗證碼的驗證流程,包括如何驗證碼的實現、如何獲取驗證碼、識別驗證碼(這篇是人來識別,機器識別放在下篇)、發送驗證碼。同樣以一個例子來說明。目標網址 http://icp.alexa.cn/index.php(查詢功能變數名稱備案信息) 1.驗證碼的實現: 簡單的說,驗證碼就是一張圖片,圖片上有字
本篇主要講述驗證碼的驗證流程,包括如何驗證碼的實現、如何獲取驗證碼、識別驗證碼(這篇是人來識別,機器識別放在下篇)、發送驗證碼。同樣以一個例子來說明。目標網址 http://icp.alexa.cn/index.php(查詢功能變數名稱備案信息)
1.驗證碼的實現:
簡單的說,驗證碼就是一張圖片,圖片上有字元串。網站是如何實現的呢?有WEB基礎的人可能會知道,每個瀏覽器基本都有cookie,作為這次回話的唯一標示。每次訪問網站,瀏覽器都會把這個cookie發送給伺服器。驗證碼就是和這個cookie綁定到一起的。如何理解呢?舉個例子,現在有網站W,有A和B兩個人,同時訪問W,W給A返回的驗證碼是X,給B返回的驗證碼是Y,這兩個驗證碼都是正確的,但是如果A輸入了B的驗證碼,肯定驗證不通過。那伺服器是怎麼區分A和B呢,就是用到的cookie。再舉個例子,有些網站你登錄一次之後,下次繼續訪問可能就自動登陸了,也是用cookie來標示唯一身份的,如果清除了cookie也就無法自動登陸了。cookie具體是什麼生成的,我們不必關心,只需要知道是一長串字元串就行了,你的和別人的都不一樣。(例子中的目標網址並不是用cookie,而是用的其他方式,所以可能會存在一些BUG)
伺服器後臺生成驗證碼的流程就很容易理解了:首先,生成一個隨機字元串,然後和cookie綁定,然後寫到圖片上返回給你。那麼,如何生成一個圖片驗證碼呢?下麵是一個簡單的生成驗證碼源碼:
from PIL import Image import ImageFilter,ImageDraw,ImageFont import random width = 80 height = 40 font = ImageFont.truetype('C:\\Windows\\Fonts\\AdobeFangsongStd-Regular.otf', 28) image = Image.new("RGB",(width,height),(0,0,0)) draw = ImageDraw.Draw(image) for t in range(4): draw.text((20*t,10),`random.randint(0,9)`,font=font,fill=(255,255,255)) image.show()
代碼說明:
a).PIL是python的圖片庫模塊,需要自己安裝
b).ImageFont.truetype()是選擇字體
c).Image.new("RGB",(width,height),(0,0,0))新建一個Image,背景色是白色((0,0,0)就代表的顏色),如果需要別的顏色,可自己查詢顏色代碼。window自帶的畫板就可以看到:
d).random.randint(0,9)隨機數 範圍大於等於0,小於等於9
e).draw.text((20*t,10),`random.randint(0,9)`,font=font,fill=(255,255,255),anchor=False) 第一個參數代表位置,帶二個代表內容,第三個代表字體,第四個代表字體顏色
f).image.show()顯示圖片,第一詞會提示選擇預設圖片查看器。
運行結果如下圖:
2).驗證碼的獲取
a).分析目標網站,可以看到當滑鼠點擊驗證碼那個輸入框時會顯示驗證碼,如圖: