最近學習C#網路程式設計中,想實現網頁自動登入並提交GET/POST資訊,再實現迴圈登入不斷髮送報文給伺服器,伺服器傳送訊息給客戶端記錄能登入的賬戶和密碼,做到後面實現繞過驗證碼、動態抓取登入位置等,但由於資料很少、進度緩慢,下面這篇文章僅供大家交流閱讀。
也許你可能看過一篇文章關於C#實現POST提交方式中三種提取網頁HTML的方法:WebBrowser、WebClient、HttpWebRequest。我也看了很多人的部落格,尤其是關於WebBrowser和HttpWebRequest方法,但能力有限,很多東西還是沒有實現成功,還在繼續研究中。
下面先講講我該階段唯一的收穫:通過WebBrowser實現簡單瀏覽器自動登入技術。WebBrowser是一個簡單瀏覽器,允許使用者在該控制元件內瀏覽網頁,其實就是封裝了IE介面,實現GET/POST功能在WebBrowser的DocumentCompeted中實現。
在“C#網路程式設計之最簡單瀏覽器實現”(http://blog.csdn.net/eastmount/article/details/9490009)中我通過WebBrowser控制元件完成了一個最簡單的瀏覽器,這裡實在該程式基礎上繼續完成網頁自動登入的功能實現。
一. 介面設計
介面如上,主要是新增一個WebBrowser控制元件。設定的詳細引數見網址:http://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 = "http://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郵箱的實現:http://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">登 錄</button>
注意:上面的值“Eastmount”、“Eastmount”是被我修改過的值,你需要填寫的是自己的密碼和使用者名稱。同時登入時會出現一些亂碼,這些都是編碼問題,有可能有的網站能通過該方法實現自動登入,有的網站不行,但我提供的是一種思想!
在執行時,我首先嚐試的是百度網站,但由於異地登入有驗證碼最終失敗;然後採用:https://passport.csdn.net/account/login但好像CSDN是通過https安全方式登入也失敗,所以該例僅提供思想參考,最後通過163郵箱和本地網頁實現了該功能。
本地網址: http://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實現自動登入)
http://blog.csdn.net/sonicrang/article/details/5878611
2.C#中的WebBrowser控制元件的使用—方培工作室(詳細講述了WebBrowser控制元件中的使用方法)
http://www.cnblogs.com/txw1958/archive/2012/09/24/CSharp-WebBrowser.html
3.C#實現POST提交方式—陳立國(最經典文章之一,詳細講述了三種方法:WebBrowser、WebClient、HttpWebRequest但不知道最初是那位大師人物寫的)
http://www.cnblogs.com/cgli/archive/2011/04/09/2010497.html
5.C#自動登入Login程式碼—珍惜當下(比較完整的程式碼講述登入功能,僅有程式碼)
http://hi.baidu.com/zkbob22/item/da897035b65516362e0f8181
6.暴力破解網站密碼—相信自己(一個暴力破解全程式碼,重點是思想,萬能密碼嘗試,但我沒有實現成功)
http://blog.sina.com.cn/s/blog_4de05339010109g7.html
7.關於C#模擬登入的論壇討論(其中一些程式碼比較優秀)
http://bbs.csdn.net/topics/330239749?page=1
8.程式設計程式碼實現網站自動登入C#(與我的思想方法類似)
http://wenku.baidu.com/view/bc46ff9d6bec0975f465e208.html
9.C# WinForm WebBrowser模擬登入打卡—Kelvin峰(過於高深,有待以後研究)
http://blog.csdn.net/llftc/article/details/7036746