VB网络编程(webbrowser+Inet+抓包封包+经验)

前端之家收集整理的这篇文章主要介绍了VB网络编程(webbrowser+Inet+抓包封包+经验)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

2012-03-02 12:10:10|分类 VB |标签 |字号订阅 @H_502_35@

网络的重要性不用我说,所以关于网络的编程对我我们来说也是非常重要,非常实用的!@H_502_35@

但是我在网络上却没有看到多少关于VB网络编程方面的知识,一方面是VB用的人比较少,不会用就说VB不好(个人认为学好VB以后C++、Java一看就会!);另一方面是大家不愿意公开这方面的知识,自己辛辛苦苦探索的,还得靠它吃饭,怎么可能轻易拿出来公布?但是社会要发展,人类要进步,为了让更多的人受益,为了让体现自己价值,我愿意分享自己对于网络编程的经验。我也是刚开始学,所以这篇文章难免有错误之处,而且认识也相对比较浅显,只是作为入门级的文章吧!@H_502_35@

用VB操作网页,主要有两种方法:一是模拟操作,即自动控制。二是POST,也就是发送消息(数据包)。这两种方式涉及到:Webbrowser控件、Inet控件、XMLHTTP对象。其中,Webbrowser控件主要用来模拟操作,让机器自动完成点击、选中、填写等操作;Inet控件和XMLHTTP对象主要是用来POST,即发送数据包,在不加载网页的情况下直接与服务器交互。下面开始讲解它们的应用。注:我在这里仅仅讨论操作网页,像聊天、文件传输在这不作为重点,毕竟这些相对来说还是比较少用的。@H_502_35@

webbrowser,这是一个比较基础的控件,关于它的学习资料,网上还是很多的。用它操作网页是一种看得见,摸得着的过程,基本的任务都能完成。经过半年的使用经验,总结一下它不能完成的任务:1.不能操作JS脚本。如果你操作的网页内容被放在了JS脚本里,那么就不要用这个控件了。2.不能点击Flash按钮。Flash按钮比在网页中较特殊,用webbrowser控件无法找到这个对象。我所遇到的就是这两条,当然肯定还有别的。下面通过一个万能代码来看一下这个控件:@H_502_35@

For lngIndex= 1 To WebBrowser1.Document.All.Length - 1@H_502_35@

If InStr(1,WebBrowser1.Document.All(lngIndex).outerhtml,"替换为你要查找的关键字") > 0 Then '查找关键字@H_502_35@

If UCase(WebBrowser1.Document.All(lngIndex).tagName) = "INPUT" Then '如果点击是超链接 把INPUT换成A@H_502_35@

' WebBrowser1.Document.All(lngIndex).Click '如果是模拟点击就用这个语句@H_502_35@

WebBrowser1.Document.All(lngIndex).Checked = True '如果是模拟选中复选框,就用这个语句@H_502_35@

Exit For@H_502_35@

End If@H_502_35@

End If@H_502_35@

Next@H_502_35@

用这个代码,可以灵活的模拟:点击按钮、点击超链接、操作复选框、操作下拉式菜单、填写数据。这个代码大概的意思:最外层循环遍历整个网页中的标签对象,然后用第二个循环去匹配这个对象中是否有我们期望的关键字,如果有的话,再判断这个标签对象的类型,一般情况下,超链接是A,其他的均为INPUT,注意一下一定要大写,因为从webbrowser中获取的网页源码全是大写的,与真实源码有差别。在最里边也就是操作语句了,如果是文本框输入就写成WebBrowser1.Document.All(lngIndex).Text = “期望的字符串”。如果是想点击按钮或者超链接就用WebBrowser1.Document.All(lngIndex).Click。如果是选中复选框WebBrowser1.Document.All(lngIndex).Checked = True。如果是下拉式菜单WebBrowser1.Document.All(lngIndex).Value = “对应的值”。基本的操作就是这些,轻松胜任。当然,用这个万能代码是在迫不得已的情况下才用的。如果网页很简单,按钮,输入框等有ID,那么直接写WebBrowser1.Document.All(“按钮的ID”).Click就可以点击按钮了,其他同理,输入ID即可。@H_502_35@

