QQ:954886777
好文分享

分享 VB 編程webbrowser+Inet+抓包封包+經(jīng)驗

時(shí)間:2019年04月19日 信息來(lái)源:本站原創(chuàng ) 點(diǎn)擊: 加入收藏 】【 字體:

      網(wǎng)絡(luò )上看到多少關(guān)于VB網(wǎng)絡(luò )編程方面的知識,一方面是VB用的人比較少,不會(huì )用就說(shuō)VB不好(個(gè)人認為學(xué)好VB以后C++、Java一看就會(huì )?。?;另一方面是大家不愿意公開(kāi)這方面的知識,自己辛辛苦苦探索的,還得靠它吃飯,怎么可能輕易拿出來(lái)公布?但是社會(huì )要發(fā)展,人類(lèi)要進(jìn)步,為了讓更多的人受益,為了讓體現自己價(jià)值,我愿意分享自己對于網(wǎng)絡(luò )編程的經(jīng)驗。我也是剛開(kāi)始學(xué),所以這篇文章難免有錯誤之處,而且認識也相對比較淺顯,只是作為入門(mén)級的文章吧!


      用VB操作網(wǎng)頁(yè),主要有兩種方法:一是模擬操作,即自動(dòng)控制。二是POST,也就是發(fā)送消息(數據包)。這兩種方式涉及到:Webbrowser控件、Inet控件、XMLHTTP對象。其中,Webbrowser控件主要用來(lái)模擬操作,讓機器自動(dòng)完成點(diǎn)擊、選中、填寫(xiě)等操作;Inet控件和XMLHTTP對象主要是用來(lái)POST,即發(fā)送數據包,在不加載網(wǎng)頁(yè)的情況下直接與服務(wù)器交互。下面開(kāi)始講解它們的應用。注:我在這里僅僅討論操作網(wǎng)頁(yè),像聊天、文件傳輸在這不作為重點(diǎn),畢竟這些相對來(lái)說(shuō)還是比較少用的。


      webbrowser,這是一個(gè)比較基礎的控件,關(guān)于它的學(xué)習資料,網(wǎng)上還是很多的。用它操作網(wǎng)頁(yè)是一種看得見(jiàn),摸得著(zhù)的過(guò)程,基本的任務(wù)都能完成。經(jīng)過(guò)半年的使用經(jīng)驗,總結一下它不能完成的任務(wù):1.不能操作JS腳本。如果你操作的網(wǎng)頁(yè)內容被放在了JS腳本里,那么就不要用這個(gè)控件了。2.不能點(diǎn)擊Flash按鈕。Flash按鈕比在網(wǎng)頁(yè)中較特殊,用webbrowser控件無(wú)法找到這個(gè)對象。我所遇到的就是這兩條,當然肯定還有別的。下面通過(guò)一個(gè)萬(wàn)能代碼來(lái)看一下這個(gè)控件:


For lngIndex= 1 To WebBrowser1.Document.All.Length - 1


    If InStr(1, WebBrowser1.Document.All(lngIndex).outerhtml, "替換為你要查找的關(guān)鍵字") > 0 Then '查找關(guān)鍵字


        If UCase(WebBrowser1.Document.All(lngIndex).tagName) = "INPUT" Then '如果點(diǎn)擊是超鏈接 把INPUT換成A


           ' WebBrowser1.Document.All(lngIndex).Click  '如果是模擬點(diǎn)擊就用這個(gè)語(yǔ)句


           WebBrowser1.Document.All(lngIndex).Checked = True  '如果是模擬選中復選框,就用這個(gè)語(yǔ)句


            Exit For


        End If


    End If


Next


用這個(gè)代碼,可以靈活的模擬:點(diǎn)擊按鈕、點(diǎn)擊超鏈接、操作復選框、操作下拉式菜單、填寫(xiě)數據。這個(gè)代碼大概的意思:最外層循環(huán)遍歷整個(gè)網(wǎng)頁(yè)中的標簽對象,然后用第二個(gè)循環(huán)去匹配這個(gè)對象中是否有我們期望的關(guān)鍵字,如果有的話(huà),再判斷這個(gè)標簽對象的類(lèi)型,一般情況下,超鏈接是A,其他的均為INPUT,注意一下一定要大寫(xiě),因為從webbrowser中獲取的網(wǎng)頁(yè)源碼全是大寫(xiě)的,與真實(shí)源碼有差別。在最里邊也就是操作語(yǔ)句了,如果是文本框輸入就寫(xiě)成WebBrowser1.Document.All(lngIndex).Text = "期望的字符串"。如果是想點(diǎn)擊按鈕或者超鏈接就用WebBrowser1.Document.All(lngIndex).Click。如果是選中復選框WebBrowser1.Document.All(lngIndex).Checked = True。如果是下拉式菜單WebBrowser1.Document.All(lngIndex).Value = "對應的值"?;镜牟僮骶褪沁@些,輕松勝任。當然,用這個(gè)萬(wàn)能代碼是在迫不得已的情況下才用的。如果網(wǎng)頁(yè)很簡(jiǎn)單,按鈕,輸入框等有ID,那么直接寫(xiě)WebBrowser1.Document.All("按鈕的ID").Click就可以點(diǎn)擊按鈕了,其他同理,輸入ID即可。


      在實(shí)際使用中,我們會(huì )遇到一個(gè)非常頭疼的問(wèn)題:webbrowser操作網(wǎng)頁(yè)必須等待網(wǎng)頁(yè)加載完成,否則會(huì )找不到標簽對象。網(wǎng)上比較流行的做法是用webbrowser的Busy方法等待網(wǎng)頁(yè)加載完成,但是根本沒(méi)有效果。在此我分享一下自己的經(jīng)驗,想想我們人是怎么判斷網(wǎng)頁(yè)是否加載完成的?因為出現了一些新的信息,因為有變化!我們當然也可以讓程序這么去判斷。我們可以在新網(wǎng)頁(yè)中找一個(gè)固定存在的字符,用while循環(huán)不斷獲取webbrowser的網(wǎng)頁(yè)源碼,直到出現這個(gè)固定字符,我們就認為加載完成。例如,在目的網(wǎng)頁(yè)里會(huì )出現123這個(gè)字符,那么:


While Instr(WebBrowser1.Document.All(1).outerhtml,"123") =0


      Doevents


Wnd


這樣寫(xiě)可以很好的達到等待網(wǎng)頁(yè)加載完成的目的。這里WebBrowser1.Document.All(1).outerhtml是webbrowser中所有的標簽對象,基本上可以說(shuō)是獲取網(wǎng)頁(yè)源碼。如果用這個(gè)語(yǔ)句無(wú)法獲取就用WebBrowser1.Document.Body.InnerHtml,最好是用第一個(gè),第二個(gè)不保險。順便提一下,WebBrowser1.Document.All(1).outerhtml是獲取網(wǎng)頁(yè)源碼,如果我們不想要源碼,而想要網(wǎng)頁(yè)內容,即瀏覽器展示給我的文字,可以用:WebBrowser1.Document.body.innertext。


      還有一個(gè)問(wèn)題就是有些網(wǎng)站點(diǎn)擊鏈接時(shí)會(huì )在新的窗口中打開(kāi),這時(shí)候webbrowser會(huì )調用IE瀏覽器,導致網(wǎng)頁(yè)跳出程序,那么可以用下面的代碼處理NewWindow2事件:


Private Sub WebBrowser1_NewWindow2(ppDisp As Object, Cancel As Boolean)


   Dim frmWB As Form1


   Set frmWB = New Form1


 


   frmWB.WebBrowser1.RegisterAsBrowser = True


 


   Set ppDisp = frmWB.WebBrowser1.Object


   frmWB.Visible = True


   Unload Me


End Sub


注意這里的Form1是窗體名稱(chēng),要根據你的實(shí)際情況修改。


      另外,注意一下Silent屬性,把它設為T(mén)ure,防止彈出一些腳本錯誤的提示。


      好了,說(shuō)到這這個(gè)控件也就沒(méi)什么了。常用的都說(shuō)了,一些注意的問(wèn)題也說(shuō)了,其他的就要靠大家自己努力了!多練?。▍⒖假Y料:webbrowser控件屬性、方法大全。)


      Inet控件。相信大家已經(jīng)體會(huì )到了Webbrowser的不足之處:慢!因為它要等待網(wǎng)頁(yè)加載完成,每一個(gè)圖片,每一個(gè)腳本都要加載出來(lái),不僅數據量大,而且造成速度太慢,簡(jiǎn)單的例子,如果要暴力破解密碼,顯然webbrowser是不可以的!。Inet控件的POST功能恰好彌補了這個(gè)缺點(diǎn)。POST是直接以數據包的形式,直接與服務(wù)器對話(huà),比如你想登陸QQ空間,根本不用過(guò)去打開(kāi)那個(gè)網(wǎng)頁(yè),直接POST給QQ服務(wù)器登錄數據,符合條件就登錄成功,就可以進(jìn)行下一步操作了。這些操作由于都是在無(wú)形之中的,所以難度比webbrowser控件大。我不清楚讀這篇文章的人是什么水平,由于這個(gè)涉及的知識太多太雜,繼續往下看之前你必須先學(xué)會(huì )抓包工具HTTPWATCH的使用(點(diǎn)擊下載教程以及軟件)。如果你對這個(gè)軟件有所了解,就可以進(jìn)入下一步了!我再次說(shuō)明,關(guān)于封包發(fā)包這部分知識很亂很雜,你只要跟著(zhù)我走,不會(huì )的就停下來(lái)多花點(diǎn)功夫,暫時(shí)不懂也沒(méi)事,等你把我這篇文章看完了我保你會(huì )!


 


    什么是數據包?


 


     數據包,又稱(chēng)作封包。簡(jiǎn)單的說(shuō),你上網(wǎng)打開(kāi)網(wǎng)頁(yè),這個(gè)簡(jiǎn)單的動(dòng)作,就是你先發(fā)送數據包給網(wǎng)站,它接收到了之后,根據你發(fā)送的數據包的IP地址,返回給你網(wǎng)頁(yè)的數據包,也就是說(shuō),網(wǎng)頁(yè)的瀏覽,實(shí)際上就是數據包的交換。以上藍色部分是百度百科上面對數據包的詮釋?zhuān)信笥芽赡芸床幻靼?,那么我就順?zhù)這個(gè)解釋?zhuān)瑏?lái)舉一個(gè)經(jīng)典的"老王借錢(qián)"例子:


 


     1、隔壁的老王向你借錢(qián)。


     2、接收到老王借錢(qián)的請求。


     3、檢查自己的腰包是否有錢(qián)。


     4、是借還是不借?


     5、把結果告訴老王。老王就會(huì )作出相關(guān)的反應(借的話(huà)他就爽,不借他當然就不爽了~)。


 


     其實(shí)上面只是一個(gè)再也簡(jiǎn)單不過(guò)的借錢(qián)行為,不過(guò)如果我們把它套用在客戶(hù)端與網(wǎng)頁(yè)服務(wù)端的通訊流程的話(huà),會(huì )發(fā)現其實(shí)兩者有著(zhù)異曲同工之妙:


 


     1、老王相當于客戶(hù)端,而借錢(qián)也就相當于一個(gè)請求。錢(qián)的數量,就相當于請求中的參數。老王向你借錢(qián),我們可以把這一步稱(chēng)為POST,就是把借錢(qián)這個(gè)請求傳遞給你(服務(wù)端)。


     2、你,就相當于服務(wù)端,而這個(gè)錢(qián),說(shuō)白了,就是客戶(hù)端傳遞過(guò)來(lái)的參數。你接到老王發(fā)出的借錢(qián)請求,這一步叫做響應。


     3、檢查自己的腰包是否有錢(qián),就相當于服務(wù)器驗證用戶(hù)的請求是否合法。比如一個(gè)網(wǎng)上支付系統,用戶(hù)請求要支出1000塊錢(qián),然后用戶(hù)就會(huì )把1000塊錢(qián)這個(gè)參數傳遞到服務(wù)端,服務(wù)端當然就得驗證一下用戶(hù)的錢(qián)包里面是否有1000塊錢(qián),如果有的話(huà)就通過(guò),沒(méi)有的話(huà)當然就返回錯誤信息了。這是驗證/校驗數據。


     4、當第四步過(guò)后,如果腰包有錢(qián),而你又情愿借給老王,此時(shí),就相當于服務(wù)端給客戶(hù)端返回一個(gè)信息,是借(True)。反之,就是不借(False)。這一步叫做返回/反饋。


     5、老王接到你給他回的信息,就會(huì )根據結果的不同而產(chǎn)生響應的動(dòng)作。響應你動(dòng)作的這一方法稱(chēng)為GET。


 


     這樣一來(lái),相信你對服務(wù)端和客戶(hù)端的基本通訊過(guò)程大家都清楚了。但是,造成這一過(guò)程的起源是啥?是錢(qián)!我不得不說(shuō)錢(qián)是萬(wàn)惡的(這也讓我說(shuō)得通,YY下)


     服務(wù)端和客戶(hù)端之間首要的通訊條件當然就是必須可以聯(lián)網(wǎng)。你說(shuō)如果老王是死人的話(huà),怎么向你借錢(qián),對吧?不過(guò)要是真的有死人向你借錢(qián)的話(huà)……離我遠點(diǎn)。其實(shí)這一個(gè)"借錢(qián)"的過(guò)程,錢(qián)充當著(zhù)比較重要的角色,一個(gè)數據包里面包含了很多參數,參數也會(huì )有相應的值。而"錢(qián)",在這里就充當著(zhù)一個(gè)數據包參數的角色,錢(qián)的數量,就是這個(gè)數據包參數的值。


 


     到這里,我們就開(kāi)始本課題的深究吧,因個(gè)人水平有限,文中難免會(huì )有不妥之處,歡迎大牛拍磚。


 


     經(jīng)過(guò)前面的說(shuō)明(純屬瞎扯),相信大家對數據包也有一個(gè)模糊的概念了,當然,這只是相對于從未接觸過(guò)這一方面內容的新手而言。下一章我們來(lái)研究一下如何去抓包,并來(lái)編寫(xiě)一個(gè)QQ空間的留言工具來(lái)完成這一個(gè)課題的學(xué)習。


 


     數據包有什么用?


 


     數據包的交互是最底層的網(wǎng)絡(luò )協(xié)議通訊,利用數據包,我們完全可以模擬客戶(hù)機和服務(wù)端通訊的過(guò)程。比如我們需要編寫(xiě)一個(gè)帳號注冊器,如果用傳統的模擬網(wǎng)頁(yè)表填寫(xiě)的方式去實(shí)現的話(huà),這樣雖然比人手工操作的方法要快,但也還需要載入一個(gè)網(wǎng)頁(yè),速度還是遜色的。但如果用數據包去實(shí)現的話(huà),就相當于只把一系列的字符串傳遞到目標服務(wù)器即可。載入一個(gè)網(wǎng)頁(yè),包含了圖片、表單等元素,大一點(diǎn)的話(huà)起碼得要下載幾百KB的數據,但數據包,最多也就幾KB,如果客戶(hù)機和服務(wù)器的網(wǎng)絡(luò )都正常的話(huà),提交數據包到服務(wù)器幾乎就是一瞬間的事情。


 


     如何抓包?


 


     相信大家對抓包這個(gè)概念并不陌生。從字面上很好理解,抓包就是一個(gè)捕獲數據包的過(guò)程。我們前面說(shuō)了,客戶(hù)機和網(wǎng)頁(yè)服務(wù)器之間的通訊都會(huì )產(chǎn)生數據包,如果我們想模擬它這個(gè)通訊過(guò)程的話(huà),就必須要把它們之間通訊所產(chǎn)生的數據包捕捉下來(lái),再進(jìn)行分析。


     可能大家都聽(tīng)說(shuō)過(guò)WEP,Sniffer等工具,其實(shí)它們都是抓包工具。但是數據包有不同類(lèi)型,TCP包,通常是軟件所產(chǎn)生的數據包,我們玩網(wǎng)絡(luò )游戲的時(shí)候和服務(wù)器所產(chǎn)生的就是TCP包。而我們在網(wǎng)頁(yè)通訊的時(shí)候,所產(chǎn)生的就是HTTP包了。TCP包是以二進(jìn)制的方式進(jìn)行傳輸的,HTTP卻是以明文的方式進(jìn)行傳輸的。


     在這個(gè)教程中,我們統一使用HTTPWATCH這個(gè)軟件來(lái)進(jìn)行抓包。


     HTTPWATCH 是一個(gè)IE插件,也是一個(gè)強大的HTTP捕捉工具。


 


     安裝完HTTPWATCH之后,要打開(kāi)IE瀏覽器,在瀏覽器工具欄處打開(kāi)才行(第三方瀏覽器諸如 360 都不支持IE插件)。我們先來(lái)看看HTTPWATCH的強大界面:


