C#实现的三种模拟自动登录和提交POST信息的方法
本文实例讲述了C#实现的三种模拟自动登录和提交POST信息的方法。分享给大家供大家参考,具体如下:
网页自动登录(提交Post内容)的用途很多,如验证身份、程序升级、网络投票等,以下是用C#实现的方法。
网页自动登录和提交POST信息的核心就是分析网页的源代码(HTML),在C#中,可以用来提取网页HTML的组件比较多,常用的用WebBrowser、WebClient、HttpWebRequest这三个。以下就分别用这三种方法来实现:
1、WebBrowser是个"迷你"浏览器,其特点是Post时不用关心Cookie、内置JS等问题
WebBrowser是VS2005新提供的组件(其实就是封装了IE接口),实现POST功能一般在webBrowser的DocumentCompleted中分析HtmlDocument来实现,代码如下:
HtmlElementClickBtn=null; if(e.Url.ToString().ToLower().IndexOf("xxx.htm")>0)//登陆页面 { HtmlDocumentdoc=webBrowser1.Document; for(inti=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的运行全在后台,并且提供了异步操作的能力,这样很方便并发多个任务,然后等待结果的返回,再逐个处理。多任务异步调用的代码如下:
privatevoidStartLoop(intProxyNum) { WebClient[]wcArray=newWebClient[ProxyNum];//初始化 for(intidArray=0;idArray<ProxyNum;idArray++) { wcArray[idArray]=newWebClient(); wcArray[idArray].OpenReadCompleted+=newOpenReadCompletedEventHandler(Pic_OpenReadCompleted2); wcArray[idArray].UploadDataCompleted+=newUploadDataCompletedEventHandler(Pic_UploadDataCompleted2); try { ...... wcArray[idArray].Proxy=newWebProxy(proxy[1],port); wcArray[idArray].OpenReadAsync(newUri("http://xxxx.com.cn/tp.asp?Id=129"));//打开WEB; proxy=null; } catch { } } } privatevoidPic_OpenReadCompleted2(objectsender,OpenReadCompletedEventArgse) { if(e.Error==null) { stringtextData=newStreamReader(e.Result,Encoding.Default).ReadToEnd();//取返回信息 ..... Stringcookie=((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); stringpostData="......" byte[]byteArray=Encoding.UTF8.GetBytes(postData);//转化成二进制数组 ((WebClient)sender).UploadDataAsync(newUri("http://xxxxxxy.com.cn/tp.asp?Id=129"),"POST",byteArray); } } privatevoidPic_UploadDataCompleted2(objectsender,UploadDataCompletedEventArgse) { if(e.Error==null) { stringreturnMessage=Encoding.Default.GetString(e.Result); ...... } }
3、HttpWebRequest较为低层,能实现的功能较多,Cookie操作也很简单
privateboolPostWebRequest() { CookieContainercc=newCookieContainer(); stringpostData="user="+strUser+"&pass="+strPsd; byte[]byteArray=Encoding.UTF8.GetBytes(postData);//转化 HttpWebRequestwebRequest2=(HttpWebRequest)WebRequest.Create(newUri("http://www.xxxx.com/chk.asp")); webRequest2.CookieContainer=cc; webRequest2.Method="POST"; webRequest2.ContentType="application/x-www-form-urlencoded"; webRequest2.ContentLength=byteArray.Length; StreamnewStream=webRequest2.GetRequestStream(); //Sendthedata. newStream.Write(byteArray,0,byteArray.Length);//写入参数 newStream.Close(); HttpWebResponseresponse2=(HttpWebResponse)webRequest2.GetResponse(); StreamReadersr2=newStreamReader(response2.GetResponseStream(),Encoding.Default); stringtext2=sr2.ReadToEnd(); ...... }
HttpWebRequest同样提供了异步操作,有兴趣的朋友自己查MSDN,实现起来也不难。
客户端程序模拟post提交的用处很多,往往用于不同平台间的接口交互,
楼主总结的很好,不过少了一中方法:
WebRequestrequest=WebRequest.Create(Url); request.Method="POST"; request.Timeout=100000; request.GetRequestStream().Close(); WebResponseresponse=request.GetResponse(); StreamReadersr=newStreamReader(response.GetResponseStream(),System.Text.Encoding.UTF8); webInfo=sr.ReadToEnd(); sr.Close();
也挺方便
希望本文所述对大家C#程序设计有所帮助。