您的位置:首页 > 运维架构 > 网站架构

C#自动登录网站(一)----WebBrowser

2013-06-03 20:31 351 查看
这章写自动登录某个网站,例如QQ空间,163邮箱啊,csdn等,有那里不对希望读者指点出来或者有更好的提议的说出来。

看到文章的题目大家也清楚这篇文章用的便是WebBrowser,写完到时还会出另外2种使用WebClient跟使用HttpWebRequest/HttpWebResponse。

一、我们先建立一个window窗体应用。



把窗体设置大点。

然后在左边工具箱所有窗体控件里面最下面一个WebBrowser控件拖到主窗体上。

然后再添加2个文本框textboxId跟textboxPwd跟一个按钮

这样基本的界面东西准备好了,接下来我们准备第二步,我们先尝试登录到163邮箱

第二步:

我们首先添加一个窗体加载事件让窗体一加载完后加载登录页面代码如下:

private void Form1_Load(object sender, EventArgs e)

{

webBrowser1.Navigate("http://reg.163.com/");

}

运行效果如下:


嘿嘿,卖广告啊~~~~~

接下来就是第三步了,我们在浏览器上打开
http://reg.163.com/ 然后查看源码,看下输入帐号,密码,跟登录按钮的id分别为什么,如下图:



由上可以看出帐号,密码,跟登录按钮的id分别为username,password,loginBtn

好接下来我们开始第四步编写登录的代码,代码如下:

private void button1_Click(object sender, EventArgs e)

{

//首先确定帐号密码不能为空

if (textBoxId.Text == "" || textBoxPwd.Text == "")

{

MessageBox.Show("帐号密码不能为空");

return;

}

//判断是否已加载完网页

if (webBrowser1.ReadyState == WebBrowserReadyState.Complete)

{

//获取网页文档对象,相当于获取网页的全部源码

HtmlDocument htmlDoc = this.webBrowser1.Document;

//设置帐号

HtmlElement id = htmlDoc.GetElementById("username");

id.SetAttribute("value", textBoxId.Text.Trim());

//设置密码

HtmlElement pwd = htmlDoc.GetElementById("password");

pwd.SetAttribute("value", textBoxPwd.Text.Trim());

//登录

HtmlElement btn = htmlDoc.GetElementById("loginBtn");

if (btn != null)

{

btn.InvokeMember("click");

}

}

}

运行下,输入帐号跟密码登录后效果如下:



是不是很简单呢,哈哈。

接下来我们试试登录csdn的,同样我们获取登录地址,表单的字段id分别为(u,p,aLogin)

嗯,我们来试试看怎样......

......

......

是不是发现不行呢,原来csdn的登录页面是用iframe嵌套在主页面的,我们查看下源码可以看到如下图:



我们可以看到iframe的id为logfrm

所以这时候我们要把帐号密码嵌入进iframe里面去而不是主页面去,所以我们需要把登录按钮的代码修改下,只需要修改第一句

HtmlDocument htmlDoc=webBrowser1.Document.Window.Frames["logfrm"].Document;

把iframe的页面内容获取到。

按钮的代码如下:

private void button1_Click(object sender, EventArgs e)

{

//首先确定帐号密码不能为空

if (textBoxId.Text == "" || textBoxPwd.Text == "")

{

MessageBox.Show("帐号密码不能为空");

return;

}

//判断是否已加载完网页

if (webBrowser1.ReadyState == WebBrowserReadyState.Complete)

{

//获取网页文档对象,相当于获取网页的全部源码

HtmlDocument htmlDoc = HtmlDocument htmlDoc = webBrowser1.Document.Window.Frames["logfrm"].Document;

//设置帐号

HtmlElement id = htmlDoc.GetElementById("u");

id.SetAttribute("value", textBoxId.Text.Trim());

//设置密码

HtmlElement pwd = htmlDoc.GetElementById("p");

pwd.SetAttribute("value", textBoxPwd.Text.Trim());

//登录

HtmlElement btn = htmlDoc.GetElementById("aLogin");

if (btn != null)

{

btn.InvokeMember("click");

}

}

}

private void Form1_Load(object sender, EventArgs e)

{

webBrowser1.Navigate("https://passport.csdn.net/account/login");

}

这样试一下是不是可以了呢,运行效果如下:



当然我们还要系统自己知道是不是登录成功,首先我们需要在登录后的页面找登录后的页面存在的特征,例如***你好等等,这个时候我们只要

String s =webBrowser1.DocumentText;

这样便可获取文档的文本然后用正则表达式匹对出特征,符合的话就是登录成功咯,当然登录页面往往是有验证码的,这个问题留到后面有空再说自动识别验证码.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: