close
使用HttpWebRequest 登入網站並POST查詢
 
我要做一個自動化查詢的小程式。他會自動去網頁送出查詢然後分析結果,但這個頁面需要先登入。
用.net framework的HttpWebRequest和HttpWebResponse可以幫我做送出接收的動作。

 流程大概是:
  1. 送出request (using GET)-> login page
    取得response 取得網頁
    parse source code
     
  2. 送出request (using POST) -> login page 送出登入資料
    登入成功
    取得response
     
  3. 送出requset (using GET) -> query page 要求查詢頁
    取得response 取得查詢頁
    parse source code
     
  4. 送出request (using POST) -> query page 進行查詢
    取得response 得到查詢結果
有幾點注意:
1.parse是為了要取得hidden的viewstate,必須從原始碼抓出來。
2.如果只是請求頁面而沒有傳表單值過去,不要用POST,不然程式會卡在那邊等你。
3.而method用POST的時候,要給ContentLength。不要自己設,取byte[]的長度,不然也會出錯。
4.登入後用一個CookieContainer存下,之後的請求在附上去。不然server不知道你有登入過啦。

到三步為止沒有什麼問題,登入成功,也取回了我要查詢的那頁原始碼。
但是我要在送出查詢的時候就出錯了。得到的exception是 500內部伺服器錯誤


沒什麼幫助。試了老半天,最後找了一個監看HTTP的程式幫忙。看我是不是有少了什麼變數沒有給到。

 


沒有阿...該有的都有了。
發現有比較詳細的錯誤訊息可以看。


 


他說是invalid ViewState。仔細看裡面還有說Base64 byte array format error
GOOGLE找了找,問題出在那一串看似亂碼的viewstate,裡面有"+"號,這個東西,在傳送的時候會變成空白。server 端解讀的時候就會出錯了。解法很簡單,把它UrlEncode就好了。(看似複雜的東西,問題總是出在很簡單的地方)

最後就順利解決,抓到我掉的東西囉。

下面是HttpWebRequest, HttpWebResponse物件的用法
 HttpWebRequest request = WebRequest.Create(URI) as HttpWebRequest;    
 request.Method = "POST";    
 request.KeepAlive = true;  //是否保持連線  
 request.ContentType = "application/x-www-form-urlencoded";    
 request.CookieContainer = cookieContainer;   //server 才知道你是誰 
 request.ContentLength = postData.Length;  
   
 HttpWebResponse response = request.GetResponse() as HttpWebResponse;  
 Stream responseStream = response.GetResponseStream();  
 StreamReader reader = new  StreamReader(responseStream, Encoding.UTF8);  
 src = reader.ReadToEnd();
 
 心得: 若有要模擬瀏覽器做自動化查詢的動作,http watch這類的東西還不錯用,可以看的一清二楚。

參考資料:

比較完整的程式碼參考 http://www.cnblogs.com/anjou/archive/2007/10/15/923770.html
我用的監看程式: HTTP Analyzer http://www.ieinspector.com/httpanalyzer/download.html

arrow
arrow
    全站熱搜

    icejuly 發表在 痞客邦 留言(0) 人氣()