A WebBrowser Toy


    记得上大学时,某老师为了防止学生上课不听讲,只准学生在课堂上看他放映的PPT,不准学生拷贝,而考试的内容恰恰是PPT上的内容,于是一个同学来找我,我就用VB写了个专门偷老师U盘上PPT的程序,结果救了无数苍生啊。那些时光已经远去了,而现在也终将成为将来的过去。

    今天又接到一个“光荣而艰巨”的任务,一个同学申请了一个XX的邮箱,可是密码忘记了,另外一个同学常使用暴力破解的方法来获取密码,可是太慢了,而且找到的工具只能使用6位数字作为字典。而单击“忘记密码?”链接需要提供以前向XX提供的生日和提示问题答案,提示问题的答案他是知道的,可是当时的生日是胡乱输入的。

    现在问题就简单了,写一个程序,让程序自动向XX输入生日进行判断就可以了。

    好了,这篇随笔并没有别的意图,只是向借助这个例子讲一下Visual Studio 2005中WebBrowser控件的用法。以前在我的随笔中有几篇关于mshtml的介绍,那是在.Net 1.1时代,现在要做这件事情简单多了。

    来看一下,单击“忘记密码了”链接的操作流程,如下图所示:

    首先,需要使用WebBrowser控件(wbXXMain)的Navigate方法进入第一个页面:

string strUrl = "http://entry.XX.com/cgi/reg?funcid=rpstart";
this.wbXXMail.Navigate(strUrl);

    然后,需要用户名获取文本框,并自动填充之。这时候需要使用WebBrowser控件Document属性的GetElementById方法获取文本框(文本框的id或name可以通过查看页面的源文件找到),并使用SetAttribute方法为文本框指定value属性:

System.Windows.Forms.HtmlElement heUserName = this.wbXXMail.Document.GetElementById("UserName");
heUserName.SetAttribute(
"value"this.dsConfig.Tables["Config"].Rows[0]["UserName"].ToString());

    接着,需要触发“确定”按钮的click事件提交文本框中的值:

 

System.Windows.Forms.HtmlElement heBtnUSubmit = this.wbXXMail.Document.GetElementById("update.x");
heBtnUSubmit.InvokeMember(
"click");

    同上,在页面http://entry.XX.com/cgi/reg?funcid=rpbirthday中填写年、月、日文本框中的值,并触发“确定”按钮的click事件。无论年、月、日的输入是否正确,都会转到页面http://entry.XX.com/cgi/reg?funcid=rpquestion。这时候只能根据该页面的内容来判断输入是否正确了,可以将该页面的body中是否出现了“生日错误”作为判断的条件:

if (this.wbXXMail.Document.Body.InnerHtml.IndexOf("生日错误"!= -1)
{
    
//生日错误,返回开始页面,也可以使用GoBack()方法
    string strUrl = "http://entry.XX.com/cgi/reg?funcid=rpstart";
    
this.wbXXMail.Navigate(strUrl);
}

else
{
    
//生日输入正确的处理逻辑
}

    OK,可以开始循环处理了。慢着,我们把逻辑全部放在在WebBrowser控件的DocumentCompleted事件中,由于多次调用了Navigate方法,不需要循环语句也可以完成循环才能完成的功能(见代码)。

    源码下载

    我把邮箱的用户名和上一次运行的起止日期以及运行的可能最终结果都保存在文件Config.xml中了,感兴趣的可更改这些参数使用自己的邮箱试一下。

   

 

posted @ 2006-06-18 00:43  蜡人张  阅读(2308)  评论(3编辑  收藏  举报