摘要:[VB6]自動登陸網路站點詳解(二):Inet控制項與WebBrowser控制項配合使用
| URL | 帳號 | 密碼 | 其他參數 |
SOHU郵箱 | http://login.sohu.com/chkpwd.php | UserName | Password | |
網易通行證 | http://reg4.163.com/CheckUser.jsp | username | password | |
CSDN通行證 | http://www.csdn.net/member/logon.asp | login_name | password | cookietime=0& x=42&y=10 |
表格中的參數就是按照前面介紹的方法得到的,在程式中將要用到。
先說明一點, WebBrowser也是可以直接POST資料給Web伺服器的,我將在第四部分給出代碼。這裏先看看Inet與WebBrowser相互配合的效果。
新建一個工程,部件中勾選中“Microsoft Internet Transfer Controls
Dim URL1(2) As String: Dim URL2(2) As String
Dim C1(2) As String: Dim C2(2) As String: Dim C3(2) As String
Private Sub Form_Load()
Text1.Text = ""
Text2.Text = ""
Text2.PasswordChar = "*"
Combo1.AddItem "SOHU郵箱", 0
Combo1.AddItem "網易通行證", 1
Combo1.AddItem "CSDN通行證", 2
Combo1.AddItem "請選擇一個登陸", 3
Combo1.Text = Combo1.List(3)
URL1(0) = "http://login.sohu.com/chkpwd.php": URL2(0) = "http://www34.mail.sohu.com/control/entry"
URL1(1) = "http://reg4.163.com/CheckUser.jsp": URL2(1) = "http://reg4.163.com/Main.jsp?"
URL1(2) = "http://www.csdn.net/member/logon.asp": URL2(2) = "http://www.csdn.net/Member/Passport.asp"
C1(0) = "UserName": C2(0) = "Password": C3(0) = ""
C1(1) = "username": C2(1) = "password": C3(1) = ""
C1(2) = "login_name": C2(2) = "password": C3(2) = "cookietime=0&x=42&y=10"
End Sub
Private Sub Form_Resize()
If Me.WindowState <> 1 Then
WebBrowser1.Left = 10
WebBrowser1.Width = Me.Width - 120
WebBrowser1.Height = Me.Height - 800
End If
End Sub
Private Sub Text2_KeyUp(KeyCode As Integer, Shift As Integer)
If KeyCode <> 13 Then Exit Sub
If Combo1.ListIndex = 3 Then MsgBox "請選擇一個登陸": Exit Sub
If Text1.Text = "" Then MsgBox "請輸入用戶名": Exit Sub
If Text2.Text = "" Then MsgBox "請輸入密碼": Exit Sub
Dim strFormData As String
strFormData = C1(Combo1.ListIndex) + "=" + Text1.Text + "&" + C2(Combo1.ListIndex) + "=" + Text2.Text + "&" + C3(Combo1.ListIndex)
Inet1.Execute URL1(Combo1.ListIndex), "Post", strFormData, "Content-Type: application/x-www-form-urlencoded "
Do Until Inet1.StillExecuting = False '這裏阻塞前面的Inet1,確保登陸成功之後再取頁面,你可以將此Do取消了試一次。
DoEvents
If Combo1.ListIndex = 1 Then
WebBrowser1.Navigate URL2(Combo1.ListIndex) + C1(Combo1.ListIndex) + "=" + Text1.Text
Else
WebBrowser1.Navigate URL2(Combo1.ListIndex)
End If
End Sub
大家可以挑選一個自己已經註冊過的站點看看效果。
可以看到,登陸成功之後, Inet與WebBrowser是可以保持住同一個Session對話的!不過當我們在WebBrowser中顯示出來的頁面上點擊了一個連接之後,請求卻不能成功(請讀者自己試一下,在登陸成功的站點中任意點擊一個與用戶相關的連接,彈出來的將是一個“你沒有登陸”的頁面)。為什麼?
因為我們現在點擊的連接還是使用IE(作業系統默認的流覽器)打開的,而IE請求頁面的時候使用的是伺服器新發送過來的Session,這個新的Session與你在WebBrowser中使用的Session也就是身份ID不一樣,至少伺服器是這麼認為的,它以為是另一個沒有登陸的用戶。所以說Session的作用範圍不是對整個客戶機的,通過實際的代碼可以很好的理解這一點。(可以利用這一點,使用代碼在一台電腦上實現兩個以上的用戶同時登陸,甚至還能對同一主題進行無縫發言。)
所以接下來我們要使頁面繼續停在WebBrowser中顯示。因為很顯然,既然WebBrowser與Inet是可以保持住同一個Session對話的,那麼WebBrowser與WebBrowser內部自然也是可以的!
要添加的代碼很簡單——
Private Sub WebBrowser1_NewWindow2(ppDisp As Object, Cancel As Boolean)
Dim frm2 As New Form2
frm2.WebBrowser1.RegisterAsBrowser = True
Set ppDisp = frm2.WebBrowser1.Object
frm2.Show
End Sub
然後在工程中添加一個Form2,上面再放一個WebBrowser1,調整好位置,Form2的代碼視窗添加上以下代碼:
Private Sub Form_Load()
WebBrowser1.Silent = True
End Sub
Private Sub Form_Resize()
If Me.WindowState <> 1 Then
WebBrowser1.Left = 10
WebBrowser1.Width = Me.Width - 120
WebBrowser1.Height = Me.Height - 600
End If
End Sub
Private Sub WebBrowser1_NewWindow2(ppDisp As Object, Cancel As Boolean)’這裏為了避免在Form1中同樣發生的事情。
Dim frm2 As New Form2
frm2.WebBrowser1.RegisterAsBrowser = True
Set ppDisp = frm2.WebBrowser1.Object
frm2.Show
End Sub
利用Inet發送登陸請求,WebBrowser流覽實際頁面,的確是個很不錯的構思,在登陸站點相對教少的情況下應該是沒有什麼問題的。但是這也會使事情變得更加複雜。除了不能缺少的POST位址(URL1)、帳號參數(C1)、密碼參數(C2)、其他參數(C3)之外,還必須要有供WebBrowser請求流覽的頁面位址參數(URL2)。 雖然只是多了一個參數,但卻添加了很多麻煩(比如網易郵箱的請求頁面是根據用戶的帳號名自動生成的,不固定)。只有利用WebBrowser直接POST資料才能避免第四個參數。但是流覽器的介面以及功能卻是一個比較麻煩的問題(除非你不嫌麻煩,自己再動手寫一個)。