大家好~我是一名业外人员,对VB比较感兴趣,喜欢编点小程序,但是不可避免的遇到自己无法解决的问题,而我周边的人都不懂VB,我也没有人可以一起探讨.....希望大家帮帮忙。问题如下:程序目的:
    自动登陆某网站的帐号(没有验证码),接着在新的页面上点击某个按钮,再在新的页面上点击某个按钮,...
个人经历:
    我上网找过示例,用的是webbrowser控件,当NavigateComplete2事件发生后,对WebBrowser1.Document.All(i).tagname筛选出值为INPUT的控件,填帐号,密码,...对着学校教务处网站一边调试一边修改,程序我终于编出来了,效果还还可以。
    可是现在出问题了!网站登陆页面变了(外观没变),之前WebBrowser1.Document.All.length返回值>=54,可是现在=12,而且.tagname没有一个是INPUT或者A的,给我输帐号密码的控件对象不能引用,我不知道该怎么办了....
    我觉得用NavigateComplete2事件太慢了,可不可以不等页面下载完成(我只需要对最后一个页面进行操作),直接发送消息“我要点某个按钮”?还有,像webbrowser这种控件,我再对象浏览器中只能查到Document,就比如我找到资料之前根本就不知道有tagname属性,怎么编程呢....我是想问,大家是通过什么途径知道这些属性的呢?