HTTPWATCH 界面:




  


     ①工具欄


         Record:開(kāi)始監聽(tīng)網(wǎng)頁(yè)數據包。


         Stop:停止監聽(tīng)。


         Clear:清空結果列表。


 


     ②數據包監聽(tīng)列表


     ③數據包詳細信息       


         基本信息(Overview):顯示數據包的目標地址,返回結果等信息。


         時(shí)間圖表(Time Chart):顯示數據包在通訊狀態(tài)中 連接、等待、接收 的占用時(shí)間。


         頭信息(Headers):HTTP的基本頭信息。


         Cookie:百度百科


         緩存(Cache):在本地臨時(shí)文件夾暫存的數據。


         查詢(xún)字符串(Query String):表單產(chǎn)生的查詢(xún)動(dòng)作的主要查詢(xún)參數。


         傳遞參數(POST Data):POST數據包的主要參數,也就是傳遞到服務(wù)器的參數。


         返回信息(Content):返回的頁(yè)面源碼。


         數據流(Stream):提交到服務(wù)器的數據包參數以及HTTP頭信息。


 


     以上就是HTTPWATCH的大體結構。在打開(kāi)IE瀏覽器,啟用這個(gè)插件之后,點(diǎn)擊"Record"就可以進(jìn)行數據包的監聽(tīng)了。在監聽(tīng)狀態(tài)下,你所做的每一步網(wǎng)頁(yè)操作都會(huì )有相關(guān)的數據流動(dòng),HTTPWATCH大致上可以抓三種行為:


 


     1.POST行為


     2.GET行為


     3.CACHE


 


     POST大家都很熟悉的了,就是向服務(wù)器傳遞參數。平時(shí)我們提交一個(gè)網(wǎng)頁(yè)表單的時(shí)候,產(chǎn)生的也是POST方法。GET大家也不會(huì )陌生,當POST完畢之后,服務(wù)器一般都會(huì )返回一些信息給用戶(hù),這就是相對于用戶(hù)而言的GET。簡(jiǎn)單通俗點(diǎn)的話(huà),大家可以把POST理解為上載數據,把GET理解為下載數據。至于CACHE,這個(gè)就是緩存操作,直接從本地緩存里面取出來(lái)的資源。


     在這里我們學(xué)習的就是POST數據,我們將會(huì )通過(guò)一個(gè)QQ空間的留言工具來(lái)帶大家入門(mén)這個(gè)課題的內容。


     首先我們打開(kāi)http://qz.qq.com,這個(gè)是騰訊留給手機用戶(hù)的接口,之前我一直不知道有這個(gè)網(wǎng)頁(yè)的存在,是XC同學(xué)找到的。這個(gè)接口比起標準的QQ空間接口來(lái)說(shuō),就精簡(jiǎn)得多了。那么我們就在這里入手,嘗試著(zhù)給好友的QQ空間留言,然后抓"留言"這個(gè)動(dòng)作所產(chǎn)生的數據包。


     眾所周知,如果沒(méi)有在網(wǎng)站上登錄自己的QQ,是沒(méi)有辦法留言的,因為QQ空間不支持匿名留言。我們進(jìn)入網(wǎng)站的時(shí)候,它也會(huì )先提示登錄,然后才可以后續操作。所以,我們如果要做這樣一個(gè)留言工具的話(huà),就必須要具備以下步驟:


 


     1.登錄QQ


     2.發(fā)送數據包


     3.取得返回信息


 


     QQ的登錄數據包我在這里就不演示抓包了,因為騰訊已經(jīng)改了新的登錄接口,但是舊的還能用,我這里還是用舊的QQ登錄數據包。在此之前,我們先來(lái)給好友的QQ空間留言,抓包,我在有錢(qián)哥的空間里面留言"測試測試",大家可以看到,列表中就產(chǎn)生看一個(gè)新的項目。其Method屬性就是POST!這就是傳遞到QQ空間服務(wù)器的數據包了,大家可以看看紅色框框的內容,是不是覺(jué)得很熟悉?


 


