kk_lee69 发表于 2011-11-15 23:00:52

IE操作新手专用入门教学 (二) (或者说是心得……POST 跟 GET 的方法)

本帖最后由 kk_lee69 于 2011-11-16 00:16 编辑

一、前言
    先聲明: 這是新手專用的文章....老手就不用看了 呵呵!!
    其實對於AU3 我只是個新手,程式設計我也不會,IE操作是剛好最近工作上有需要才學的,由於學習的過程 跌跌撞撞所以想到,如果可以把自己學習到的心得
分享出來,讓其他新手也知道一些過程跟方法,我想多多少少也可以幫助到別人,這篇文章與其說是教學,不如說是我的一些小小的心得,希望可以給新手解決問題
的方向。這邊必須要先感謝 suiyefeng 兄的幫助.....花了很多時間幫助我 學到不少東西 解決了我的問題......是個好人 必須要給個讚喔!!

P.S 文章中如果有引用到某些朋友發表的語法....請多見諒 教學用而已...至於大名可能會遺漏 多多見諒

二 工具介紹

網上應該有很多可以分析跟偵測 網頁通訊的軟體跟工具....這邊介紹兩種比較常見 或者說方便取得的方式.......
HttpWatchPro 這個應該很多人會用吧!! 不過既然說了這是新手專用的教學....那就是仔細點的慢慢介紹.....軟件取的方式 請問GOOGLE 大神....
安裝完畢後.....開啟HttpWatchPro 然後進入到你想登入的畫面 輸入好資料 在你要按下確認之前.....請先 按下HttpWatchPro 的紀錄按鈕.....然後再按下網頁的登入按鈕....
這時候 HttpWatchPro就會幫你記錄下 跟網站溝通的過程......如下圖



上面紅色圈圈就是應該注意的地方........上面有個URL的地方 就是你應該提交的網址對象......HEADERS 就是傳輸過程的內容,POSTDATA 就是提交的部份.....





從上面的資料裡面 其實都可以發現到 CLINE 端 跟 主機之間每個需要記錄的動作 跟溝通的資料有POST 的有GET的

第二個方式 是 使用IE9 本身內建的功能.........打開你的IE9 到你想要登入的網站畫面 按下 下圖的F12開發者工具....



然後打好想要登入的資料.........然後再開發者工具......選擇網路按下開始擷取.....然後在到 網站案下登入......這樣IE9的工具就會幫你記錄下登入的過程.....



再這裡一樣可以看到 各個動作 跟資料.....有POST也有GET 的過程........提交的資料裡面都有.....






三 程式部份:
既然工具有了 我們需要了解的資料也有了......接下來該要開始寫AU3程式了.......
這裡必須要提到 republican兄的 UDF 了........... http://www.autoitx.com/forum.php?mod=viewthread&tid=18528&highlight=WinHttp%5C_GetRespond
本來這個UDF 我也是看的模模糊糊的....更別提怎麼應用了..... 不過經過了一番折騰 ....終於搞懂了.....先把這個UDF 的資料準備好.....我們就可以開始試看看了.....
下面的範例必須要感謝 suiyefeng 兄的幫助......他寫的出來的範本....

#include <Array.au3>
#include <WinHttp_GetRespond.au3>



