吐血巨献VB网络编程webbrowser+Inet+抓包封包+经验.docx
《吐血巨献VB网络编程webbrowser+Inet+抓包封包+经验.docx》由会员分享,可在线阅读,更多相关《吐血巨献VB网络编程webbrowser+Inet+抓包封包+经验.docx(15页珍藏版)》请在冰豆网上搜索。
吐血巨献VB网络编程webbrowser+Inet+抓包封包+经验
吐血巨献:
VB网络编程(webbrowser+Inet+抓包封包+经验)
网络的重要性不用我说,所以关于网络的编程对我我们来说也是非常重要,非常实用的!
但是我在网络上却没有看到多少关于VB网络编程方面的知识,一方面是VB用的人比较少,不会用就说VB不好(个人认为学好VB以后C++、Java一看就会!
);另一方面是大家不愿意公开这方面的知识,自己辛辛苦苦探索的,还得靠它吃饭,怎么可能轻易拿出来公布?
但是社会要发展,人类要进步,为了让更多的人受益,为了让体现自己价值,我愿意分享自己对于网络编程的经验。
用VB操作网页,主要有两种方法:
一是模拟操作,即自动控制。
二是POST,也就是发送消息(数据包)。
这两种方式涉及到:
Webbrowser控件、Inet控件、XMLHTTP对象。
其中,Webbrowser控件主要用来模拟操作,让机器自动完成点击、选中、填写等操作;Inet控件和XMLHTTP对象主要是用来POST,即发送数据包,在不加载网页的情况下直接与服务器交互。
下面开始讲解它们的应用。
注:
我在这里仅仅讨论操作网页,像聊天、文件传输在这不作为重点,毕竟这些相对来说还是比较少用的。
Webbrowser控件
这是一个比较基础的控件,关于它的学习资料,网上还是很多的。
用它操作网页是一种看得见,摸得着的过程,基本的任务都能完成。
经过半年的使用经验,总结一下它不能完成的任务:
1.不能操作JS脚本。
如果你操作的网页内容被放在了JS脚本里,那么就不要用这个控件了。
2.不能点击Flash按钮。
Flash按钮比在网页中较特殊,用webbrowser控件无法找到这个对象。
我所遇到的就是这两条,当然肯定还有别的。
下面通过一个万能代码来看一下这个控件:
ForlngIndex=1ToWebBrowser1.Document.All.Length–1
IfInStr(1,WebBrowser1.Document.All(lngIndex).outerhtml,"替换为你要查找的关键字")>0Then'查找关键字
IfUCase(WebBrowser1.Document.All(lngIndex).tagName)="INPUT"Then'如果点击是超链接把INPUT换成A
'WebBrowser1.Document.All(lngIndex).Click '如果是模拟点击就用这个语句
WebBrowser1.Document.All(lngIndex).Checked=True '如果是模拟选中复选框,就用这个语句
ExitFor
EndIf
EndIf
Next
用这个代码,可以灵活的模拟:
点击按钮、点击超链接、操作复选框、操作下拉式菜单、填写数据。
这个代码大概的意思:
最外层循环遍历整个网页中的标签对象,然后用第二个循环去匹配这个对象中是否有我们期望的关键字,如果有的话,再判断这个标签对象的类型,一般情况下,超链接是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即可。
在实际使用中,我们会遇到一个非常头疼的问题:
webbrowser操作网页必须等待网页加载完成,否则会找不到标签对象。
网上比较流行的做法是用webbrowser的Busy方法等待网页加载完成,但是根本没有效果。
在此我分享一下自己的经验,想想我们人是怎么判断网页是否加载完成的?
因为出现了一些新的信息,因为有变化!
我们当然也可以让程序这么去判断。
我们可以在新网页中找一个固定存在的字符,用while循环不断获取webbrowser的网页源码,直到出现这个固定字符,我们就认为加载完成。
例如,在目的网页里会出现123这个字符,那么:
WhileInstr(WebBrowser1.Document.All
(1).outerhtml,”123”)=0
Doevents
Wnd
这样写可以很好的达到等待网页加载完成的目的。
这里WebBrowser1.Document.All
(1).outerhtml是webbrowser中所有的标签对象,基本上可以说是获取网页源码。
如果用这个语句无法获取就用WebBrowser1.Document.Body.InnerHtml,最好是用第一个,第二个不保险。
顺便提一下,WebBrowser1.Document.All
(1).outerhtml是获取网页源码,如果我们不想要源码,而想要网页内容,即浏览器展示给我的文字,可以用:
WebBrowser1.Document.body.innertext。
还有一个问题就是有些网站点击链接时会在新的窗口中打开,这时候webbrowser会调用IE浏览器,导致网页跳出程序,那么可以用下面的代码处理NewWindow2事件:
PrivateSubWebBrowser1_NewWindow2(ppDispAsObject,CancelAsBoolean)
DimfrmWBAsForm1
SetfrmWB=NewForm1
frmWB.WebBrowser1.RegisterAsBrowser=True
SetppDisp=frmWB.WebBrowser1.Object
frmWB.Visible=True
UnloadMe
EndSub
注意这里的Form1是窗体名称,要根据你的实际情况修改。
另外,注意一下Silent属性,把它设为Ture,防止弹出一些脚本错误的提示。
好了,说到这这个控件也就没什么了。
常用的都说了,一些注意的问题也说了,其他的就要靠大家自己努力了!
多练!
(参考资料:
webbrowser控件属性、方法大全。
)
Inet控件
相信大家已经体会到了Webbrowser的不足之处:
慢!
因为它要等待网页加载完成,每一个图片,每一个脚本都要加载出来,不仅数据量大,而且造成速度太慢,简单的例子,如果要暴力破解密码,显然webbrowser是不可以的!
Inet控件的POST功能恰好弥补了这个缺点。
POST是直接以数据包的形式,直接与服务器对话,比如你想登陆QQ空间,根本不用过去打开那个网页,直接POST给QQ服务器登录数据,符合条件就登录成功,就可以进行下一步操作了。
这些操作由于都是在无形之中的,所以难度比webbrowser控件大。
我不清楚读这篇文章的人是什么水平,由于这个涉及的知识太多太杂,继续往下看之前你必须先学会抓包工具HTTPWATCH的使用。
如果你对这个软件有所了解,就可以进入下一步了!
我再次说明,关于封包发包这部分知识很乱很杂,你只要跟着我走,不会的就停下来多花点功夫,暂时不懂也没事,等你把我这篇文章看完了我保你会!
什么是数据包?
数据包,又称作封包。
简单的说,你上网打开网页,这个简单的动作,就是你先发送数据包给网站,它接收到了之后,根据你发送的数据包的IP地址,返回给你网页的数据包,也就是说,网页的浏览,实际上就是数据包的交换。
、来举一个经典的“老王借钱”例子:
1、隔壁的老王向你借钱。
2、接收到老王借钱的请求。
3、检查自己的腰包是否有钱。
4、是借还是不借?
5、把结果告诉老王。
老王就会作出相关的反应(借的话他就爽,不借他当然就不爽了~)。
其实上面只是一个再也简单不过的借钱行为,不过如果我们把它套用在客户端与网页服务端的通讯流程的话,会发现其实两者有着异曲同工之妙:
1、老王相当于客户端,而借钱也就相当于一个请求。
钱的数量,就相当于请求中的参数。
老王向你借钱,我们可以把这一步称为POST,就是把借钱这个请求传递给你(服务端)。
2、你,就相当于服务端,而这个钱,说白了,就是客户端传递过来的参数。
你接到老王发出的借钱请求,这一步叫做响应。
3、检查自己的腰包是否有钱,就相当于服务器验证用户的请求是否合法。
比如一个网上支付系统,用户请求要支出1000块钱,然后用户就会把1000块钱这个参数传递到服务端,服务端当然就得验证一下用户的钱包里面是否有1000块钱,如果有的话就通过,没有的话当然就返回错误信息了。
这是验证/校验数据。
4、当第四步过后,如果腰包有钱,而你又情愿借给老王,此时,就相当于服务端给客户端返回一个信息,是借(True)。
反之,就是不借(False)。
这一步叫做返回/反馈。
5、老王接到你给他回的信息,就会根据结果的不同而产生响应的动作。
响应你动作的这一方法称为GET。
这样一来,相信你对服务端和客户端的基本通讯过程大家都清楚了。
但是,造成这一过程的起源是啥?
是钱!
我不得不说钱是万恶的(这也让我说得通,YY下)
服务端和客户端之间首要的通讯条件当然就是必须可以联网。
你说如果老王是死人的话,怎么向你借钱,对吧?
不过要是真的有死人向你借钱的话……离我远点。
其实这一个“借钱”的过程,钱充当着比较重要的角色,一个数据包里面包含了很多参数,参数也会有相应的值。
而“钱”,在这里就充当着一个数据包参数的角色,钱的数量,就是这个数据包参数的值。
经过前面的说明(纯属瞎扯),相信大家对数据包也有一个模糊的概念了,当然,这只是相对于从未接触过这一方面内容的新手而言。
下一章我们来研究一下如何去抓包,并来编写一个QQ空间的留言工具来完成这一个课题的学习。
数据包有什么用?
数据包的交互是最底层的网络协议通讯,利用数据包,我们完全可以模拟客户机和服务端通讯的过程。
比如我们需要编写一个帐号注册器,如果用传统的模拟网页表填写的方式去实现的话,这样虽然比人手工操作的方法要快,但也还需要载入一个网页,速度还是逊色的。
但如果用数据包去实现的话,就相当于只把一系列的字符串传递到目标服务器即可。
载入一个网页,包含了图片、表单等元素,大一点的话起码得要下载几百KB的数据,但数据包,最多也就几KB,如果客户机和服务器的网络都正常的话,提交数据包到服务器几乎就是一瞬间的事情。
如何抓包?
相信大家对抓包这个概念并不陌生。
从字面上很好理解,抓包就是一个捕获数据包的过程。
我们前面说了,客户机和网页服务器之间的通讯都会产生数据包,如果我们想模拟它这个通讯过程的话,就必须要把它们之间通讯所产生的数据包捕捉下来,再进行分析。
可能大家都听说过WEP,Sniffer等工具,其实它们都是抓包工具。
但是数据包有不同类型,TCP包,通常是软件所产生的数据包,我们玩网络游戏的时候和服务器所产生的就是TCP包。
而我们在网页通讯的时候,所产生的就是HTTP包了。
TCP包是以二进制的方式进行传输的,HTTP却是以明文的方式进行传输的。
在这个教程中,我们统一使用HTTPWATCH这个软件来进行抓包。
HTTPWATCH是一个IE插件,也是一个强大的HTTP捕捉工具。
安装完HTTPWATCH之后,要打开IE浏览器,在浏览器工具栏处打开才行(第三方浏览器诸如360都不支持IE插件)。
我们先来看看HTTPWATCH的强大界面:
HTTPWATCH界面:
1工具栏
2Record:
开始监听网页数据包。
3Stop:
停止监听。
4Clear:
清空结果列表。
5数据包监听列表
6数据包详细信息
基本信息(Overview):
显示数据包的目标地址,返回结果等信息。
时间图表(TimeChart):
显示数据包在通讯状态中连接、等待、接收的占用时间。
头信息(Headers):
HTTP的基本头信息。
Cookie:
XX百科
缓存(Cache):
在本地临时文件夹暂存的数据。
查询字符串(QueryString):
表单产生的查询动作的主要查询参数。
传递参数(POSTData):
POST数据包的主要参数,也就是传递到服务器的参数。
返回信息(Content):
返回的页面源码。
数据流(Stream):
提交到服务器的数据包参数以及HTTP头信息。
以上就是HTTPWATCH的大体结构。
在打开IE浏览器,启用这个插件之后,点击“Record”就可以进行数据包的监听了。
在监听状态下,你所做的每一步网页操作都会有相关的数据流动,HTTPWATCH大致上可以抓三种行为:
1.POST行为
2.GET行为
3.CACHE
POST大家都很熟悉的了,就是向服务器传递参数。
平时我们提交一个网页表单的时候,产生的也是POST方法。
GET大家也不会陌生,当POST完毕之后,服务器一般都会返回一些信息给用户,这就是相对于用户而言的GET。
简单通俗点的话,大家可以把POST理解为上载数据,把GET理解为下载数据。
至于CACHE,这个就是缓存操作,直接从本地缓存里面取出来的资源。
在这里我们学习的就是POST数据,我们将会通过一个QQ空间的留言工具来带大家入门这个课题的内容。
首先我们打开,这个是腾讯留给手机用户的接口。
这个接口比起标准的QQ空间接口来说,就精简得多了。
那么我们就在这里入手,尝试着给好友的QQ空间留言,然后抓“留言”这个动作所产生的数据包。
众所周知,如果没有在网站上登录自己的QQ,是没有办法留言的,因为QQ空间不支持匿名留言。
我们进入网站的时候,它也会先提示登录,然后才可以后续操作。
所以,我们如果要做这样一个留言工具的话,就必须要具备以下步骤:
1.登录QQ
2.发送数据包
3.取得返回信息
腾讯已经改了新的登录接口,但是旧的还能用,我这里介绍的是旧的QQ登录数据包。
在此之前,我们先来给好友的QQ空间留言,抓包,加入我在好友空间留言,列表中就产生看一个新的项目。
其Method属性就是POST!
这就是传递到QQ空间服务器的数据包了,大家可以看看红色框框的内容:
con=%E6%B5%8B%E8%AF%95%E6%B5%8B%E8%AF%95%7E%7E&uin=12345678&suin=87654321
没错,这红色字体部分就是传说中的HTTP数据包!
大家可以看看,这个数据包里面只有三个参数,分别是con,uin,suin,这三个参数一眼看上去就很容易知道它的意思了,我们分析数据包的时候一般都是根据其参数名称的字面意思以及参数的值来判断这是一个什么样的参数。
我刚才在比你·有钱的QQ空间留言了,我的QQ就是12345678,好友的QQ是87654321。
除此之外,还有一个最重要的参数,那就是con,这也是我们留言的内容!
大家可能会奇怪,怎么是一堆乱码?
其实这不是乱码,而是网页编码。
至于转换的方法,我们会在下面讲到。
相信大家都懂得抓包了,自己多实践几次,你也可以找一些网站上的注册页面,自己尝试着注册一个帐号,然后提交一个表单,抓包看看,尝试着去分析一个数据包,弄清楚各个参数的意思。
如何发送数据包?
这一节是本教程的核心部分。
既然我们已经捕捉到了QQ空间留言的数据包,那么我们完全可以模拟这个过程了。
VB对于网络的操控性能还是很不错的。
在VB中封装了inet,winsock等控件,可以很轻松的调用各种方法去发HTTP数据包。
我用inet作为例子去讲解一下如何发送数据包。
先来看看Inet的execute方法:
InetObject.Execute"[POST页面URL]","POST","要发送的数据包内容","封包头信息"
我们在发送数据包的时候需要注意,一个完整的数据包,应该是由报头和封包内容组成的。
比如上面我们抓出来的数据包之中:
这是数据包内容:
con=%E6%B5%8B%E8%AF%95%E6%B5%8B%E8%AF%95%7E%7E&uin=12345678&suin=87654321
这是数据包头信息:
POST/cgi-bin/mobile_update_msgHTTP/1.1
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/QVOD,application/vnd.ms-excel,application/vnd.ms- powerpoint,application/msword,*/*
Referer:
Accept-Language:
zh-CN
User-Agent:
Mozilla/4.0(compatible;MSIE8.0;WindowsNT6.1;Trident/4.0;QQDownload646;SLCC2;.NETCLR 2.0.50727;.NETCLR3.5.30729;.NETCLR3.0.30729;MediaCenterPC6.0;CIBA)
Content-Type:
application/x-www-form-urlencoded
Accept-Encoding:
gzip,deflate
Host:
Content-Length:
75
Connection:
Keep-Alive
Cache-Control:
no-cache
Cookie:
pgv_pvid=12345678;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
一般来说,我们在inet之中并不需要把数据包的所有头信息都附加进去。
不过有一句是肯定要的,那就是:
Content-Type:
application/x-www-form-urlencoded
这指定了数据包网页所支持的类型。
如果是在winsock里面的话,则需要附带所有的头信息。
头信息指定了一个数据包的属性等信息。
通过上面的头信息,相信大家也可以获悉很多内容。
我们再回到上面一小节所提到的问题,数据包里面的con参数为什么是经过转换了的字符?
因为我们在访问一个网页,或者在HTTP数据传输的时候,服务器并不能直接识别中文字符,因此需要转换。
不同编码方式的转换方式也有不同。
QQ空间留言工具的例程我已经写好了,里面的注释很详细,我在这里就不多说了。
大家下载例子看看就一目了然。
这个例子真的注释很详细,一看就会!
(点击下载QQ留言工具)
好了,看到这相信你对抓包、封包已经有了一定了解,并且跃跃欲试了!
上边的例子是来源于网络的,那个留言工具的代码也比较复杂,为了让读者更加清晰,我再举一个例子,简化一下代码。
我就拿网易开刀吧!
登录网易博客!
首先打开我的网易博客,然后点击登录,再点击HTTPWATCH的Record,输完帐号密码,点击登录,可爱的小包包都被我们抓到了,下面是stream(流)
POST/logins.jspHTTP/1.1
Accept:
text/html,application/xhtml+xml,*/*
Referer:
Accept-Language:
zh-CN
User-Agent:
Mozilla/5.0(compatible;MSIE9.0;WindowsNT6.1;Trident/5.0)
Content-Type:
application/x-www-form-urlencoded
Accept-Encoding:
gzip,deflate
Host:
Content-Length:
205
Connection:
Keep-Alive
Cache-Control:
no-cache
Cookie:
MAIL163_SSN=yangyuankp;vjuids=b46ab8d61.12dc620ae36.0.8235534c19532;vjlast=1296109187.1307365009.22;_ntes_nnid=174bb1179a0306265cd30352879cecbd,0;_ntes_nuid=174bb1179a0306265cd30352879cecbd;P_INFO=yangyuankp@|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=|utmccn=(referral)|utmcmd=referral|utmcct=/error.do;USERTRACK=219.243.79.67.1306393576113082;SID=16552eab-8fda-403b-874f-b199b2b23626;JSESSIONID=dacwhOfantSjj6j2TM8bt
password=123456&type=1&url=http%3A%2F%2F%2FloginGate.do%3Ftarget%3Dhttp%253A%252F%252F%252F%26blogActivation%3Dtrue&product=blog&savelogin=0&username=18932624147@
一般情况下,在流里面已经包含了必要的头信息,POSTDATA等等,所以就直接看这个了!
我们看到Content-Type: