使用WebClient自动填写并提交ASP.NET页面表单

使用WebClient自动填写并提交ASP.NET页面表单

      在.NET中通过程序填写和提交表单还是比较简单。比如,要提交一个如下图所示的登录表单:
          

填写和提交以上表单的代码如下:

        //  要提交表单的URI字符串。
        string  uriString  =   " http://www.xxx.com/Login.aspx " ;
       
//  要提交的字符串数据。
        string  postString  =   " userName=user1&password=password1 " ;
       
//  初始化WebClient
       WebClient webClient  =   new  WebClient();
       webClient.Headers.Add(
" Content-Type " " application/x-www-form-urlencoded " );
       
//  将字符串转换成字节数组
        byte [] postData  =  Encoding.ASCII.GetBytes(postString);
       
//  上传数据,返回页面的字节数组
        byte [] responseData  =  webClient.UploadData(uriString,  " POST " , postData);
       
//  返回的将字节数组转换成字符串(HTML)
        string  srcString  =  Encoding.UTF8.GetString(responseData);

srcStrinig 就是提交表单后所返回页面的HTML。怎么样,很简单吧。

      但是,以上代码可以提交ASP或JSP生成的表单,却不能提交ASP.NET表单。因为提交ASP.NET表单时,必须给“__VIEWSTATE”和“__EVENTVALIDATION”赋值。“__VIEWSTATE”和“__EVENTVALIDATION”的值可以通过在要提交的页面上按右键“查看源文件”中找到。如下:
        id="__VIEWSTATE" value="/wEPDwUKMTg0NTgwMzM2M2RksjXHwIOzdq/skwDy1k6qTexm2j0="
        id="__EVENTVALIDATION" value="/wEWBAKxhbOEAQKPpuq2CALyveCRDwLejM6fDwP2723lUdzBJVBIAVzbpM2sXYqc" 
通过“查看源文件”得到的“__VIEWSTATE”和“__EVENTVALIDATION”的值还不能直接提交给表单,还需要转换成URL编码的字符串。

       viewState  =  System.Web.HttpUtility.UrlEncode(viewState);
       eventValidation 
=  System.Web.HttpUtility.UrlEncode(eventValidation);

      完整的代码如下:

       //  提交按钮的文本
       string  submitButton  =   " 登录 " ;
       
//  页面的 VeiwState(可以通过IE打开页面,右键“查看源文件”取得)
        string  viewState  =   " /wEPDwUKMTg0NTgwMzM2M2RksjXHwIOzdq/skwDy1k6qTexm2j0= " ;
       
//  页面的 EventValidation(可以通过IE打开页面,右键“查看源文件”取得)
        string  eventValidation  =   " /wEWBAKxhbOEAQKPpuq2CALyveCRDwLejM6fDwP2723lUdzBJVBIAVzbpM2sXYqc " ;

       submitButton 
=  System.Web.HttpUtility.UrlEncode(submitButton);
       viewState 
=  System.Web.HttpUtility.UrlEncode(viewState);
       eventValidation 
=  System.Web.HttpUtility.UrlEncode(eventValidation);

       
try
       {
           
//  要提交表单的URI字符串。
            string  uriString  =   " http://www.xxx.com/Login.aspx " ;
           
//  要提交的字符串数据。格式形如:user=uesr1&password=123
            string  postString  =   " userName=1&password=1 "   +   " &loginButton= "   +  submitButton  +   " &__VIEWSTATE= "   +  viewState  +   " &__EVENTVALIDATION= "   +  eventValidation;
           
//  初始化WebClient
           WebClient webClient  =   new  WebClient();
           webClient.Headers.Add(
" Content-Type " " application/x-www-form-urlencoded " );
           
//  将字符串转换成字节数组
            byte [] postData  =  Encoding.ASCII.GetBytes(postString);
           
//  上传数据,返回页面的字节数组
            byte [] responseData  =  webClient.UploadData(uriString,  " POST " , postData);
           
//  将返回的将字节数组转换成字符串(HTML);
           
//      ASP.NET 返回的页面一般是Unicode,如果是简体中文应使用 
           
//      Encoding.GetEncoding("GB2312").GetString(responseData)
            string  srcString  =  Encoding.UTF8.GetString(responseData);
       }
       
