如果要對用戶投票的話就必須先填寫驗證碼!由于驗證碼是圖片,而且是隨即的,所以對自動提交數(shù)據(jù)增加了很大的難度。因此,如果要提交投票就必須先得到驗證碼!
難點:(1)取得驗證碼圖片并識別成相應(yīng)數(shù)據(jù);(2)提交數(shù)據(jù)表單。
首先我們來剖析一下本頁面的 HTML 源代碼,代碼如下:
… …
… …
為了保證代碼的易讀性,進(jìn)行了相應(yīng)的處理,并省略了部分無用的代碼!不難看出的是:
(1)表單的名稱是:form1 ; 提交的頁面是:Photo_Vote.asp ; 提交方式是:Post
?。?)表單提交的數(shù)據(jù)有:id 和 CheckCode 。其中 id 為隱藏域,內(nèi)容是:{525147E1-C4A7-41EE-9190-95800AC81E29}
?。?)驗證碼的圖片文件為:count.asp?sksid=624BE861D1FF9641DE7F1D1FF967C1E711D1FF95C
D5E9B1D1FF9|3812D0|1AF2D7 它是由 Count.asp 隨即動態(tài)生成,存在不確定性!
?。?)在網(wǎng)頁的驗證碼的圖片上按右鍵,保存圖片時顯示為:Count.XBM 即圖片的格式為:XBM
通過上面的分析,問題就可以一個一個解決了。
【表單的提交】
表單的提交有幾種方式,常用的有兩種:一是直接提交含表單提交數(shù)據(jù)的網(wǎng)址;二是修改原表單,然后提交新數(shù)據(jù)!
對于第一種,我們在得到驗證碼后可以這樣發(fā)送:http://www.motorola.com.cn/news/925/photo_vote.asp?id={
525147E1-C4A7-41EE-9190-95800AC81E29}&CheckCode=6793
然而由于摩托羅拉的網(wǎng)站對 Cookies 進(jìn)行了操作,這樣做起來不是很好,而且也難成功,所以我們直能改用第二種方法,修改原有的表單。
首先,利用 WebBrowers 控件取得網(wǎng)頁源代碼(具體方法,請參考:
http://www.cndevx.com/tips/showdoc.asp?detail_id=1337)利用VB中的 Replace 函數(shù)將原表單網(wǎng)頁的代碼修改成:
… …
… …
然后利用 Webbrowers.Document.write HTMLCodes 方式,講替換的 HTML 代碼重新寫入 Webbrowers 控件里面, Webbrowers 控件將自動運行新的代碼,即自動提交了數(shù)據(jù)!
這樣,整個提交過程就自動完成了,如果我們再加上相應(yīng)的時間控制或者其他網(wǎng)站的話,就可以實現(xiàn)自動刷新和消息群發(fā)了!
【XBM 圖片文件】
XBM(X BitMap)一種圖形文件格式
文件結(jié)構(gòu)類似如下:
#define counter_width 32 //定義圖片寬(象素)
#define counter_height 10 //定義圖片高(象素)
static unsigned char counter_bits[]={
0x3c,0x3c,0xfe,0x3c,0x66,0x66,0xfe,0x66,0xc3,0xc3,0x06,0x60,0x66,0x66,0x06,
0x60,0x3c,0x3c,0x3e,0x30,0x66,0x66,0x60,0x18,0xc3,0xc3,0xc0,0x0c,0xc3,0xc3,0xc3,
0x06,0x66,0x66,0x66,0x06,0x3c,0x3c,0x3c,0x7e};
// 圖像數(shù)據(jù),采取16進(jìn)制格式的,還原圖像時需轉(zhuǎn)換成二進(jìn)制后數(shù)據(jù)反向,否則圖片將是反的
得到 XBM 圖片,分離成相應(yīng)的字符,然后與預(yù)先的圖片文件比較,即可得出此圖像代表的數(shù)字,即所謂的識別!
演示程序:http://www.cndevx.com/club/uploadfile/2003941042070557.rar
源 代 碼:http://www.cndevx.com/club/uploadfile/20039410421872749.rar
=========================
附:使用VB獲得一頁的HTML代碼
加入WebBrowser、Timer、CommandButton控件各一個,然后使用以下代碼:
Private Sub Command1_Click()
WebBrowser1.Navigate "http://www.motorola.com.cn/news/925/photo_vote.asp?id=
{525147E1-C4A7-41EE-9190-95800AC81E29}"
Timer1.Enabled = True
End Sub
Private Sub Timer1_Timer()
Dim doc, objhtml As Object
Dim i As Integer
Dim strhtml As String
If Not WebBrowser1.Busy Then
Set doc = WebBrowser1.Document
i = 0
Set objhtml = doc.body.createtextrange()
If Not IsNull(objhtml) Then
Text1.Text = objhtml.htmltext
End If
Timer1.Enabled = False
End If
End Sub
這是網(wǎng)上流行的一種方法,但是從我使用來看,因為 WebBrowers 控件本身有 DocumentComplete 事件,也就是
說并不需要使用 Timer 控件!(csdn)