随笔 - 64, 文章 - 0, 评论 - 372, 引用 - 15
数据加载中……

CodeForFun--编写自动登录Email的程序

每天早上一开机就登录博客园已经成了习惯, 总要先打开浏览器, 然后输入www.cnblogs.com,然后等待... ...
要是某天有火箭队的比赛, 还要去关注一下赛事情况: 先打开浏览器, 然后输入www.sohu.com,点NBA,然后... ...
哈哈, 还有一件少不了的事情,就是要登录电子油箱查看一下是否有新邮件...

这么多操作真是麻烦! 能不能通过点击一个按纽来简化这些操作呢?

前两天从同事(ZnS04)那里得到启示, 根据自动化测试的原理, 完全可以...

好了,下面就开始编写吧 ... ...

1).  新建一个 window application 工程.
2). 在窗体上添加3个Button,设置好属性, 如图:


3). 给工程添加2个引用 Microsoft.mshtml 和SHDocVw.dll
4). 编写代码

 1using System;
 2using System.Collections.Generic;
 3using System.ComponentModel;
 4using System.Data;
 5using System.Drawing;
 6using System.Text;
 7using System.Windows.Forms;
 8using System.Threading;
 9//添加引用
10using SHDocVw;
11using mshtml;
12
13namespace WebExplorer
14{
15    public partial class Form1 : Form
16    {
17        public Form1()
18        {
19            InitializeComponent();
20        }

21
22        /// <summary>
23        /// Redirect to the URL page.
24        /// </summary>
25        /// <param name="URL">Your wanted URL.</param>

26        public void GotoURL(string URL)
27        {
28            //实例化一个IE模型
29            SHDocVw.InternetExplorer IE = new InternetExplorer();            
30            IE.Visible = true;
31            object nullArg = null;
32            //引导到URL
33            IE.Navigate(URL, ref nullArg, ref nullArg, ref nullArg, ref nullArg);
34        }

35
36        private void gotocnBlogs_Click(object sender, EventArgs e)
37        {
38            this.GotoURL("www.cnblogs.com");
39        }

40
41        private void gotoNBA_Click(object sender, EventArgs e)
42        {
43            this.GotoURL("sports.sohu.com/nba"); 
44        }

45
46        private void gotoGmail_Click(object sender, EventArgs e)
47        {
48            try
49            {
50                
                        this.GotoURL("http://gmail.google.com");
55
56                Thread.Sleep(3000);
57                //得到IE的文档对象模型
58                mshtml.IHTMLDocument2 DOM = (mshtml.IHTMLDocument2)IE.Document;
59                //声明用户名
60                mshtml.IHTMLInputTextElement txtUserName = (mshtml.IHTMLInputTextElement)DOM.all.item("Email"null);
61                txtUserName.value = "YOUE USERNAME";
62                //声明密码
63                mshtml.IHTMLInputTextElement txtPwd = (mshtml.IHTMLInputTextElement)DOM.all.item("Passwd"null);
64                txtPwd.value = "PASSWORD";
65                //声明登录
66                mshtml.HTMLInputElement btnLogin = (mshtml.HTMLInputElement)DOM.all.item("null"0);
67                Thread.Sleep(1000);
68                btnLogin.click();
69            }

70            catch (Exception ex)
71            {
72
73            }

74        }

75    }

76}


5. 运行工程,点击上面的Button,OK!

需要说明两点:
1. 关于两个引用
   Microsoft.mshtml:这个引用可以从add reference->.NET中得到。
   SHDocVw.dll:这个引用在windows/system32目录下。
2.对上述dll进行引用后,即可实例化IE模型,通过构建页面元素进行操作。

posted on 2006-11-09 22:28 Ring 阅读(2757) 评论(25)  编辑 收藏 所属分类: B .Net 开发

评论

#1楼    回复  引用  查看    

两个System.Threading.Thread.Sleep();使用的似乎不是很专业。
2006-11-09 23:25 | Dflying Chen      

#2楼    回复  引用  查看    

2.0不用Microsoft.mshtml,也有HtmlElement封装
Dim user As HtmlElement = WebBrowser1.Document.GetElementById("user")
user.SetAttribute("value", "用户名")
Dim pass As HtmlElement = WebBrowser1.Document.GetElementById("pass")
pass.SetAttribute("value", "密码")
Dim submit As HtmlElement = WebBrowser1.Document.GetElementById("input_btn1")
submit.InvokeMember("click")
这是126邮箱的
2006-11-09 23:30 | ZergTant      