catch  (WebException we)
       {
           
string  msg  =  we.Message;
       }

       几点说明:
       1)  srcStrinig 是提交表单后所返回页面的HTML,可以使用正则表达式等来分析之,以获得你所需要的数据。
       2)  “__VIEWSTATE”和“__EVENTVALIDATION”的值不是不是一成不变的。
       3)  查看网页POST的数据还可以通过一些工具来查看,比如: 网页数据分析工具HttpWatch,网络嗅探器等。
       4)  如果提交的表单有验证码,则不在本文讨论的范围内。

相关文章:使用WebClient自动填写并提交ASP.NET页面表单的源代码
             在C#中使用正则表达式自动匹配并获取所需要的数据

本文地址:http://www.cnblogs.com/anjou/archive/2006/12/25/602943.html 
 

posted on 2006-12-25 21:46 大豆男生 阅读(4548) 评论(42)  编辑 收藏 所属分类: .NET

评论

 

"“__VIEWSTATE”和“__EVENTVALIDATION”的值可以通过在要提交的页面上按右键“查看源文件”中找到" 你的意思是每次用的话还得去查看源代码,然后再赋值使用啊!   回复  引用  查看    

#2楼  2006-12-26 08:45 随心所欲

http://www.cnblogs.com/dlwang2002/archive/2006/02/06/326156.html
这是我的另外一种实现方式,通过WebBrowse控件来完成。   回复  引用  查看    

#3楼  2006-12-26 08:50 臭石头

楼上的,博主的意思是,每次用的使用,用正则来分析HTML,把那两个值取出来。   回复  引用  查看    

#4楼  2006-12-26 09:40 还没有博客 [未注册用户]

是不是可以先通过程序将页面抓取下来,然后分析一下页面,将需要的字段拿出来,比如搂主所说的__VIEWSTATE等字段,这样就能实现程序自动运行,而不必每次都要人工干预了,呵呵。   回复  引用  查看    

#5楼  2006-12-26 10:37 韦恩卑鄙

不需要分析正则 只需要用 dom分析就可以了 只需要简单的浏览器对象基础

实际上 webbrowser 和 webclient都是 ie 的 activex外部对象的.net封装 和引用com对象没有本质不同 其实挺无聊的 尤其是对做js的人来说   回复  引用  查看    

#6楼  2006-12-26 13:22 天才书生 [未注册用户]

如果像楼上所说的话,我觉得还是用WEBREQUEST等对象来做会比较好些,轻量级

“其实挺无聊的 尤其是对做js的人来说”,我个人不觉得,抛砖引玉,大家学习一下,我自己有用WEBREQUEST对象来实现对表单提交,可以连验证码都可以搞定。至于做JS的人,如果不用浏览器,他们就不能实现所谓了表单提交了,有些东西并不是都用浏览器的解决的,如要实现某个网页的登录后的点击率,你就要用表单模拟提交并取得COOKIE进行其它页面的操作了。   回复  引用  查看    

#7楼  2006-12-27 17:11 Wisdom-zh

有时也有用   回复  引用  查看    

#8楼  2006-12-29 00:27 锦瑟 [未注册用户]

连验证码都可以搞定?!我没有听错吧,请问你是怎么获得页面上的验证码的?   回复  引用  查看    

#9楼  2007-01-03 15:24 沙漠风暴 [未注册用户]

我试过了.怎么搞都不能实现自动提交的功能.我的邮箱是zy41796745@163.com如果你有完整的源码可以发一份到我的邮箱,谢谢!   回复  引用  查看    