con=%E6%B5%8B%E8%AF%95%E6%B5%8B%E8%AF%95%7E%7E&uin=298096110&suin=542464221


 


     沒(méi)錯,這紅色字體部分就是傳說(shuō)中的HTTP數據包!


     大家可以看看,這個(gè)數據包里面只有三個(gè)參數,分別是con,uin,suin,這三個(gè)參數一眼看上去就很容易知道它的意思了,我們分析數據包的時(shí)候一般都是根據其參數名稱(chēng)的字面意思以及參數的值來(lái)判斷這是一個(gè)什么樣的參數。


     我剛才在比你·有錢(qián)的QQ空間留言了,我的QQ就是542464221,而有錢(qián)的QQ是298096110。除此之外,還有一個(gè)最重要的參數,那就是con,這也是我們留言的內容!大家可能會(huì )奇怪,上面的留言?xún)热莶皇?quot;測試測試~~"嗎?怎么現在看著(zhù)變成了一堆亂碼?


     其實(shí)這不是亂碼,而是網(wǎng)頁(yè)編碼。至于轉換的方法,我們會(huì )在下面講到。


     相信大家都懂得抓包了,自己多實(shí)踐幾次,你也可以找一些網(wǎng)站上的注冊頁(yè)面,自己嘗試著(zhù)注冊一個(gè)帳號,然后提交一個(gè)表單,抓包看看,嘗試著(zhù)去分析一個(gè)數據包,弄清楚各個(gè)參數的意思。


 


 


     如何發(fā)送數據包?


     這一節是本教程的核心部分。既然我們已經(jīng)捕捉到了QQ空間留言的數據包,那么我們完全可以模擬這個(gè)過(guò)程了。VB對于網(wǎng)絡(luò )的操控性能還是很不錯的。在VB中封裝了inet,winsock等控件,可以很輕松的調用各種方法去發(fā)HTTP數據包。在本教程例子當中,我們用inet作為例子去講解一下如何發(fā)送數據包。


 


     我們先來(lái)看看Inet的execute方法 :


     InetObject.Execute "[POST頁(yè)面URL]", "POST", "要發(fā)送的數據包內容", "封包頭信息"


 


     我們在發(fā)送數據包的時(shí)候需要注意,一個(gè)完整的數據包,應該是由報頭和封包內容組成的。比如上面我們抓出來(lái)的數據包之中:


 


     這是數據包內容:


     con=%E6%B5%8B%E8%AF%95%E6%B5%8B%E8%AF%95%7E%7E&uin=298096110&suin=542464221


 


     這是數據包頭信息:


     POST /cgi-bin/mobile_update_msg HTTP/1.1


     Accept: image/jpeg, application/x-ms-application, image/gif, application/xaml+xml, image/pjpeg, application/x-ms-xbap, application/x-shockwave-flash, application/QVOD, application/QVOD, application/vnd.ms-excel, application/vnd.ms-     powerpoint, application/msword, */*


     Referer: http://qz.qq.com/298096110/msglist/


     Accept-Language: zh-CN


     User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; QQDownload 646; SLCC2; .NET CLR      2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; CIBA)


     Content-Type: application/x-www-form-urlencoded


     Accept-Encoding: gzip, deflate


     Host: qz.qq.com


     Content-Length: 75


     Connection: Keep-Alive


     Cache-Control: no-cache


     Cookie: pgv_pvid=5935155721; pgv_flv=10.0; ptcz=711d7cb1ddde86208f1cefa14aeef570559b7327db1e1500853742cd7ff607b7; pvid=5935155721; icache=GDGGMM@LM; pgv_r_cookie=107649076403; o_cookie=542464221; suid=5538977674; adid=542464221; adSP=irZ4SlVL95zhdFpg5bULoRAhsvy9F4wI/hgQDREbzJc=_4400_326830_1278923685_; adVer=2839; ac=1,030,006; showModel=list; tips-share=1; aq_displaybubble=542464221; pt2gguin=o0542464221; uin=o0542464221; skey=@cKMj7aqRM; speed=1; browsertype=4; inbox=0


 


 


     一般來(lái)說(shuō),我們在inet之中并不需要把數據包的所有頭信息都附加進(jìn)去。不過(guò)有一句是肯定要的,那就是:


     Content-Type: application/x-www-form-urlencoded


 


     這指定了數據包網(wǎng)頁(yè)所支持的類(lèi)型。如果是在winsock里面的話(huà),則需要附帶所有的頭信息。頭信息指定了一個(gè)數據包的屬性等信息。通過(guò)上面的頭信息,相信大家也可以獲悉很多內容。


     我們再回到上面一小節所提到的問(wèn)題,數據包里面的con參數為什么是經(jīng)過(guò)轉換了的字符?因為我們在訪(fǎng)問(wèn)一個(gè)網(wǎng)頁(yè),或者在HTTP數據傳輸的時(shí)候,服務(wù)器并不能直接識別中文字符,因此需要轉換。不同編碼方式的轉換方式也有不同。



           QQ空間留言工具的例程我已經(jīng)寫(xiě)好了,里面的注釋很詳細,我在這里就不多說(shuō)了。大家下載例子看看就一目了然。這個(gè)例子真的注釋很詳細,一看就會(huì )?。c(diǎn)擊下載QQ留言工具)

 


      好了,看到這相信你對抓包、封包已經(jīng)有了一定了解,并且躍躍欲試了!上邊的例子是來(lái)源于網(wǎng)絡(luò )的,那個(gè)留言工具的代碼也比較復雜,為了讓讀者更加清晰,我再舉一個(gè)例子,簡(jiǎn)化一下代碼。


      我就拿網(wǎng)易開(kāi)刀吧!登錄網(wǎng)易博客!首先打開(kāi)我的網(wǎng)易博客,然后點(diǎn)擊登錄,再點(diǎn)擊HTTPWATCH的Record,輸完帳號密碼,點(diǎn)擊登錄,可愛(ài)的小包包都被我們抓到了,下面是stream(流)


POST /logins.jsp HTTP/1.1


Accept: text/html, application/xhtml+xml, */*


