在C#中,可以使用HttpWebRequest進行相關的類比登陸,登陸後進行相關的操作,比如抓取資料,頁面分析,製作相關登陸助手等等。
先說下流程
1.使用httpwebrequest先進入你要登入的網站,擷取cookie
2.使用第一步擷取的cookie到驗證碼的網頁將驗證碼下載下來。
3.使用Post資料 發送至網站。如果有cookie則繼續儲存。
4.使用第三步的cookie登陸相關網頁操作。
擷取相關資料可以使用抓包工具進行抓取,如httpwatch。(網上下載的好多都有病毒,下載的時候注意點)
1.
/// <summary> /// 通過get方式請求頁面,傳遞一個執行個體化的cookieContainer /// </summary> /// <param name="postUrl"></param> /// <param name="cookie"></param> /// <returns></returns> public static ArrayList GetHtmlData(string postUrl, CookieContainer cookie) { HttpWebRequest request; HttpWebResponse response; ArrayList list = new ArrayList(); request = WebRequest.Create(postUrl) as HttpWebRequest; request.Method = "GET"; request.UserAgent = "Mozilla/4.0"; request.CookieContainer = cookie; request.KeepAlive = true; request.CookieContainer = cookie; try { //擷取伺服器返回的資源 using (response = (HttpWebResponse)request.GetResponse()) { using (StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.Default)) { cookie.Add(response.Cookies); //儲存Cookies list.Add(cookie); list.Add(reader.ReadToEnd()); list.Add(Guid.NewGuid().ToString());//圖片名 } } } catch (WebException ex) { list.Clear(); list.Add("發生異常/n/r"); WebResponse wr = ex.Response; using (Stream st = wr.GetResponseStream()) { using (StreamReader sr = new StreamReader(st, System.Text.Encoding.Default)) { list.Add(sr.ReadToEnd()); } } } catch (Exception ex) { list.Clear(); list.Add("5"); list.Add("發生異常:" + ex.Message); } return list; }
2.下載驗證碼,儲存在本地。
/// <summary> /// 下載驗證碼圖片並儲存到本地 /// </summary> /// <param name="Url">驗證碼URL</param> /// <param name="cookCon">Cookies值</param> /// <param name="savePath">儲存位置/檔案名稱</param> public static bool DowloadCheckImg(string Url, CookieContainer cookCon, string savePath) { bool bol = true; HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(Url); //屬性配置 webRequest.AllowWriteStreamBuffering = true; webRequest.Credentials = System.Net.CredentialCache.DefaultCredentials; webRequest.MaximumResponseHeadersLength = -1; webRequest.Accept = "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*"; webRequest.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon; .NET CLR 1.1.4322)"; webRequest.ContentType = "application/x-www-form-urlencoded"; webRequest.Method = "GET"; webRequest.Headers.Add("Accept-Language", "zh-cn"); webRequest.Headers.Add("Accept-Encoding", "gzip,deflate"); webRequest.KeepAlive = true; webRequest.CookieContainer = cookCon; try { //擷取伺服器返回的資源 using (HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse()) { using (Stream sream = webResponse.GetResponseStream()) { List<byte> list = new List<byte>(); while (true) { int data = sream.ReadByte(); if (data == -1) break; list.Add((byte)data); } File.WriteAllBytes(savePath, list.ToArray()); } } } catch (WebException ex) { bol = false; } catch (Exception ex) { bol = false; } return bol; }
3。發送post資料
/// <summary> /// 發送相關資料至頁面 /// 進行登入操作 /// 並儲存cookie /// </summary> /// <param name="postData"></param> /// <param name="postUrl"></param> /// <param name="cookie"></param> /// <returns></returns> public static ArrayList PostData(string postData, string postUrl, CookieContainer cookie) { ArrayList list = new ArrayList(); HttpWebRequest request; HttpWebResponse response; ASCIIEncoding encoding = new ASCIIEncoding(); request = WebRequest.Create(postUrl) as HttpWebRequest; byte[] b = encoding.GetBytes(postData); request.UserAgent = "Mozilla/4.0"; request.Method = "POST"; request.CookieContainer = cookie; request.ContentLength = b.Length; using (Stream stream = request.GetRequestStream()) { stream.Write(b, 0, b.Length); } try { //擷取伺服器返回的資源 using (response = request.GetResponse() as HttpWebResponse) { using (StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8)) { if (response.Cookies.Count > 0) cookie.Add(response.Cookies); list.Add(cookie); list.Add(reader.ReadToEnd()); } } } catch (WebException wex) { WebResponse wr = wex.Response; using (Stream st = wr.GetResponseStream()) { using (StreamReader sr = new StreamReader(st, System.Text.Encoding.Default)) { list.Add(sr.ReadToEnd()); } } } catch (Exception ex) { list.Add("發生異常/n/r"+ex.Message); } return list; }
4。就是第三步請求的連結地址換一個就行了
好了
以上核心代碼已經貼出了
具體實現需要靠你們按照你們自己的邏輯
還有一些header能不寫就不寫,因為我2天前一直在擷取返回response這地方報500錯誤。
找了N多代碼,看了N多資料都不可以。最後將一些header注釋掉就可以了,真鬱悶。
本文轉自VIP888的部落格(http://my.csdn.net/vip__888)