#10楼 [楼主] 2007-03-06 22:44 大豆男生

@沙漠风暴
过几天我会把代码传上去。
  回复  引用  查看    

#11楼 [楼主] 2007-03-08 12:58 大豆男生

 

使用WebClient自动填写并提交ASP.NET页面表单的源代码: AutoPost.rar
   回复   引用   查看     

 

#12楼  2007-03-21 16:35 着急者 [未注册用户]

有验证码怎么弄啊,能发我一份代码吗?邮箱xiafeng5@163.com   回复  引用  查看    

#13楼 [楼主] 2007-03-21 21:43 大豆男生

 

@着急者
不好意思,带验证码没有研究出来。这里是本文相关的完整代码: AutoPost.rar
   回复   引用   查看     

 

#14楼  2007-03-24 01:06 着急者 [未注册用户]

网址http://www.leopardschina.com/DesktopDefault.aspx 输入的单号是57100134071 可以查到信息 但是用你的方法怎么不行啊,大豆兄弟有什么方法吗?   回复  引用  查看    

#15楼 [楼主] 2007-03-24 09:11 大豆男生

@着急者
应该和 form 的 enctype="multipart/form-data" 有关   回复  引用  查看    

#16楼  2007-06-05 10:48 dlnow [未注册用户]

怎么提交cookie?   回复  引用  查看    

#17楼  2007-07-10 17:56 re [未注册用户]

能帮我发一分自动注册的吗?我的油箱是zhongguo.com_001@163.com   回复  引用  查看    

#18楼 [楼主] 2007-07-10 23:09 大豆男生

@re
已经把“使用WebClient自动填写并提交ASP.NET页面表单”的源代码 发到你的邮箱里了。   回复  引用  查看    

#19楼  2007-07-11 10:04 re [未注册用户]

可是怎么看不到登录注册页面呢?   回复  引用  查看    

#20楼 [楼主] 2007-07-11 10:39 大豆男生

@re
“使用WebClient自动填写并提交ASP.NET页面表单”的源代码中包括2个项目:一个是WebTest(Web项目,里面有一个登录界面),一个是WinTest项目(Win Form 应用,用于自动提交 WebTest 项目的表单)的。你可以参考这些,自己做一个“自动注册”的程序。希望可以帮到你!
  回复  引用  查看    

#21楼  2007-07-16 09:39 re [未注册用户]

非常感谢你,能不能在帮我发一个自动登陆ASP或JSP的页面原码啊.油箱zhongguo.com_001@163.com   回复  引用  查看    

#22楼 [楼主] 2007-07-16 09:48 大豆男生

@re
自动登陆ASP或JSP的页面原码的代码和“自动提交ASP.NET页面表单”的代码是类似的,只是ASP和JSP不需要viewState和eventValidation。我这几天比较忙。你先试试吧,哈哈。
  回复  引用  查看    

#23楼  2007-07-16 09:54 re [未注册用户]

我登陆WebTest中的界面可登陆,但为什么登陆远端服务器论坛怎么登陆不上呢,请指点   回复  引用  查看    

#24楼  2007-07-16 09:56 re [未注册用户]

你QQ是多少,我加你吧   回复  引用  查看    

#25楼  2007-07-16 10:00 re [未注册用户]

我qq:125477861,加我吧
  回复  引用  查看    

#26楼  2007-07-16 17:43 re [未注册用户]

为什么我自动登陆到论坛之后跳转不到论坛主页得到原码啊   回复  引用  查看    

#27楼  2007-07-20 10:31 re [未注册用户]

在吗?大豆男生,在登陆的时候为什么跳转不到主页啊?   回复  引用  查看    

#28楼 [楼主] 2007-07-20 12:43 大豆男生

@re
我试了,你那个页面确实不能跳转。那天我在QQ里面回复你啊。跟踪了一下,它使用了Cookies。不好意思,目前我没有什么好办法。   回复  引用  查看    