Referer: http://yangyuankp.blog.163.com/


Accept-Language: zh-CN


User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)


Content-Type: application/x-www-form-urlencoded


Accept-Encoding: gzip, deflate


Host: reg.163.com


Content-Length: 205


Connection: Keep-Alive


Cache-Control: no-cache


Cookie: MAIL163_SSN=yangyuankp; vjuids=b46ab8d61.12dc620ae36.0.8235534c19532; vjlast=1296109187.1307365009.22; _ntes_nnid=174bb1179a0306265cd30352879cecbd,0; _ntes_nuid=174bb1179a0306265cd30352879cecbd; P_INFO=yangyuankp@163.com|1306890848|2|blog|11&15|heb&1306846208&blog#heb&131000#10|189147&1; ALLYESID4=00110324074458898832678; NTES_LOGINED=true; __utma=187553192.944603223.1301881124.1301881124.1301887705.2; __utmz=187553192.1301881124.1.1.utmcsr=blog.163.com|utmccn=(referral)|utmcmd=referral|utmcct=/error.do; USERTRACK=219.243.79.67.1306393576113082; SID=16552eab-8fda-403b-874f-b199b2b23626; JSESSIONID=dacwhOfantSjj6j2TM8bt


 


password=123456&type=1&url=http%3A%2F%2Fblog.163.com%2FloginGate.do%3Ftarget%3Dhttp%253A%252F%252Fyangyuankp.blog.163.com%252F%26blogActivation%3Dtrue&product=blog&savelogin=0&username=18932624147@163.com


