C#三种模拟自动登录和提交POST信息的实现方法

原创 2007年10月13日 13:35:00

       在实际编程过程中,我们经常会遇到验证身份、程序升级网络投票会员模拟登陆等需要,C#给我们提供了以下的实现方法:
       网页自动登录和提交POST信息的核心就是分析网页的源代码(HTML),在C#中,可以用来提取网页HTML的组件比较多,常用的用WebBrowser、WebClient、HttpWebRequest这三个。以下就分别用这三种方法来实现:
       1、WebBrowser是个"迷你"浏览器,其特点是Post时不用关心Cookie、内置JS等问题
           WebBrowser是VS2005新提供的组件(其实就是封装了IE接口),实现POST功能一般在webBrowser的DocumentCompleted中分析HtmlDocument 来实现,代码如下:
           HtmlElement ClickBtn =null;
           if (e.Url.ToString().ToLower().IndexOf("xxx.htm") > 0)   //登陆页面
            { 

                HtmlDocument doc = webBrowser1.Document;
                for (int i = 0; i < doc.All.Count ; i++)
                {
                    if (doc.All[i].TagName.ToUpper().Equals("INPUT"))
                    {
                        switch (doc.All[i].Name)
                        {
                            case "userCtl": 
                                doc.All[i].InnerText = "user01";
                                break;
                            case "passCt1":
                                doc.All[i].InnerText = "mypass";
                                break; 
                            case "B1":
                                ClickBtn = doc.All[i]; //提交按钮
                                break;
                        }
                    }
                }
                ClickBtn.InvokeMember("Click");   //执行按扭操作 
            }
           2、WebClient封装了HTTP的一些类,操作简单,相较于webBrowser,特点是可以自设代理,缺点是对COOKIE的控制
              WebClient的运行全在后台,并且提供了异步操作的能力,这样很方便并发多个任务,然后等待结果的返回,再逐个处理。多任务异步调用的代码如下:
    private void StartLoop(int ProxyNum)
        {
           WebClient []  wcArray = new WebClient[ProxyNum];  //初始化
             for (int idArray = 0; idArray< ProxyNum;idArray++) {
                 wcArray[idArray] = new WebClient();
                wcArray[idArray].OpenReadCompleted += new OpenReadCompletedEventHandler(Pic_OpenReadCompleted2);
                wcArray[idArray].UploadDataCompleted += new UploadDataCompletedEventHandler(Pic_UploadDataCompleted2);
                try
                {
                    ......
                    wcArray[idArray].Proxy = new WebProxy(proxy[1], port); 
                    wcArray[idArray].OpenReadAsync(new Uri("/tp.asp?Id=129")); //打开WEB;
                    proxy = null;
                }
                catch
                {
                }
            }
        }

        private void Pic_OpenReadCompleted2(object sender, OpenReadCompletedEventArgs e)
        {
                if (e.Error == null)
                {
                            string textData = new StreamReader(e.Result, Encoding.Default).ReadToEnd();  //取返回信息
                             .....
                              String cookie = ((WebClient)sender).ResponseHeaders["Set-Cookie"]; 
                             ((WebClient)sender).Headers.Add("Content-Type", "application/x-www-form-urlencoded");
                            ((WebClient)sender).Headers.Add("Accept-Language", "zh-cn");
                            ((WebClient)sender).Headers.Add("Cookie", cookie);

                            string postData = "......"
                            byte[] byteArray = Encoding.UTF8.GetBytes(postData); // 转化成二进制数组
                           ((WebClient)sender).UploadDataAsync(new Uri("/tp.asp?Id=129"), "POST", byteArray);
                }
         }

 

        private void Pic_UploadDataCompleted2(object sender, UploadDataCompletedEventArgs e)
        {
                 if (e.Error == null)
                {

                    string returnMessage = Encoding.Default.GetString(e.Result);
                    ......
                }
       }

       3、HttpWebRequest较为低层,能实现的功能较多,Cookie操作也很简单

             private bool  PostWebRequest()       
             {
                   CookieContainer cc = new CookieContainer();
                    string pos tData = "user=" + strUser + "&pass=" + strPsd;
                    byte[] byteArray = Encoding.UTF8.GetBytes(postData); // 转化 免费资源http://www.it55.com

                    HttpWebRequest webRequest2 = (HttpWebRequest)WebRequest.Create(new Uri("/chk.asp"));
                    webRequest2.CookieContainer = cc;
                    webRequest2.Method = "POST";
                    webRequest2.ContentType = "application/x-www-form-urlencoded";
                    webRequest2.ContentLength = byteArray.Length;
                    Stream newStream = webRequest2.GetRequestStream(); 
                    // Send the data.
                    newStream.Write(byteArray, 0, byteArray.Length);    //写入参数
                    newStream.Close(); 

                    HttpWebResponse response2 = (HttpWebResponse)webRequest2.GetResponse();
                    StreamReader sr2=new StreamReader(response2.GetResponseStream(), Encoding.Default);
                    string text2 =  sr2.ReadToEnd();
                  ......
        }

