程序自动登录和下载数据

1请求登录页面

2根据登录页面获取需要提交的数据

3提交登录数据,并返回CookieContainer

4根据登录后的CookieContainer,设置CookieContainer,获取数据


1请求登录页面,获取需要提交的数据,登录数据数据,并返回CookieContainer

  private CookieContainer GetLogInCookie(string Url, string username, string password)
        {
            RegexOptions options = RegexOptions.None;
            Regex nameIt = new Regex("input type=\"hidden\" name=\"lt\" value=\"(?<lt>[^\"]{1,})\"", options);
            Regex nameexecution = new Regex("<input type=\"hidden\" name=\"execution\" value=\"(?<lt>[^\"]{1,})\"", options);
            Regex name_eventId = new Regex("<input type=\"hidden\" name=\"_eventId\" value=\"(?<lt>[^\"]{1,})\"", options);
            Regex name_PostUrl = new Regex("action=\"(?<lt>[^\"]+)\"", options);
            CookieContainer InCookieContainer1 = new CookieContainer();
            CookieContainer OutCookieContainer1 = new CookieContainer();
            //获取登录页,和相关的提交字段     

            string longInPageinfo = WebHttps.CreateGetHttpResponse(urlLog, Encoding.UTF8, InCookieContainer1, ref OutCookieContainer1);
            string ithidden = "";
            if (nameIt.IsMatch(longInPageinfo))
            {
                Match m = nameIt.Match(longInPageinfo);
                ithidden = m.Groups["lt"].Value;
            }
            string executionhidden = "";
            if (nameexecution.IsMatch(longInPageinfo))
            {
                Match m = nameexecution.Match(longInPageinfo);
                executionhidden = m.Groups["lt"].Value;
            }
            string posturl = "";
            if (name_PostUrl.IsMatch(longInPageinfo))
            {
                Match m = name_PostUrl.Match(longInPageinfo);
                posturl = m.Groups["lt"].Value;
            }
            //提交用户名密码及相关数据
            string data = "lt=" + ithidden + "&password="+ password + "&username="+ username + "&execution=" + executionhidden + "&_eventId=submit";
            CookieContainer OutCookieContainer2 = new CookieContainer();
            string dataMain = WebHttps.CreatePostHttpResponse(posturl, Encoding.GetEncoding("GB2312"), data, InCookieContainer1, ref OutCookieContainer2);
            if (string.IsNullOrEmpty(dataMain) || InCookieContainer1.Count == 0)
            {
                return null;
            }       
            return InCookieContainer1;
        }


