http://developer.51cto.com/art/201001/180094.htm
VB.NET表单自动提交实现方案剖析

 


http://www.winu.cn/ask/question.php?qid=24714
用 VB 实现表单的自动提交
 
问题补充: 以摩托罗拉的九月大奖赛为例,下面介绍用   VB   实现带校验码的网页表单的自动提交。我们现看看摩托罗拉的投票页面:http://www.motorola.com.cn/news/925/photo.asp?id={525147E1-C4A7-41EE-9190-95800AC81E29}


        如果要对用户投票的话就必须先填写验证码!由于验证码是图片,而且是随即的,所以对自动提交数据增加了很大的难度。因此,如果要提交投票就必须先得到验证码!

        难点:(1)取得验证码图片并识别成相应数据;(2)提交数据表单。

        首先我们来剖析一下本页面的   HTML   源代码,代码如下:

                …   …
<table>
                <form   name= "form1 "   method= "post "   action= "photo_vote.asp ">
                                <input   type= "hidden "   name= "id "   value= "{525147E1-C4A7-41EE-9190-95800AC81E29} ">
                <tr>
                                <td> 请输入4位数字验证码:   <input   type= "text "   name= "CheckCode "   size=4> <img   src= "count.asp?sksid=624BE861D1FF9641DE7F1D1FF967C1E711D1FF95CD5E9B1D1FF9|3812D0|1AF2D7 ">

<input   type= "submit "   name= "submit "   value= "投   票 "> <input   type= "button "   value= "关   闭 "   onClick= "javascript:window.close() "> </td>
                </tr>
                </form>
</table>

                …   …


为了保证代码的易读性,进行了相应的处理,并省略了部分无用的代码!不难看出的是:

        (1)表单的名称是:form1   ;   提交的页面是:Photo_Vote.asp   ;   提交方式是:Post
        (2)表单提交的数据有:id   和   CheckCode   。其中   id   为隐藏域,内容是:{525147E1-C4A7-41EE-9190-95800AC81E29}
        (3)验证码的图片文件为:count.asp?sksid=624BE861D1FF9641DE7F1D1FF967C1E711D1FF95CD5E9B1D1FF9|3812D0|1AF2D7   它是由   Count.asp   随即动态生成,存在不确定性!
        (4)在网页的验证码的图片上按右键,保存图片时显示为:Count.XBM   即图片的格式为:XBM

        通过上面的分析,问题就可以一个一个解决了。

【表单的提交】


        表单的提交有几种方式,常用的有两种:一是直接提交含表单提交数据的网址;二是修改原表单,然后提交新数据!
        对于第一种,我们在得到验证码后可以这样发送:http://www.motorola.com.cn/news/925/photo_vote.asp?id={525147E1-C4A7-41EE-9190-95800AC81E29}&CheckCode=6793   然而由于摩托罗拉的网站对   Cookies   进行了操作,这样做起来不是很好,而且也难成功,所以我们直能改用第二种方法,修改原有的表单。
        首先,利用   WebBrowers   控件取得网页源代码(具体方法,请参考:http://www.cndevx.com/tips/showdoc.asp?detail_id=1337)利用VB中的   Replace   函数将原表单网页的代码修改成:
                …   …
<table>
                <form   name= "form1 "   method= "post "   action= "http://www.motorola.com.cn/news/925/photo_vote.asp ";>
                                <input   type= "hidden "   name= "id "   value= "{525147E1-C4A7-41EE-9190-95800AC81E29} ">
                <tr>
                                <td> 请输入4位数字验证码:   <input   type= "text "   name= "CheckCode "   size=4   value=6739> <img   src= "count.asp?sksid=624BE861D1FF9641DE7F1D1FF967C1E711D1FF95CD5E9B1D1FF9|3812D0|1AF2D7 ">

<Script>
                form1.submit();
</Script>
<input   type= "button "   value= "关   闭 "   onClick= "javascript:window.close() "> </td>
                </tr>
                </form>
</table>
                …   …


        然后利用   Webbrowers.Document.write   HTMLCodes   方式,讲替换的   HTML   代码重新写入   Webbrowers   控件里面,   Webbrowers   控件将自动运行新的代码,即自动提交了数据!

        这样,整个提交过程就自动完成了,如果我们再加上相应的时间控制或者其他网站的话,就可以实现自动刷新和消息群发了!




【XBM   图片文件】

        XBM(X   BitMap)一种图形文件格式

        文件结构类似如下:
#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};                                                       //图像数据,采取16进制格式的,还原图像时需转换成二进制后数据反向,否则图片将是反的

        得到   XBM   图片,分离成相应的字符,然后与预先的图片文件比较,即可得出此图像代表的数字,即所谓的识别!

=========================
附:使用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  

        这是网上流行的一种方法,但是从我使用来看,因为   WebBrowers   控件本身有   DocumentComplete   事件,也就是说并不需要使用   Timer   控件!


zhangcaiyun99 的答案


<table>
                <form   name= "form1 "   method= "post "   action= "photo_vote.asp ">
                                <input   type= "hidden "   name= "id "   value= "{525147E1-C4A7-41EE-9190-95800AC81E29} ">
                <tr>
                                <td> 请输入4位数字验证码:   <input   type= "text "   name= "CheckCode "   size=4> <img   src= "count.asp?sksid=624BE861D1FF9641DE7F1D1FF967C1E711D1FF95CD5E9B1D1FF9|3812D0|1AF2D7 ">

<input   type= "submit "   name= "submit "   value= "投   票 "> <input   type= "button "   value= "关   闭 "   onClick= "javascript:window.close() "> </td>
                </tr>
                </form>
</table>louis vuitton bags