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