#29楼  2007-07-20 16:19 re [未注册用户]

你那有利用WebBrowser控件自动填写的吗?帮我发一份,油箱:zhongguo.com_001@163.com   回复  引用  查看    

#30楼 [楼主] 2007-07-21 11:24 大豆男生

@re
WebBrowser 和 WebRequest 应该都可以,不过我没有用过。   回复  引用  查看    

#31楼  2007-08-09 16:26 re [未注册用户]

你好,大豆男生,我现在遇到一些线程的问题,请教一下你.   回复  引用  查看    

#32楼  2007-08-09 17:42 re [未注册用户]

线程不让引用window.net控件,如:listBox控件不让引用
  回复  引用  查看    

#33楼 [楼主] 2007-08-09 22:33 大豆男生

@re
我不知道你说的是不是,多线程中线程访问界面上的控件问题。
线程是不能直接访问界面上的控件的,要使用委托(delegate),并通过 BeginInvoke 来异步访问界面上的控件。   回复  引用  查看    

#34楼  2007-10-15 19:14 菜鸟也问问题 [未注册用户]

怎么做自动登陆呀,能不能给个case看看呀,我是菜鸟,帮帮忙啦.   回复  引用  查看    

#35楼 [楼主] 2007-10-15 21:23 大豆男生

@菜鸟也问问题
不要意思Case现在给不了,哈哈。不过基本方法都是一样的,做页面数据抓取:首先,使用网页数据分析工具HttpWatch、网络嗅探器等分析出页面的 QueryString 参数和 POST 参数;然后使用上文的方法获取页面的内容;最好再使用正则表达式等分析页面的内容获取你想要的数据。   回复  引用  查看    

#36楼  2007-10-16 10:17 菜鸟也问问题 [未注册用户]

回的还够快的,我的意思是获得登陆成功后的第一个页面的html后怎样打开这个页面,比如你的代码最后有:string srcString = Encoding.UTF8.GetString(responseData),获取到srcString后怎么打开这个页面呢?
  回复  引用  查看    

#37楼 [楼主] 2007-10-16 17:00 大豆男生

@菜鸟也问问题
srcString 就是该页面的源文件(html),和你用IE打开该页面后,单击鼠标右键弹出菜单的“查看源文件”看到的内容是一样的。然后你就可以使用正则表达式等分析该源文件(就是 srcString 中的内容)获取你想要的内容。不需要你说的“打开”。   回复  引用  查看    

#38楼  2007-10-31 10:06 yxsan@126.com [未注册用户]

我最近三天都在研究这个自动登入和获取HTML的问题。(vs2003)
在登入的时候,如LOG.ASPX中的登入不是<input type=button>
而是
<input type="image" name="Submit" id="Submit" src="image/login.gif" border="0" />
如何编写poststring才能让WEB服务器触发后台Submit_clicked的事件userid=aaa&userpwd=bbb&Submit=clicked&__VIEWSTATE*****
上面的提交上去无效果   回复  引用  查看    

#39楼 [楼主] 2007-10-31 12:34 大豆男生

@yxsan@126.com
建议你使用HttpWatch查看一下页面的POST参数。   回复  引用  查看    

#40楼  2007-11-01 16:16 yxsan@126.com [未注册用户]

今天终于搞定NET1.1的ASPX登入.图片的话,加上&Submit.x=11&Submit.y=33
其中的数字好象可以任何数字.就可以激发IMAGE定义的C#事件.   回复  引用  查看    

#41楼 [楼主] 2007-11-01 17:33 大豆男生

@yxsan@126.com
恭喜!   回复  引用  查看    

#42楼 [TrackBack] 2007-12-05 20:06 badwood

asp.net和asp页面的互相跳转。
[引用提示]badwood引用了该文章, 地址: http://www.cnblogs.com/badwood316/archive/2007/12/05/984062.html   回复  引用  查看    

  #1楼  2006-12-26 08:10 ※ABeen※
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值