在实际使用中,我们会遇到一个非常头疼的问题:webbrowser操作网页必须等待网页加载完成,否则会找不到标签对象。网上比较流行的做法是用webbrowser的Busy方法等待网页加载完成,但是根本没有效果。在此我分享一下自己的经验,想想我们人是怎么判断网页是否加载完成的?因为出现了一些新的信息,因为有变化!我们当然也可以让程序这么去判断。我们可以在新网页中找一个固定存在的字符,用while循环不断获取webbrowser的网页源码,直到出现这个固定字符,我们就认为加载完成。例如,在目的网页里会出现123这个字符,那么:@H_502_35@

While Instr(WebBrowser1.Document.All(1).outerhtml,”123”) =0@H_502_35@

Doevents@H_502_35@

Wnd@H_502_35@

这样写可以很好的达到等待网页加载完成的目的。这里WebBrowser1.Document.All(1).outerhtml是webbrowser中所有的标签对象,基本上可以说是获取网页源码。如果用这个语句无法获取就用WebBrowser1.Document.Body.InnerHtml,最好是用第一个,第二个不保险。顺便提一下,WebBrowser1.Document.All(1).outerhtml是获取网页源码,如果我们不想要源码,而想要网页内容,即浏览器展示给我的文字,可以用:WebBrowser1.Document.body.innertext。@H_502_35@

还有一个问题就是有些网站点链接时会在新的窗口中打开,这时候webbrowser会调用IE浏览器,导致网页跳出程序,那么可以用下面的代码处理NewWindow2事件:@H_502_35@

Private Sub WebBrowser1_NewWindow2(ppDisp As Object,Cancel As Boolean)@H_502_35@

Dim frmWB As Form1@H_502_35@

Set frmWB = New Form1@H_502_35@

@H_502_35@

frmWB.WebBrowser1.RegisterAsBrowser = True@H_502_35@

@H_502_35@

Set ppDisp = frmWB.WebBrowser1.Object@H_502_35@

frmWB.Visible = True@H_502_35@

Unload Me@H_502_35@

End Sub@H_502_35@

注意这里的Form1是窗体名称,要根据你的实际情况修改。@H_502_35@

另外,注意一下Silent属性,把它设为Ture,防止弹出一些脚本错误提示。@H_502_35@

好了,说到这这个控件也就没什么了。常用的都说了,一些注意的问题也说了,其他的就要靠大家自己努力了!多练!(@L_403_2@)@H_502_35@

Inet控件。相信大家已经体会到了Webbrowser的不足之处:慢!因为它要等待网页加载完成,每一个图片,每一个脚本都要加载出来,不仅数据量大,而且造成速度太慢,简单的例子,如果要暴力破解密码,显然webbrowser是不可以的!。Inet控件的POST功能恰好弥补了这个缺点。POST是直接以数据包的形式,直接与服务器对话,比如你想登陆QQ空间,根本不用过去打开那个网页,直接POST给QQ服务器登录数据,符合条件就登录成功,就可以进行下一步操作了。这些操作由于都是在无形之中的,所以难度比webbrowser控件大。我不清楚读这篇文章的人是什么水平,由于这个涉及的知识太多太杂,继续往下看之前你必须先学会抓包工具HTTPWATCH的使用(点击下载教程以及软件)。如果你对这个软件有所了解,就可以进入下一步了!我再次说明,关于封包发包这部分知识很乱很杂,你只要跟着我走,不会的就停下来多花点功夫,暂时不懂也没事,等你把我这篇文章看完了我保你会!@H_502_35@

@H_502_35@

什么是数据包?@H_502_35@

@H_502_35@