2根据返回的CookieContainer请求数据


  private string GetData(CookieContainer InCookieContainer1,string Url)
        {
            CookieContainer OutCookieContainer4 = new CookieContainer();
            string outputdata = WebHttps.CreateGetHttpResponse(Url, Encoding.GetEncoding("GB2312"), InCookieContainer1, ref OutCookieContainer4);
            return outputdata;
        }


 public class WebHttps
{
    private static readonly string DefaultUserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.109 Safari/537.36";
    public static string DownFileFolder = @"C:\ydfile";
    private static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
    {
        return true; //总是接受     
    }
    // <summary>
    /// 遍历CookieContainer
    /// </summary>
    /// <param name="cc"></param>
    /// <returns></returns>
    public static List<Cookie> GetAllCookies(CookieContainer cc)
    {
        List<Cookie> lstCookies = new List<Cookie>();
        Hashtable table = (Hashtable)cc.GetType().InvokeMember("m_domainTable",
            System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.GetField |
            System.Reflection.BindingFlags.Instance, null, cc, new object[] { });
        foreach (object pathList in table.Values)
        {
            SortedList lstCookieCol = (SortedList)pathList.GetType().InvokeMember("m_list",
                System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.GetField
                | System.Reflection.BindingFlags.Instance, null, pathList, new object[] { });
            foreach (CookieCollection colCookies in lstCookieCol.Values)
                foreach (Cookie c in colCookies) lstCookies.Add(c);
        }
        return lstCookies;
    }
    public static string CreatePostHttpResponse(string url, Encoding encoding, string databuffer, CookieContainer InCookieContainer, ref CookieContainer OutCookieContainer)
    {
        return CreatePostHttpResponse(url, encoding, databuffer, InCookieContainer, ref OutCookieContainer, false);
    }
    public static string CreatePostHttpResponse(string url, Encoding encoding, string databuffer, CookieContainer InCookieContainer, ref CookieContainer OutCookieContainer, bool savefile)
    {
        HttpWebRequest request = null;
        int countold = InCookieContainer.Count;
        //HTTPSQ请求  
        if (url.Contains("https"))
        {
            ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
            request = (HttpWebRequest)WebRequest.CreateDefault(new Uri(url));
        }
        else
        {
            request = (HttpWebRequest)WebRequest.Create(url);
        }
        request.Headers["Upgrade-Insecure-Requests"] = "1";
        request.CookieContainer = InCookieContainer;
        request.ProtocolVersion = HttpVersion.Version10;
        request.Method = "POST";
        request.ContentType = "application/x-www-form-urlencoded";
        request.UserAgent = DefaultUserAgent;
        request.Headers["Upgrade-Insecure-Requests"] = "1";
        request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8";
        request.Headers["Accept-Encoding"] = "gzip, deflate, br";
        request.KeepAlive = true;
        //如果需要POST数据     
        byte[] data = encoding.GetBytes(databuffer.ToString());
        request.ContentLength = data.Length;
        request.AllowAutoRedirect = true;
        try
        {


            using (Stream stream = request.GetRequestStream())
            {
                stream.Write(data, 0, data.Length);
            }
            HttpWebResponse rsp = (HttpWebResponse)request.GetResponse();
            CookieCollection c = rsp.Cookies;
            OutCookieContainer.Add(rsp.Cookies);
            if (rsp.Cookies.Count != 0)
            {
                InCookieContainer.Add(rsp.Cookies);
                LogInfo.Error("session Post Cookie返回不为空改变");
            }
            //很奇怪,传进来的InCookieContainer会改变,
            int countNew = InCookieContainer.Count;
            if (countNew == countold)
            {
                LogInfo.Error("session Cookie未改变");
            }
            return GetResponse(rsp, encoding, savefile);
        }
        catch (Exception ex)
        {
            LogInfo.Error("session Post登录异常", ex);
            return null;
        }
    }
    public static string CreateGetHttpResponse(string url, Encoding encoding, CookieContainer InCookieContainer, ref CookieContainer OutCookieContainer)
    {
        return CreateGetHttpResponse(url, encoding, InCookieContainer, ref OutCookieContainer, false);
    }
    public static string CreateGetHttpResponse(string url, Encoding encoding, CookieContainer InCookieContainer, ref CookieContainer OutCookieContainer, bool savefile)
    {
        HttpWebRequest request = null;
        //HTTPSQ请求  
        if (url.Contains("https"))
        {
            ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
            request = (HttpWebRequest)WebRequest.CreateDefault(new Uri(url));
        }
        else
        {
            request = (HttpWebRequest)WebRequest.Create(url);
        }
        request.CookieContainer = InCookieContainer;
        request.ProtocolVersion = HttpVersion.Version10;
        request.Method = "GET";
        request.Headers["Upgrade-Insecure-Requests"] = "1";
        request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8";
        request.Headers["Accept-Encoding"] = "gzip, deflate, br";
        request.KeepAlive = true;
        request.AllowAutoRedirect = true;
        request.UserAgent = DefaultUserAgent;
        try
        {
            HttpWebResponse rsp = (HttpWebResponse)request.GetResponse();
            OutCookieContainer.Add(rsp.Cookies);
            return GetResponse(rsp, encoding, savefile);
        }
        catch (Exception ex)
        {
            LogInfo.Error("session Get异常", ex);
            return null;
        }
    }
    /// <summary>
    /// 把响应流转换为文本。
    /// </summary>
    /// <param name="rsp">响应流对象</param>
    /// <param name="encoding">编码方式</param>
    /// <returns>响应文本</returns>
    private static string GetResponseAsString(HttpWebResponse rsp, Encoding encoding)
    {
        System.IO.Stream stream = null;
        StreamReader reader = null;
        try
        {                // 以字符流的方式读取HTTP响应
            stream = rsp.GetResponseStream();
            reader = new StreamReader(stream, encoding);
            return reader.ReadToEnd();
        }
        catch (Exception ex)
        {
            LogInfo.Error("响应文本错误", ex);
            return null;
        }
        finally
        {
            // 释放资源
            if (reader != null) reader.Close();
            if (stream != null) stream.Close();
            if (rsp != null) rsp.Close();
        }
    }


    private static string GetResponse(HttpWebResponse rsp, Encoding encoding, bool savefile)
    {
        string ContentType = rsp.ContentType.ToLower();
        if (savefile && !string.IsNullOrEmpty(ContentType) && !ContentType.StartsWith("text/"))
        {


            string disp = rsp.Headers.Get("Content-disposition");
            LogInfo.Error("返回文件类型" + disp);
            string ext = disp.Substring(disp.LastIndexOf("."));
            string filename = disp.Substring(disp.IndexOf("fileName="));
            string saveFileName = DownFileFolder;
            if (!saveFileName.EndsWith("\\"))
            {
                saveFileName += "\\";
            }
            saveFileName = saveFileName + System.Guid.NewGuid().ToString() + "_" + filename;
            bool issaveok = SaveBinaryFile(rsp, saveFileName);
            if (issaveok)
            {
                return saveFileName;
            }
            return null;
        }
        else
        {
            return GetResponseAsString(rsp, encoding);
        }
    }
    // 将二进制文件保存到磁盘
    private static bool SaveBinaryFile(WebResponse response, string FileName)
    {
        bool Value = true;
        byte[] buffer = new byte[1024];


        try
        {
            if (File.Exists(FileName))
                File.Delete(FileName);
            Stream outStream = System.IO.File.Create(FileName);
            Stream inStream = response.GetResponseStream();


            int l;
            do
            {
                l = inStream.Read(buffer, 0, buffer.Length);
                if (l > 0)
                    outStream.Write(buffer, 0, l);
            }
            while (l > 0);


            outStream.Close();
            inStream.Close();
            LogInfo.Error("保存文件成功FileName=" + FileName);
        }
        catch (Exception ex)
        {
            LogInfo.Error("保存文件失败FileName=" + FileName, ex);
            Value = false;
        }
        return Value;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值