VB6在90年代时很流行,随着时代的变迁,VB.Net\C#的出现,VB6开始慢慢被淡忘。由于VB6本身有他致命的缺点,导致份额日渐下降。但是他的优点也是非常明显的。通过本系列文章,记录我这几天开发一个QQ小游戏辅助工具的历程,让大家了解和重温VB6。
当然,在本次代码中,由于时间限制,我不能将代码写得完美。或许有些不规范和容错能力不强,请大家见谅。当然这个辅助工具也不是我第一次的作品。之前还有几个。本次开发也是总结之前的经验作为一个经验之谈。
首先我们谈一下VB6在常规情况下的优缺点。
优点 |
IDE精简 |
生成程序较为绿色 |
代码可操作能力较强,属于面向过程编程 |
支持的文档和示例较多 |
当然他的缺点也是多线程,不支持64位等等。每一个语言都有他自己的优缺点,我们只需要适当运用,就可以在不同程序和需求中找到自己合适的,快速的语言进行开发自己的项目。
好了,我们现在开始进行我们第一步的开发。就是准备工作。首先本次我们只需要两个必备软件。
1、VB6精装版(http://download.csdn.net/source/888517)
2、HttpWatch Professional Edition(http://www.crsky.com/soft/3455.html)
安装完毕后,我们就要开始进入编程第一步。
首先我们要进行Web游戏操作,第一步是登陆。首先我们需要了解一个概念。网页状态是如何确定的(session、Cookies)。我在之前看不少博文,很多人在登陆时遇到不少阻拦,因为VB6的MD5加密方式是基于字符串,而腾讯的MD5_3加密方式是基于字节。所以要运算出验证码、获取验证码图片,相对于个新手来说是一个非常用难度的操作,腾讯还会不定时更新登陆的。以下我教大家如何简易绕过这个登陆,并且做到一个不用输入账号密码的效果。
我们首先观察一个地方
我们能否借花敬佛,让腾讯帮我们完成这个登陆过程呢?其实是可以的。
首先我贴出一个JS代码,看看大家明白我想干什么。
document.getElementById('main').getElementsByTagName('div')[0].style.zIndex = 99999; document.getElementById('main').getElementsByTagName('div')[0].style.position='fixed'; document.getElementById('main').getElementsByTagName('div')[0].style.left = 0; document.getElementById('main').getElementsByTagName('div')[0].style.top = 0; document.getElementById('main').getElementsByTagName('div')[0].style.margin = 0;
我让这个登陆框的位置移动到左上角,因为好像ie6不支持fixed属性,我也没时间在不同ie版本测试。不过大概原理都是这样子呢。
在VB6创建一个窗体,在工具栏中引用以下组件。
第一个是IE的窗口,而第二个是以后会用到的信息显示的组件(listview)。
将IEFrame随意改个名字叫"W” ,然后我们双击窗体,获取其Load事件。
Private Sub Form_Load() W.Navigate "http://pengyou.qq.com/index.html" W.Width = 0 W.Left = -100 End Sub让窗体打开时首先读入校友的首页。在没完全读取前我们先将他隐藏。不让用户看到。 接下来,我们选择IEFrame中的DocumentComplete事件,让其在加载完毕后,帮我做点事。
If url = "http://pengyou.qq.com/index.html" Then W.Document.parentWindow.execScript ("document.getElementById('main').getElementsByTagName('div')[0].style.zIndex = 99999;") W.Document.parentWindow.execScript ("document.getElementById('main').getElementsByTagName('div')[0].style.position='fixed';") W.Document.parentWindow.execScript ("document.getElementById('main').getElementsByTagName('div')[0].style.left = 0;") W.Document.parentWindow.execScript ("document.getElementById('main').getElementsByTagName('div')[0].style.top = 0;") W.Document.parentWindow.execScript ("document.getElementById('main').getElementsByTagName('div')[0].style.margin = 0;") W.Width = 6015 W.Left = 0 End If
好啦,我们看到一个可以自动登陆的效果了。那么我们如何获取登陆后的信息呢?我们继续在DocumentComplete事件中写入以下代码
If InStr(1, url, "http://home.pengyou.qq.com/index.php") > 0 Then W.Width = 0 W.Left = -100 Web_Mod.SetCookieString (W.Document.cookie) Main.Caption = Main.Caption & " - " & Public_Mod.decodeURI(Web_Mod.Cookies("name")) End If
代码意思是如果进入了首页,就表示登陆完成啦~我们就获取网页的cookie,将其登陆后的事情全部交给程序去处理。看样子浏览器的事情已经告一段落,我们也成功完美地登陆了。里面使用了2个函数,第一个是我自己编写的管理Cookies模块,和一个decode解码函数,现在你们可以先新建一个Web_Mod的模块,将代码放入去,以下是Cookie函数,在Web_Mod模块中
Public Cookies As Object Public openid As String Public openkey As String Public Sub SetCookieString(s As String) Set Cookies = CreateObject("Scripting.Dictionary") tmp = Split(s, ";") For i = 0 To UBound(tmp) If UBound(Split(tmp(i), "=")) > 0 Then Cookies.Add Trim(Split(tmp(i), "=")(0)), Trim(Split(tmp(i), "=")(1)) Else Cookies.Add Trim(Split(tmp(i), "=")(0)), "" End If Next End Sub Public Sub AddCookie(key As String, item As String) If Cookies Is Nothing Then If Cookies.Exists(key) = True Then Cookies(key) = item Else Cookies.Add key, item End If End If End Sub Public Sub RemoveCookie(key As String) If Not (Cookies Is Nothing) Then If Cookies.Exists(key) = True Then Cookies.Remove (key) End If End If End Sub Public Function GetCookieString() As String Dim cookie As String If Not (Cookies Is Nothing) Then arrKeys = Cookies.keys arrItems = Cookies.Items For i = 0 To Cookies.Count - 1 cookie = cookie & arrKeys(i) & "=" & arrItems(i) & "; " Next End If GetCookieString = cookie End Function
以下是关于文字的转换函数,在自建的Public_Mod模块中。
Public Function decodeURI(txt) Dim o As Object Set o = CreateObject("MSScriptControl.ScriptControl") o.Language = "Jscript" decodeURI = o.Eval("decodeURI('" & txt & "')") End Function Public Function decode(txt) Dim o As Object Set o = CreateObject("MSScriptControl.ScriptControl") o.Language = "Jscript" decode = o.Eval("'" & txt & "'") End Function这样一次帮IE穿马甲,很容易穿过了腾讯登陆页面。连页面UI都不需要我们做,验证码等也与我们无关。哈哈~当然也可以将代码写得更加严密,因为还会有登陆密码错误的情况,我还没考虑进去。不过这个应该算是那么多辅助工具最人性化的登陆方式了吧。好,今天先写到这里。下次是关于HttpWatch Professional Edition截包,和破解QQ校友的摩天大楼的思维。