数据包,又称作封包。简单的说,你上网打开网页,这个简单的动作,就是你先发送数据包给网站,它接收到了之后,根据你发送的数据包的IP地址,返回给你网页的数据包,也就是说,网页的浏览,实际上就是数据包的交换。以上蓝色部分是百度百科上面对数据包的诠释,有朋友可能看不明白,那么我就顺着这个解释,来举一个经典的“老王借钱”例子:@H_502_35@

@H_502_35@

1、隔壁的老王向你借钱。@H_502_35@

2、接收到老王借钱的请求。@H_502_35@

3、检查自己的腰包是否有钱。@H_502_35@

4、是借还是不借?@H_502_35@

5、把结果告诉老王。老王就会作出相关的反应(借的话他就爽,不借他当然就不爽了~)。@H_502_35@

@H_502_35@

其实上面只是一个再也简单不过的借钱行为,不过如果我们把它套用在客户端与网页服务端的通讯流程的话,会发现其实两者有着异曲同工之妙:@H_502_35@

@H_502_35@

1、老王相当于客户端,而借钱也就相当于一个请求。钱的数量,就相当于请求中的参数。老王向你借钱,我们可以把这一步称为POST,就是把借钱这个请求传递给你(服务端)。@H_502_35@

2、你,就相当于服务端,而这个钱,说白了,就是客户端传递过来的参数。你接到老王发出的借钱请求,这一步叫做响应。@H_502_35@

3、检查自己的腰包是否有钱,就相当于服务器验证用户的请求是否合法。比如一个网上支付系统,用户请求要支出1000块钱,然后用户就会把1000块钱这个参数传递到服务端,服务端当然就得验证一下用户的钱包里面是否有1000块钱,如果有的话就通过,没有的话当然就返回错误信息了。这是验证/校验数据。@H_502_35@

4、当第四步过后,如果腰包有钱,而你又情愿借给老王,此时,就相当于服务端给客户端返回一个信息,是借(True)。反之,就是不借(False)。这一步叫做返回/反馈。@H_502_35@

5、老王接到你给他回的信息,就会根据结果的不同而产生响应的动作。响应你动作的这一方法称为GET。@H_502_35@

@H_502_35@

这样一来,相信你对服务端和客户端的基本通讯过程大家都清楚了。但是,造成这一过程的起源是啥?是钱!我不得不说钱是万恶的(这也让我说得通,YY下)@H_502_35@

服务端和客户端之间首要的通讯条件当然就是必须可以联网。你说如果老王是死人的话,怎么向你借钱,对吧?不过要是真的有死人向你借钱的话……离我远点。其实这一个“借钱”的过程,钱充当着比较重要的角色,一个数据包里面包含了很多参数,参数也会有相应的值。而“钱”,在这里就充当着一个数据包参数的角色,钱的数量,就是这个数据包参数的值。@H_502_35@

@H_502_35@

到这里,我们就开始本课题的深究吧,因个人水平有限,文中难免会有不妥之处,欢迎大牛拍砖。@H_502_35@

@H_502_35@

经过前面的说明(纯属瞎扯),相信大家对数据包也有一个模糊的概念了,当然,这只是相对于从未接触过这一方面内容的新手而言。下一章我们来研究一下如何去抓包,并来编写一个QQ空间的留言工具来完成这一个课题的学习。@H_502_35@

@H_502_35@

数据包有什么用?@H_502_35@

@H_502_35@

数据包的交互是最底层的网络协议通讯,利用数据包,我们完全可以模拟客户机和服务端通讯的过程。比如我们需要编写一个帐号注册器,如果用传统的模拟网页表填写的方式去实现的话,这样虽然比人手工操作的方法要快,但也还需要载入一个网页,速度还是逊色的。但如果用数据包去实现的话,就相当于只把一系列的字符串传递到目标服务器即可。载入一个网页,包含了图片、表单等元素,大一点的话起码得要下载几百KB的数据,但数据包,最多也就几KB,如果客户机和服务器的网络都正常的话,提交数据包到服务器几乎就是一瞬间的事情。@H_502_35@