一般情況下,在流里面已經(jīng)包含了必要的頭信息,POSTDATA等等,所以就直接看這個(gè)了!


我們看到Content-Type: application/x-www-form-urlencoded,這是個(gè)必要的頭信息,告訴服務(wù)器怎么解碼。在VB中寫(xiě)對應的:Const POST_HEADER = "CONTENT-TYPE:application/x-www-form-urlencoded"。然后我們去找POST地址:




 


在這個(gè)POST信息最后是地址,在VB中寫(xiě):Const POST_URL = "https://reg.163.com/logins.jsp"。在流的最下邊就是POSTDATA,當然去POSTDATA選項卡看更加清晰!讓我們來(lái)看看,都有什么。。。其中有一個(gè)&url=http%3A%2F%2Fblog.163.com%2FloginGate.do%3Ftarget%3Dhttp%253A%252F%252Fyangyuankp.blog.163.com%252F%26blogActivation%3Dtrue,這個(gè)一看就不是必要信息,舍去?。。?!其他的可不能省,都是密碼,帳號,類(lèi)型之類(lèi)的,省了肯定出錯。在VB中寫(xiě):POST_DATA = "password=123456&type=1&product=blog&savelogin=0&username=18932624147@163.com"這樣是不是很清晰?。▍抵遍g用&連接)。。。萬(wàn)事具備只欠POST了!我們寫(xiě)Inet1.Execute POST_URL, "POST", POST_DATA, POST_HEADER。然后等待數據接收完畢 


