利用VB實現驗證碼識別

其實我們只要在工程里加一個“WebBrowser”控件,就可以隨意讀取網頁上的任何東西,這樣就不再專門爲不同的圖片碼寫一個顯示程序。在VB6上添加“WebBrowser”控件。 
應用此部件後在VB6的左邊控件欄裏就會出現一個地球的按鈕。然後在窗體上繪出它的位置以及大小。(其實這個程序我早已寫好的,現在拿出來解釋),那個帶編輯點的控件就是“WebBrowser”。 
載入此控件後也不用再編輯什麼的,很方便,因爲其實上這個控件的行爲都會在控鈕上觸發。在這先講講圖2裏的相關控件關係,在圖2的最頂那個“CODE:….”那個文字輸入框就是在那裏讀取圖片驗證碼的URL,http://verify.qq.com/getimage這個是Tencent裏QQ申請密保圖片驗證碼的URL。這個URL如何才能得到呢?這個獲取也很容易,在瀏覽器裏右擊那個圖片驗證碼屬性就可以看到它的URL。 
下面那個“Post:”那個文字輸入框就是我們最後提交數據的目的頁面,這就簡短的介紹這裏。 
接下來就是那個“WebBrowser”這個控件如何觸發它去讀取網頁。就這那個“刷新驗證碼”的按鈕,裏面的代碼這樣:“WebBrowser1.Navigate Trim(Text4.Text)”,這裏的“Text4.Text”就是那個得到驗證碼的URL。就是這個“WebBrowser”連接驗證碼的URL的結果。 
來到這,有一個問題就是服務器發送出來的驗證碼是與那個會話結合起來纔有效的,否則服務器根本不知你是那個會話,至於那個會話其實就是那個Cookie,看下面。如圖5所示。它是我用WS找IE的Http報文的包,裏面有比較多有用的信息。 
這個會話的ID碼我們把數據Post回去時一定要把這個提交上去,要不然你返回了正確的圖片驗證碼也沒有用。至於其中的會話ID如何在VB6裏讀取自如呢? 
在“WebBrowser”的控件裏有一個類方法可以調用方法過程來得來,且很方便。在窗體裏那個“View”按鈕里加入以下兩行重要的代碼。 
Dim doc As IHTMLDocument2 //通過定義Doc對像數據類型 
Set Doc = WebBrowser1.Document //通過Set 來建立Doc對像。 
如果要讀取“WebBrowser”已打開網頁的會話ID就可以通過以下的代碼就要以取得: 
Msgbox “會話的ID爲:”&doc.cookie,vbokonly,”讀取會話ID”來到這裏我們已成功了一半了,緊接着的就是如何把得到的數據POST到目的頁面。Post數據有幾種方法,一般是用WinSock來建立TCP/IP的HTTP連接,這樣要重新的封包HTTP報文,比較好用但有些麻煩,不過它的靈活性也比較的好。但今天我沒有打算是用它來做數據Post,取而代之的就是用那個“MSXML2.XMLHTTP”,這個一般有裝過數據處理的軟件或Office軟件都會有存在,且它用起來真的比較方便,只要在VB裏用“CreateObject”就可以了。 
在封包Http報文時我們先看看IE是如何Post數據到目的頁面的,下面如圖6所示。就是我用WS找取IE瀏覽器Post數據的報文,可作參考用。 
那個Cookie以及我Post出去的數據在這裏可以看得一清二楚了,特別是那個Cookie的那些會話變量,它是與圖5裏的那個Cookie會話一樣的,因爲我沒有關閉過IE瀏覽器。 
理清了IE的工作過程後,下面就輪到我們自己來做了。下面的這一段代碼是比較完整,它是當我觸發那個“View”按鈕裏的代碼: 
Private Sub Command2_Click() 
Dim doc As IHTMLDocument2 
Set doc = WebBrowser1.Document 
Set objXMLHTTP = CreateObject("MSXML2.XMLHTTP")//建立XMLHTTP對像組件 
//下面的這個“Trim(Text5.Text)”是讀取要Post的網頁 
objXMLHTTP.open "POST", Trim(Text5.Text), False 
//以下的一連幾個setRequestHeader都是設置HTTP的報文變量頭,有些是比較重要的。 
objXMLHTTP.setRequestHeader "Referer", "http://service.qq.com/psw/psw_id.htm" 
objXMLHTTP.setRequestHeader "accept -language", "zh -cn" 
objXMLHTTP.setRequestHeader "Content-Type", "application/x-www-form-urlencoded" 
objXMLHTTP.setRequestHeader "cache -Control", "no - cache" 
On Error Resume Next 
//下面這行代碼是最重要的,它是把上一環節裏取得的圖片驗證碼的會話ID讀取並設置好準備POST的HTTP報文頭。 
objXMLHTTP.setRequestHeader "Cookie", doc.cookie 
//下面這行代就是把我們要Post的數據重新封包好 
q_post = "uin=" & Text1.Text & "&password=" & Text2.Text & "&code=" & Text3.Text & "step2=1&image.x=35&image.y=8" 
objXMLHTTP.send (q_post)//當一切搞好後,這裏就是把我們之前細心封包的數據一次Post到目的頁面 
If InStr(objXMLHTTP.responseText, "name=certtype") > 0 Then 
MsgBox "此QQ沒有密保!", vbOKOnly + 64, "恭喜!!!" 
Else 
MsgBox "此QQ可能已有密保!", vbOKOnly + 16, Form1.Caption 
End If 
Set objXMLHTTP = Nothing 
Text3.Text = "" 
If Err Then 
MsgBox "內部出錯!", vbOKOnly + 16, Form1.Caption 
End If 
End Sub 
就這樣,一個讀取圖片驗證碼的網絡程序已基本上完成了
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章