close
使用HttpWebRequest 登入網站並POST查詢
我要做一個自動化查詢的小程式。他會自動去網頁送出查詢然後分析結果,但這個頁面需要先登入。
用.net framework的HttpWebRequest和HttpWebResponse可以幫我做送出接收的動作。
流程大概是:
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
我要做一個自動化查詢的小程式。他會自動去網頁送出查詢然後分析結果,但這個頁面需要先登入。
用.net framework的HttpWebRequest和HttpWebResponse可以幫我做送出接收的動作。
流程大概是:
- 送出request (using GET)-> login page
取得response 取得網頁
parse source code
- 送出request (using POST) -> login page 送出登入資料
登入成功
取得response
- 送出requset (using GET) -> query page 要求查詢頁
取得response 取得查詢頁
parse source code
- 送出request (using POST) -> query page 進行查詢
取得response 得到查詢結果
1.parse是為了要取得hidden的viewstate,必須從原始碼抓出來。
2.如果只是請求頁面而沒有傳表單值過去,不要用POST,不然程式會卡在那邊等你。
3.而method用POST的時候,要給ContentLength。不要自己設,取byte[]的長度,不然也會出錯。
4.登入後用一個CookieContainer存下,之後的請求在附上去。不然server不知道你有登入過啦。
到三步為止沒有什麼問題,登入成功,也取回了我要查詢的那頁原始碼。
但是我要在送出查詢的時候就出錯了。得到的exception是 500內部伺服器錯誤
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.dotblogs.com.tw/Providers/BlogEntryEditor/FCKeditor/editor/images/smiley/msn/confused_smile.gif)
沒什麼幫助。試了老半天,最後找了一個監看HTTP的程式幫忙。看我是不是有少了什麼變數沒有給到。
沒有阿...該有的都有了。
發現有比較詳細的錯誤訊息可以看。
他說是invalid ViewState。仔細看裡面還有說Base64 byte array format error
GOOGLE找了找,問題出在那一串看似亂碼的viewstate,裡面有"+"號,這個東西,在傳送的時候會變成空白。server 端解讀的時候就會出錯了。解法很簡單,把它UrlEncode就好了。(看似複雜的東西,問題總是出在很簡單的地方
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.dotblogs.com.tw/Providers/BlogEntryEditor/FCKeditor/editor/images/smiley/msn/confused_smile.gif)
最後就順利解決,抓到我掉的東西囉。
下面是HttpWebRequest, HttpWebResponse物件的用法
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.dotblogs.com.tw/Providers/BlogEntryEditor/FCKeditor/editor/dialog/InsertCode/codeimages/InBlock.gif)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.dotblogs.com.tw/Providers/BlogEntryEditor/FCKeditor/editor/dialog/InsertCode/codeimages/InBlock.gif)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.dotblogs.com.tw/Providers/BlogEntryEditor/FCKeditor/editor/dialog/InsertCode/codeimages/InBlock.gif)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.dotblogs.com.tw/Providers/BlogEntryEditor/FCKeditor/editor/dialog/InsertCode/codeimages/InBlock.gif)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.dotblogs.com.tw/Providers/BlogEntryEditor/FCKeditor/editor/dialog/InsertCode/codeimages/InBlock.gif)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.dotblogs.com.tw/Providers/BlogEntryEditor/FCKeditor/editor/dialog/InsertCode/codeimages/InBlock.gif)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.dotblogs.com.tw/Providers/BlogEntryEditor/FCKeditor/editor/dialog/InsertCode/codeimages/InBlock.gif)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.dotblogs.com.tw/Providers/BlogEntryEditor/FCKeditor/editor/dialog/InsertCode/codeimages/InBlock.gif)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.dotblogs.com.tw/Providers/BlogEntryEditor/FCKeditor/editor/dialog/InsertCode/codeimages/InBlock.gif)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.dotblogs.com.tw/Providers/BlogEntryEditor/FCKeditor/editor/dialog/InsertCode/codeimages/InBlock.gif)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.dotblogs.com.tw/Providers/BlogEntryEditor/FCKeditor/editor/dialog/InsertCode/codeimages/InBlock.gif)
心得: 若有要模擬瀏覽器做自動化查詢的動作,http watch這類的東西還不錯用,可以看的一清二楚。
參考資料:
比較完整的程式碼參考 http://www.cnblogs.com/anjou/archive/2007/10/15/923770.html
我用的監看程式: HTTP Analyzer http://www.ieinspector.com/httpanalyzer/download.html
全站熱搜