http://www.ems.com.cn/qcgzOutQueryAction.do?reqCode=gotoSearch  
这个网站提供在线查询ems邮件状态的功能,现在我们要把这个功能集成到我们自己的系统中自动去运行,就是说要省去人工去这个网站输入邮件号码查询的步骤,系统自动提交邮件号码,自动处理返回来的数据。 
我就想知道这个自动模拟提交的动作如何去实现? 
我用httpclient可以去模拟这个动作,但是他页面上有个隐含域 <input type="hidden" name="myEmsbarCode" value="5356189693738"/>他应该是每次在提交的时候都会去校验这个值。 
所以我先把进入这个表单页的数据抓下来,得到这个隐含域的值,然后再模拟提交,但是返回来的数据还是提示这个验证码不正确。 
这个有没有办法去解决? 

解决方案 »

  1.   

    这是别人写的,不过没看懂,有没有人能看懂 
    关于提取EMS网站内容 
    url="http://www.ems.com.cn/qcgzOutQueryAction.do?reqCode=gotoSearch" 
    url2 = "http://www.ems.com.cn/qcgzOutQueryAction.do" 
    mailNum= "EU548271726CN" call emsQuery(url,url2,mailNum) 
    Sub emsQuery(url,url2,mailNum) 
    set objXMLHTTP = Server.CreateObject("MSXML2.XMLHTTP.5.0") 
    objXMLHTTP.open "GET", ""&url&"", false 
    objXMLHTTP.setRequestHeader "Referer",""&url&"" 
    objXMLHTTP.send() 
    if InStr(objXMLHTTP.responseText, "myEmsbarCode") then 
    myEmsbarCode=right(replace(replace(replace(RemoveHTML(objXMLHTTP.responseText),"""",""),"=","")," ",""),13) 
    response.Write " <script>alert("&myEmsbarCode&"); </script>" 
    end if '取得了myEmsbarCode的值后开始执行查询 
    set objXMLHTTP2 = Server.CreateObject("MSXML2.XMLHTTP.5.0") 
    objXMLHTTP2.open "POST", ""&url2&"", false objXMLHTTP2.setRequestHeader "Content-Type", "application/x-www-form-urlencoded" 
    objXMLHTTP2.setRequestHeader "Referer",""&url2&"" objXMLHTTP2.send("reqCode=browseBASE&myEmsbarCode="&myEmsbarCode&"mailNum="&mailNum&"") 
    response.Write objXMLHTTP2.responseText set objXMLHTTP2 = nothing End Sub 
    Function BytesToBstr(body) 
    dim objstream 
    set objstream = Server.CreateObject("adodb.stream") 
    objstream.Type = 1 
    objstream.Mode =3 
    objstream.Open 
    objstream.Write body 
    objstream.Position = 0 
    objstream.Type = 2 
    objstream.Charset = "GB2312" 
    BytesToBstr = objstream.ReadText 
    objstream.Close 
    set objstream = nothing 
    End Function function RemoveHTML(strHtml) Dim objRegExp, Match, Matches 
    Set objRegExp = New Regexp 
    objRegExp.IgnoreCase = True 
    objRegExp.Global = True 
    objRegExp.Pattern = "name=""myEmsbarCode"" value=""(\d*)""" ' 设置模式。 Set Matches = objRegExp.Execute(strHTML) 
    For Each Match in Matches 
    RemoveHTML=Match.Value Next end function 
      

  2.   

    前段时间是用别的网站(http://www.kdccc.com)做的,因为有很多其它网站可以查询EMS的轨迹。就在前几天发现那个网站查看的源代码和显示出来的页面不一样,应该是隐藏了吧,还是什么的 
      

  3.   

    有些网站不是单纯的发到服务端(提交的url)去验证,中间还有可能去别的url去验证,像盛大游戏充值,126邮箱,都是将信息发送到一个基于https协议的安全url去验证,验证过了再返回来,这个过程是在地址栏看不到的,建议LZ用抓包工具看看数据包的源地址和目的地址的发送情况,
      

  4.   

    可以尝试 cookie 等办法
      

  5.   

    用session里的getparameter()取得隐藏的值
      

  6.   

    <input type="hidden" name="myEmsbarCode" value="5356189693738"/>
    是不是他的隐藏域的值不是固定的呢。