分享

掌控POST(4)

 ipilipala 2016-06-14
 本帖最後由 michael3636 於 2015-5-1 04:55 編輯

Part 4




讓我們繼續我們的征途,相信每一個仔細看完前三篇文章的人.都對XHR對象都有了一定的認識,而不是像以前使用那樣照搬照寫,壓根不知道為啥這麼寫.好了廢話不多說了,進入正題,老規矩,先來點相關知識墊墊底:




  • 網頁上的時間: 玩網頁的時候,我們一般會碰上2種形式的時間:

  • Thu, 30 Apr 2015 12:05:28 GMT :這種類型的,這是個js格式的時間顯示模式,一般出現在服務器的返回頭部,雖然平時不常見,但是我們一看就能認識,處理也簡單,用Mid() Cdate() 函數我們就能很好的得到我們常用的vbs時間格式
  • 時間戳: 一般出現在"POST"的請求內容或者"GET"的查詢字符串裡,一般看到一串很長的以"14"開頭的數字,我們就得考慮它是否代表時間,其實就是時間的純數字表現形式:定義是從1970年1月1日0點到目前為止的秒數,它包含了年/月/日/時/分/秒的所有信息(js的時間格式的本質就是從時間戳數字格式化而來的),根據定義我們很簡單的就能用按鍵寫出我們按鍵版的時間戳:
  1. t = datediff("s", "1970-1-1", now) - 3600 * 8
  2. //我們是8時區的,為了跟服務器時區統一,我們的減去8小時的秒數
複製代碼



好了.進入主題,今天的主題是: 用XHR登陸賬號(3種方法)

注意:本章節只說英文數字類的賬號密碼.不涉及中文或其他字符,因為這涉及到字符編碼問題,是個大話題,不是幾句話能講完的,我會在以後專門講到


  • POST方式(本質是拷貝瀏覽器的登陸方式)

  • 我們打開火狐,進入按鍵綜合論壇版塊"http://bbs./forum.php?mod=forumdisplay&fid=17",如果賬號已經登陸,請先退出賬號.填好我們的賬號和密碼,然後打開firebug.如圖1然後,點一下清除按鈕,確保firebug很乾淨,然後按下登陸按鈕,等待網頁載入完成.
  • 我了個去..firebug裡好大一坨,呵呵呵,不用管,拉到最上面,有一個"[新]綜合討論"文字,前面還有"+",點開這個"+",圖2
  • 現在我把我們需要用到的內容摘入如下:


以下為本帖隱藏內容

==============================

頭信息=>來自上傳流的信息:
Content-Length 68
Content-Type application/x-www-form-urlencoded
第一個:我們上傳的內容的長度,由於賬號密碼長度的不一樣,可能我們很多人這個數據是不一樣的,這個具體的數字我們可用用len()函數搞定,具體形式是,len(上傳的內容)
第二個:客戶端要告訴服務器的上傳的內容的類型,上面的意思是,應用類的,通過URL編標的,這個不需要去瞭解很深,到時候照搬就行了,這2個內容XHR是不會自動幫我們加到請求頭去的,所以到時候我們得自己加上去

POST=>源代碼
username=我的賬號&password=我的密碼&quickforward=yes&handlekey=ls
這個相信我們只需要關注裡面的紅字即可

響應:

window.location.href='http://bbs.
/forum.php?mod=forumdisplay&fid=17';]]>

很明顯,這是我們登陸成功後服務器給我的反饋,也就是說,只要我們得到這個反饋.就說明我們登陸成功啦..那麼,登陸失敗的反饋是什麼呢?很簡單啊,退出賬號,故意打錯密碼,然後登陸,我們就能得到登陸失敗的反饋了,這些內容有助於我們判斷是否登陸成功或者除了其他什麼狀況

==============================
心細的朋友估計要說了,這跟瀏覽器的表現對不上啊,瀏覽器登陸成功的話就直接跳回綜合論壇啦,而不是出來這個,為什麼呢?其實很簡單,這是XML封裝的一行js代碼,瀏覽器得到這段文本後執行了這段代碼,這段代碼的意思是,讓瀏覽器當前窗口轉到網址"http://bbs.
/forum.php?mod=forumdisplay&fid=17",這不就是綜合論壇的網址麼.而這些代碼的執行,都是在後台的,我們是看不到的..這不就跟我們看到的實際情況對上號了麼...

對了,還差一個.那就是POST方式提交內容的目標網址:
很簡單的操作,把我們的鼠標放到firebug的目標URL上,按下右鍵,點擊複製網址,我們就得到目標網址了,如下:
http://bbs./member.php ... submit=yes&inajax=1

好了,我們需要的消息都得到了.接下來可以寫代碼了,咋寫?很簡單啊..剛學嘛..傻瓜式複製,瀏覽器腫麼做我們就怎麼寫:

  • 去按鍵綜合論壇,綜合之前學到的知識,我們知道這個應該是"GET"方式
  • 用POST方式登錄
  • 瀏覽器成功後回到綜合論壇了,XHR可不會執行代碼..我們手動去唄,"GET"方式,


開寫,如下:
  1. //第一步:GET方式去綜合版塊
  2. Set http = CreateObject("WinHttp.WinHttpRequest.5.1")//創建XHR對象
  3. URL="http://bbs./forum.php?mod=forumdisplay&fid=17"
  4. http.open "GET", URL, false
  5. http.send
  6. If Not isEmpty(http.responsetext) Then
  7. MessageBox "第1步成功!!!"
  8. Else MessageBox "第1步失敗失敗"
  9. End If


  10. //第二步:POST方式登錄
  11. URL = "http://bbs./member.php?mod=logging&action=login&loginsubmit=yes&infloat=yes&lssubmit=yes&inajax=1"
  12. str = "username=Mic_test&password=password1&quickforward=yes&handlekey=ls"
  13. //上面的str是我們要發送的內容,其中:mic_test是賬號,大家可以換成自己的,password1是密碼,大家可以換成自己的
  14. http.open "POST", URL, False
  15. http.setrequestheader "Content-Type","application/x-www-form-urlencoded" //加上2個header
  16. http.setrequestheader "Content-Length",len(str) //用函數取字符串長度
  17. http.send str//發送請求,帶著內容
  18. If Not isEmpty(http.responsetext) Then
  19. MessageBox http.responsetext //看看返回的內容是不是對得上
  20. Else MessageBox "第2步失敗失敗"
  21. End If


  22. //第三步:瀏覽器會自動去,我們...手動去,,
  23. URL="http://bbs./forum.php?mod=forumdisplay&fid=17"
  24. http.open "GET", URL, false
  25. http.send
  26. If Not isEmpty(http.responsetext) Then
  27. MessageBox "第3步成功!!!,扔進剪貼板"
  28. Plugin.Sys.SetCLB http.responsetext
  29. Else MessageBox "第1步失敗失敗"
  30. End If
複製代碼
啊哈.....看看剪貼板的內容,圖3,成功啦....


等等,問題來了

  • 為啥我得到返回值:

window.location.href='http://bbs././';]]>
跟上面的對不上?雖然差不多但是有區別啊....
贊一下,兄弟或者姐們,你真細心,其實很好解釋的,因為這個對象它的提交header裡默認是不帶"referer"項目的,就是我們在之前說到的來源的,也就是說,這個對象它是不會主公告訴服務器我是從哪個網頁來的,呵呵呵.牛吧..要跟上面一樣也簡單啊.在第二步設置header的地方加一句代碼:
http.setrequestheader "Referer","http://bbs./forum.php?mod=forumdisplay&fid=17"
然後再執行.這次是不是對上號了?,當然這是題外話,我們只要成功就行了,至於返回值具體是什麼內容不重要不是麼?在實際應用中這句代碼是多餘的,但是從這我們知道了一個這個對象的特性,它的請求header是不帶"referer"的,假若我們需要的話,我們可以隨意添加進行來源冒充,多好啊......



