閱讀471 返回首頁    go 小米 go 小米6


C# 網絡編程之網頁自動登錄 (一).使用WebBrower控件模仿登錄

      最近學習C#網絡編程中,想實現網頁自動登錄並提交GET/POST信息,再實現循環登錄不斷發送報文給服務器,服務器發送消息給客戶端記錄能登錄的賬戶和密碼,做到後麵實現繞過驗證碼、動態抓取登錄位置等,但由於資料很少、進度緩慢,下麵這篇文章僅供大家交流閱讀。
      也許你可能看過一篇文章關於C#實現POST提交方式中三種提取網頁HTML的方法:WebBrowser、WebClient、HttpWebRequest。我也看了很多人的博客,尤其是關於WebBrowser和HttpWebRequest方法,但能力有限,很多東西還是沒有實現成功,還在繼續研究中。
      下麵先講講我該階段唯一的收獲:通過WebBrowser實現簡單瀏覽器自動登錄技術。WebBrowser是一個簡單瀏覽器,允許用戶在該控件內瀏覽網頁,其實就是封裝了IE接口,實現GET/POST功能在WebBrowser的DocumentCompeted中實現。
      在“C#網絡編程之最簡單瀏覽器實現”(
https://blog.csdn.net/eastmount/article/details/9490009)中我通過WebBrowser控件完成了一個最簡單的瀏覽器,這裏實在該程序基礎上繼續完成網頁自動登錄的功能實現。

一.   界麵設計

      界麵如上,主要是添加一個WebBrowser控件。設置的詳細參數見網址:https://blog.csdn.net/eastmount/article/details/9490009
      重點
:點擊”WebBrowser1”控件為其在屬性對話框中添加一個事件DocumentCorr(Web瀏覽器控件中承載的文檔全部加載後發生)該程序主要的實現過程是:
      1.點擊按鈕button事件Click中添加簡單瀏覽器功能;
      2.再在DocumentCorr事件中查找用戶名、密碼、登錄按鈕三個html元素——HtmlElement,並賦值設置登錄狀態實現自動登錄。

二. 源代碼

      我看了很多博客代碼,但自己實現起來還是非常困難的,所以我填出了所有的代碼並詳細的注釋及實現過程,希望能幫助初學者,高手亦可鞏固知識,對否!同時最重要的是思想。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

//新添加命名空間
using System.Net;
using System.IO;

namespace HttpWeb
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        //雙擊"瀏覽"添加Click事件
        private void button1_Click(object sender, EventArgs e)
        {
            //獲取輸入的URL
            string url = textBox1.Text;
            //string url = "https://mail.163.com/";

            //創建http鏈接
            //HttpWebRequest對象實例:該類用於獲取和操作HTTP請求 var可改成HttpWebRequest
            var request = (HttpWebRequest)WebRequest.Create(url);   //創建WebRequest對象

            //HttpWebResponse對象實例:該類用於獲取和操作HTTP應答 var可改成HttpWebResponse
            var response = (HttpWebResponse)request.GetResponse();  //GetResponse:獲取答複

            //構造數據流對象實例
            Stream stream = response.GetResponseStream();  //GetResponseStream:獲取應答流
            StreamReader sr = new StreamReader(stream);    //從字節流中讀取字符

            //從流當前位置讀取到末尾並顯示在WebBrower控件中
            string content = sr.ReadToEnd();
            webBrowser1.DocumentText = content;
        }

        //web瀏覽器控件中承載的文檔全部加載後發生
        private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            //定義html元素 通過Name獲取控件值
            //HtmlElement tbUserid = webBrowser1.Document.All["userName"];
            //HtmlElement tbPasswd = webBrowser1.Document.All["password"];
            
            //定義html元素 通過ID獲取控件值 (用戶名 密碼 登錄按鈕)
            HtmlElement tbUserid = webBrowser1.Document.GetElementById("idInput");
            HtmlElement tbPasswd = webBrowser1.Document.GetElementById("pwdInput");
            HtmlElement btnSubmit = webBrowser1.Document.GetElementById("loginBtn");

            //三個元素其一為空返回 加載後才執行賦值 否則會出現為null值的崩潰錯誤
            if (tbUserid == null || tbPasswd == null || btnSubmit == null)
            {
                return;
            }
            
            //設置元素value屬性值 (用戶名 密碼值)
            tbUserid.SetAttribute("value", "Eastmount");
            tbPasswd.SetAttribute("value", "Eastmount");
            
            //執行元素的方法:如click submit
            btnSubmit.InvokeMember("click");     
        }
    }
}

      其實使用WebBrowser控件實現網頁自動登錄的核心代碼就是:

