欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-04-29 10:40:12
本文实例讲述了c#实现的三种模拟自动登录和提交post信息的方法。分享给大家供大家参考,具体如下: 网页自动登录(提交post内容)的用途很多,如验证身份、程序升级、网络...

本文实例讲述了c#实现的三种模拟自动登录和提交post信息的方法。分享给大家供大家参考,具体如下:

网页自动登录(提交post内容)的用途很多,如验证身份、程序升级、网络投票等,以下是用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("http://xxxx.com.cn/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("http://xxxxxxy.com.cn/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); // 转化
   httpwebrequest webrequest2 = (httpwebrequest)webrequest.create(new uri("http://www.xxxx.com/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();
   ......
}

httpwebrequest同样提供了异步操作,有兴趣的朋友自己查msdn,实现起来也不难。

客户端程序模拟post提交的用处很多,往往用于不同平台间的接口交互,
楼主总结的很好,不过少了一中方法:

webrequest request = webrequest.create(url);
request.method = "post";
request.timeout = 100000;
request.getrequeststream().close();
webresponse response = request.getresponse();
streamreader sr = new streamreader(response.getresponsestream(), system.text.encoding.utf8);
webinfo = sr.readtoend();
sr.close();

也挺方便

希望本文所述对大家c#程序设计有所帮助。