@H_502_35@

如何抓包?@H_502_35@

@H_502_35@

相信大家对抓包这个概念并不陌生。从字面上很好理解,抓包就是一个捕获数据包的过程。我们前面说了,客户机和网页服务器之间的通讯都会产生数据包,如果我们想模拟它这个通讯过程的话,就必须要把它们之间通讯所产生的数据包捕捉下来,再进行分析。@H_502_35@

可能大家都听说过WEP,Sniffer等工具,其实它们都是抓包工具。但是数据包有不同类型,TCP包,通常是软件所产生的数据包,我们玩网络游戏的时候和服务器所产生的就是TCP包。而我们在网页通讯的时候,所产生的就是HTTP包了。TCP包是以二进制的方式进行传输的,HTTP却是以明文的方式进行传输的。@H_502_35@

在这个教程中,我们统一使用HTTPWATCH这个软件来进行抓包。@H_502_35@

HTTPWATCH 是一个IE插件,也是一个强大的HTTP捕捉工具。@H_502_35@

@H_502_35@

安装完HTTPWATCH之后,要打开IE浏览器,在浏览器工具栏处打开才行(第三方浏览器诸如 360 都不支持IE插件)。我们先来看看HTTPWATCH的强大界面:@H_502_35@

HTTPWATCH 界面:@H_502_35@


①工具栏@H_502_35@

Record:开始监听网页数据包。@H_502_35@

Stop:停止监听。@H_502_35@

Clear:清空结果列表。@H_502_35@

@H_502_35@

②数据包监听列表@H_502_35@

③数据包详细信息 @H_502_35@

基本信息(Overview):显示数据包的目标地址,返回结果等信息。@H_502_35@

时间图表(Time Chart):显示数据包在通讯状态中 连接、等待、接收 的占用时间。@H_502_35@

头信息(Headers):HTTP的基本头信息。@H_502_35@

Cookie:百度百科@H_502_35@

缓存(Cache):在本地临时文件夹暂存的数据。@H_502_35@

查询字符串(Query String):表单产生的查询动作的主要查询参数。@H_502_35@

传递参数(POST Data):POST数据包的主要参数,也就是传递到服务器的参数。@H_502_35@

返回信息(Content):返回的页面源码。@H_502_35@

数据流(Stream):提交到服务器的数据包参数以及HTTP头信息。@H_502_35@

@H_502_35@

以上就是HTTPWATCH的大体结构。在打开IE浏览器,启用这个插件之后,点击“Record”就可以进行数据包的监听了。在监听状态下,你所做的每一步网页操作都会有相关的数据流动,HTTPWATCH大致上可以抓三种行为:@H_502_35@

@H_502_35@

1.POST行为@H_502_35@

2.GET行为@H_502_35@

3.CACHE@H_502_35@

@H_502_35@

POST大家都很熟悉的了,就是向服务器传递参数。平时我们提交一个网页表单的时候,产生的也是POST方法。GET大家也不会陌生,当POST完毕之后,服务器一般都会返回一些信息给用户,这就是相对于用户而言的GET。简单通俗点的话,大家可以把POST理解为上载数据,把GET理解为下载数据。至于CACHE,这个就是缓存操作,直接从本地缓存里面取出来的资源。@H_502_35@

在这里我们学习的就是POST数据,我们将会通过一个QQ空间的留言工具来带大家入门这个课题的内容。@H_502_35@

首先我们打开http://qz.qq.com,这个是腾讯留给手机用户的接口,之前我一直不知道有这个网页的存在,是XC同学找到的。这个接口比起标准的QQ空间接口来说,就精简得多了。那么我们就在这里入手,尝试着给好友的QQ空间留言,然后抓“留言”这个动作所产生的数据包。@H_502_35@

