本帖最后由 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 ... nHttp%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[0], 'name="lt" value="(.*)"', 3)
If Not IsArray($lt) Then
Exit
EndIf
;以上 是查詢的 語法 所以你會發現 語法只要這幾個.....後面其他的 參數都可以省略
;Post提交資料 這個就是要登入了......請注意 POST 語法 會比上面多出幾個參數
$sPost = "username="&$user&"&passwordX="&$pwd&"&password="&$pwd&"<="&$lt[0]&"&_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[6], "Location: (.*)\n", 3)
If Not IsArray($location) Then
MsgBox(64, 0, "用戶名或密碼錯誤")
Exit
EndIf
$rContext=_WinHTTP_GetRespond($MyOpen, $location[0], 4 + 2 , 50000)
If @error Then
MsgBox(0,@error,"出錯了")
Exit
EndIf
FileWrite("成功後的網頁.txt", $rContext[0]) ;注意 返回值 是陣列的
;跳到需要的頁面; 登入後 打算 轉到某個網頁去更新某些東西
;下面的語法是 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[0])
MsgBox(0, "cookie", $rContext[3])
MsgBox(0, "header", $rContext[6])
FileWrite("頁.txt", $rContext[6])
_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[0],如果網頁會自動跳轉....上面的範例一樣有取得跳轉的 語法.........
至於 如果需要提交登入的 也就是 POST 就需要 句柄 , 也就是要提交的網站網址 , 函數模式定義 , 超時時間 , 提交內容 , COOKIE , 傳輸資料的檔頭
這幾個參數了. 其中絕大部分的參數 請參照上面語法範例裡面的.... 需要特別說明的是 .................
要提交的網站網址===> 請注意提交網址的正確性...一般來說 登入畫面的網址不會錯誤....不過 上面的範例來說 我是還跑到某個地方 去更新的某些資料 .....
在這邊 遇到了不少麻煩....因為我ㄧ開始都是用$X2 這個變數裡面的網址去提交.....所以怎麼測試 都過不了,無法更新....後來才發現
網址錯誤... 應該是要用$XIU 這個變數裡面的網址 才是正確的......
提交內容 ====> 這個資料在工具介紹裡面都寫的很清楚的 可以找的到資料.....需要用那些工具去看....當然成是有分寫活的 跟寫死的, 活的通常是需要
先GET 然後從GET裡面的返回值 得到需要的資料....然後再去POST 如同上面範例第一段登入畫面的時候寫法.....可是我是比較偷懶....
反正先求有.... 在求好....上面範例最後一段的資料....我就是把利用工具查詢到的 資料直接 輸入在提交的內容..........
COOKIE ===> 這個比較特別.....我上面的範例都沒有用到....不知道是不是我網站的關係.....不過發現一個重點....譬如說登入畫面那段程式的語法...
其實GET的時候所得到的COOKIE 是 -1 這個可以由返回值查詢的到,所以POST的時候也是用-1,不然也可以試著把上面工具查詢
的到的COOKIE 輸入看看
傳輸資料的檔頭 ===> 其實如果從工具裡面看...傳輸的檔頭資料 其實很多 ,不過 在POST的時候 那些大概都可以省略....只要填入這個即可
"Content-Type: application/x-www-form-urlencoded"
希望上面的 一些心得 可以幫助新手......說了這是新手專用的教學.....說的淺 或者有說錯的 老手別見怪.....歡迎大家一起來討論.....如果覺得這篇文章對您有幫助....也請別忘了給個鼓勵感謝^^ |