这篇文章是有关模拟登录网站方面的。URL信息我是goole下面的开发者工具中获得
实现步骤;
使用HttpWebRequest和HttpWebResponse
- 启用一个web会话
- 获取验证码(POST或者GET)
- 在获取验证码的时候提取CooKie和token
- 拼接另一页面的URL获取数据 首先我建了HTTPHELPER类 如下:
using System; using System.Collections.Generic; using System.Collections.Specialized; using System.IO; using System.Linq; using System.Net; using System.Reflection; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; namespace WindowsFormsApp4 { class HTTPHELPER { public static CookieContainer container = null; //存储验证码cookie #region 登录 public string requestM(string vaildate) //密码和账号我是直接复制页面中header里面的 { HttpWebRequest request = null; HttpWebResponse response = null; try { request = (HttpWebRequest)HttpWebRequest.Create("登录页面URL"); request.Method = "Post"; request.ContentType = "application/x-www-form-urlencoded; charset=UTF-8"; request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.182 Safari/537.36"; request.AllowAutoRedirect = true; request.CookieContainer = container;//获取验证码时候获取到的cookie会附加在这个容器里面 request.KeepAlive = true;//建立持久性连接 //整数据 //string postData = string.Format("userName={0}&passwd={1}&validateCode={2}&rememberMe=true", uName, passwd, vaildate); string postData = string.Format("method=login&checkMMFlag=0&orgid=156499012&password=954b9c6122038fb010c91dfa5d0c83d8&orgCode={0}&myCode=&autologin=autologin", vaildate); ASCIIEncoding encoding = new ASCIIEncoding(); byte[] bytepostData = encoding.GetBytes(postData); request.ContentLength = bytepostData.Length; //发送数据 using结束代码段释放 using (Stream requestStm = request.GetRequestStream()) { requestStm.Write(bytepostData, 0, bytepostData.Length); } //响应 response = (HttpWebResponse)request.GetResponse(); string text = string.Empty; using (Stream responseStm = response.GetResponseStream()) { StreamReader redStm = new StreamReader(responseStm, Encoding.UTF8); text = redStm.ReadToEnd(); } return text; } catch (Exception ex) { var msg = ex.Message; return msg; } } #endregion #region 获取验证码 public Stream getCodeStream(string codeUrl) { //验证码请求 HttpWebRequest request = (HttpWebRequest)WebRequest.Create(codeUrl); request.Method = "GET"; request.ContentType = "application/x-www-form-urlencoded"; request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:5.0.1) Gecko/20100101 Firefox/5.0.1"; request.Accept = "image/webp,*/*;q=0.8"; request.CookieContainer = new CookieContainer();//!Very Important.!!! container = request.CookieContainer; var c = request.CookieContainer.GetCookies(request.RequestUri); HttpWebResponse response = (HttpWebResponse)request.GetResponse(); response.Cookies = container.GetCookies(request.RequestUri); Stream stream = response.GetResponseStream(); return stream; } #endregion #region 登陆成功后获取另一个页面的数据 /// <summary> /// request最好与页面中的request headers相同 /// </summary> /// <param name="Url"></param> /// <param name="Data"></param> /// <returns></returns> public string Post(string Url, string Data) { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url); ///request配置请查看页面的开发者工具,尽量保证与request headers相同 request.Method = "POST";//或者GET //request.Referer = Referer; byte[] bytes = Encoding.UTF8.GetBytes(Data); request.ContentType = "application/x-www-form-urlencoded; charset=UTF-8"; request.ContentLength = bytes.Length; request.AllowAutoRedirect = true; request.Host = "主机IP"; request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.182 Safari/537.36"; request.CookieContainer = container;//获取验证码时候获取到的cookie会附加在这个容器里面 Stream myResponseStream = request.GetRequestStream(); myResponseStream.Write(bytes, 0, bytes.Length); HttpWebResponse response = (HttpWebResponse)request.GetResponse(); response.Cookies = container.GetCookies(request.RequestUri); StreamReader myStreamReader = new StreamReader(response.GetResponseStream(), Encoding.UTF8); string retString = myStreamReader.ReadToEnd(); myStreamReader.Close(); myResponseStream.Close(); if (response != null) { response.Close(); } if (request != null) { request.Abort(); } return retString; } #endregion } }
然后我建了一个winform窗体测试 页面如下:
winform的代码如下:
using Newtonsoft.Json; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; using System.Windows.Forms; using WindowsFormsApp4; namespace 模拟登陆 { public partial class Form1 : Form { HTTPHELPER agent = new HTTPHELPER(); public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { //加载验证码图片 ReflshPicImage(); } Bitmap bitmap; public void ReflshPicImage() { string codeUrl = "验证码的url"; Stream stmImage = agent.getCodeStream(codeUrl); picValidate.Image = Image.FromStream(stmImage); bitmap = new Bitmap(picValidate.Image); } private void button2_Click(object sender, EventArgs e) { var rmsg = agent.requestM(txtVaildata.Text);// #region 获取token string csrftoken = ""; Regex Re = new Regex(@"token"" type=""hidden"" value=""([0-9\.]+)""", RegexOptions.IgnoreCase); MatchCollection Mc = Re.Matches(rmsg); if (Mc.Count == 0) { Console.WriteLine("没有匹配到数据"); } else { foreach (Match M in Mc) { csrftoken = M.Groups[1].Value.Replace("\"", string.Empty); } } #endregion //获取另一个页面数据 string json = agent.Post("另一个页面的url" + csrftoken, "page=1&rows=50"); } } }
获取数据如下: