基本要求是这样的,在对话框中输入用户名和密码后,提交到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));请各位高手指点。。
用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));请各位高手指点。。
CString strObjName = "/client_bs/SystemTeamTest/login.php"; BOOL bSendRequest = ::HttpSendRequest(hRequest, NULL, 0, "login_id=aa&login_pass=123", 0);
你在你的程序对话框中放一个IE控件,设置为隐藏,或大小为(0,0),你的数据就提交给这个IE控件,IE控件会自动打开你指定的地址,并将参数传送进去,相当于你提交数据.这样你的IE控件就会打开反馈网页,你通过IHTMLDOCUMENT指针可以得到这个HTML的内容(显示的文字),也可以得到HTML源码,根本你的网页格式,很方便就能定位到你的数值处,并得到结果,这样你得到结果的过程,就全在你的程序中完成了.你还可以将返回的网页中的显示内容有一定的加密,例如,简单的反转,加一段无用数据,ASC编码等等.如果还是不明白,可以加我的QQ 30101,我有现成的代码,作用是:发送帐号密码登录一个网页,并将这个网页中显示的一个表格读取写入到数据库,这个过程和你的非常相像.可以给你核心代码. 可以的话,请加分. 呵呵.
#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控件里提交你的帐号密码了。
非常感谢,现在没法使用QQ,晚上再加你。
定义一个函数: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就是你要的数据了.相同的方法得到另一个数据.所以操作基本说完了,楼主要加分才行. :)