c# 模拟登陆(带验证码) |
您所在的位置:网站首页 › 网页登录跳过验证码 › c# 模拟登陆(带验证码) |
在C#中,可以使用HttpWebRequest进行相关的模拟登陆,登陆后进行相关的操作,比如抓取数据,页面分析,制作相关登陆助手等等。 先说下流程 1.使用httpwebrequest先进入你要登录的网站,获取cookie 2.使用第一步获取的cookie到验证码的网页将验证码下载下来。 3.使用Post数据 发送至网站。如果有cookie则继续保存。 4.使用第三步的cookie登陆相关网页操作。
获取相关数据可以使用抓包工具进行抓取,如httpwatch。(网上下载的好多都有病毒,下载的时候注意点) 1。 view plain copy to clipboard print ? /// /// 通过get方式请求页面,传递一个实例化的cookieContainer /// /// /// /// 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.下载验证码,保存在本地。 view plain copy to clipboard print ? /// /// 下载验证码图片并保存到本地 /// /// 验证码URL /// Cookies值 /// 保存位置/文件名 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 list = new List(); 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数据 view plain copy to clipboard print ? /// /// 发送相关数据至页面 /// 进行登录操作 /// 并保存cookie /// /// /// /// /// 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注释掉就可以了,真郁闷。
我马上试验,等有做出成熟的例子,再写新文章提供给大家!
|
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |