在VB上轻松编写读取图片验证码的网络程序,转

现在很多网页上的登录都有一个验证码(如Tencent公司里的网站里也有不少),主要就是防那些灌水机、朔雪等那些网页DDos的工具。有了图片验证码基本上就可以防止这类事情的发生。

前些日子,我刚从硬盘的底层找出我多年没有整理过的QQ,如果一个一个在腾讯的网页上刷新验证是那么麻烦,特别是在网页上等那个图片验证码时间是那么的长,一下子计上心头,想法写个比较自动化的程序。

当初我打开VB6时也不知如何入手,特别那个图片码是如何写一个程序来读取。其实我们只要在工程里加一个“WebBrowser”控件,就可以随意读取网页上的任何东西,这样就不再专门为不同的图片码写一个显示程序。在VB6上添加“WebBrowser”控件。如图1所示。

图1

应用此部件后在VB6的左边控件栏里就会出现一个地球的按钮。然后在窗体上绘出它的位置以及大小。如图2所示。(其实这个程序我早已写好的,现在拿出来解释),那个带编辑点的控件就是“WebBrowser”。

图2

载入此控件后也不用再编辑什么的,很方便,因为其实上这个控件的行为都会在控钮上触发。在这先讲讲图2里的相关控件关系,在图2的最顶那个“CODE:….”那个文字输入框就是在那里读取图片验证码的URL,http://verify.qq.com/getimage这个是Tencent里QQ申请密保图片验证码的URL。这个URL如何才能得到呢?这个获取也很容易,在浏览器里右击那个图片验证码属性就可以看到它的URL。如图3所示。

图3

下面那个“Post:”那个文字输入框就是我们最后提交数据的目的页面,这就简短的介绍这里。

接下来就是那个“WebBrowser”这个控件如何触发它去读取网页。就这那个“刷新验证码”的按钮,里面的代码这样:“WebBrowser1.Navigate Trim(Text4.Text)”,这里的“Text4.Text”就是那个得到验证码的URL。如图4所示。就是这个“WebBrowser”连接验证码的URL的结果。

图4

来到这,有一个问题就是服务器发送出来的验证码是与那个会话结合起来才有效的,否则服务器根本不知你是那个会话,至于那个会话其实就是那个Cookie,看下面。如图5所示。它是我用WS找IE的Http报文的包,里面有比较多有用的信息。

图5

这个会话的ID码我们把数据Post回去时一定要把这个提交上去,要不然你返回了正确的图片验证码也没有用。至于其中的会话ID如何在VB6里读取自如呢?

在“WebBrowser”的控件里有一个类方法可以调用方法过程来得来,且很方便。在窗体里那个“View”按钮里加入以下两行重要的代码。

Dim doc As IHTMLDocument2 //通过定义Doc对像数据类型

Set Doc = WebBrowser1.Document //通过Set 来建立Doc对像。

如果要读取“WebBrowser”已打开网页的会话ID就可以通过以下的代码就要以取得:

Msgbox “会话的ID为:”&doc.cookie,vbokonly,”读取会话ID”来到这里我们已成功了一半了,紧接着的就是如何把得到的数据POST到目的页面。Post数据有几种方法,一般是用WinSock来建立TCP/IP的HTTP连接,这样要重新的封包HTTP报文,比较好用但有些麻烦,不过它的灵活性也比较的好。但今天我没有打算是用它来做数据Post,取而代之的就是用那个“MSXML2.XMLHTTP”,这个一般有装过数据处理的软件或Office软件都会有存在,且它用起来真的比较方便,只要在VB里用“CreateObject”就可以了。

在封包Http报文时我们先看看IE是如何Post数据到目的页面的,下面如图6所示。就是我用WS找取IE浏览器Post数据的报文,可作参考用。

图6

图6里的那个Cookie以及我Post出去的数据在这里可以看得一清二楚了,特别是那个Cookie的那些会话变量,它是与图5里的那个Cookie会话一样的,因为我没有关闭过IE浏览器。

理清了IE的工作过程后,下面就轮到我们自己来做了。下面的这一段代码是比较完整,它是当我触发那个“View”按钮里的代码:

Private Sub Command2_Click()

Dim doc As IHTMLDocument2

Set doc = WebBrowser1.Document

Set objXMLHTTP = CreateObject("MSXML2.XMLHTTP")//建立XMLHTTP对像组件

//下面的这个“Trim(Text5.Text)”是读取要Post的网页

objXMLHTTP.open "POST", Trim(Text5.Text), False

//以下的一连几个setRequestHeader都是设置HTTP的报文变量头,有些是比较重要的。

objXMLHTTP.setRequestHeader "Referer", "http://service.qq.com/psw/psw_id.htm"

objXMLHTTP.setRequestHeader "accept -language", "zh -cn"

objXMLHTTP.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"

objXMLHTTP.setRequestHeader "cache -Control", "no - cache"

On Error Resume Next

//下面这行代码是最重要的,它是把上一环节里取得的图片验证码的会话ID读取并设置好准备POST的HTTP报文头。

objXMLHTTP.setRequestHeader "Cookie", doc.cookie

//下面这行代就是把我们要Post的数据重新封包好

q_post = "uin=" & Text1.Text & "&password=" & Text2.Text & "&code=" & Text3.Text & "step2=1&image.x=35&image.y=8"

objXMLHTTP.send (q_post)//当一切搞好后,这里就是把我们之前细心封包的数据一次Post到目的页面

If InStr(objXMLHTTP.responseText, "name=certtype") > 0 Then

MsgBox "此QQ没有密保!", vbOKOnly + 64, "恭喜!!!"

Else

MsgBox "此QQ可能已有密保!", vbOKOnly + 16, Form1.Caption

End If

Set objXMLHTTP = Nothing

Text3.Text = ""

If Err Then

MsgBox "内部出错!", vbOKOnly + 16, Form1.Caption

End If

End Sub

就这样,一个读取图片验证码的网络程序已基本上完成了