用webbrowser做的網站登陸程式,如何獲取cookie並且儲存在程式中 (IE8有效)
今天幫朋友做了個工具,用webbrowser做的,使用者使用使用者名稱密碼登陸網站後,需要在後臺下載和分析一些頁面。
分析頁面使用的是htmlparser .net版
裡面唯一需要解決的問題是,登陸後的cookie在webbrowser上,使用HttpWebRequest無法儲存其狀態。
因為中間有幾個cookie值是httponly的!
上網查詢到使用InternetGetCookieEx函式可以在ie8中讀出httponly的值
然後,解決方法如下:
這段程式碼可以獲取登陸後的cookie
[DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true)] static extern bool InternetGetCookieEx(string pchURL, string pchCookieName, StringBuilder pchCookieData, ref int pcchCookieData, int dwFlags, object lpReserved); private static string GetCookieString(string url) { // Determine the size of the cookie int datasize = 256; StringBuilder cookieData = new StringBuilder(datasize); if (!InternetGetCookieEx(url, null, cookieData, ref datasize, 0x00002000, null)) { if (datasize < 0) return null; // Allocate stringbuilder large enough to hold the cookie cookieData = new StringBuilder(datasize); if (!InternetGetCookieEx(url, null, cookieData, ref datasize, 0x00002000, null)) return null; } return cookieData.ToString(); }
使用HttpWebRequest獲取頁面
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.Method = "GET"; request.Headers.Clear(); request.Headers[HttpRequestHeader.Cookie] = GetCookieString(url); request.ContentType = "application/x-www-form-urlencoded"; request.KeepAlive = true; request.AllowAutoRedirect = true; HttpWebResponse httpResponse = (HttpWebResponse)request.GetResponse(); using (System.IO.Stream dataStream = httpResponse.GetResponseStream()) { using (System.IO.StreamReader sr = new System.IO.StreamReader(dataStream, Encoding.GetEncoding("gb2312"))) { html = sr.ReadToEnd(); sr.Close(); } } httpResponse.Close();
一些相關連結:
轉這篇 提示使用INTERNET_COOKIE_HTTPONLY
InternetSetCookieEx和InternetGetCookieEx使用tip(COOKIE檔案格式) 收藏
這兩個函式都要注意,szCookieName這個引數不太好使,最好設為NULL,然後在寫cookie時手動寫在內容裡:
"my_cookie_name=my_cookie_value; path=/; expires=Wed, 30-Mar-11 09:00:00 GMT; domain=.csdn.net"
讀的時候整個讀出來然後自己解析。
另外,InternetGetCookieEx的dwFlag引數,對於IE8,最好加上INTERNET_COOKIE_HTTPONLY,這樣才能讀出具有httponly屬性的cookie欄位值。如果SDK比較老,沒有這個巨集,可以直接從DLL裡GetProcAddress把這兩個函式扒出來,然後定義這個值為0x00002000使用。對於IE6和IE7,想獲取HTTPONLY的COOKIE,就只好手動讀取COOKIE檔案然後解析了。
COOKIE檔案格式:
_ntes_nnid // 欄位名
456f74e9863f8f4b1a1e37774b0c464d,0 // 欄位值
163.com/ // 欄位所屬域
3584 // 標誌位
3205176064 // 過期時間(低位)
37425091 // 過期時間(高位)
2444768976 // 建立時間(低位)
30082544 // 建立時間(高位)