基本要求是这样的,在对话框中输入用户名和密码后,提交到web登陆页面进行验证。登陆成功的话,返回登陆标识code和一个验证码,失败的话,只返回登陆标识code。然后Dialog中,再根据取得的验证码,启动另外一个exe。
用WinInet API 倒是实现了,得到的都是HTML的代码,看了网上的很多例子也都是这样的。只能把所需要的信息放在html中然后再截取吗,这样好像不安全?有没有别的办法只取得所需要的code和验证码就可以了。
下面是我的代码。。因为不熟悉vc,请各位高手帮忙,入手点有没有错?有没有别的更好的方法?HINTERNET hInternet = ::InternetOpen("Get AuthKey", PRE_CONFIG_INTERNET_ACCESS, "", INTERNET_INVALID_PORT_NUMBER,0);
if (hInternet == NULL)
{
return ;
}m_strServer = "124.38.95.119";
HINTERNET hConnect = ::InternetConnect(hInternet, m_strServer, INTERNET_DEFAULT_HTTP_PORT, NULL, "", INTERNET_SERVICE_HTTP, 0, 0); 
if (hConnect == NULL)
{
return ;
}CString strObjName = "/client_bs/SystemTeamTest/login.php?login_id=aa&login_pass=123";
HINTERNET hRequest = ::HttpOpenRequest(hConnect, "POST", strObjName, HTTP_VERSION, 0, NULL, INTERNET_FLAG_RELOAD, 0);
if (hRequest == NULL)
{
VERIFY(::InternetCloseHandle(hInternet));
VERIFY(::InternetCloseHandle(hConnect));
return ;
}// send the request
BOOL bSendRequest = ::HttpSendRequest(hRequest, NULL, 0, 0, 0);
if (!bSendRequest)
{
return ;
}
char achQueryBuf[32];
DWORD dwFileSize;
DWORD dwQueryBufLen = sizeof(achQueryBuf);
BOOL bQuery = ::HttpQueryInfo(hRequest, HTTP_QUERY_CONTENT_LENGTH, achQueryBuf, &dwQueryBufLen, NULL);
if (bQuery)
{
dwFileSize = (DWORD)atol(achQueryBuf);

else {
dwFileSize = 10 * 1024;
}char *lpszBuf = new char[dwFileSize + 1];DWORD dwBytesRead;
BOOL bRead = ::InternetReadFile(hRequest, lpszBuf, dwFileSize + 1, &dwBytesRead);lpszBuf[dwBytesRead] = 0 ;
AfxMessageBox((LPCTSTR)lpszBuf);delete lpszBuf;VERIFY(::InternetCloseHandle(hRequest));
VERIFY(::InternetCloseHandle(hConnect));
VERIFY(::InternetCloseHandle(hInternet));请各位高手指点。。

解决方案 »

  1.   

    是的,http请求得到不是html才奇怪呀.你可以做一些加密什么的.
      

  2.   

    没有,人家都是拿到html自己在分析的
      

  3.   

    都是拿到http请求返回的结果后,自己处理http字符串等来分析,判断,..
      

  4.   

    弱弱的问一下,关于postdata部分,代码的下面两个地方是不是错了??CString strObjName = "/client_bs/SystemTeamTest/login.php?login_id=aa&login_pass=123"; BOOL bSendRequest = ::HttpSendRequest(hRequest, NULL, 0, 0, 0); 正确的是不是这样的???
    CString strObjName = "/client_bs/SystemTeamTest/login.php";  BOOL bSendRequest = ::HttpSendRequest(hRequest, NULL, 0, "login_id=aa&login_pass=123", 0);
      

  5.   

    你的数据返回的时候,无论如何都是要显示的啊,无法和VC函数一样返回一个值但不显示的,所以内容在HTML中体现是确定的,否则你就只能这样:你提交后,你的ASP将结果发到一个FTP网站上的一个文件里,你再通过不同的帐号及密码访问这个FTP得到这个文件.即 VC程序-->提交数据到ASP-->ASP生成验证码等结果-->ASP网站将数据以文件名方式存到FTP(但网页可以显示成功与否的标识,不显示验证码,也可以显示文件名称)-->你的程序得到ASP反馈的信息后,用另一个帐号密码登录FTP,下载这个文件并分析.还有一种,我认为比较好:
    你在你的程序对话框中放一个IE控件,设置为隐藏,或大小为(0,0),你的数据就提交给这个IE控件,IE控件会自动打开你指定的地址,并将参数传送进去,相当于你提交数据.这样你的IE控件就会打开反馈网页,你通过IHTMLDOCUMENT指针可以得到这个HTML的内容(显示的文字),也可以得到HTML源码,根本你的网页格式,很方便就能定位到你的数值处,并得到结果,这样你得到结果的过程,就全在你的程序中完成了.你还可以将返回的网页中的显示内容有一定的加密,例如,简单的反转,加一段无用数据,ASC编码等等.如果还是不明白,可以加我的QQ 30101,我有现成的代码,作用是:发送帐号密码登录一个网页,并将这个网页中显示的一个表格读取写入到数据库,这个过程和你的非常相像.可以给你核心代码. 可以的话,请加分. 呵呵.
      

  6.   

    插入一个IE控件到你的对话框,并关联一个CWebBrowser2变量m_browser;
    #include "webbrowser2.h"
    //CWebBrowser2  m_browser;   VARIANT vInfo;
        vInfo.vt=VT_EMPTY;
        m_browser.Navigate("http:www.xxx.com/Login.jsp?user=U0001&password=ABCDEFG",&vInfo,&vInfo,&vInfo,&vInfo);
     //这就在你的IE控件里提交你的帐号密码了。
      

  7.   

    To TianChong: 
    非常感谢,现在没法使用QQ,晚上再加你。
      

  8.   

    顺带提一下,我使用的是CDHtmlDialog。。
      

  9.   

    你再定义一个全局变量:CString str_HTMLText;
    定义一个函数:void GetWebHtml(CWebBrowser2 &WebBrowser)

          long BufSize = 1000000L;
          long Size;
          IStream *Stream;
          HGLOBAL hHTMLText;
          IPersistStreamInit *psi;      IHTMLDocument2 *htm;
          htm=(IHTMLDocument2*)WebBrowser.GetDocument();
          htm->QueryInterface((REFIID)IID_IPersistStreamInit, (void**) &psi);
          ULARGE_INTEGER size;
          psi->GetSizeMax (&size);
          hHTMLText = GlobalAlloc(GMEM_FIXED, BufSize);
          if ((void*)NULL == hHTMLText )
      {
       AfxMessageBox("ERR 01:读取网页数据失败,请重试操作!");
           exit(0); 
      }
           memset((char*)hHTMLText,0,BufSize); 
           CreateStreamOnHGlobal (hHTMLText, true, &Stream);       psi->Save(Stream, false);
           Size = strlen((char*)hHTMLText);       str_HTMLText=(char*)hHTMLText;
           GlobalFree(hHTMLText);
           psi->Release ();} 
    在你的IE控件的事件中加入
    void CGetHtmlDlg::OnDocumentCompleteWebbrowser(LPDISPATCH pDisp, VARIANT FAR* URL) 
    {
    // TODO: Add your control notification handler code here
            GetWebHtml(m_browser);
    }可以通过简单的方法来判断是否取得了数据
    long nPos=str_HTMLText.Find("验证码为",0); if (nPos<0)
    {
      AfxMessageBox("页面可能没有正常显示或网页不正确,请重试! ");
      return;
    }然后找起点
    long nFullLen= str_HTMLText.GetLength();
    long nNextPos=0,nIndex=0,nLen=0; //下一个符号的位置,检索ID用于是否为第一二项,二个POS之间的长度
    CString str_code,str_name//单位编码,名称
    long nID=0; //顺序号 nPos=str_HTMLText.Find("td nowrap",nPos); //我取的是表,这个是表的开头,你要查看你的网页源码特征
        if (nPos==-1)
    {
      AfxMessageBox("没有找到起点,页面可能没有完整显示或无单位记录! ");
      return;
    }定位到正确位置然后就是取数据了
    str_code=str_HTMLText.Mid(找到的位置nPos+离实际数据的字符数,例如1,你要取的数据的长度可以通过找到结束特征码的nPos来相减取得);这样str_code就是你要的数据了.相同的方法得到另一个数据.所以操作基本说完了,楼主要加分才行. :)
      

  10.   

    我整个过程都没有生成文件,很安全了.你要记得IE控件不要显示出来,哈哈,其中得到网页源码的部分很有价值,以前我没有公开过的,你可以好好看看.QQ不用加了,我都给你写完了.可以的话,给贴子多加点分比较实际.祝你成功,有需要的话,可以到我的VC高手群2997669交流.