众所周知,如果没有在网站上登录自己的QQ,是没有办法留言的,因为QQ空间不支持匿名留言。我们进入网站的时候,它也会先提示登录,然后才可以后续操作。所以,我们如果要做这样一个留言工具的话,就必须要具备以下步骤:@H_502_35@

@H_502_35@

1.登录QQ@H_502_35@

2.发送数据包@H_502_35@

3.取得返回信息@H_502_35@

@H_502_35@

QQ的登录数据包我在这里就不演示抓包了,因为腾讯已经改了新的登录接口,但是旧的还能用,我这里还是用旧的QQ登录数据包。在此之前,我们先来给好友的QQ空间留言,抓包,我在有钱哥的空间里面留言“测试测试”,大家可以看到,列表中就产生看一个新的项目。其Method属性就是POST!这就是传递到QQ空间服务器的数据包了,大家可以看看红色框框的内容,是不是觉得很熟悉?@H_502_35@

@H_502_35@

con=%E6%B5%8B%E8%AF%95%E6%B5%8B%E8%AF%95%7E%7E&uin=298096110&suin=542464221@H_502_35@

@H_502_35@

没错,这红色字体部分就是传说中的HTTP数据包!@H_502_35@

大家可以看看,这个数据包里面只有三个参数,分别是con,uin,suin,这三个参数一眼看上去就很容易知道它的意思了,我们分析数据包的时候一般都是根据其参数名称的字面意思以及参数的值来判断这是一个什么样的参数。@H_502_35@

我刚才在比你·有钱的QQ空间留言了,我的QQ就是542464221,而有钱的QQ是298096110。除此之外,还有一个最重要的参数,那就是con,这也是我们留言的内容!大家可能会奇怪,上面的留言内容不是“测试测试~~”吗?怎么现在看着变成了一堆乱码?@H_502_35@

其实这不是乱码,而是网页编码。至于转换的方法,我们会在下面讲到。@H_502_35@

相信大家都懂得抓包了,自己多实践几次,你也可以找一些网站上的注册页面,自己尝试着注册一个帐号,然后提交一个表单,抓包看看,尝试着去分析一个数据包,弄清楚各个参数的意思。@H_502_35@

@H_502_35@

@H_502_35@

如何发送数据包?@H_502_35@

这一节是本教程的核心部分。既然我们已经捕捉到了QQ空间留言的数据包,那么我们完全可以模拟这个过程了。VB对于网络的操控性能还是很不错的。在VB中封装了inet,winsock等控件,可以很轻松的调用各种方法去发HTTP数据包。在本教程例子当中,我们用inet作为例子去讲解一下如何发送数据包。@H_502_35@

@H_502_35@

我们先来看看Inet的execute方法 :@H_502_35@

InetObject.Execute "[POST页面URL]","POST","要发送的数据包内容","封包头信息"@H_502_35@

@H_502_35@

我们在发送数据包的时候需要注意,一个完整的数据包,应该是由报头和封包内容组成的。比如上面我们抓出来的数据包之中:@H_502_35@

@H_502_35@

这是数据包内容:@H_502_35@

con=%E6%B5%8B%E8%AF%95%E6%B5%8B%E8%AF%95%7E%7E&uin=298096110&suin=542464221@H_502_35@

@H_502_35@

这是数据包头信息:@H_502_35@

POST /cgi-bin/mobile_update_msg HTTP/1.1@H_502_35@

