用VB编写Web页面提交程序

软件世界

现在有很多软件可以自动提交填写文字后的页面,比如填表软件,自动答题软件,等等。有些朋友可能觉得这个功能很神奇,其实不然,利用VB的WEBBROWSER控件,完成这个功能是很容易的。
下面以提交央视的开心辞典网上答题(http://www.cctv.com/life/happygame/right01.html)为例,说明一下具体的步骤。注册用户后,点击进入,就可以答题了,答题的界面如(图1)所示。

图1
图1

查看这个页面的源文件,发现其文字和提交部分如下:
//题目部分

3、下令“破釜沉舟”的我国古代将领是:(中级)
项庄
项羽
刘邦 张良
//提交部分

从以上可以看出,题目位于标签中,而选项则是一个一个的type为RADIO的中。
用VB新建一个工程,控件添加“Microsoft Internet Controls”,在窗体上添加一个WEBBROWSER控件,并把它命名为w1。这个WEBBROWDER提供了对其中的页面全面的控制,可以把页面中的每个标签作为一个对象来操作。其NAVIGATE方法可以浏览一个Web页面。下面这段代码在窗体加载时连接到央视的答题网站。
Private Sub Form_Load()
w1.Navigate "http://www.cctv.com/life/happygame/right01.html"
End Sub
连接后,我们输入用户名和密码直到出现如上面的图一样的页面,这时就可以答题了。
要想正确答题并且自动提交,设想如下:首先取得页面中所有的题目和选项,然后在一个题库数据库(假如有的话)中根据这个题目的选项或题干进行查询,查到正确答案后在页面中选择它,最后提交。
下面的代码将自动填写这个答题页面并提交,每一步都有具体的注释。
'定义题目结构,text记录题干,a数组记录选项, p数组记录选项相应在页面中的位置
Public Type textinfotype
a(8) As String
p(8) As String
text As String
End Type
'这个函数实现功能
Public Sub inputanswer()
Dim vdoc, vtag, vtag2, m As Long, t As Long, selclick As Long
Dim textinfo(4) As textinfotype, textcount As Long, rcount As Long
Dim i As Long
Dim chk As long
Set vdoc = w1.Document '将VDOC设置为W1的页面对象
For m = 0 To vdoc.All.length - 1 '访问页面中的每个元素如同一个数组,作一个循环遍历所有的元素
Set vtag = vdoc.All(m) '将VTAG设置为这次循环的元素
Set vtag2 = vdoc.All(m + 1) '将VTAG2设置为这次循环的下一个元素
If UCase(vtag.tagname) = "INPUT" Then
'tagname属性指出当前元素的标签名称,如果是INPUT类型,那么该类型是button,即按钮类型,用来记录这个元素的位置以便后来访问
If vtag.Type = "button" Then selclick = m
End If
'如果这个元素标签名称是“TD”且它的下一个元素名称是“FONT”,根据上面的页面,说明这个标签显示的是题目。
If UCase(vtag.tagname) = "TD" And UCase(vtag2.tagname) = "FONT" Then
textcount = textcount + 1 '题目计数器增加一
rcount = 0 '每个题目的答案计数器赋初值为0
textinfo(textcount).text = vtag.innertext '利用INNERTEXT属性得到题目的文字,储存于预先定义的结构中
End If
End If
'如果这个元素标签名称是“TD”且它的下一个元素名称是“INPUT”,根据上面的页面,说明这个标签显示的是题目下面的选项。
If UCase(vtag.tagname) = "TD" And UCase(vtag2.tagname) = "INPUT" Then
'如果类型是RADIO,而且内容不为空则记录
If UCase(vtag2.Type) = "radio" Then
If vtag.innertext <>"" Then
'答案计数器增加一
rcount = rcount + 1
'记录当前选项和元素位置到定义的结构
textinfo(textcount).a(rcount) = vtag.innertext
textinfo(textcount).p(rcount) = m
End if
End if
End If
Next m
'到现在,我们已经成功地把页面的题干和选项储存到了textinfo(3)这个结构数组里
'下面需要的是从数据库里查询出正确的记录,步骤从略
For i = 1 To 3
'在这里写查询代码
'假设已经查询到正确答案的数值,保存到CHK变量中,比如CHK=2就是第二个答案是正确的
vdoc.All(textinfo(i).p(chk + 1).Checked = True '通过访问TEXTINFO的P数组找到正确答案在页面中的位置,设置CHECKED属性为TRUE,即选中它。
Next I
'页面不允许太快提交时,可以用下面的办法延时
t = Timer
Do
DoEvents
If t < Timer - 3.5 Then Exit Do
Loop
'最后利用CLICK方法点击按钮,提交页面
vdoc.All(selclick).Click
End Sub
如果想提交后再次自动提交,可以在WEBBROWSER的DOCUMENRCOMPLE-
TE事件中调用这个函数,这样每次新题目出完后再次自动提交。
本程序在Win98、VB6.0下调试通过。需要注意的是,这里只是想说明一个提交页面的方法,并不是要大家真去这样做题。对于文本框还可以设置它的value属性以改变其中的文字,对于按钮则用Click方法提交。一些自动提交的软件,如《开心辞典XP》等就是利用这个原理。熟练掌握它后,可以帮助我们自动做很多事情。