進一步思考:
瀏覽器去網頁沒辦法.不然沒法用登陸界面去登陸賬號,XHR沒這問題,是不是可以省了第一步呢?很簡單啊..既然有這想法.市實驗下就行了,把第一部分註釋掉,記得創建XHR哪行代碼別註釋掉啊.........我們再調試,代碼就不貼了.
啊哈...成功啦..我們不需要第一步啦...是啊是啊..萬事貴在嘗試嘛......XHR的優點就開始凸顯了不是麼?雖然寫起來麻煩點不直觀,但是就效率而言,是瀏覽器所根本無法比擬的,多好的技術啊..

2."GET"方式


以下為本帖隱藏內容

==============================

在 Part 2 我講到過很多時候"GET"和"POST" 可以互轉的,我們能否用"GET"登陸呢?這還不簡單.能不能的試試不就知道了麼,
截取上面的POST方式的 地址和內容:
提交地址是: http://bbs./member.php ... submit=yes&inajax=1
提交內容是: username=我的賬號&password=我的密碼&quickforward=yes&handlekey=ls
照葫蘆畫瓢我們把內容接到地址裡去,看代碼:

==============================
  1. //"GET"登陸
  2. Set http = CreateObject("WinHttp.WinHttpRequest.5.1")//創建XHR對象
  3. //原來的地址
  4. URLold = "http://bbs./member.php?mod=logging&action=login&loginsubmit=yes&infloat=yes&lssubmit=yes&inajax=1"
  5. //原來的請求內容
  6. str = "username=Mic_test&password=password1&quickforward=yes&handlekey=ls"
  7. URL=URLold & "&" & str //把2者連起來,看格式可以知道每個參數是用"&",連接的,所以我們再 2者之間加個"&"
  8. //上面的str是我們要發送的內容,其中:mic_test是賬號,大家可以換成自己的,password1是密碼,大家可以換成自己的
  9. http.open "GET", URL, False
  10. http.send //發送請求,"get"不需要內容,而且不需要設置header 多方便啊.保佑成功啊....
  11. If Not isEmpty(http.responsetext) Then
  12. MessageBox http.responsetext //看看返回的內容是否登陸成功了...
  13. Else MessageBox "失敗"
  14. End If


  15. //去網址再次確認看看是不是真的登陸了
  16. URL="http://bbs./forum.php?mod=forumdisplay&fid=17"
  17. http.open "GET", URL, false
  18. http.send
  19. If Not isEmpty(http.responsetext) Then
  20. MessageBox "成功!!!,扔進剪貼板"
  21. Plugin.Sys.SetCLB http.responsetext
  22. Else MessageBox "失敗"
  23. End If
複製代碼
哈哈哈,激動吧.事實證明你成功了,,,,呵呵呵

需要著重說明的是:這個方式是否可以登錄得看服務器短校本代碼是腫麼寫的,你在按鍵成功了不代表你在任何地方能成功,所以得學會嘗試和實踐!!!!

3."Cookie"方式(登錄都省了,帶著cookie直接訪問網頁去!!!!)


以下為本帖隱藏內容

==============================

按鍵論壇登錄裡有個自動登陸的複選框,相信很多人都隨手點了,派啥用的呢,,,很簡單啊,,你選了.明天一覺醒來來按鍵論壇,你就不用登陸啦,,直接就是在線狀態,為啥啊,綜合我們前面所知道的知識不難推測,cookie是服務器唯一可以讓瀏覽器保存在硬盤裡的東西,瀏覽器能保證是登陸狀態,肯定是cookie搞的鬼,事實也能證明這一點,我們清理下cookie的話...開了瀏覽器,按鍵又問我們要賬號密碼了....那要是我們的XHR帶了cookie去瀏覽網頁的話.會不會?,,,恭喜你,答案是,當然會.現在,就讓我們一步一步見證奇蹟吧:
先瞭解下cookie:
cookie是服務器唯一可以放在我們硬盤裡的信息,它是文本(當然是加密的),cookie只有服務器能改變(無恥的js代碼不算),服務器發佈命令,瀏覽器執行命令,從而達到服務器控制cookie的目的.
cookie分2種,一種是放在硬盤的,一種是放在內存的,放在內存的,瀏覽器一關就消失啦
cookie是會過期的,過了保質期的cookie瀏覽器會自動刪除的
cookie是鍵值對儲存的:格式是 鍵(項目)=值 ,每一個鍵值之間是用";"分割的
cookie的鍵名是唯一的,通一個網站的cookie裡不可能同時存在兩個a,值是可以改變的,瀏覽器裡 a=5,當某個時候服務器帶來新的a=6的時候,瀏覽器裡的a就會更新為6
服務器是文明的:它在返回頭裡用"SetCookie"來設定每個cookie的鍵值,一個"SetCookie"對應一個鍵值,瀏覽器是粗魯的,他們發送header的是說是用"Cookie",一股腦把所有的鍵值用";"分割扔給服務器