Do While Inet1.StillExecuting


    DoEvents


  Loop


完成之后獲取登錄后的主頁(yè)


Inet1.Execute "http://yangyuankp.blog.163.com/", "GET"


再等待。。。


    Do While Inet1.StillExecuting


    DoEvents


  Loop


  獲取二進(jìn)制數據,給字節數組


BinBuff() = Inet1.GetChunk(0, icByteArray)


解析為Unicode 并在text中顯示:


Text1.Text = StrConv(BinBuff(), vbUnicode)


大工造成!這是我們會(huì )在text中看到登錄成功的源碼。。。是不是很簡(jiǎn)單????有沒(méi)有自豪感??是不是感覺(jué)自己會(huì )了很多東西?? 


XMLHTTP用法大同小異,在此就不多說(shuō)了。(點(diǎn)擊下載參考資料以及XMLHTTPQQ申請器源碼)



   


看到這,相信你也算一個(gè)高手了!我再給讀者介紹一點(diǎn)經(jīng)驗和注意事項,就更完美了!


以下是心血經(jīng)驗?。。。。。。。。。?!


 要注意網(wǎng)頁(yè)的編碼。在用Inet控件傳送數據時(shí),直接寫(xiě)就可以(如果沒(méi)有特殊要求的情況下,像QQ密碼,是要加密后再發(fā)送的),但是接受時(shí)要分情況,如果網(wǎng)頁(yè)是UTF-8,就要用UTF-8解析二進(jìn)制數組,這個(gè)函數上邊QQ留言代碼里有。如果是GB2312,就用StrConv("二進(jìn)制數組",VBUnicode)函數來(lái)解析,否則中文亂碼。


 要知道Inet和webbrowser都可以記錄cookic,所以不用你管cookic,造成很大便利??!另外,Inet控件和webbrowser控件的cookic是可以互相使用的,比如你用Inet控件登錄成功,在用同一個(gè)程序里的webbrowser打開(kāi)這個(gè)網(wǎng)站時(shí),也是登錄的狀態(tài),反之亦然。在此我很感謝廊坊師范給了我這次磨練的機會(huì )!為什么?因為我第一次試驗就讓我遇到了沒(méi)有cookie的網(wǎng)站?。?!我可是個(gè)新手?。?!就不能讓我順利的操作一次嘛??對于沒(méi)有cookie的網(wǎng)站,登錄成功后只能GET主頁(yè),如果GET其他的網(wǎng)頁(yè)馬上退出(有cookie的網(wǎng)站直接GET某個(gè)存在的頁(yè)面就可以,不管這個(gè)頁(yè)面在哪),我也想過(guò)用webbrowser登錄,讓它保持對話(huà),然后用Inet進(jìn)行POST,但是行不通,因為根本沒(méi)有cookie,這兩個(gè)控件是聯(lián)系不上的!經(jīng)過(guò)無(wú)數次實(shí)驗,因為網(wǎng)上沒(méi)有這方面的文章,所以只有實(shí)驗!終于成功了!下面講解一下不能GET其他頁(yè)面的原因!我們可以分析,為什么在真實(shí)操作中點(diǎn)擊鏈接是登錄的,而我們模擬GET就是無(wú)效的呢?既然這個(gè)網(wǎng)站沒(méi)有cookie,那么它判斷我們登錄身份的唯一途徑就是判斷來(lái)源頁(yè)面,如果我們憑空而來(lái),直接GET,肯定是被拒絕的!但如果我們在GET的時(shí)候加點(diǎn)參數:在HTTP頭里加上referre:xxx(xxx是指登錄成功的網(wǎng)頁(yè),例子:Inet1.Execute "http://219.243.79.21/(sgaujaimu4mtapazvirdic3g)/xf_xsqxxxk.aspx?xh=09050241066&xm=楊元&gnmkdm=N121203", "GET", , "Referer : http://219.243.79.21/(sgaujaimu4mtapazvirdic3g)/xs_main.aspx?xh=09050241066"),也就是告訴服務(wù)器我是從哪來(lái)的,服務(wù)器發(fā)現你來(lái)自于登錄成功的頁(yè)面,也就證明了你的身份。這個(gè)猜測最好的證明是你把隨便一個(gè)登錄成功的頁(yè)面URL復制到一個(gè)新的瀏覽器窗口的地址欄里,點(diǎn)擊轉到你會(huì )發(fā)現自己已經(jīng)退出登錄了。。所以,要細心分析參數,少了就出錯。。。這個(gè)就要靠多實(shí)踐了。。。


 還有需要注意的是如果你登錄的頁(yè)面有跳轉,也就是有個(gè)中間網(wǎng)頁(yè),像loading什么的,登錄后,不可以直接去POST其他網(wǎng)頁(yè),必須GET一下它自動(dòng)跳轉到的主頁(yè),否則你POST別的網(wǎng)頁(yè)也得不到用戶(hù)信息,得到的只是一個(gè)空架子??赡苁沁@類(lèi)網(wǎng)站必須通過(guò)主頁(yè)加載一個(gè)數據,如果跳過(guò)會(huì )造成登錄成功但沒(méi)有數據的現象。