$ATXT=UrlEnc("今日特餐") ;將今日特餐 轉為 傳輸的匙後會用到的專屬格式
$user = "A001"
$pwd = "9999"
$X2="http://www.2lwy1a54b.tw:8081/web/41215/1?p_p_id=DscMarquee&p_p_lifecycle=0&p_p_state=maximized&p_p_mode=view&p_p_col_id=column-1&p_p_col_pos=4&p_p_col_count=5&_DscMarquee_struts_action=%2Fdsc%2Fdscmarquee%2Fedit_marquee&_DscMarquee_redirect=%2Fweb%2F41215%2F1&_DscMarquee_marqueeId=84239"
$xiu = "http://www.2lwy1a54b.tw:8081/web/41215/1?p_p_id=DscMarquee&p_p_lifecycle=1&p_p_state=maximized&p_p_mode=view&_DscMarquee_struts_action=%2Fdsc%2Fdscmarquee%2Fedit_marquee"
                ;先連線到 登入的畫面 取的 某些資料下面的語法 其實是 GET 因為 4 + 2 + 16 裡面沒有 1
                $MyOpen=_WinHttpOpen()
                                ;返回值                      句柄                     登入畫面 也就是要提交的網站網址                                                         函數模式定義超時
                $rContext=_WinHTTP_GetRespond($MyOpen,"https://www.2lwy1a54b.tw:8443/cas-web/login?service=http%3A%2F%2Fwww.2lwy1a54b.tw%3A8081%2Fc%2Fportal%2Flogin&",4 + 2 + 16,50000)
                If @error Then
                        MsgBox(0,@error,"出錯了")
                        Exit
                EndIf
               
                $lt = StringRegExp($rContext, 'name="lt" value="(.*)"', 3)
                If Not IsArray($lt) Then
                        Exit
                EndIf
                ;以上 是查詢的 語法 所以你會發現 語法只要這幾個.....後面其他的 參數都可以省略
                               
                               
                ;Post提交資料這個就是要登入了......請注意 POST 語法 會比上面多出幾個參數
                $sPost = "username="&$user&"&passwordX="&$pwd&"&password="&$pwd&"&lt="&$lt&"&_eventId=submit"
                                ;返回值                      句柄                     登入畫面 也就是要提交的網站網址                                                         函數模式定義超時提交內容   COOKIE       傳輸資料的檔頭
                                $rContext=_WinHTTP_GetRespond($MyOpen,"https://www.2lwy1a54b.tw:8443/cas-web/login?service=http%3A%2F%2Fwww.2lwy1a54b.tw%3A8081%2Fc%2Fportal%2Flogin&",1 + 4 + 2, 50000, $sPost ,   -1, "Content-Type: application/x-www-form-urlencoded")
                                If @error Then
                        MsgBox(0,@error,"出錯了")
                        Exit
                EndIf
               
                               
                               
                               
                ;登入成功後會跳轉........以下是 取得跳轉後的資料 方便驗證是不是真的有辦法登入
                $location = StringRegExp($rContext, "Location: (.*)\n", 3)
                If Not IsArray($location) Then
                        MsgBox(64, 0, "用戶名或密碼錯誤")
                        Exit
                EndIf
               
                $rContext=_WinHTTP_GetRespond($MyOpen, $location, 4 + 2 , 50000)
                If @error Then
                        MsgBox(0,@error,"出錯了")
                        Exit
                EndIf
                FileWrite("成功後的網頁.txt", $rContext) ;注意 返回值 是陣列的



                ;跳到需要的頁面; 登入後 打算 轉到某個網頁去更新某些東西
                ;下面的語法是 POST 的標準模式.......請注意 提交的位置資料
                $rContext=_WinHTTP_GetRespond($MyOpen, $xiu,1 + 4 + 2, 50000,"_DscMarquee_marqueeId=84239&_DscMarquee_userId=76937&_DscMarquee_cmd=update&_DscMarquee_redirect=%2Fweb%2F41215%2F1&_DscMarquee_tabs1TabsScroll=&_DscMarquee_title=%E5%95%86%E5%93%81%E5%88%B0%E8%B2%A8%E8%A8%8A%E6%81%AF&_DscMarquee_content="&$ATXT&"&_DscMarquee_startDateYear=2011&_DscMarquee_startDateMonth=10&_DscMarquee_startDateDay=9&_DscMarquee_endDateYear=2013&_DscMarquee_endDateMonth=11&_DscMarquee_endDateDay=9", -1, "Content-Type: application/x-www-form-urlencoded")
                If @error Then
                        MsgBox(0,@error,"獲取失敗")
                        Exit
                EndIf
                _ArrayDisplay($rContext) ;這個 可以看到 POST 後整個返回的資料....很多人問 怎麼確認成功沒有....返回值都會告訴你
                MsgBox(0, "內容", $rContext)
                MsgBox(0, "cookie", $rContext)
                MsgBox(0, "header", $rContext)               
                                FileWrite("頁.txt", $rContext)
               
               

                _WinHttpCloseHandle($MyOpen)


Func UrlEnc($Sz_url)
      Local $str=StringTrimLeft(StringToBinary($Sz_url,4),2)
      Local $ret
      For $i=1 to StringLen($str) Step 2
                $ret &='%' & StringMid($str,$i,2)
      Next
      Return $ret
EndFunc


從上面的範例中 有幾點 必須要拿出來說明的........
首先 請注意到 POST 跟 GET 的語法參數數目不一樣......
GET只要    句柄 , 也就是要提交的網站網址 ,函數模式定義 , 超時時間
POST只要    句柄 , 也就是要提交的網站網址 ,函數模式定義 , 超時時間 , 提交內容 , COOKIE ,傳輸資料的檔頭