在XHR對象裡(哪個小弟不算啊,,,,,切記),cookie總是在內存的,xhr對象會自動的維護cookie,如果我們需要,我們是可以隨意讓XHR在請求的時候帶上我們想讓它帶的cookie.但是我們無法把cookie放到XHR對象裡面,也就是說:我們需要XHR每次請求都帶上我們需要帶的cookie,我們只能無奈的每次都是用指令添加cookie,而不是這次添了以後,之後的每次都不用管了

==============================
詳細看cookie:

  • 服務器給瀏覽器的cookie:例子
Set-Cookieg :UmJ_2132_lastact=1430424271%09forum.py; expires=Fri, 01-May-2015 20:04:31 GMT; path=/

UmJ_2132_lastact : cookie的鍵(項目的名稱)
1430424271%09forum.py : 對應鍵的值

後面的是針對這條cookie鍵的設置:
expires : 設定這個鍵的過期時間,過了這個點瀏覽器就會刪除這個cookie鍵值,如果沒有這個設置,cookie不進硬盤,只存在於內存
有時候大家會看到一個很早以前的日期,這其實是服務器讓瀏覽器刪除cookie的方式,也是唯一的方式,把cookie設置為過去,就能刪除cookie鍵值
path: 代表這個鍵的作用域,這個不需要太過瞭解
httpolny: 如果看到這個,說明這個cookie很重要!!!!這個是告訴瀏覽器,這條代碼不許js看到,防止不良代碼竊取敏感信息,嘿嘿嘿,那麼說的話,,,賬號密碼有關的cookie豈不是帶有這個設定?是啊是啊..很有可能啊,
domaim:設定此條cookie鍵值的作用域名,瞭解下即可
關於cookie的屬性設定,大家注意下expires和httpolny屬性即可


準備:
大家打開firebug吧..向之前那樣登陸一次,不過麼,,這次請記得在"自動登陸"上打上鉤,成功後,,來到如圖:找Httpolny相關的屬性
圖4:
很簡單吧,一下就找到4個標識,其中2個沒有過期時間,標識的是"會話"(就是放在內存的意思),肯定不是!!!,好吧..就剩下的有過期時間的2個貨了,,,寫在代碼試試
  1. Set http = CreateObject("WinHttp.WinHttpRequest.5.1")//創建XHR對象
  2. URL="http://bbs./forum.php?mod=forumdisplay&fid=17" //綜合版塊網址
  3. http.open "GET", URL, False
  4. //下面是設置請求頭的Cookie,記住.瀏覽器是粗魯的,把兩條cookie寫在一起就行,只要鍵值,不要設置,cookie之間用";"分隔
  5. http.setrequestheader "Cookie","gUmJ_2132_saltkey=UQZSGyJs;gUmJ_2132_auth=9ec68C%2Bc5BTgrB2VemTNWm6%2B8NrVUZsayPnJaEmnf0WMs9pU4Ymw9cFhvQpilKkX3%2Bo28QVtcRiVP4pLVw1W53QmLTPu;"
  6. http.send //發送請求
  7. If Not isEmpty(http.responsetext) Then
  8. Plugin.Sys.SetCLB http.responsetext //扔進剪貼板,看看返回的內容是否登陸成功了...
  9. Else MessageBox "失敗"
  10. End If
複製代碼
啊哈..成功啦...太無恥了..哈哈哈...只不過大家得切記.用這個方式必須得每次請求都寫上請求頭,至少在按鍵論壇是這樣的!!!

本節完了..下節講如何在又長又亂的源文件裡提起我們需要的信息和字符編碼的問題 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多