【轉】C# winform 載入網頁 類比鍵盤輸入自動接入訪問網路

來源:互聯網
上載者:User

標籤:app   origin   wireless   儲存   src   sas   void   ssas   []   

【轉】C# winform 載入網頁 類比鍵盤輸入自動接入訪問網路

聲明:

本文原創,首發於部落格園 http://www.cnblogs.com/EasyInvoice/p/6070563.html 轉載請註明出處。

背景:

由於所在辦公室網路限制,筆者每天都使用網路都要先串連無線網。如,輸入授權使用者資訊登入後才能使用WIFI。

喪心病狂的是該網頁Cookie 到期時間為24小時,所以每天重複以下動作:開啟瀏覽器 -> 手動輸入 工號密碼、密碼 -> 點擊“登入”按鈕。

作為一個懶出天際的程式員,逃避這種重複勞動是必須滴~~

解決方案:

建立一個C# 應用程式,使用WebBrowser控制項載入該頁面,類比鍵盤輸入帳號、密碼,把使用者配置分別賦值給兩個控制項,然後調用按鈕的點擊事件。

具體步驟:

1. 開啟登入頁面,按F12查看網頁源碼,可以看到2個輸入控制項名分別為 "user", "password",登入按鈕名為"Login",如:

2. 類比事件

類比過程具體又可分為以下4個步驟:

step 1. 讀取設定檔中的 登入網址、帳號、密碼

step 2. 載入網頁

step 3. 類比鍵盤操作

step 4. 退出程式

關鍵區段代碼

        /// <summary>        /// 載入網頁,類比登入動作處理        /// </summary>        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();        }        /// <summary>        /// 載入網頁,類比登入動作處理        /// </summary>        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();        }        /// <summary>        /// 調用 Html 元素的方法        /// </summary>        /// <param name="em"></param>        /// <param name="methodname"></param>        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);            }        }        /// <summary>        /// 擷取取設定檔節點值        /// </summary>        /// <param name="arrays"></param>        /// <returns></returns>        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();        }        /// <summary>        /// 顯示資訊        /// </summary>        /// <param name="p"></param>        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    {        /// <summary>        /// Required designer variable.        /// </summary>        private System.ComponentModel.IContainer components = null;        /// <summary>        /// Clean up any resources being used.        /// </summary>        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>        protected override void Dispose(bool disposing)        {            if (disposing && (components != null))            {                components.Dispose();            }            base.Dispose(disposing);        }        #region Windows Form Designer generated code        /// <summary>        /// Required method for Designer support - do not modify        /// the contents of this method with the code editor.        /// </summary>        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;    }}

  運行

 

【轉】C# winform 載入網頁 類比鍵盤輸入自動接入訪問網路

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.