重點來了 如果需要某個網頁的資料 其實就是用 GET 的方法.... 只要提交網址....其他的參數照上面的範例打....理論上就可以有返回的值...而返回的網頁資料
就放在$rContext,如果網頁會自動跳轉....上面的範例一樣有取得跳轉的 語法.........
至於 如果需要提交登入的 也就是 POST 就需要 句柄 , 也就是要提交的網站網址 ,函數模式定義 , 超時時間 , 提交內容 , COOKIE ,傳輸資料的檔頭
這幾個參數了. 其中絕大部分的參數 請參照上面語法範例裡面的.... 需要特別說明的是.................

要提交的網站網址===>請注意提交網址的正確性...一般來說 登入畫面的網址不會錯誤....不過 上面的範例來說我是還跑到某個地方 去更新的某些資料 .....
                                 在這邊 遇到了不少麻煩....因為我ㄧ開始都是用$X2 這個變數裡面的網址去提交.....所以怎麼測試 都過不了,無法更新....後來才發現
                     網址錯誤... 應該是要用$XIU 這個變數裡面的網址 才是正確的......

提交內容 ====>這個資料在工具介紹裡面都寫的很清楚的可以找的到資料.....需要用那些工具去看....當然成是有分寫活的 跟寫死的, 活的通常是需要
                  先GET   然後從GET裡面的返回值得到需要的資料....然後再去POST 如同上面範例第一段登入畫面的時候寫法.....可是我是比較偷懶....
                           反正先求有.... 在求好....上面範例最後一段的資料....我就是把利用工具查詢到的   資料直接 輸入在提交的內容..........

COOKIE ===>這個比較特別.....我上面的範例都沒有用到....不知道是不是我網站的關係.....不過發現一個重點....譬如說登入畫面那段程式的語法...
                         其實GET的時候所得到的COOKIE 是 -1   這個可以由返回值查詢的到,所以POST的時候也是用-1,不然也可以試著把上面工具查詢
               的到的COOKIE 輸入看看

傳輸資料的檔頭 ===>其實如果從工具裡面看...傳輸的檔頭資料 其實很多 ,不過 在POST的時候 那些大概都可以省略....只要填入這個即可
                      "Content-Type: application/x-www-form-urlencoded"

希望上面的 一些心得 可以幫助新手......說了這是新手專用的教學.....說的淺 或者有說錯的老手別見怪.....歡迎大家一起來討論.....如果覺得這篇文章對您有幫助....也請別忘了給個鼓勵感謝^^

lpxx 发表于 2011-11-16 00:21:14

台湾的朋友?

kk_lee69 发表于 2011-11-16 00:25:57

呵呵 是呀....因為要打很多字就懶的轉成簡體了

bdancerlc 发表于 2011-11-16 01:34:24

写得不错,谢谢分享!...

newuser 发表于 2011-11-16 08:31:29

回复 1# kk_lee69
找到了,呵呵!以后多发这样的教程啊!

兔子先生 发表于 2011-11-16 11:39:21

找到了。这样的话是可以作成批量什么注册还有什么刷票什么的?

haodd 发表于 2011-11-16 14:03:31

很好 也很强大 谢谢分享

绿色风 发表于 2011-11-16 14:12:27

回复 6# 兔子先生


    面对有验证码的,始终中是个伤

weineng 发表于 2011-11-16 21:51:06

这个贴子标志着本论坛新手水平的整体提高!

qqgghh1 发表于 2011-11-17 09:38:44

LZ很辛苦,半夜了还在发帖。而且看上去不错哦,多谢!

redmoon0421 发表于 2011-11-17 16:42:22

受益匪浅,谢谢了,我等新手就需要这方面的东东!

chinaxx 发表于 2011-11-18 14:55:47

非常好的东西

masterpcc 发表于 2011-11-19 11:32:34

受益匪浅,谢谢分享!...

微笑炸弹 发表于 2011-11-20 14:06:18

比新手还新的我,先路过吧

都市浪子666 发表于 2011-11-20 23:06:54

很详细,,支持一个,,
页: [1] 2 3 4 5 6
查看完整版本: IE操作新手专用入门教学 (二) (或者说是心得……POST 跟 GET 的方法)