要注意POST與GET的區別(如果你早就有這個(gè)疑問(wèn)說(shuō)明你是真心學(xué)習了?。?/p>


1、HTTP 只有POST和GET 兩種命令模式;


2、POST是被設計用來(lái)向上放東西的,而GET是被設計用來(lái)從服務(wù)器取東西的,GET也能夠向服務(wù)器傳送較少的數據,而Get之所以也能傳送數據,只是用來(lái)設計告訴服務(wù)器,你到底需要什么樣的數據.POST的信息作為HTTP 請求的內容,而GET是在HTTP 頭部傳輸的;所以GET可見(jiàn)但不安全,POST不可見(jiàn),安全!


3、POST與GET在HTTP 中傳送的方式不同,GET的參數是在HTTP 的頭部傳送的,而Post的數據則是在HTTP 請求的內容里傳送;


4、POST傳輸數據時(shí),不需要在URL中顯示出來(lái),而GET方法要在URL中顯示;


5、GET方法由于受到URL長(cháng)度的限制,只能傳遞大約1024字節;POST傳輸的數據量大,可以達到2M,而根據微軟方面的說(shuō)法,微軟對用 Request.Form() 可接收的最大數據有限制,IIS 4 中為 80 KB 字節,IIS 5 中為 100 KB 字節;


6、SOAP是依賴(lài)于HTTP POST模式實(shí)現的;


其實(shí)這個(gè)經(jīng)驗就與本文無(wú)關(guān)了,不知道大家有沒(méi)有注意那個(gè)QQ留言的源碼里用到了Scriptcontrol控件(控件具體用法說(shuō)明下載),這個(gè)控件是用來(lái)在VB運行腳本的,有什么用捏?很有用!比如你在登錄一個(gè)網(wǎng)頁(yè)時(shí),人家要求傳送的密碼用他們的算法加密,但是你哪有這個(gè)算法啊。。。。。。別急,去他們網(wǎng)頁(yè)的JS腳本里邊去找這個(gè)算法,然后復制到VB中,把代碼賦給Scriptcontrol控件就可以運行加密了。


好了,到這里你就畢業(yè)了!


上一篇:想要在百度上有個(gè)好排名,必須要了解百度排名算法
下一篇:css中@media和@media screen和@media only screen用法做用區別
(作者:佚名 編輯:admin)

新文章

門(mén)文章

野性狂欢大派对AV片_亚洲va欧美va_亚洲 国产 最新_国产999在线视频观看