代码改变世界

操纵IE,模拟用户登录

2015-07-07 10:29  莫球名堂  阅读(423)  评论(0编辑  收藏  举报

操作IE浏览器,模拟用户登录,首先需要两个程序集:shdocvw.dll和mshtml.dll;

新建项目将程序集引用到项目中;

代码如下:

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Text;
  5 using System.Threading.Tasks;
  6 using mshtml;
  7 using SHDocVw;
  8 using System.Threading;
  9 using System.Diagnostics;
 10 
 11 namespace StudyPrograms
 12 {
 13     class Program
 14     {
 15         static AutoResetEvent documentComplete = new AutoResetEvent(false);
 16  
 17         static void Main(string[] args)
 18         {
 19             Console.WriteLine(DateTime.Now.ToString() + " 开始");
 20             InternetExplorer ie = GetInternetExplorer();
 21             if (ie != null)
 22             {
 23                 Run(ie);
 24             }
 25             Console.WriteLine(DateTime.Now.ToString() + " 结束");
 26         }
 27 
 28         private static InternetExplorer GetInternetExplorer()
 29         {
 30             InternetExplorer ie = null;
 31             Console.WriteLine(DateTime.Now.ToString() + " 加载IE实例");
 32 
 33             //查找是否有打开的IE进程窗口,如果已经包含CSDN登录页,则得到此进程
 34             Process[] processes = Process.GetProcesses();
 35             Process process = null;
 36             foreach (Process p in processes)
 37             {
 38                 if (string.Compare(p.ProcessName, "iexplore", true) == 0)
 39                 {
 40                     if (p.MainWindowTitle.IndexOf("CSDN 用户登录") >= 0) // CSDN 用户登录 - Windows Internet Explorer
 41 
 42                     {
 43                         process = p;
 44                         break;
 45                     }
 46                 }
 47             }
 48 
 49             //如果没有则启动IE实例
 50             if (process == null)
 51             {
 52                 process = Process.Start("iexplore.exe", "about:blank");
 53             }
 54 
 55             if (process == null)
 56             {
 57                 Console.WriteLine(DateTime.Now.ToString() + " 无法启动IE");
 58                 return null;
 59             }
 60 
 61             Thread.Sleep(3000);
 62             try
 63             {
 64 
 65                 Console.WriteLine(DateTime.Now.ToString() + " Process Handle: " + process.MainWindowHandle.ToString());
 66             }
 67             catch (Exception ex)
 68             {
 69                 Console.WriteLine(ex.Message);
 70                 return null;
 71             }
 72 
 73             ShellWindows browsers = new ShellWindows();
 74             Console.WriteLine(DateTime.Now.ToString() + " 活动浏览器数量: " + browsers.Count);
 75             if (browsers.Count == 0)
 76             {
 77                 Console.WriteLine(DateTime.Now.ToString() + " 未找到IE");
 78             }
 79 
 80             //如果找到匹配的IE进程,则把当前InternetExplorer对象连接到正在运行的IE程序
 81             Console.WriteLine(DateTime.Now.ToString() + " 附加到IE");
 82             int i = 0;
 83             while (i < browsers.Count && ie == null)
 84             {
 85                 InternetExplorer e = browsers.Item(i) as InternetExplorer;
 86                 if (e != null)
 87                 {
 88                     if (e.HWND == (int)process.MainWindowHandle)
 89                     {
 90                         ie = e;
 91                         break;
 92                     }
 93                 }
 94                 ++i;
 95             }
 96             if (ie == null)
 97             {
 98                 Console.WriteLine(DateTime.Now.ToString() + " 附加到IE失败");
 99             }
100             return ie;
101         }
102 
103         private static void Run(InternetExplorer ie)
104         {
105             ie.DocumentComplete += new DWebBrowserEvents2_DocumentCompleteEventHandler(ie_DocumentComplete);
106 
107             try
108             {
109                 HTMLDocument document = null;
110  
111                 object o = new object();
112                 //导航到 博客园 登录页
113                 ie.Navigate("http://passport.cnblogs.com/user/signin?ReturnUrl=http%3A%2F%2Fwww.cnblogs.com%2Fcate%2Fbeginner%2F", ref o, ref o, ref o, ref o);
114                 documentComplete.WaitOne(1000, true);
115 
116                 document = ie.Document as HTMLDocument;
117                 if (document != null)
118                 {
119                     //以下操纵IE Shell
120                     HTMLInputElement loginname = document.getElementById("input1") as HTMLInputElement;
121                     if (loginname != null)
122                     {
123                         loginname.value = "用户名";
124                     }
125                     HTMLInputElement pwd = document.getElementById("input2") as HTMLInputElement;
126                     if (pwd != null)
127                     {
128                         pwd.value = "密码";
129                     }
130                     //HTMLInputButtonElement imagecode = document.getElementById("ctl00_CPH_Content_tb_ExPwd") as HTMLInputButtonElement;
131                     //if (imagecode != null)
132                     //{
133                     //    Console.Write("输入验证码:");
134                     //    //控制台窗口输入验证码
135                     //    string code = Console.ReadLine();
136                     //    imagecode.value = code;
137                     //}
138                     HTMLButtonElement signin = document.getElementById("signin") as HTMLButtonElement;
139                     if (signin != null)
140                     {
141                         signin.click();
142                         documentComplete.WaitOne(1000, true);
143                     }
144                 }
145             }
146             catch (Exception ex)
147             {
148                 Console.WriteLine(ex.Message);
149             }
150             
151         //    ie.Quit();
152         }
153 
154         private static void ie_DocumentComplete(object pDisp, ref object URL)
155         {
156             documentComplete.Set();
157         }
158     }
159 }

使用前关闭所有IE浏览器,然后运行,否则会出现异常,目前没解决