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#程序设计有所帮助。
上一篇: B - Knight Moves