`

C#网页自动登录和提交POST信息的多种方法

 
阅读更多

网页自动登录和提交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("http://sandou.cnblogs.com/") > 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://sandou.cnblogs.com/")); //打开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://sandou.cnblogs.com/"), "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://sandou.cnblogs.com/));
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 实现, 这个是从网上COPY 的!我以前用相关的代码登录到WWW.ASP.NET上,并且成功post,可惜代码不知道放什么地方了。

HttpWebRequest自动登录网站并获取网站内容(不包含验证码的网站)
可以使用 Visual Sniffer(百度搜索) 来捕捉提交的数据信息:
1. 访问你需要站外提交的页面,比如 CSDN 登陆页 http://www.csdn.net/member/UserLogin.aspx
2. 填写好需要的资料,比如用户名和密码,
3. 打开 Visual Sniffer, 点“开始拦截”
4. 在访问的页面中提交。
5. 等提交成功之后,在 Visual Sniffer 中“停止拦截”
6. 在 Visual Sniffer 的左侧栏的加号中依次点开,右边是它拦截到的内容:


POST http://www.csdn.net/member/UserLogin.aspx HTTP/1.0
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-shockwave-flash, **
Referer: http://www.csdn.net/member/UserLogin.aspx
Accept-Language: zh-cn
UA-CPU: x86
Pragma: no-cache
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; InfoPath.1)
Host: www.csdn.net
Proxy-Connection: Keep-Alive
Cookie: ASPSESSIONIDAAAATBQC=FMEGGCKDBKHAMMCGKPFDMBFG; ASP.NET_SessionId=lusprmnom05lr445tmteaf55; userid=699879
以上为拦截内容,其中提交数据的参数部分(程序中的:strArgs)如:
__EVENTTARGET=&__EVENTARGUMENT=&__VIEWSTATE=dDwtMTcwMzgxNjQ2Mjs7bDxDU
0ROVXNlckxvZ2luOmNiX1NhdmVTdGF0ZTtDU0ROVXNlckxvZ2luOkltYWdlX0xvZ2luOz4%2Btu
1q2wmRZoAJTi9L73w1zBleylY%3D&CSDNUserLogin%3Atb_UserName=testusername&CSDN
UserLogin%3Atb_Password=testpassword&CSDNUserLogin%3Atb_ExPwd=9232



protected static string cookieHeader;
private void Page_Load(object sender, System.EventArgs e)
{
string strReContent = string.Empty;
//登录
strReContent = PostLogin("http://www.mystand.com.cn/login/submit.jsp提交的页面","提交的参数:userid=hgj0000&password=06045369","引用地址:http://www.mystand.com.cn/");
//asp.net登录传递的参数需注意
//strReContent = PostLogin("47bDxcZTs%2BPjs%2BOzs%2BOz4%2BOz6aX2dtqkJTK%2BKbNPsjd7Op%2Fl26Iw%3D%3D&txtUserName=hxf&txtPassword=hxf0000&btnEnter=%E7%99%BB%E5%BD%95","http://www.mystand.com.cn/login.aspx">http://www.mystand.com.cn/login.aspx","__VIEWSTATE=dDwtNjkzMjUyNDczO3Q8O2w8aTwzPjs%2BO2w8dDxwPHA8bDxUZXh0Oz47bDxcZTs%2BPjs%2BOzs%2BOz4%2BOz6aX2dtqkJTK%2BKbNPsjd7Op%2Fl26Iw%3D%3D&txtUserName=hxf&txtPassword=hxf0000&btnEnter=%E7%99%BB%E5%BD%95","http://www.mystand.com.cn/login.aspx");
//获取页面
strReContent = GetPage("http://www.mystand.com.cn/company/getdata.jsp?code=","引用地址:http://www.mystand.com.cn/");
//strReContent = GetPage("http://www.mystand.com.cn/Modules/index.aspx","http://www.mystand.com.cn/login.aspx");
//可以对获得的内容进行处理:strReContent
}

/// <summary>
/// 功能描述:模拟登录页面,提交登录数据进行登录,并记录Header中的cookie
/// </summary>
/// <param name="strURL">登录数据提交的页面地址</param>
/// <param name="strArgs">用户登录数据</param>
/// <param name="strReferer">引用地址</param>
/// <returns>可以返回页面内容或不返回</returns>
public static string PostLogin(string strURL,string strArgs,string strReferer)
{
string strResult = "";
HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(strURL);
myHttpWebRequest.AllowAutoRedirect = true;
myHttpWebRequest.KeepAlive = true;
myHttpWebRequest.Accept = "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/msword, application/x-shockwave-flash, */// <summary>
/// 功能描述:在PostLogin成功登录后记录下Headers中的cookie,然后获取此网站上其他页面的内容
/// </summary>
/// <param name="strURL">获取网站的某页面的地址</param>
/// <param name="strReferer">引用的地址</param>
/// <returns>返回页面内容</returns>
public static string GetPage(string strURL,string strReferer)
{
string strResult = "";
HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(strURL);
myHttpWebRequest.ContentType = "text/html";
myHttpWebRequest.Method = "GET";
myHttpWebRequest.Referer = strReferer;
myHttpWebRequest.Headers.Add("cookie:"+ cookieHeader);

HttpWebResponse response = null;
System.IO.StreamReader sr = null;
response = (HttpWebResponse)myHttpWebRequest.GetResponse();
sr = new System.IO.StreamReader(response.GetResponseStream(), Encoding.GetEncoding("gb2312")); // //utf-8
strResult = sr.ReadToEnd();
return strResult;
}

技术应用——网页自动登录(提交Post内容)的用途很多,如验证身份、程序升级、网络投票等,以下是用C#实现的方法.

未解决问题——目前最大问题无法绕过验证码——我曾经和同事讨论图片的算法,基本上很难识别,网上也有很多识别验证码的例子,但是对于简单的噪声还是可以的,可是对于复杂的就一点用都没有了!到目前为止,我没有测试成功过!如果你有测试成功过,请帖代码,我们一起研究研究。

分享到:
评论

相关推荐

    C#网页自动登录和提交POST信息的多种方法 -

    C#网页自动登录和提交POST信息的多种方法 - C#网页自动登录和提交POST信息的多种方法 - C#网页自动登录和提交POST信息的多种方法 - C#网页自动登录和提交POST信息的多种方法 - C#网页自动登录和提交POST信息的多种...

    C#实现表单提交(1) - 真功夫

    这里的关键在于使用`SetAttribute`方法来改变输入框的`value`属性,以及使用`InvokeMember`方法来触发按钮的`click`事件,从而完成表单的自动提交。 ### 结论 通过上述分析,我们可以看到,在C#和ASP.NET中,`...

    c#自动登录网页,浏览页面.pdf

    标题:"C#自动登录网页,浏览页面.pdf" 描述:"C#自动登录网页,浏览页面.pdf" 标签:"技术" 知识点: 1. C#编程基础 文档内容涉及C#语言的编程实践,需要具备C#语言基础知识,包括语言结构、数据类型、控制语句...

    C# post 传值 和接收值实例

    在C#中,我们可以使用多种库来实现POST请求,如HttpClient、WebClient或HttpWebRequest。这里以HttpClient为例,介绍如何发送POST请求并传值: 1. 首先,确保已引入System.Net.Http命名空间: ```csharp using ...

    C#模拟Post提交,附Demo,直接引用就能用

    本示例主要关注如何使用C#来模拟POST提交,这对于API测试、自动化脚本或集成第三方服务非常有用。 1. **HttpClient类**: .NET Framework 4.5及以上版本引入了`HttpClient`类,它是执行HTTP请求的最佳选择。`...

    asp.net网页post提交

    通过上述介绍可以看出,在ASP.NET开发中实现Post提交的方式多种多样,开发者可以根据具体的应用场景选择最适合的方法。无论是使用HTML表单还是编程方式,理解Post提交的基本原理都是十分重要的。希望本文能够帮助...

    网站自动登录及c# winform执行js文件

    在IT领域,网站自动登录和C# WinForm执行JS文件是两个重要的技术点,它们主要涉及到网络编程和前端脚本的交互。以下是对这两个主题的详细讲解。 首先,网站自动登录通常是为了提高用户体验,减少用户手动输入账号和...

    基于C#的网页爬虫实例

    在IT领域,网络爬虫是一种自动化程序,用于从互联网上抓取信息,通常是网页内容。在本案例中,我们关注的是一个基于C#语言编写的特定爬虫,它被设计来针对QQ空间这一社交媒体平台进行操作。QQ空间是腾讯公司推出的一...

    刷票大战(三)——C#自动POST数据源码

    本篇文章将详细探讨"刷票大战(三)——C#自动POST数据源码"这一主题,它涉及到的是利用C#进行网络请求,特别是HTTP POST方法的应用,这对于网络自动化任务和爬虫开发至关重要。 HTTP POST是HTTP协议中的一个重要...

    C# 模拟POST数据

    在C#中,我们可以使用多种方式来模拟POST请求,这对于测试API、与Web服务交互或者自动化任务非常有用。以下是一些关于C#模拟POST数据的关键知识点,以及如何实现这一功能。 1. **HttpClient类**:C#从.NET ...

    C# 识别登陆验证码.rar

    在IT行业中,自动化登录和验证码识别是常见的任务,特别是在Web应用程序测试、数据分析和爬虫程序中。...这样的工具和方法在各种自动化任务中都有广泛的应用,如网站测试、数据抓取和智能客服系统。

    淘宝登陆自动并模拟发产品信息

    HttpClient允许开发者发送GET、POST等HTTP方法,用于获取登录页面、提交表单数据等操作。此外,登录可能还需要处理Cookie,以保持会话状态。C#的CookieContainer类可以帮助管理这些会话Cookie。 对于网页解析,项目...

    C#微信模拟登陆群发信息

    在本文中,我们将深入探讨如何使用C#编程语言...通过理解微信的登录流程和API接口,我们可以利用C#的强大功能实现自动化的信息发送,提高工作效率。同时,也要时刻注意遵守微信的使用规则,确保程序的稳定性和安全性。

    基于C#的作业批改及提交系统源码+论文-毕业设计(源码+论文).rar

    标题中的“基于C#的作业批改及提交系统源码+论文-毕业设计”表明这是一个使用C#编程语言开发的毕业设计项目,旨在创建一个自动化的作业提交和批改平台。这个系统可能包括学生提交作业、教师批改作业以及成绩记录等...

    精品软件工具--window 端,测试后台接口的工具软件。C#语言,封装有get和post。.zip

    GET方法用于获取服务器上的资源,而POST方法则用于向服务器发送数据,例如提交表单或创建新资源。在接口测试中,这两种方法是最常用的,因为大多数API交互都涉及这些HTTP操作。 在压缩包的子文件列表中,“ahao5”...

    C# vs2013 TestHttpPost demo

    通过这个项目,开发者可以学习到如何在C#中构造和发送POST请求,以及如何处理响应,这对于理解网络编程和API调用至关重要。在实践中,这些技能可以应用于诸如Web API通信、移动应用后台服务交互、自动化测试等多个...

    2018C#面试整理

    - **POST**:用于提交数据,数据作为HTTP消息体的一部分发送,更适合传输敏感信息。 #### 六、总结 以上内容涵盖了C#面试中的关键知识点和技术细节,包括.NET框架的基础、内存管理、设计模式以及一些重要的面试...

    阿里联盟模拟登录

    例如,你可以使用HttpClient类的`GetStringAsync`方法获取网页内容,`PostAsync`方法发送POST请求。对于复杂的登录流程,可以借助第三方库如HtmlAgilityPack来解析HTML,或者使用CookieContainer来管理cookie。 在...

    HTTP HTTPS POST GET(包含curl版本和winhttp两种实现),修复bug版

    GET和POST是HTTP/HTTPS中最常见的请求方法,分别用于获取资源和提交数据。 GET请求通常用于从服务器获取资源,它将参数附加到URL中,具有可见性和缓存特性。而POST请求则用于向服务器发送数据,比如表单提交,它将...

    HTTP Programming Recipes for C# Bots

    HTTP协议可以分为两种主要请求方法:GET和POST。GET用于请求获取资源的信息,而POST则用于发送数据给服务器。此外,安全版的HTTP——HTTPS也得到了广泛的应用,它通过SSL/TLS加密来保护数据传输的安全性。 #### 三...

Global site tag (gtag.js) - Google Analytics