#3楼    回复  引用  查看    

呵呵,类似ms webrunner~~
2006-11-09 23:36 | Clark Chen      

#4楼    回复  引用  查看    

3个按钮的事件处理函数可以设成一个,用sender来区分哪个点击了。即使要分开,gotoGmail_Click()中也应该调用GotoURL(string URL) 啊。
2006-11-09 23:36 | Dflying Chen      

#5楼    回复  引用    

@Dflying Chen
多谢指点啊!
程序调试完后,没有去做重构工作!! 就这样不专业点先凑和着...
:-) :-)
2006-11-09 23:57 | ring19811 [未注册用户]

#6楼    回复  引用    

@3个按钮的事件处理函数可以设成一个,用sender来区分哪个点击了。即使要分开,gotoGmail_Click()中也应该调用GotoURL(string URL) 啊。

如果是2。0的话,可以使用commandname来区别的吧。

#7楼    回复  引用  查看    

不知道我理解的是否对
这种登陆是在ie里已经记录了你的登陆信息后,才会实现自动登陆
而要是第一次使用的话肯定是要提示用户名和密码的
记得以前写的时候都是用cookies,很头疼
2006-11-10 08:32 | aspnetx      

#8楼    回复  引用  查看    

偶现在还看不是很懂啊.
看来偶不够专业啊!
2006-11-10 09:07 | slan      

#9楼    回复  引用  查看    

to aspnetx
你还真是理解的不对,好好看看
mshtml.IHTMLInputTextElement txtUserName = (mshtml.IHTMLInputTextElement)DOM.all.item("Email", null);
txtUserName.value = "YOUE USERNAME";
//声明密码
mshtml.IHTMLInputTextElement txtPwd = (mshtml.IHTMLInputTextElement)DOM.all.item("Passwd", null);
txtPwd.value = "PASSWORD";

他在这里进行了赋值。
2006-11-10 09:23 | 铱星      

#10楼 [楼主]   回复  引用  查看    

@aspnetx

这种登陆不需要在ie里已经记录了你的登陆信息后才能登录, 也不依赖cookie,
不信你可以把ie的cookie清空再似似!
2006-11-10 09:27 | Ring      

#11楼    回复  引用  查看    

如果不依靠微软的那个库就好了
2006-11-10 16:00 | 大剑师      

#12楼 [楼主]   回复  引用  查看    

@ZergTant
确实也可以的 :-)
2006-11-10 16:10 | Ring      

#13楼    回复  引用  查看    

这个太累了。干同样的事情用 EditPlus 写个 hta 就行了啊,和你这个界面也一样。。。
2006-11-10 18:39 | 木野狐      

#14楼    回复  引用    

@木野狐
怎么写?, 可否赐教一下?多谢
2006-11-10 18:41 | ring19811 [未注册用户]

#15楼    回复  引用    

模拟登录。
除楼主提供的实现,一个可以用ajax的方式,另外还可以在程序里面用httpwebrequest的类来实现。
不过有两个缺点,1、需要用抓包工具分析一下IE正常登录目标邮箱所需的参数和过程;2、不适用对https开头的邮箱模拟登录处理。
另外,不知道前面说写hta的方式是什么意思。hta是HTML Appication,任何一个html文件都可以存成后缀为.hta的文件,这个只是一个表现形式的问题。

#16楼    回复  引用  查看    

private void GoURL(string Url)
{
IE = new InternetExplorer();
IE.Visible = true;
object NullArg = null;
IE.Navigate(Url, ref NullArg, ref NullArg, ref NullArg, ref NullArg);
}

private void button2_Click(object sender, EventArgs e)
{
this.GoURL("http://mail.tom.com/");
Thread.Sleep(3000);
mshtml.IHTMLDocument2 DOM = (mshtml.IHTMLDocument2)IE.Document;

mshtml.IHTMLInputTextElement txtUserName = (mshtml.IHTMLInputTextElement)DOM.all.item("Email", null);
txtUserName.value = "csharp";

mshtml.IHTMLInputElement PWD = (mshtml.IHTMLInputElement)DOM.all.item("Passwd", null);
PWD.value = "taotaoit";

mshtml.HTMLInputElement Login = (mshtml.HTMLInputElement)DOM.all.item("null", 0);
Thread.Sleep(3000);
Login.click();
}