Accept: image/jpeg,application/x-ms-application,image/gif,application/xaml+xml,image/pjpeg,application/x-ms-xbap,application/x-shockwave-flash,application/QVOD,application/vnd.ms-excel,application/vnd.ms- powerpoint,application/msword,*/*@H_502_35@

Referer: http://qz.qq.com/298096110/msglist/@H_502_35@

Accept-Language: zh-CN@H_502_35@

User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; QQDownload 646; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; CIBA)@H_502_35@

Content-Type: application/x-www-form-urlencoded@H_502_35@

Accept-Encoding: gzip,deflate@H_502_35@

Host: qz.qq.com@H_502_35@

Content-Length: 75@H_502_35@

Connection: Keep-Alive@H_502_35@

Cache-Control: no-cache@H_502_35@

Cookie: pgv_pvid=5935155721; pgv_flv=10.0; ptcz=711d7cb1ddde86208f1cefa14aeef570559b7327db1e1500853742cd7ff607b7; pvid=5935155721; icache=GDGGMM@LM; pgv_r_cookie=107649076403; o_cookie=542464221; suid=5538977674; adid=542464221; adSP=irZ4SlVL95zhdFpg5bULoRAhsvy9F4wI/hgQDREbzJc=_4400_326830_1278923685_; adVer=2839; ac=1,030,006; showModel=list; tips-share=1; aq_displaybubble=542464221; pt2gguin=o0542464221; uin=o0542464221; skey=@cKMj7aqRM; speed=1; browsertype=4; inBox=0@H_502_35@

@H_502_35@

@H_502_35@

一般来说,我们在inet之中并不需要把数据包的所有头信息都附加进去。不过有一句是肯定要的,那就是:@H_502_35@

Content-Type: application/x-www-form-urlencoded@H_502_35@

@H_502_35@

这指定了数据包网页所支持的类型。如果是在winsock里面的话,则需要附带所有的头信息。头信息指定了一个数据包的属性等信息。通过上面的头信息,相信大家也可以获悉很多内容。@H_502_35@

我们再回到上面一小节所提到的问题,数据包里面的con参数为什么是经过转换了的字符?因为我们在访问一个网页,或者在HTTP数据传输的时候,服务器并不能直接识别中文字符,因此需要转换。不同编码方式的转换方式也有不同。@H_502_35@
QQ空间留言工具的例程我已经写好了,里面的注释很详细,我在这里就不多说了。大家下载例子看看就一目了然。这个例子真的注释很详细,一看就会!( 点击下载QQ留言工具

好了,看到这相信你对抓包、封包已经有了一定了解,并且跃跃欲试了!上边的例子是来源于网络的,那个留言工具的代码也比较复杂,为了让读者更加清晰,我再举一个例子,简化一下代码。@H_502_35@

我就拿网易开刀吧!登录网易博客!首先打开我的网易博客,然后点击登录,再点击HTTPWATCH的Record,输完帐号密码,点击登录,可爱的小包包都被我们抓到了,下面是stream(流)@H_502_35@

POST /logins.jsp HTTP/1.1@H_502_35@

Accept: text/html,application/xhtml+xml,*/*@H_502_35@

Referer: http://yangyuankp.blog.163.com/@H_502_35@

Accept-Language: zh-CN@H_502_35@

User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)@H_502_35@

Content-Type: application/x-www-form-urlencoded@H_502_35@

Accept-Encoding: gzip,deflate@H_502_35@

Host: reg.163.com@H_502_35@

Content-Length: 205@H_502_35@

Connection: Keep-Alive@H_502_35@

Cache-Control: no-cache@H_502_35@

Cookie: MAIL163_SSN=yangyuankp; vjuids=b46ab8d61.12dc620ae36.0.8235534c19532; vjlast=1296109187.1307365009.22; _ntes_nnid=174bb1179a0306265cd30352879cecbd,0; _ntes_nuid=174bb1179a0306265cd30352879cecbd; P_INFO=yangyuankp@163.com|1306890848|2|blog|11&15|heb&1306846208&blog#heb&131000#10|189147&1; ALLYESID4=00110324074458898832678; NTES_LOGINED=true; __utma=187553192.944603223.1301881124.1301881124.1301887705.2; __utmz=187553192.1301881124.1.1.utmcsr=blog.163.com|utmccn=(referral)|utmcmd=referral|utmcct=/error.do; USERTRACK=219.243.79.67.1306393576113082; SID=16552eab-8fda-403b-874f-b199b2b23626; JSESSIONID=dacwhOfantSjj6j2TM8bt@H_502_35@

@H_502_35@

password=123456&type=1&url=http%3A%2F%2Fblog.163.com%2FloginGate.do%3Ftarget%3Dhttp%253A%252F%252Fyangyuankp.blog.163.com%252F%26blogActivation%3Dtrue&product=blog&savelogin=0&username=18932624147@163.com@H_502_35@

一般情况下,在流里面已经包含了必要的头信息,POSTDATA等等,所以就直接看这个了!@H_502_35@

我们看到Content-Type: application/x-www-form-urlencoded,这是个必要的头信息,告诉服务器怎么解码。在VB中写对应的:Const POST_HEADER = "CONTENT-TYPE:application/x-www-form-urlencoded"。然后我们去找POST地址:@H_502_35@

@H_502_35@

@H_502_35@

在这个POST信息最后是地址,在VB中写:Const POST_URL = "https://reg.163.com/logins.jsp"。在流的最下边就是POSTDATA,当然去POSTDATA选项卡看更加清晰!让我们来看看,都有什么。。。其中有一个&url=http%3A%2F%2Fblog.163.com%2FloginGate.do%3Ftarget%3Dhttp%253A%252F%252Fyangyuankp.blog.163.com%252F%26blogActivation%3Dtrue,这个一看就不是必要信息,舍去!!!!其他的可不能省,都是密码,帐号,类型之类的,省了肯定出错。在VB中写:POST_DATA = “password=123456&type=1&product=blog&savelogin=0&username=18932624147@163.com”这样是不是很清晰啊(参数直间用&连接)。。。万事具备只欠POST了!我们写Inet1.Execute POST_URL,POST_DATA,POST_HEADER。然后等待数据接收完毕 @H_502_35@

Do While Inet1.StillExecuting@H_502_35@

DoEvents@H_502_35@

Loop@H_502_35@

完成之后获取登录后的主页@H_502_35@

Inet1.Execute "http://yangyuankp.blog.163.com/","GET"@H_502_35@

再等待。。。@H_502_35@

Do While Inet1.StillExecuting@H_502_35@

DoEvents@H_502_35@

Loop@H_502_35@

获取二进制数据,给字节数组@H_502_35@

BinBuff() = Inet1.GetChunk(0,icByteArray)@H_502_35@

解析为Unicode 并在text中显示:@H_502_35@

Text1.Text = StrConv(BinBuff(),vbUnicode)@H_502_35@

大工造成!这是我们会在text中看到登录成功的源码。。。是不是很简单????有没有自豪感??是不是感觉自己会了很多东西?? @H_502_35@

XMLHTTP用法大同小异,在此就不多说了。(点击下载参考资料以及XMLHTTPQQ申请器源码)@H_502_35@

看到这,相信你也算一个高手了!我再给读者介绍一点经验和注意事项,就更完美了!@H_502_35@

以下是心血经验!!!!!!!!!!!@H_502_35@

要注意网页的编码。在用Inet控件传送数据时,直接写就可以(如果没有特殊要求的情况下,像QQ密码,是要加密后再发送的),但是接受时要分情况,如果网页是UTF-8,就要用UTF-8解析二进制数组,这个函数上边QQ留言代码里有。如果是GB2312,就用StrConv(“二进制数组”,VBUnicode)函数来解析,否则中文乱码。@H_502_35@