C#几种模拟自动登录和提交POST信息的实现方法

正在实践编程进程中,人们常常会碰到考证身份、程序进级网络投票会员模仿登陆等须要,C#给人们提求了以下的完成方式:网页主动登录和提交POST疑作的中心便是剖析网页的流代码(HTML), 正在C#中,能...
  • angel20082008
  • angel20082008
  • 2014年06月02日 11:49
  • 2018

C#三种模拟自动登录和提交POST信息的实现方法

网页自动登录(提交Post内容)的用途很多,如验证身份、程序升级、网络投票等,以下是用C#实现的方法。 网页自动登录和提交POST信息的核心就是分析网页的源代码(HTML),在C#中,可以用来提...
  • sundacheng1989
  • sundacheng1989
  • 2013年03月15日 16:35
  • 2519

C#实现通过HttpWebRequest发送POST请求实现网站自动登陆

怎样通过HttpWebRequest 发送 POST 请求到一个网页服务器?例如编写个程序实现自动用户登录,自动提交表单数据到网站等。 假如某个页面有个如下的表单(Form):  form n...
  • huangtao2011
  • huangtao2011
  • 2013年10月25日 21:55
  • 1829

C# 网络编程之网页自动登录 (一).使用WebBrower控件模仿登录

最近学习C#网络编程中,想实现网页自动登录并提交GET/POST信息,再实现循环登录不断发送报文给服务器,服务器发送消息给客户端记录能登录的账户和密码,做到后面实现绕过验证码、动态抓取登录位置等,但由...
  • Eastmount
  • Eastmount
  • 2013年08月01日 15:59
  • 15254

c# POST和GET方式通过服务器地址提交数据

c# POST和GET方式通过服务器地址提交数据
  • make1828
  • make1828
  • 2014年10月31日 09:59
  • 14413

C#模拟web请求,使用post提交带有文件的数据表单

在C#中有HttpWebRequest类,可以很方便用来获取http请求,但是这个类对Post方式没有提供一个很方便的方法来获取数据。网上有很多人提供了解决方法,但都参差不齐,这里我把我使用的方法总结...
  • yue1183283159
  • yue1183283159
  • 2015年11月17日 11:00
  • 3501

HttpClient4模拟表单提交

这里用httpclient4.3模拟一个表单普通文本提交的方法 建一个servlet接受表单数据,只传递2个参数,name和password //servlet的访问地址是:http://localh...
  • ngaveup
  • ngaveup
  • 2013年11月26日 15:20
  • 4201

Linux下使用CURL模拟用户提交post表单

本文介绍在Linux下使用CURL命令提交post请求,在需要手动重复提交post表单时,使用本文介绍的方法可以达到事半功倍的效果。...
  • cjf_wei
  • cjf_wei
  • 2017年04月16日 10:35
  • 2683

Jsoup实现Iteye自动登录

本来是为找如何实现有js动态加载网页的表单自动填写和提交,发现httpclient貌似不行,于是换成Jsoup,好像也不行,这里是Jsoup实现静态网页自动提交表单的代码。 package gddx...
  • fjssharpsword
  • fjssharpsword
  • 2016年05月20日 12:23
  • 2533

记一次C#的web模拟登录抓取

模拟登录的文章有很多,代码也有很多,但是缺少详细的关于如何抓取登录时的请求内容,以及我在模拟登录过程中出现的一些问题。 实现步骤; 使用抓包工具(这里使用360浏览器自带的工具)抓取登录动作时我们...
  • chen46311973
  • chen46311973
  • 2015年08月21日 15:56
  • 7451
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C#三种模拟自动登录和提交POST信息的实现方法
举报原因:
原因补充:

(最多只允许输入30个字)