C#使用HttpWebRequest類比登陸(附帶驗證碼)

來源:互聯網
上載者:User

在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)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.