zoukankan      html  css  js  c++  java
  • C#模拟百度登录并到指定网站评论回帖(二)

    序言

     

    回归正题:前面讲到的抓包分析的数据,是模拟登录要获得得必要信息(当然有些也不是必要的...我只是都列举出来这样有个对比)如果说,有哪个英文字母不知道什么意思的,可以问一下度娘,有不少前辈都发过类似的博文上面都有解释,我这软件也是基于他们的帮助才得以实现。

     

    好了,根据前面说的步骤,下面开始我们今天的内容--------①如何获取百度的BAIDUID

    获取之前还要给大家普及一个注意事项:就是Get请求跟Post时的请求报文头,Post必须注明request.ContentType = "application/x-www-form-urlencoded";

    第一步理论逻辑:我们要向www.baidu.com提交一个Get请求,获取这个BAIDUID(第一次请求的时候才能够抓包到这个Cookies,所以找不到的童鞋请清除缓存)

    第二步代码实现:

    #region 网页请求HttpHelper类
           HttpWebRequest request = null;
            HttpWebResponse response = null;
            CookieContainer cc = new CookieContainer();
            /// <summary>
            /// Get方式获取页面响应内容
            /// </summary>
            public string GetPageResponse_Get(string url,string referer,string request_Accept)
            {
                try
                {
                    string content = "";
                    request = (HttpWebRequest)WebRequest.Create(url);
                    request.Method = "GET";
                    request.Referer = referer;
                    request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.0";
                    request.Headers["Accept-Language"] = "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3";
                    request.KeepAlive = true;
                    request.Accept = request_Accept;
                    request.Host = new Uri(url).Host;
                    request.AllowAutoRedirect = false;
                    request.CookieContainer = cc;
                    using (response = (HttpWebResponse)request.GetResponse())
                    {  
                        //第一次从http:\www.baidu.com中获取BAIDUID时,发现该cookie会当场失效,此处修改保存期限
                        foreach (Cookie ck in response.Cookies)
                        {
                            ck.Expires = DateTime.MaxValue;
                        }
                        cc.Add(response.Cookies);
                        Stream stream = response.GetResponseStream();
                        StreamReader reader = new StreamReader(stream);
                        content = reader.ReadToEnd(); 
                        stream.Close();
                        reader.Close();
                    }
                    return content;
                }
                catch (Exception ex)
                {
                    System.Windows.Forms.MessageBox.Show(ex.Message);
                }
                return null;
            }
            /// <summary>
            /// Post数据获取响应
            /// </summary>
            public string GetPageResponse_Post(string url, string postData, string referer)
            {
                try
                {
                    string content = "";
                    request = (HttpWebRequest)WebRequest.Create(url);
                    request.Method = "Post";
                    request.Timeout = 20000;
                    request.Headers["Cache-control"] = "no-cache";
                    request.Headers["Accept-Language"] = "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3";
                    request.Headers["DNT"] = "1";
                    request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.0";
                    request.Referer = referer;
                    request.ContentType = "application/x-www-form-urlencoded";
                    request.KeepAlive = true;
                    request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
                    request.Host = new Uri(url).Host;
                    request.AllowAutoRedirect = false;
                    request.CookieContainer = cc;
                    ///携带cookiesPost数据
                    byte[] dataByte = Encoding.UTF8.GetBytes(postData);
                    request.ContentLength = dataByte.Length;
                    using (Stream stream = request.GetRequestStream())
                    {
                        stream.Write(dataByte, 0, dataByte.Length);
                    }
                    using (response = request.GetResponse() as HttpWebResponse)
                    {
                        foreach (Cookie ck in response.Cookies)
                        {
                            ck.Expires = DateTime.MaxValue;
                        }
                        cc.Add(response.Cookies);
                        using (StreamReader reader = new StreamReader(response.GetResponseStream())) 
                        {
                            content = reader.ReadToEnd();
                        }   
                    }
                    return content;
                }
                catch (Exception ex)
                {
                    System.Windows.Forms.MessageBox.Show(ex.Message);
                }
                return null;
            }

    #endregion

    上面的类大家参考一下,写的可能不是很好,大家要注意一个问题就是,目前我用的是VS2012版本,它在获取BAIDUID的时候我发现这个值效期短,所以弄得每次反馈回来的信息都没有这个值,捣鼓了很久才终于发现原来是Cookis过期。所以上面的代码,我将每一次获得的Cookies都设置成为无限期。

    下面是获取代码:

    /// <summary>
            /// 获取BAIDUID等cookies
            /// </summary>
            public void GetBAIDUID()
            {
                string url_baidu = string.Format("https://www.baidu.com");
                helper.GetPageResponse_Get(url_baidu,null, "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
            }

    如无意外,你获得的将会有4个Cookies,也就是前面提到的那几个,但最重要的是BAIDUID,我们只要将这些Cookies储存在CookieContainer中就可以不用管了,好了,今天就到这里比较简单,如果看了有不懂的或者无法实现的,欢迎评论交流

  • 相关阅读:
    SQL Server的数据库镜像实施笔记(3)
    MVC3缓存之三:MVC3中的局部缓存
    MVC3缓存之二:页面缓存中的局部动态
    SQL Server的数据库镜像实施笔记(2)
    ab工具
    数据库灾难备份,和负载均衡 主从数据库配置
    SQL Server的数据库镜像实施笔记 一
    ArcGIS version not specified. You must call RuntimeManager.
    SL命名空间书写
    通过文件tnsnames.ora连接
  • 原文地址:https://www.cnblogs.com/AssertionBird/p/4801326.html
Copyright © 2011-2022 走看看