1. 程式人生 > >用webbrowser做的網站登陸程式,如何獲取cookie並且儲存在程式中 (IE8有效)

用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 // 建立時間(高位)