1. 程式人生 > 實用技巧 >極驗驗證碼破解—超詳細教程(三)

極驗驗證碼破解—超詳細教程(三)

極驗驗證碼破解—超詳細教程(三)

Gayhub:FanhuaandLuomu/geetest_brek

[國家企業信用資訊公示系統為例]

目錄

一、網站http://www.gsxt.gov.cn滑動驗證碼概述.

二、極驗驗證碼破解-抓包分析.

三、極驗驗證碼破解-搭建本地驗證碼服務.

四、極驗驗證碼破解-分析geetest.js,得到所需引數.

五、極驗驗證碼破解-Track的獲取.

六、極驗驗證碼破解-獲取背景圖片及缺口距離d的計算.

七、極驗驗證碼破解-總結.

參考文獻.

執行截圖.

五、極驗驗證碼破解-Track的獲取

1. Track的生成可以根據圖片缺口的距離d,使用隨機函式隨機取樣生成。比如d=120,則我們控制總拖動時間為t(t一般小於3s),則可以每很小的時間內(每次隨機時間,如10ms)移動一小段隨機距離,最後在時刻t時正好移動到d。但考慮人拖動會有先加速在減速的特點(或許還有其他特點),geetest的伺服器可能會識別到時機器所為,我們很難找到人行為的軌跡特點並且難以模擬,因此生成軌跡不太可行(也許可行,但代價較大)。

2. 我們提出另一種方法替代Track的生成,即手工事先儲存備用Track。驗證碼圖片總長大概250左右,由於我們已經實現了在Console中列印Track的js,因此我們可以多次重新整理http://localhost:8000/頁面,得到不同缺口位置的驗證碼,手動拖動至缺口處,儲存Console中的Track。

3. 經過試驗發現,缺口位置大多停留在中間位置,並且拖動誤差在3以內都可以接受。因此我們可以用當前位置d的Track來代替d-1和d+1的Track(如缺口位置120,則119和121的Track可以不用測試,直接使用120的Track)。這樣大大減少了重新整理頁面獲取Track的次數,我收集的Track列表如下:

為了方便統計,我按個位數將Track存放在10個檔案中。

我們將所有的Track整合為dict(t_dict.pkl),格式如下:

{k1:v1},其中k1為缺口位置,v1為Track(字串形式)。

至此我們得到Track備用列表,我們可以根據實際的缺口位置獲得相應的Track值,下一節我們將會講解如何得到缺口距離驗證碼左邊的相對距離d。

六、極驗驗證碼破解-獲取背景圖片及缺口距離d的計算

1. 我們首先尋找圖片的來源。回憶分析get.php?的時候,看到過“fullbg”的出現,因此很大可能背景圖片資訊是通過get.php?傳來的。檢視Response如下:

根據圖片的url開啟圖片:

可以發現圖片已經亂碼,這是因為返回的圖片是區域性重合產生的。

檢視驗證碼圖片的審查元素:

可以發現,展示的圖片是從原始亂碼圖片中多次擷取小段,合成而成的。具體的合成方式如background-position所示。如background-position:-157px,-58px。則該小段圖片為源亂碼圖片的(157,58,157+10,58+58)。根據上述分析,我麼可以還原bg和fullbg的非亂碼圖片(即所看見的背景圖片)。

我們通過比較兩張圖片的畫素值,即可得到缺口的位置,缺口左上角橫座標的值即為d。我們封裝了get_dist函式如下:

# 計算缺口距離
def get_dist(image1,image2):
	# 合併圖片使用
	location_list=cPickle.load(open('location_list.pkl'))

	jpgfile1=cStringIO.StringIO(urllib2.urlopen(image1).read())
	new_image1=get_merge_image(jpgfile1,location_list)

	new_image1.save('image1.jpg')

	jpgfile2=cStringIO.StringIO(urllib2.urlopen(image2).read())
	new_image2=get_merge_image(jpgfile2,location_list)

	new_image2.save('image2.jpg')

	i=0
	for i in range(260):
		for j in range(116):
			if is_similar(new_image1,new_image2,i,j)==False:
				# 找到缺口  返回缺口的橫座標i 
				# 因為圖片是水平移動 所以不需要缺口的縱座標
				return i

函式其它細節請參見專案原始碼。

七、極驗驗證碼破解-總結

1. 至此,geetest驗證碼的關鍵技術點已經講解完,有沒有感覺號稱使用深度學習技術進行人機驗證的滑動驗證碼也不過如此。最近我會在Github上開源所有程式碼,希望得到大家的指點。

2. 當時做這個專案大概斷斷續續做了兩星期左右(2017.03),開始是參照網上教程使用selenium控制滑鼠來實現,後來發現滑鼠移動的速度太機械化,成功率太低(滑動到缺口處,但被識別為機器行為)。所以,我採取了退而求其次的方法,避免對軌跡路徑的生成,直接使用已經成功驗證的歷史軌跡來作為當前軌跡。經過試驗,這種方法成功率接近100%,且複雜度不高,歷史軌跡單獨存在硬碟,可定期更新(以防止軌跡被封)。

3. 最近(2017.07)突然想寫個文件教程分享技術,算是個學習筆記,也算是對自己曾經努力的記載。該文件斷斷續續寫了4個晚上的時間,歡迎大家閱讀並指正。

4. 最後附上Github地址,裡面有一些小爬蟲和NLP相關的專案,歡迎圍觀。https://github.com/FanhuaandLuomu

參考文獻

1.http://blog.csdn.net/paololiu/article/details/52514504

2.https://zhuanlan.zhihu.com/p/22866110?refer=windev

3.https://zhuanlan.zhihu.com/p/22404294

(向以上參考文章的作者致謝~)

執行截圖

Python geetest_spider.py

注意:要爬取的企業列表寫在searchword_list。

(THE END,如果對您有幫助,請點個贊~~~)