上面就是我照着你作的例子写的,可是不知为什么它是老是报错.
解释一下好吗?
2006-11-28 12:58 | xt idt[匿名]      

#17楼    回复  引用    

mshtml.IHTMLInputTextElement txtUserName = (mshtml.IHTMLInputTextElement)DOM.all.item("Email", null);
txtUserName.value = "csharp";

mshtml.IHTMLInputElement PWD = (mshtml.IHTMLInputElement)DOM.all.item("Passwd", null);
PWD.value = "taotaoit";

mshtml.HTMLInputElement Login = (mshtml.HTMLInputElement)DOM.all.item("null", 0);

你看看mail.tom.com页面的Dom.all.item("Email",null),应该是Dom.all.item("user",null),下面的也是有误.
Dom.all.item(...)是根据控件的name搜索的。
2006-11-28 14:19 | ring19811 [未注册用户]

#18楼    回复  引用    

@xt idt[匿名]
you can try:

mshtml.IHTMLDocument2 DOM = (mshtml.IHTMLDocument2)IE.Document;
mshtml.IHTMLInputTextElement textBoxUserName = (mshtml.IHTMLInputTextElement)DOM.all.item("user", null);
//输入账号****
textBoxUserName.value = "AAA";
mshtml.IHTMLInputTextElement textBoxPassword = (mshtml.IHTMLInputTextElement)DOM.all.item("pass", null);
//输入密码 ***
textBoxPassword.value = "AAAAAAA";

Thread.Sleep(5000);
Console.WriteLine("自动输入帐号/密码已完成……");

////用Form的Submit登录。
mshtml.HTMLInputElement img = (mshtml.HTMLInputElement)DOM.all.item("enter", 0);
2006-11-28 14:26 | ring19811 [未注册用户]

#19楼    回复  引用    

你好,偶尔找到这里,还颇有收获。

顺便请教个问题,在C#中使用HttpWebRequest将表单中所有的字段都发出去还登录不了(不用IE界面),有没有什么好办法能使登录代码通用于大多数网站?

(每登录一个网站都要抓包分析一下也太麻烦了,想找一个通用解决方案)


#20楼    回复  引用    

上述是winform的例子,能否请教下用asp.net 如何编写自动登录Email的程序?
谢谢!
2007-03-23 20:58 | 西风胡杨 [未注册用户]

#21楼    回复  引用    

//实例化一个IE模型
SHDocVw.InternetExplorer IE = new InternetExplorer();

我在执行这句时出现这个错误,请问如何解决?


异常详细信息: System.UnauthorizedAccessException: 拒绝访问。

ASP.NET 未被授权访问所请求的资源。请考虑授予 ASP.NET 请求标识访问此资源的权限。ASP.NET 有一个在应用程序没有模拟时使用的基进程标识(通常,在 IIS 5 上为 {MACHINE}\ASPNET,在 IIS 6 上为网络服务)。如果应用程序正在通过 <identity impersonate="true"/> 模拟,则标识将为匿名用户(通常为 IUSR_MACHINENAME)或经过身份验证的请求用户。

若要授予 ASP.NET 对文件的写访问权,请在资源管理器中右击该文件,选择“属性”,然后选择“安全”选项卡。单击“添加”添加适当的用户或组。突出显示 ASP.NET 帐户,选中所需访问权限对应的框。




我已经对InternetExplorer 设置了aspnet的完全控制权限。还不可以,为什么?谢谢。
2007-04-19 14:23 | 王者胡 [未注册用户]

#22楼    回复  引用    




HtmlElement el = webBrowser1.Document.GetElementById("na");

textBox1.Text = el.GetAttribute("value");

#23楼    回复  引用    

mshtml.IHTMLDocument2 DOM =
(mshtml.IHTMLDocument2)ie.Document;

为什么这个语句会有错误啊 <当前上下文中不存在名称“ie”>
2007-11-07 16:24 | AJ [未注册用户]

#24楼    回复  引用    

兄弟,我有个很好的创意能用到这项技术
希望你能参与
QQ:249548285
msn: xing126@126.com
2008-01-08 15:48 | dfsfdsfdsf [未注册用户]

#25楼    回复  引用    

这个程序似乎不能实现 浏览器是IE7的需求,此程序用IE7好像会打开两个页面
2008-03-14 16:50 | tz [未注册用户]

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2006-11-15 21:31 编辑过


相关链接: