博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# winform 加载网页 模拟键盘输入自动接入访问网络
阅读量:6680 次
发布时间:2019-06-25

本文共 12125 字,大约阅读时间需要 40 分钟。

声明:

本文原创,首发于博客园  转载请注明出处。

背景:

由于所在办公室网络限制,笔者每天都使用网络都要先连接无线网。如下图,输入授权用户信息登录后才能使用WIFI。

丧心病狂的是该网页Cookie 过期时间为24小时,所以每天重复以下动作:打开浏览器 -> 手动输入 工号密码、密码 -> 点击“登录”按钮。

作为一个懒出天际的程序员,逃避这种重复劳动是必须滴~~

解决方案:

创建一个C# 应用程序,使用WebBrowser控件加载该页面,模拟键盘输入账号、密码,把用户配置分别赋值给两个控件,然后调用按钮的点击事件。

具体步骤:

1. 打开登录页面,按F12查看网页源码,可以看到2个输入控件名分别为 "user", "password",登录按钮名为"Login",如下图:

2. 模拟事件

模拟过程具体又可分为以下4个步骤:

step 1. 读取配置文件中的 登录网址、账号、密码

step 2. 加载网页

step 3. 模拟键盘操作

step 4. 退出程序

关键部分代码

///         /// 加载网页,模拟登录动作处理        ///         private void ProcessLogin()        {            // 验证配置文件            if (string.IsNullOrEmpty(url))            {                ShowMsg("配置文件错误");                return;            }            ShowMsg("正在加载登录网页...");            // 加载网页            webBrowser1.Navigate(url);            //等待浏览器控件加载完成            while (webBrowser1.ReadyState != WebBrowserReadyState.Complete)            {                Application.DoEvents();            }            ShowMsg("加载完毕!");            //模拟登录事件            LoginSimulation(webBrowser1);        }

 

//模拟登录事件        private void LoginSimulation(WebBrowser wb)        {            try            {                ShowMsg(string.Format("账户名:[{0}],输入账户密码...", userName));                ShowMsg(string.Format("请确保配置文件中的用户及登录密码准确可用"));                // 网页元素                HtmlDocument doc = wb.Document;                HtmlElement emuser = doc.GetElementById("user");                SetHtmlValue(emuser, userName);//设置账户                HtmlElement empassword = doc.GetElementById("password");                SetHtmlValue(empassword, password);//设置密码                HtmlElement btn = doc.GetElementById("Login");                InvokeMethod(btn, "click");//调用 登录按钮的 Click 事件 提交配置                ShowMsg("完成!");                TimeSpan used = DateTime.Now - begin;//用时                ShowMsg(string.Format("用时: {0}.{1}s" , used.Seconds, used.Milliseconds));                ShowMsg("即将自动退出...");                //启动计时器,4s 后自动退出当前程序                Timer timer = new Timer();                timer.Interval = 4000;                timer.Tick += new EventHandler(timer_Tick);                timer.Start();            }            catch (Exception ex)            {                ShowMsg(ex.Message);            }        }

   

 编译应用程序,把快捷方式添加到开机启动项。这样开机时就会自动运行程序接入网络啦!!!

不足之处:

1. 接入网络成功后网页会打开如下的页面,因此模拟登录成功后也会启动浏览器打开页面。如果能禁用就更好了。

 

 2. 只能简单地提示模拟操作完成,调用登录按钮事件后没有检测是否登录成功。

关于以上2点不足,如果有人找到解决办法,就请大胆大意地私信笔者或留言吧 ^_^

适用场景:

本应用演示了如何在客户端加载页面并模拟键盘鼠标操作,适用于用户访问许可配置保存于服务器的登录网站,那些配置要保存到 Session(会话)的网站访问 例如 某宝网站登录 就不适用了,除非继续使用应用程序中的 WebBrowser 控件操作而不用外部浏览器。

附 界面全部代码及运行截图

(代码有点乱,将就着看 -_-|||)

后台代码:

using System;using System.IO;using System.Text;using System.Windows.Forms;namespace LoginAssistant{    public partial class MainForm : Form    {        public MainForm()        {            InitializeComponent();            readConfigFile();            ProcessLogin();        }        ///         /// 加载网页,模拟登录动作处理        ///         private void ProcessLogin()        {            // 验证配置文件            if (string.IsNullOrEmpty(url))            {                ShowMsg("配置文件错误");                return;            }            ShowMsg("正在加载登录网页...");            // 加载网页            webBrowser1.Navigate(url);            //等待浏览器控件加载完成            while (webBrowser1.ReadyState != WebBrowserReadyState.Complete)            {                Application.DoEvents();            }            ShowMsg("加载完毕!");            //模拟登录事件            LoginSimulation(webBrowser1);        }        //模拟登录事件        private void LoginSimulation(WebBrowser wb)        {            try            {                ShowMsg(string.Format("账户名:[{0}],输入账户密码...", userName));                ShowMsg(string.Format("请确保配置文件中的用户及登录密码准确可用"));                // 网页元素                HtmlDocument doc = wb.Document;                HtmlElement emuser = doc.GetElementById("user");                SetHtmlValue(emuser, userName);//设置账户                HtmlElement empassword = doc.GetElementById("password");                SetHtmlValue(empassword, password);//设置密码                HtmlElement btn = doc.GetElementById("Login");                InvokeMethod(btn, "click");//调用 登录按钮的 Click 事件 提交配置                ShowMsg("完成!");                TimeSpan used = DateTime.Now - begin;//用时                ShowMsg(string.Format("用时: {0}.{1}s" , used.Seconds, used.Milliseconds));                ShowMsg("即将自动退出...");                //启动计时器,4s 后自动退出当前程序                Timer timer = new Timer();                timer.Interval = 4000;                timer.Tick += new EventHandler(timer_Tick);                timer.Start();            }            catch (Exception ex)            {                ShowMsg(ex.Message);            }        }        //自动退出        void timer_Tick(object sender, EventArgs e)        {            this.Close();        }        ///         /// 调用 Html 元素的方法        ///         ///         ///         private void InvokeMethod(HtmlElement em, string methodname)        {            if (em == null) return;            object response = em.InvokeMember(methodname); //触发submit事件         }        //赋值于 Html 元素        private void SetHtmlValue(HtmlElement em, string valueStr)        {            if (em == null) return;            em.SetAttribute("value", valueStr);        }        //读取配置文件        private void readConfigFile()        {            try            {                if(!File.Exists(fileName))return;                using (FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read))                {                    StreamReader m_streamReader = new StreamReader(fs);                    m_streamReader.BaseStream.Seek(0, SeekOrigin.Begin);                    string strLine = m_streamReader.ReadLine();                    while (strLine != null)                    {                        string[] data = strLine.Split('=');                        switch (data[0])                        {                            case "user":                                userName = getValue(data);                                break;                            case "password":                                password = getValue(data);                                break;                            case "url":                                url = getValue(data);                                break;                            default:                                break;                        }                        strLine = m_streamReader.ReadLine();                    }                    m_streamReader.Close();                    fs.Close();                }            }            catch (Exception ex)            {                ShowMsg(ex.Message);            }        }        ///         /// 获取取配置文件节点值        ///         ///         /// 
private string getValue(string[] arrays) { StringBuilder sb = new StringBuilder(); sb.Append(arrays[1]); for (int i = 2; i < arrays.Length; i++) { sb.Append("=" + arrays[i]); } return sb.ToString(); } /// /// 显示信息 /// /// private void ShowMsg(string p) { rtbStatus.AppendText(string.Format("[{0}] {1}\r\n",DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"), p)); } #region variables //账号、密码 private string userName = "allliangkaiyu"; // default private string password = "vicky"; private string url = string.Empty; //登录页面 string fileName = "WirelessAssistantConfig.ini"; //配置文件名 WebBrowser webBrowser1 = new WebBrowser();//浏览器控件 private DateTime begin = DateTime.Now;//当前时刻 #endregion #region 按钮事件 //登录 private void btnRegister_Click(object sender, EventArgs e) { ProcessLogin(); } //退出 private void btnExit_Click(object sender, EventArgs e) { this.Close(); } #endregion }}

  designer.cs 代码:

namespace LoginAssistant{    partial class MainForm    {        ///         /// Required designer variable.        ///         private System.ComponentModel.IContainer components = null;        ///         /// Clean up any resources being used.        ///         /// true if managed resources should be disposed; otherwise, false.        protected override void Dispose(bool disposing)        {            if (disposing && (components != null))            {                components.Dispose();            }            base.Dispose(disposing);        }        #region Windows Form Designer generated code        ///         /// Required method for Designer support - do not modify        /// the contents of this method with the code editor.        ///         private void InitializeComponent()        {            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm));            this.btnInput = new System.Windows.Forms.Button();            this.rtbStatus = new System.Windows.Forms.RichTextBox();            this.btnExit = new System.Windows.Forms.Button();            this.SuspendLayout();            //             // btnInput            //             this.btnInput.Font = new System.Drawing.Font("Consolas", 10F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134)));            this.btnInput.Location = new System.Drawing.Point(46, 235);            this.btnInput.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3);            this.btnInput.Name = "btnInput";            this.btnInput.Size = new System.Drawing.Size(86, 36);            this.btnInput.TabIndex = 0;            this.btnInput.Text = "重新登录";            this.btnInput.UseVisualStyleBackColor = true;            this.btnInput.Click += new System.EventHandler(this.btnRegister_Click);            //             // rtbStatus            //             this.rtbStatus.BackColor = System.Drawing.SystemColors.Control;            this.rtbStatus.Dock = System.Windows.Forms.DockStyle.Top;            this.rtbStatus.Location = new System.Drawing.Point(0, 0);            this.rtbStatus.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3);            this.rtbStatus.Name = "rtbStatus";            this.rtbStatus.Size = new System.Drawing.Size(322, 229);            this.rtbStatus.TabIndex = 1;            this.rtbStatus.Text = "";            //             // btnExit            //             this.btnExit.Font = new System.Drawing.Font("Consolas", 10F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134)));            this.btnExit.ForeColor = System.Drawing.Color.Red;            this.btnExit.Location = new System.Drawing.Point(150, 235);            this.btnExit.Name = "btnExit";            this.btnExit.Size = new System.Drawing.Size(75, 36);            this.btnExit.TabIndex = 2;            this.btnExit.Text = "退出";            this.btnExit.UseVisualStyleBackColor = true;            this.btnExit.Click += new System.EventHandler(this.btnExit_Click);            //             // MainForm            //             this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 13F);            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;            this.ClientSize = new System.Drawing.Size(322, 274);            this.Controls.Add(this.btnExit);            this.Controls.Add(this.rtbStatus);            this.Controls.Add(this.btnInput);            this.Font = new System.Drawing.Font("Consolas", 10F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));            this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));            this.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3);            this.Name = "MainForm";            this.Text = "无线网络助手 V20160908© vicky";            this.ResumeLayout(false);        }        #endregion        private System.Windows.Forms.Button btnInput;        private System.Windows.Forms.RichTextBox rtbStatus;        private System.Windows.Forms.Button btnExit;    }}

  运行截图

 

转载于:https://www.cnblogs.com/EasyInvoice/p/6070563.html

你可能感兴趣的文章
Faster-rnnlm代码分析3 - EvaluateLM(前向计算ForwardPropagate)
查看>>
Python4周 入职培训的过程
查看>>
Linux 下的下载文件命令
查看>>
hibernate generator class=xxx id详解
查看>>
关于安装黑苹果
查看>>
Sublime Text 3 安装
查看>>
spring源代码分析
查看>>
分析UIWindow
查看>>
hibernate 批量处理数据
查看>>
Redis时延问题分析及应对
查看>>
HDU 4915 Parenthese sequence _(:зゝ∠)_ 哈哈
查看>>
I.MX6 修改调试串口号(ttymx0 -> ttymxc2)
查看>>
mips cfe命令
查看>>
[转]Spring数据库读写分离
查看>>
TELNET协议规范
查看>>
View and Data API Tips : Conversion between DbId and node
查看>>
如何不给红包就看朋友圈照片?get✔️
查看>>
金额显示,每3位加逗号
查看>>
第四话-开放封闭原则
查看>>
Atitit. 如何判断软件工程师 能力模型 程序员能力模型 项目经理能力模型...
查看>>