解决方案 »

  1.   

    用个抓包软件看看这个登陆页面发送到远程服务器的是什么,然后直接模拟这个动作就行了。
    不用抓包软件的话,只用webbrowser应该也能完成,这个登陆页面应该用的post方式发送数据吧,那么:Private Sub Command1_Click()
        WebBrowser1.Navigate "登陆页面的网址" '打开登陆页面并手工登陆一次
    End SubPrivate Sub WebBrowser1_BeforeNavigate2(ByVal pDisp As Object, URL As Variant, Flags As Variant, TargetFrameName As Variant, PostData As Variant, Headers As Variant, Cancel As Boolean)
        Debug.Print URL, Flags, PostData, Headers '把这些记下来,用webbrowser给原样发送回去就是了
    End Sub也可能没我想的这么简单,但愿对你有所帮助。
      

  2.   

    好像不行啊,postdata根本就没有几个字符...
    这个事件的PostData As Variant参数是按地址传送的,估计是给程序员设置的,而不是引用的,我觉得....
      

  3.   

    其实实现WEB上的自动登陆可以有好几种方法,但通常会根据具体的而定使用哪一种方法。
    很多人会使用WebBrowser1来实现网页自动登陆的原因就是图简单,就像操作Script对象
    一样去操作WebBrowser1里的对象模拟浏览器操作的过程。甚至连实现的原理是什么都不
    知道的都大有人在。其实说到根本,就是通过TCP/IP协议向远程服务器提交一段字符串就实现了自动登陆,其主要
    问题是在提交的字符串内容及格式,然后再等待服务器返回一段字符串就得到了网页的代码内容。
    既然是这样,只要研究一下HTTP通讯协议就知道该提交什么样的文本数据比较合适。其实登陆的关键在于HTTP协议中的Cookie的内容,只要懂得用TCP/IP进行网络通讯,并了解
    HTTP通讯协议及格式,稍微考虑一下如何纪录及修改Cookie字段的内容,然后将Cookie字段的
    内容和HTTP头一同发送,登陆的用户信息就不会跑了。如果认真的研究一下HTTP协议,也很容易
    理解的,也不会花很多时间,但是得到的效果却远比在虚幻中的使用对象来得清晰。如果知道了原理,
    那么你做这种东西的要求可能也会提高,可能也不会用WebBrowser1这种东西来实现你的需求了,
    因为WebBrowser1除了访问网页地址,同时也会去加载很多别的与登陆无关东西,比如单纯的图片等,
    对于有速度上的要求来说,这就会感觉很慢。一般情况下,可以使用XMLHTTP来实现这个需求速度会快点,因为XMLHTTP不会自动去下载那些
    图片或CSS之类的东西,这样可以提高很多网络速度,至于XMLHTTP如何使用,你可以看看以下
    我的博客,VB、VC的都有说明:
    http://blog.csdn.net/SupermanKing
    VB用XML实现在线翻译范例
    在我的资源里也有个范例你可以看看
    VB源码:通过XML读取网页内容并分析取得需要的数据当然,如果你对HTTP协议不熟悉,那么可能会有很多问题,但如果你先了解了HTTP服务端和客户端
    通讯的协议及整个过程,那么使用这种组件就简单多了。在电脑软件的学习上,基础理论很重要的,要向基础的理论及方向走才会得到更多的提高,才能发现更
    多的实现方法。
      

  4.   

    楼上大哥的意见我有很认真对待哦,可是毕竟不是专业出生....
    这几天翻了点书,结果得出了更多的问题:
    1.用一楼的方法实现自动登陆的时候,为什么WebBrowser1.Document.All(i)里面没有没有可以操作的控件。比如查看网页的源代码,可以看到<INPUT class=button id=Button1 type=submit value=" 登 录 " name=Button1>,但是我把所有的WebBrowser1.Document.All(i).id(tagname)都列出来了,就是没有Button1(INPUT),怎么滴个回事啊!
    2.客户请求的格式、方法、头,我都了解一点了,但是请求数据该怎么弄呢?还没见到过实例...比如我要填写某些表单,再点击某个按钮,请求数据怎么编写呢?
    3.服务器是怎么判断某个帐号是否在线的呢?有些网站登陆后关闭所有页面,再进入网站的时候,帐号仍然是在线的,而有些网站就不这样...
    4.3台机器通过路由器共享一个IP,现在用winsock控件,实现网内的文件传输,连接的时候IP该怎么确定啊?
    5.vb控制其他程序怎么搞呢?比如用vb编程控制KuGoo8换下一曲,该怎么办咧?
    希望大家能帮帮忙啊~
      

  5.   

    1、你用WebBrowser转到你说的网页后,这样看看行不行
       msgbox WebBrowser1.Document.All.item("Button1").value2、正常的HTTP客户端请求有两种方式
       1)GET 方式
          将要提交的内容加到地址中,如:
          GET /default.asp?Button1=1&Text1=%20AAA%20 HTTP/1.1
          Accept: */*
          Accept-Language: zh-cn
          UA-CPU: x86
          ...
          Cookie:ASPSESSIONIDASDBSDRR=BLEDBIBBCGKBJAKJCFEJKGII
          Connection: Keep-Alive   2)POST 方式
          将要提交的内容加到数据区中,如:
          POST /default.asp HTTP/1.1
          Accept: */*
          Accept-Language: zh-cn
          UA-CPU: x86
          ...
          Cookie:UserName=User1;PassWord=1234;ASPSESSIONIDASDBSDRR=BLEDBIBBCGKBJAKJCFEJKGII
          Connection: Keep-Alive
          
          Button1=1&Text1=%20AAA%203、服务器判断用户是否登陆通常有两种方式,在ASP或PHP的角度来说,分Session和Cookie两种。    Session机制其实也是基于Cookie信息的,只是他不是依靠Cookie存储具体的数据,Cookie里
        存储的只是一个特殊而唯一的编号而已,具体的数据由服务器缓存存储,所以Session失效会很快,
        因为要保证服务器的内存使用足够,所以默认情况下时间都不会很长。    Cookie则是完全依靠客户端存储的,而Cookie通常是存在客户端,而且很多浏览器都是以文件形
        式存储,所以有效期存个几年都没问题。就上面的范例来说一下:
        "Cookie:UserName=User1;PassWord=1234;ASPSESSIONIDASDBSDRR=BLEDBIBBCGKBJAKJCFEJKGII"
        Cookie:                           - 这是浏览器提交Cookie内容的标志,表示后面的信息是Cookie内容
        UserName=User1;PassWord=1234;      - 这些数据就完全属于存储在客户端的Cookie信息。
        ASPSESSIONIDASDBSDRR=BLEDBIBBCGKBJAKJCFEJKGII  - 这就是所谓Session特殊而唯一的编号    IIS会申请一块空间,然后每个客户端都有分配一个编号,服务器脚本根据客户端提交的编号查询服务器上存储的信息
        来进行运算或处理。    而对于Cookie,服务器脚本就是直接分析客户端提交上来的Cookie内容进行分析或处理。4、做一个TCP服务,然后通过UDP广播告诉局域网的用户需要那个用户连接过来,然后对方收到信息,判断那个指定的用户
       是自己后,就主动的用TCP去连接那个TCP服务器。5、控制别人的程序方法很多,可以通过系统消息、DDE信息、钩子技术、虚拟键盘或鼠标操作等等,根据你具体要控制的程
       序而定。就比如你说的KuGoo8换下一曲,我没用过,呵呵,但是估计可以用 mouse_event 函数模拟鼠标操作实现,搞
       不好也可以用 SendMessage 发送系统消息实现,你可以研究一下这两个函数,应该会对你有些帮助的。