使用WebClient自动填写并提交ASP.NET页面表单
在.NET中通过程序填写和提交表单还是比较简单。比如,要提交一个如下图所示的登录表单:
填写和提交以上表单的代码如下:
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编码的字符串。
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 大豆男生
#12楼 2007-03-21 16:35 着急者 [未注册用户]
有验证码怎么弄啊,能发我一份代码吗?邮箱xiafeng5@163.com 回复 引用 查看
#13楼 [楼主] 2007-03-21 21:43 大豆男生
#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 回复 引用 查看