VB網(wǎng)絡(luò)編程(webbrowser+Inet+抓包封包+經(jīng)驗)
當(dāng)前位置:點(diǎn)晴教程→知識管理交流
→『 技術(shù)文檔交流 』
網(wǎng)絡(luò)的重要性不用我說,所以關(guān)于網(wǎng)絡(luò)的編程對我我們來說也是非常重要,非常實(shí)用的! 但是我在網(wǎng)絡(luò)上卻沒有看到多少關(guān)于VB網(wǎng)絡(luò)編程方面的知識,一方面是VB用的人比較少,不會用就說VB不好(個人認(rèn)為學(xué)好VB以后C++、Java一看就會?。?;另一方面是大家不愿意公開這方面的知識,自己辛辛苦苦探索的,還得靠它吃飯,怎么可能輕易拿出來公布?但是社會要發(fā)展,人類要進(jìn)步,為了讓更多的人受益,為了讓體現(xiàn)自己價值,我愿意分享自己對于網(wǎng)絡(luò)編程的經(jīng)驗。我也是剛開始學(xué),所以這篇文章難免有錯誤之處,而且認(rèn)識也相對比較淺顯,只是作為入門級的文章吧! 用VB操作網(wǎng)頁,主要有兩種方法:一是模擬操作,即自動控制。二是POST,也就是發(fā)送消息(數(shù)據(jù)包)。這兩種方式涉及到:Webbrowser控件、Inet控件、XMLHTTP對象。其中,Webbrowser控件主要用來模擬操作,讓機(jī)器自動完成點(diǎn)擊、選中、填寫等操作;Inet控件和XMLHTTP對象主要是用來POST,即發(fā)送數(shù)據(jù)包,在不加載網(wǎng)頁的情況下直接與服務(wù)器交互。下面開始講解它們的應(yīng)用。注:我在這里僅僅討論操作網(wǎng)頁,像聊天、文件傳輸在這不作為重點(diǎn),畢竟這些相對來說還是比較少用的。 webbrowser,這是一個比較基礎(chǔ)的控件,關(guān)于它的學(xué)習(xí)資料,網(wǎng)上還是很多的。用它操作網(wǎng)頁是一種看得見,摸得著的過程,基本的任務(wù)都能完成。經(jīng)過半年的使用經(jīng)驗,總結(jié)一下它不能完成的任務(wù):1.不能操作JS腳本。如果你操作的網(wǎng)頁內(nèi)容被放在了JS腳本里,那么就不要用這個控件了。2.不能點(diǎn)擊Flash按鈕。Flash按鈕比在網(wǎng)頁中較特殊,用webbrowser控件無法找到這個對象。我所遇到的就是這兩條,當(dāng)然肯定還有別的。下面通過一個萬能代碼來看一下這個控件: 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)擊就用這個語句 WebBrowser1.Document.All(lngIndex).Checked = True '如果是模擬選中復(fù)選框,就用這個語句 Exit For End If End If Next 用這個代碼,可以靈活的模擬:點(diǎn)擊按鈕、點(diǎn)擊超鏈接、操作復(fù)選框、操作下拉式菜單、填寫數(shù)據(jù)。這個代碼大概的意思:最外層循環(huán)遍歷整個網(wǎng)頁中的標(biāo)簽對象,然后用第二個循環(huán)去匹配這個對象中是否有我們期望的關(guān)鍵字,如果有的話,再判斷這個標(biāo)簽對象的類型,一般情況下,超鏈接是A,其他的均為INPUT,注意一下一定要大寫,因為從webbrowser中獲取的網(wǎng)頁源碼全是大寫的,與真實(shí)源碼有差別。在最里邊也就是操作語句了,如果是文本框輸入就寫成WebBrowser1.Document.All(lngIndex).Text = “期望的字符串”。如果是想點(diǎn)擊按鈕或者超鏈接就用WebBrowser1.Document.All(lngIndex).Click。如果是選中復(fù)選框WebBrowser1.Document.All(lngIndex).Checked = True。如果是下拉式菜單WebBrowser1.Document.All(lngIndex).Value = “對應(yīng)的值”?;镜牟僮骶褪沁@些,輕松勝任。當(dāng)然,用這個萬能代碼是在迫不得已的情況下才用的。如果網(wǎng)頁很簡單,按鈕,輸入框等有ID,那么直接寫WebBrowser1.Document.All(“按鈕的ID”).Click就可以點(diǎn)擊按鈕了,其他同理,輸入ID即可。 在實(shí)際使用中,我們會遇到一個非常頭疼的問題:webbrowser操作網(wǎng)頁必須等待網(wǎng)頁加載完成,否則會找不到標(biāo)簽對象。網(wǎng)上比較流行的做法是用webbrowser的Busy方法等待網(wǎng)頁加載完成,但是根本沒有效果。在此我分享一下自己的經(jīng)驗,想想我們?nèi)耸窃趺磁袛嗑W(wǎng)頁是否加載完成的?因為出現(xiàn)了一些新的信息,因為有變化!我們當(dāng)然也可以讓程序這么去判斷。我們可以在新網(wǎng)頁中找一個固定存在的字符,用while循環(huán)不斷獲取webbrowser的網(wǎng)頁源碼,直到出現(xiàn)這個固定字符,我們就認(rèn)為加載完成。例如,在目的網(wǎng)頁里會出現(xiàn)123這個字符,那么: While Instr(WebBrowser1.Document.All(1).outerhtml,”123”) =0 Doevents Wnd 這樣寫可以很好的達(dá)到等待網(wǎng)頁加載完成的目的。這里WebBrowser1.Document.All(1).outerhtml是webbrowser中所有的標(biāo)簽對象,基本上可以說是獲取網(wǎng)頁源碼。如果用這個語句無法獲取就用WebBrowser1.Document.Body.InnerHtml,最好是用第一個,第二個不保險。順便提一下,WebBrowser1.Document.All(1).outerhtml是獲取網(wǎng)頁源碼,如果我們不想要源碼,而想要網(wǎng)頁內(nèi)容,即瀏覽器展示給我的文字,可以用:WebBrowser1.Document.body.innertext。 還有一個問題就是有些網(wǎng)站點(diǎn)擊鏈接時會在新的窗口中打開,這時候webbrowser會調(diào)用IE瀏覽器,導(dǎo)致網(wǎng)頁跳出程序,那么可以用下面的代碼處理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是窗體名稱,要根據(jù)你的實(shí)際情況修改。 另外,注意一下Silent屬性,把它設(shè)為Ture,防止彈出一些腳本錯誤的提示。 好了,說到這這個控件也就沒什么了。常用的都說了,一些注意的問題也說了,其他的就要靠大家自己努力了!多練?。?/span>參考資料:webbrowser控件屬性、方法大全。) Inet控件。相信大家已經(jīng)體會到了Webbrowser的不足之處:慢!因為它要等待網(wǎng)頁加載完成,每一個圖片,每一個腳本都要加載出來,不僅數(shù)據(jù)量大,而且造成速度太慢,簡單的例子,如果要暴力破解密碼,顯然webbrowser是不可以的!。Inet控件的POST功能恰好彌補(bǔ)了這個缺點(diǎn)。POST是直接以數(shù)據(jù)包的形式,直接與服務(wù)器對話,比如你想登陸QQ空間,根本不用過去打開那個網(wǎng)頁,直接POST給QQ服務(wù)器登錄數(shù)據(jù),符合條件就登錄成功,就可以進(jìn)行下一步操作了。這些操作由于都是在無形之中的,所以難度比webbrowser控件大。我不清楚讀這篇文章的人是什么水平,由于這個涉及的知識太多太雜,繼續(xù)往下看之前你必須先學(xué)會抓包工具HTTPWATCH的使用(點(diǎn)擊下載教程以及軟件)。如果你對這個軟件有所了解,就可以進(jìn)入下一步了!我再次說明,關(guān)于封包發(fā)包這部分知識很亂很雜,你只要跟著我走,不會的就停下來多花點(diǎn)功夫,暫時不懂也沒事,等你把我這篇文章看完了我保你會!
什么是數(shù)據(jù)包? 數(shù)據(jù)包,又稱作封包。簡單的說,你上網(wǎng)打開網(wǎng)頁,這個簡單的動作,就是你先發(fā)送數(shù)據(jù)包給網(wǎng)站,它接收到了之后,根據(jù)你發(fā)送的數(shù)據(jù)包的IP地址,返回給你網(wǎng)頁的數(shù)據(jù)包,也就是說,網(wǎng)頁的瀏覽,實(shí)際上就是數(shù)據(jù)包的交換。以上藍(lán)色部分是百度百科上面對數(shù)據(jù)包的詮釋,有朋友可能看不明白,那么我就順著這個解釋,來舉一個經(jīng)典的“老王借錢”例子: 1、隔壁的老王向你借錢。 2、接收到老王借錢的請求。 3、檢查自己的腰包是否有錢。 4、是借還是不借? 5、把結(jié)果告訴老王。老王就會作出相關(guān)的反應(yīng)(借的話他就爽,不借他當(dāng)然就不爽了~)。 其實(shí)上面只是一個再也簡單不過的借錢行為,不過如果我們把它套用在客戶端與網(wǎng)頁服務(wù)端的通訊流程的話,會發(fā)現(xiàn)其實(shí)兩者有著異曲同工之妙: 1、老王相當(dāng)于客戶端,而借錢也就相當(dāng)于一個請求。錢的數(shù)量,就相當(dāng)于請求中的參數(shù)。老王向你借錢,我們可以把這一步稱為POST,就是把借錢這個請求傳遞給你(服務(wù)端)。 2、你,就相當(dāng)于服務(wù)端,而這個錢,說白了,就是客戶端傳遞過來的參數(shù)。你接到老王發(fā)出的借錢請求,這一步叫做響應(yīng)。 3、檢查自己的腰包是否有錢,就相當(dāng)于服務(wù)器驗證用戶的請求是否合法。比如一個網(wǎng)上支付系統(tǒng),用戶請求要支出1000塊錢,然后用戶就會把1000塊錢這個參數(shù)傳遞到服務(wù)端,服務(wù)端當(dāng)然就得驗證一下用戶的錢包里面是否有1000塊錢,如果有的話就通過,沒有的話當(dāng)然就返回錯誤信息了。這是驗證/校驗數(shù)據(jù)。 4、當(dāng)?shù)谒牟竭^后,如果腰包有錢,而你又情愿借給老王,此時,就相當(dāng)于服務(wù)端給客戶端返回一個信息,是借(True)。反之,就是不借(False)。這一步叫做返回/反饋。 5、老王接到你給他回的信息,就會根據(jù)結(jié)果的不同而產(chǎn)生響應(yīng)的動作。響應(yīng)你動作的這一方法稱為GET。 這樣一來,相信你對服務(wù)端和客戶端的基本通訊過程大家都清楚了。但是,造成這一過程的起源是啥?是錢!我不得不說錢是萬惡的(這也讓我說得通,YY下) 服務(wù)端和客戶端之間首要的通訊條件當(dāng)然就是必須可以聯(lián)網(wǎng)。你說如果老王是死人的話,怎么向你借錢,對吧?不過要是真的有死人向你借錢的話……離我遠(yuǎn)點(diǎn)。其實(shí)這一個“借錢”的過程,錢充當(dāng)著比較重要的角色,一個數(shù)據(jù)包里面包含了很多參數(shù),參數(shù)也會有相應(yīng)的值。而“錢”,在這里就充當(dāng)著一個數(shù)據(jù)包參數(shù)的角色,錢的數(shù)量,就是這個數(shù)據(jù)包參數(shù)的值。 到這里,我們就開始本課題的深究吧,因個人水平有限,文中難免會有不妥之處,歡迎大牛拍磚。 經(jīng)過前面的說明(純屬瞎扯),相信大家對數(shù)據(jù)包也有一個模糊的概念了,當(dāng)然,這只是相對于從未接觸過這一方面內(nèi)容的新手而言。下一章我們來研究一下如何去抓包,并來編寫一個QQ空間的留言工具來完成這一個課題的學(xué)習(xí)。 數(shù)據(jù)包有什么用? 數(shù)據(jù)包的交互是最底層的網(wǎng)絡(luò)協(xié)議通訊,利用數(shù)據(jù)包,我們完全可以模擬客戶機(jī)和服務(wù)端通訊的過程。比如我們需要編寫一個帳號注冊器,如果用傳統(tǒng)的模擬網(wǎng)頁表填寫的方式去實(shí)現(xiàn)的話,這樣雖然比人手工操作的方法要快,但也還需要載入一個網(wǎng)頁,速度還是遜色的。但如果用數(shù)據(jù)包去實(shí)現(xiàn)的話,就相當(dāng)于只把一系列的字符串傳遞到目標(biāo)服務(wù)器即可。載入一個網(wǎng)頁,包含了圖片、表單等元素,大一點(diǎn)的話起碼得要下載幾百KB的數(shù)據(jù),但數(shù)據(jù)包,最多也就幾KB,如果客戶機(jī)和服務(wù)器的網(wǎng)絡(luò)都正常的話,提交數(shù)據(jù)包到服務(wù)器幾乎就是一瞬間的事情。 如何抓包? 相信大家對抓包這個概念并不陌生。從字面上很好理解,抓包就是一個捕獲數(shù)據(jù)包的過程。我們前面說了,客戶機(jī)和網(wǎng)頁服務(wù)器之間的通訊都會產(chǎn)生數(shù)據(jù)包,如果我們想模擬它這個通訊過程的話,就必須要把它們之間通訊所產(chǎn)生的數(shù)據(jù)包捕捉下來,再進(jìn)行分析。 可能大家都聽說過WEP,Sniffer等工具,其實(shí)它們都是抓包工具。但是數(shù)據(jù)包有不同類型,TCP包,通常是軟件所產(chǎn)生的數(shù)據(jù)包,我們玩網(wǎng)絡(luò)游戲的時候和服務(wù)器所產(chǎn)生的就是TCP包。而我們在網(wǎng)頁通訊的時候,所產(chǎn)生的就是HTTP包了。TCP包是以二進(jìn)制的方式進(jìn)行傳輸?shù)?,HTTP卻是以明文的方式進(jìn)行傳輸?shù)摹?/span> 在這個教程中,我們統(tǒng)一使用HTTPWATCH這個軟件來進(jìn)行抓包。 HTTPWATCH 是一個IE插件,也是一個強(qiáng)大的HTTP捕捉工具。 安裝完HTTPWATCH之后,要打開IE瀏覽器,在瀏覽器工具欄處打開才行(第三方瀏覽器諸如 360 都不支持IE插件)。我們先來看看HTTPWATCH的強(qiáng)大界面: HTTPWATCH 界面: ①工具欄 Record:開始監(jiān)聽網(wǎng)頁數(shù)據(jù)包。 Stop:停止監(jiān)聽。 Clear:清空結(jié)果列表。 ②數(shù)據(jù)包監(jiān)聽列表 ③數(shù)據(jù)包詳細(xì)信息 基本信息(Overview):顯示數(shù)據(jù)包的目標(biāo)地址,返回結(jié)果等信息。 時間圖表(Time Chart):顯示數(shù)據(jù)包在通訊狀態(tài)中 連接、等待、接收 的占用時間。 頭信息(Headers):HTTP的基本頭信息。 Cookie:百度百科 緩存(Cache):在本地臨時文件夾暫存的數(shù)據(jù)。 查詢字符串(Query String):表單產(chǎn)生的查詢動作的主要查詢參數(shù)。 傳遞參數(shù)(POST Data):POST數(shù)據(jù)包的主要參數(shù),也就是傳遞到服務(wù)器的參數(shù)。 返回信息(Content):返回的頁面源碼。 數(shù)據(jù)流(Stream):提交到服務(wù)器的數(shù)據(jù)包參數(shù)以及HTTP頭信息。 以上就是HTTPWATCH的大體結(jié)構(gòu)。在打開IE瀏覽器,啟用這個插件之后,點(diǎn)擊“Record”就可以進(jìn)行數(shù)據(jù)包的監(jiān)聽了。在監(jiān)聽狀態(tài)下,你所做的每一步網(wǎng)頁操作都會有相關(guān)的數(shù)據(jù)流動,HTTPWATCH大致上可以抓三種行為: 1.POST行為 2.GET行為 3.CACHE POST大家都很熟悉的了,就是向服務(wù)器傳遞參數(shù)。平時我們提交一個網(wǎng)頁表單的時候,產(chǎn)生的也是POST方法。GET大家也不會陌生,當(dāng)POST完畢之后,服務(wù)器一般都會返回一些信息給用戶,這就是相對于用戶而言的GET。簡單通俗點(diǎn)的話,大家可以把POST理解為上載數(shù)據(jù),把GET理解為下載數(shù)據(jù)。至于CACHE,這個就是緩存操作,直接從本地緩存里面取出來的資源。 在這里我們學(xué)習(xí)的就是POST數(shù)據(jù),我們將會通過一個QQ空間的留言工具來帶大家入門這個課題的內(nèi)容。 首先我們打開http://qz.qq.com,這個是騰訊留給手機(jī)用戶的接口,之前我一直不知道有這個網(wǎng)頁的存在,是XC同學(xué)找到的。這個接口比起標(biāo)準(zhǔn)的QQ空間接口來說,就精簡得多了。那么我們就在這里入手,嘗試著給好友的QQ空間留言,然后抓“留言”這個動作所產(chǎn)生的數(shù)據(jù)包。 眾所周知,如果沒有在網(wǎng)站上登錄自己的QQ,是沒有辦法留言的,因為QQ空間不支持匿名留言。我們進(jìn)入網(wǎng)站的時候,它也會先提示登錄,然后才可以后續(xù)操作。所以,我們?nèi)绻鲞@樣一個留言工具的話,就必須要具備以下步驟: 1.登錄QQ 2.發(fā)送數(shù)據(jù)包 3.取得返回信息 QQ的登錄數(shù)據(jù)包我在這里就不演示抓包了,因為騰訊已經(jīng)改了新的登錄接口,但是舊的還能用,我這里還是用舊的QQ登錄數(shù)據(jù)包。在此之前,我們先來給好友的QQ空間留言,抓包,我在有錢哥的空間里面留言“測試測試”,大家可以看到,列表中就產(chǎn)生看一個新的項目。其Method屬性就是POST!這就是傳遞到QQ空間服務(wù)器的數(shù)據(jù)包了,大家可以看看紅色框框的內(nèi)容,是不是覺得很熟悉? con=%E6%B5%8B%E8%AF%95%E6%B5%8B%E8%AF%95%7E%7E&uin=298096110&suin=542464221 沒錯,這紅色字體部分就是傳說中的HTTP數(shù)據(jù)包! 大家可以看看,這個數(shù)據(jù)包里面只有三個參數(shù),分別是con,uin,suin,這三個參數(shù)一眼看上去就很容易知道它的意思了,我們分析數(shù)據(jù)包的時候一般都是根據(jù)其參數(shù)名稱的字面意思以及參數(shù)的值來判斷這是一個什么樣的參數(shù)。 我剛才在比你·有錢的QQ空間留言了,我的QQ就是542464221,而有錢的QQ是298096110。除此之外,還有一個最重要的參數(shù),那就是con,這也是我們留言的內(nèi)容!大家可能會奇怪,上面的留言內(nèi)容不是“測試測試~~”嗎?怎么現(xiàn)在看著變成了一堆亂碼? 其實(shí)這不是亂碼,而是網(wǎng)頁編碼。至于轉(zhuǎn)換的方法,我們會在下面講到。 相信大家都懂得抓包了,自己多實(shí)踐幾次,你也可以找一些網(wǎng)站上的注冊頁面,自己嘗試著注冊一個帳號,然后提交一個表單,抓包看看,嘗試著去分析一個數(shù)據(jù)包,弄清楚各個參數(shù)的意思。 如何發(fā)送數(shù)據(jù)包? 這一節(jié)是本教程的核心部分。既然我們已經(jīng)捕捉到了QQ空間留言的數(shù)據(jù)包,那么我們完全可以模擬這個過程了。VB對于網(wǎng)絡(luò)的操控性能還是很不錯的。在VB中封裝了inet,winsock等控件,可以很輕松的調(diào)用各種方法去發(fā)HTTP數(shù)據(jù)包。在本教程例子當(dāng)中,我們用inet作為例子去講解一下如何發(fā)送數(shù)據(jù)包。 我們先來看看Inet的execute方法 : InetObject.Execute "[POST頁面URL]", "POST", "要發(fā)送的數(shù)據(jù)包內(nèi)容", "封包頭信息" 我們在發(fā)送數(shù)據(jù)包的時候需要注意,一個完整的數(shù)據(jù)包,應(yīng)該是由報頭和封包內(nèi)容組成的。比如上面我們抓出來的數(shù)據(jù)包之中: 這是數(shù)據(jù)包內(nèi)容: con=%E6%B5%8B%E8%AF%95%E6%B5%8B%E8%AF%95%7E%7E&uin=298096110&suin=542464221 這是數(shù)據(jù)包頭信息: 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 一般來說,我們在inet之中并不需要把數(shù)據(jù)包的所有頭信息都附加進(jìn)去。不過有一句是肯定要的,那就是: Content-Type: application/x-www-form-urlencoded 這指定了數(shù)據(jù)包網(wǎng)頁所支持的類型。如果是在winsock里面的話,則需要附帶所有的頭信息。頭信息指定了一個數(shù)據(jù)包的屬性等信息。通過上面的頭信息,相信大家也可以獲悉很多內(nèi)容。 我們再回到上面一小節(jié)所提到的問題,數(shù)據(jù)包里面的con參數(shù)為什么是經(jīng)過轉(zhuǎn)換了的字符?因為我們在訪問一個網(wǎng)頁,或者在HTTP數(shù)據(jù)傳輸?shù)臅r候,服務(wù)器并不能直接識別中文字符,因此需要轉(zhuǎn)換。不同編碼方式的轉(zhuǎn)換方式也有不同。 QQ空間留言工具的例程我已經(jīng)寫好了,里面的注釋很詳細(xì),我在這里就不多說了。大家下載例子看看就一目了然。這個例子真的注釋很詳細(xì),一看就會?。?a target="_blank">點(diǎn)擊下載QQ留言工具) 好了,看到這相信你對抓包、封包已經(jīng)有了一定了解,并且躍躍欲試了!上邊的例子是來源于網(wǎng)絡(luò)的,那個留言工具的代碼也比較復(fù)雜,為了讓讀者更加清晰,我再舉一個例子,簡化一下代碼。 我就拿網(wǎng)易開刀吧!登錄網(wǎng)易博客!首先打開我的網(wǎng)易博客,然后點(diǎn)擊登錄,再點(diǎn)擊HTTPWATCH的Record,輸完帳號密碼,點(diǎn)擊登錄,可愛的小包包都被我們抓到了,下面是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等等,所以就直接看這個了! 我們看到Content-Type: application/x-www-form-urlencoded,這是個必要的頭信息,告訴服務(wù)器怎么解碼。在VB中寫對應(yīng)的:Const POST_HEADER = "CONTENT-TYPE:application/x-www-form-urlencoded"。然后我們?nèi)フ襊OST地址: 在這個POST信息最后是地址,在VB中寫:Const POST_URL = "https://reg.163.com/logins.jsp"。在流的最下邊就是POSTDATA,當(dāng)然去POSTDATA選項卡看更加清晰!讓我們來看看,都有什么。。。其中有一個&url=http%3A%2F%2Fblog.163.com%2FloginGate.do%3Ftarget%3Dhttp%253A%252F%252Fyangyuankp.blog.163.com%252F%26blogActivation%3Dtrue,這個一看就不是必要信息,舍去?。。?!其他的可不能省,都是密碼,帳號,類型之類的,省了肯定出錯。在VB中寫:POST_DATA = “password=123456&type=1&product=blog&savelogin=0&username=18932624147@163.com”這樣是不是很清晰啊(參數(shù)直間用&連接)。。。萬事具備只欠POST了!我們寫Inet1.Execute POST_URL, "POST", POST_DATA, POST_HEADER。然后等待數(shù)據(jù)接收完畢 Do While Inet1.StillExecuting DoEvents Loop 完成之后獲取登錄后的主頁 Inet1.Execute "http://yangyuankp.blog.163.com/", "GET" 再等待。。。 Do While Inet1.StillExecuting DoEvents Loop 獲取二進(jìn)制數(shù)據(jù),給字節(jié)數(shù)組 BinBuff() = Inet1.GetChunk(0, icByteArray) 解析為Unicode 并在text中顯示: Text1.Text = StrConv(BinBuff(), vbUnicode) 大工造成!這是我們會在text中看到登錄成功的源碼。。。是不是很簡單????有沒有自豪感??是不是感覺自己會了很多東西?? XMLHTTP用法大同小異,在此就不多說了。(點(diǎn)擊下載參考資料以及XMLHTTPQQ申請器源碼) 看到這,相信你也算一個高手了!我再給讀者介紹一點(diǎn)經(jīng)驗和注意事項,就更完美了! 以下是心血經(jīng)驗?。。。。。。。。。?! 要注意網(wǎng)頁的編碼。在用Inet控件傳送數(shù)據(jù)時,直接寫就可以(如果沒有特殊要求的情況下,像QQ密碼,是要加密后再發(fā)送的),但是接受時要分情況,如果網(wǎng)頁是UTF-8,就要用UTF-8解析二進(jìn)制數(shù)組,這個函數(shù)上邊QQ留言代碼里有。如果是GB2312,就用StrConv(“二進(jìn)制數(shù)組”,VBUnicode)函數(shù)來解析,否則中文亂碼。 要知道Inet和webbrowser都可以記錄cookic,所以不用你管cookic,造成很大便利??!另外,Inet控件和webbrowser控件的cookic是可以互相使用的,比如你用Inet控件登錄成功,在用同一個程序里的webbrowser打開這個網(wǎng)站時,也是登錄的狀態(tài),反之亦然。在此我很感謝廊坊師范給了我這次磨練的機(jī)會!為什么?因為我第一次試驗就讓我遇到了沒有cookie的網(wǎng)站?。。∥铱墒莻€新手?。?!就不能讓我順利的操作一次嘛??對于沒有cookie的網(wǎng)站,登錄成功后只能GET主頁,如果GET其他的網(wǎng)頁馬上退出(有cookie的網(wǎng)站直接GET某個存在的頁面就可以,不管這個頁面在哪),我也想過用webbrowser登錄,讓它保持對話,然后用Inet進(jìn)行POST,但是行不通,因為根本沒有cookie,這兩個控件是聯(lián)系不上的!經(jīng)過無數(shù)次實(shí)驗,因為網(wǎng)上沒有這方面的文章,所以只有實(shí)驗!終于成功了!下面講解一下不能GET其他頁面的原因!我們可以分析,為什么在真實(shí)操作中點(diǎn)擊鏈接是登錄的,而我們模擬GET就是無效的呢?既然這個網(wǎng)站沒有cookie,那么它判斷我們登錄身份的唯一途徑就是判斷來源頁面,如果我們憑空而來,直接GET,肯定是被拒絕的!但如果我們在GET的時候加點(diǎn)參數(shù):在HTTP頭里加上referre:xxx(xxx是指登錄成功的網(wǎng)頁,例子:Inet1.Execute "http://219.243.79.21/(sgaujaimu4mtapazvirdic3g)/xf_xsqxxxk.aspx?xh=09050241066&xm=楊元&gnmkdm=N121203", "GET", , "Referer : 還有需要注意的是如果你登錄的頁面有跳轉(zhuǎn),也就是有個中間網(wǎng)頁,像loading什么的,登錄后,不可以直接去POST其他網(wǎng)頁,必須GET一下它自動跳轉(zhuǎn)到的主頁,否則你POST別的網(wǎng)頁也得不到用戶信息,得到的只是一個空架子??赡苁沁@類網(wǎng)站必須通過主頁加載一個數(shù)據(jù),如果跳過會造成登錄成功但沒有數(shù)據(jù)的現(xiàn)象。 要注意POST與GET的區(qū)別(如果你早就有這個疑問說明你是真心學(xué)習(xí)了?。?/span> 1、HTTP 只有POST和GET 兩種命令模式; 2、POST是被設(shè)計用來向上放東西的,而GET是被設(shè)計用來從服務(wù)器取東西的,GET也能夠向服務(wù)器傳送較少的數(shù)據(jù),而Get之所以也能傳送數(shù)據(jù),只是用來設(shè)計告訴服務(wù)器,你到底需要什么樣的數(shù)據(jù).POST的信息作為HTTP 請求的內(nèi)容,而GET是在HTTP 頭部傳輸?shù)模凰訥ET可見但不安全,POST不可見,安全! 3、POST與GET在HTTP 中傳送的方式不同,GET的參數(shù)是在HTTP 的頭部傳送的,而Post的數(shù)據(jù)則是在HTTP 請求的內(nèi)容里傳送; 4、POST傳輸數(shù)據(jù)時,不需要在URL中顯示出來,而GET方法要在URL中顯示; 5、GET方法由于受到URL長度的限制,只能傳遞大約1024字節(jié);POST傳輸?shù)臄?shù)據(jù)量大,可以達(dá)到2M,而根據(jù)微軟方面的說法,微軟對用 Request.Form() 可接收的最大數(shù)據(jù)有限制,IIS 4 中為 80 KB 字節(jié),IIS 5 中為 100 KB 字節(jié); 6、SOAP是依賴于HTTP POST模式實(shí)現(xiàn)的; 其實(shí)這個經(jīng)驗就與本文無關(guān)了,不知道大家有沒有注意那個QQ留言的源碼里用到了Scriptcontrol控件(控件具體用法說明下載),這個控件是用來在VB運(yùn)行腳本的,有什么用捏?很有用!比如你在登錄一個網(wǎng)頁時,人家要求傳送的密碼用他們的算法加密,但是你哪有這個算法啊。。。。。。別急,去他們網(wǎng)頁的JS腳本里邊去找這個算法,然后復(fù)制到VB中,把代碼賦給Scriptcontrol控件就可以運(yùn)行加密了。 好了,寫了這么多。。。。。。真是累啊。。。。。能不能學(xué)會,還是在于你自己!努力吧!為了祖國美好的明天!為了社會的進(jìn)步!加油! 該文章在 2015/8/4 23:38:24 編輯過 |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |