C#登陆后获取另一个网页数据带验证码和token

这篇文章是有关模拟登录网站方面的。URL信息我是goole下面的开发者工具中获得

实现步骤;

     使用HttpWebRequest和HttpWebResponse

  1. 启用一个web会话
  2. 获取验证码(POST或者GET)
  3. 在获取验证码的时候提取CooKie和token
  4. 拼接另一页面的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窗体测试 页面如下:

  5. 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");
    
            }
        }
    
    }
    

    获取数据如下:

  6. 参考https://blog.csdn.net/htsnoopy/article/details/7094224?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-4.control&dist_request_id=605c03c4-c0d0-435b-91c3-4b993ed151cd&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-4.control

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@榴莲酥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值