//獲取網頁元素 (用戶名 密碼 登錄按鈕)
HtmlElement tbUserid = webBrowser1.Document.GetElementById("idInput");
HtmlElement tbPasswd = webBrowser1.Document.GetElementById("pwdInput");
HtmlElement btnSubmit = webBrowser1.Document.GetElementById("loginBtn");

//用相應方法為元素賦值
tbUserid.SetAttribute("value", "Eastmount");
tbPasswd.SetAttribute("value", "Eastmount");
btnSubmit.InvokeMember("click");

三. 運行結果

      上麵源代碼中是自動登錄163郵箱的實現:https://mail.163.com運行程序,輸入網址即可實現自動登錄163郵箱。如圖:

      其中通過查找該登錄頁麵發現用戶名Id為“idInput”,密碼Id為“pwdInput”,登錄按鈕ID為“loginBtn”。如下圖id和name:
<inputclass="loginFormTdIpt"tabindex="1"title="請輸入帳號"id="idInput"name="username"type="text"maxlength="50"value=""..
<inputclass="loginFormTdIpt"tabindex="2"title="請輸入密碼"id="pwdInput"name="password"type="password" autocomplete="off"/>
<buttonid="loginBtn"class="btnbtn-login formSubmit"tabindex="6"type="submit">&nbsp;&nbsp;</button>

     注意:上麵的值“Eastmount”、“Eastmount”是被我修改過的值,你需要填寫的是自己的密碼和用戶名.同時登錄時會出現一些亂碼,這些都是編碼問題,有可能有的網站能通過該方法實現自動登錄,有的網站不行,但我提供的是一種思想!
      在運行時,我首先嚐試的是百度網站,但由於異地登錄有驗證碼最終失敗;然後采用:https://passport.csdn.net/account/login但好像CSDN是通過https安全方式登錄也失敗,所以該例僅提供思想參考,最後通過163郵箱和本地網頁實現了該功能。
      本地網址:
https://localhost:1165/WebTest/MyLogin.aspx 查看源代碼可以在用戶名的Id為”userName”,密碼Id為”password”,登錄按鈕為”loginButton”,用戶名和密碼為1,設置相應的值即可實現登錄。下圖為瀏覽器顯示本地登錄頁麵:

四.總結

      其實我由於最近研究HttpWebRequest、Cookies較多,更希望通過該類實現同樣功能,但編寫了幾個程序還是沒有實現,還在研究中。希望這篇文章能幫助到大家,也不知道我上麵的關於WebBrowser使用的敘述是否正確,如果有錯誤或不足之處,更希望大家指正,希望大家多多交流,相互學習共同進步!
      同時感謝一些博客的博主,下麵是一些關於WebBrowser該方麵的博客,有時間可以看看,我認為都是非常優秀的文章,同時我上麵講訴的核心思想都與下麵的相似的,感謝下麵的博主及文章:
 (By:Eastmount 2013-8-1 下午4點)
參考資料:
1.C#網頁自動填表自動登錄—sonicrang(最簡單的代碼闡述了使用WebBrowser實現自動登錄)
https://blog.csdn.net/sonicrang/article/details/5878611
2.C
#中的WebBrowser控件的使用—方培工作室(詳細講述了WebBrowser控件中的使用方法)
https://www.cnblogs.com/txw1958/archive/2012/09/24/CSharp-WebBrowser.html
3.C
#實現POST提交方式—陳立國(最經典文章之一,詳細講述了三種方法:WebBrowser、WebClient、HttpWebRequest但不知道最初是那位大師人物寫的)
https://www.cnblogs.com/cgli/archive/2011/04/09/2010497.html
5.C
#自動登錄Login代碼—珍惜當下(比較完整的代碼講述登錄功能,僅有代碼)
https://hi.baidu.com/zkbob22/item/da897035b65516362e0f8181
6
.暴力破解網站密碼—相信自己(一個暴力破解全代碼,重點是思想,萬能密碼嚐試,但我沒有實現成功)
https://blog.sina.com.cn/s/blog_4de05339010109g7.html
7
.關於C#模擬登錄的論壇討論(其中一些代碼比較優秀)
https://bbs.csdn.net/topics/330239749?page=1
8
.編程代碼實現網站自動登錄C#(與我的思想方法類似)
https://wenku.baidu.com/view/bc46ff9d6bec0975f465e208.html
9.C
# WinForm WebBrowser模擬登錄打卡—Kelvin峰(過於高深,有待以後研究)
https://blog.csdn.net/llftc/article/details/7036746 

最後更新:2017-04-03 16:48:47

  上一篇:go Javascript頁麵打印的頁眉頁腳的清除與設置
  下一篇:go LLVM對注釋的新增支持 @ WWDC 2013