要知道Inet和webbrowser都可以记录cookic,所以不用你管cookic,造成很大便利啊!另外,Inet控件和webbrowser控件的cookic是可以互相使用的,比如你用Inet控件登录成功,在用同一个程序里的webbrowser打开这个网站时,也是登录的状态,反之亦然。在此我很感谢廊坊师范给了我这次磨练的机会!为什么?因为我第一次试验就让我遇到了没有cookie的网站!!!我可是个新手啊!!就不能让我顺利的操作一次嘛??对于没有cookie的网站,登录成功后只能GET主页,如果GET其他的网页马上退出(有cookie的网站直接GET某个存在的页面就可以,不管这个页面在哪),我也想过用webbrowser登录,让它保持对话,然后用Inet进行POST,但是行不通,因为根本没有cookie,这两个控件是联系不上的!经过无数次实验,因为网上没有这方面的文章,所以只有实验!终于成功了!下面讲解一下不能GET其他页面的原因!我们可以分析,为什么在真实操作中点击链接登录的,而我们模拟GET就是无效的呢?既然这个网站没有cookie,那么它判断我们登录身份的唯一途径就是判断来源页面,如果我们凭空而来,直接GET,肯定是被拒绝的!但如果我们在GET的时候加点参数:在HTTP头里加上referre:xxx(xxx是指登录成功的网页,例子:Inet1.Execute "http://219.243.79.21/(sgaujaimu4mtapazvirdic3g)/xf_xsqxxxk.aspx?xh=09050241066&xm=杨元&gnmkdm=N121203","GET","Referer : http://219.243.79.21/(sgaujaimu4mtapazvirdic3g)/xs_main.aspx?xh=09050241066"),也就是告诉服务器我是从哪来的,服务器发现你来自于登录成功的页面,也就证明了你的身份。这个猜测最好的证明是你把随便一个登录成功的页面URL复制到一个新的浏览器窗口的地址栏里,点击转到你会发现自己已经退出登录了。。所以,要细心分析参数,少了就出错。。。这个就要靠多实践了。。。@H_502_35@

还有需要注意的是如果你登录页面跳转,也就是有个中间网页,像loading什么的,登录后,不可以直接去POST其他网页,必须GET一下它自动跳转到的主页,否则你POST别的网页也得不到用户信息,得到的只是一个空架子。可能是这类网站必须通过主页加载一个数据,如果跳过会造成登录成功但没有数据的现象。@H_502_35@

要注意POST与GET的区别(如果你早就有这个疑问说明你是真心学习了!):@H_502_35@

1、HTTP 只有POST和GET 两种命令模式; @H_502_35@

2、POST是被设计用来向上放东西的,而GET是被设计用来从服务器取东西的,GET也能够向服务器传送较少的数据,而Get之所以也能传送数据,只是用来设计告诉服务器,你到底需要什么样的数据.POST的信息作为HTTP 请求的内容,而GET是在HTTP 头部传输的;所以GET可见但不安全,POST不可见,安全! @H_502_35@

3、POST与GET在HTTP 中传送的方式不同,GET的参数是在HTTP 的头部传送的,而Post的数据则是在HTTP 请求的内容里传送; @H_502_35@

4、POST传输数据时,不需要在URL中显示出来,而GET方法要在URL中显示; @H_502_35@

5、GET方法由于受到URL长度的限制,只能传递大约1024字节;POST传输的数据量大,可以达到2M,而根据微软方面的说法,微软对用 Request.Form() 可接收的最大数据有限制,IIS 4 中为 80 KB 字节,IIS 5 中为 100 KB 字节; @H_502_35@

6、SOAP是依赖于HTTP POST模式实现的;@H_502_35@

其实这个经验就与本文无关了,不知道大家有没有注意那个QQ留言的源码里用到了Scriptcontrol控件(控件具体用法说明下载),这个控件是用来在VB运行脚本的,有什么用捏?很有用!比如你在登录一个网页时,人家要求传送的密码用他们的算法加密,但是你哪有这个算法啊。。。。。。别急,去他们网页的JS脚本里边去找这个算法,然后复制到VB中,把代码赋给Scriptcontrol控件就可以运行加密了。@H_502_35@

好了,写了这么多。。。。。。真是累啊。。。。。能不能学会,还是在于你自己!努力吧!为了祖国美好的明天!为了社会的进步!加油!@H_502_35@

原文链接:https://www.f2er.com/vb/259445.html

猜你在找的VB相关文章