用MFC 实现HTTP POST,GET ,COOKIE功能

spotatoes 2008-11-17 09:07:45
我搜了半天了,都没有找到可以设置COOKIE 正常的代码

实现功能很简单,就是先用POST 打开一个登陆页面,登陆成功接着再打开另一个页面,
当然这个页面需要用到第一个页面提交的COOKIE,否则失败;;就是这样点我没有弄出,可以登陆了,
就是打开另一个页面时始终跳到登陆去了,,,,我设置了COOKIE的,调试时有COOKIE,
我在浏览器登陆后,javascript:alert(document.cookie); 这个返回的数据比我调试时要长一些,不知道怎么搞了,;;


看吓,代友,很乱,测试时这样的,大家耐心点帮我看吓,哪点有问题,
或才发个可用的源码到我邮箱吓spotatoes@tom.com

DWORD WINAPI RunThread(LPVOID l)
{
CQueryJFDlg::sctAddInfo sct = *(CQueryJFDlg::sctAddInfo*)l;
CString userName(sct.info->un),userPwd(sct.info->pwd);
//http://www.qidian.com/user/userbilling/billingindex.aspx
CString m_strRequest= "loginname="+userName +"&loginpassword="+
userPwd+"&Ekey=0&Challenge=234234&cookietime=1&USEUUID=1";;
CString m_strServerName = "my.jjwxc.net";
CString m_strObjectName = "login.php?action=login";
CString m_strObj2 = "user/userbilling/billingindex.aspx";
//http://www.qidian.com/User/Login.aspx
CInternetSession m_InetSession("session");
m_InetSession.SetOption(INTERNET_OPTION_CONNECT_TIMEOUT,32000);
m_InetSession.SetOption(INTERNET_OPTION_CONNECT_RETRIES,10);
m_InetSession.SetOption(INTERNET_OPTION_CONNECT_BACKOFF,1000);
CHttpConnection* pServer = NULL;
CHttpFile* pFile = NULL;
bool allOK = false;
try{
INTERNET_PORT nPort;
nPort=80;
{
m_strRequest= "txtUserName="+userName
+"&txtPwd="+userPwd+"&txtToken=3&__EVENTTARGET=1&__EVENTARGUMENT=1&
__VIEWSTATE=/wEPDwUKMTIyODU3MTM0NA8WAh4LX19yZXR1cm
5VcmwFDS9EZWZhdWx0LmFzcHgWAgIDD2QWBAIFDw9kFgIeB29uZm9jd
XMFDnRoaXMudmFsdWU9Jyc7ZAIGDw8WAh4EVGV4dAUEMjYzM
mRkGAEFHl9fQ29udHJvbHNSZXF1aXJlUG9zdE
JhY2tLZXlfXxYBBQhpYm5Mb2dpbvu
tF1O65ihdfQUXXYyMu+palHjj&__EVENTVALIDATION=/wE
WBQLTzf6GBgKl1bKzCQK537/1CwKd+7qdDgLChNy0DU7IXbq0/m8gjjOe8iLCzG/UYsvs";;

m_strServerName = "www.qidian.com";
m_strObjectName = "User/Login.aspx";
nPort=80;
pServer = m_InetSession.GetHttpConnection(m_strServerName, nPort);
pFile = pServer->OpenRequest(CHttpConnection::HTTP_VERB_POST,
m_strObjectName,0,1,0,0,INTERNET_FLAG_DONT_CACHE);
char szHeaders[100];
strcpy(szHeaders,"Accept: text*/*\r\nContent-Type: application/x-www-form-urlencoded");
pFile->AddRequestHeaders(szHeaders);
pFile->AddRequestHeaders(_T("Connection: keep-alive\r\n"));

pFile->SendRequestEx(m_strRequest.GetLength());
pFile->WriteString(m_strRequest);
pFile->EndRequest();
pFile->QueryInfoStatusCode(dwRet);
BOOL bSucc=0;


Sleep(1000);
CString sNewCookie;

{

//bSucc = pFile->QueryInfo(HTTP_QUERY_COOKIE, sCookie, &dwVal);
//这个是我在GOOGLE搜到的源码,它获取COOKIE是这样的获取的,不过我测试时返回为空
char ss[10000];memset(ss,0,10000);
long lend = strlen(ss);
m_InetSession.GetCookie( pFile->GetFileURL(),"",ss,10000); //这里可以获取到值
sNewCookie = ss;
sNewCookie.Trim();
}




m_strHtml = "";
int nRead = 0;
bool isLogon = false;
while( (nRead=pFile->Read(szBuff,1023))>0 )
{
m_strHtml = szBuff;
if( -1 == m_strHtml.Find("用户登录") )
{
isLogon = true;break;//登陆成功
}
TRACE( szBuff );
TRACE( "\r\n" );
//break;

}
if( !isLogon ){
sct.info->info = "登陆失败xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
goto exit;
}




delete pFile;pFile = NULL;
delete pServer; pServer = NULL;
pServer = m_InetSession.GetHttpConnection(m_strServerName,nPort);
pFile = pServer->OpenRequest(CHttpConnection::HTTP_VERB_GET,m_strObj2 );
//m_InetSession.SetCookie( pFile->GetFileURL(),"session",cookie );
CString sTmp;
// pFile->AddRequestHeaders(_T("Content-Type: application/x-www-form-urlencoded\r\n"));
pFile->AddRequestHeaders("Accept: text*/*\r\n");
pFile->AddRequestHeaders(_T("Connection: keep-alive\r\n"));
//sTmp.Format(_T("Cookie: %s\r\n"), sNewCookie);
pFile->AddRequestHeaders("Cookie: ");
pFile->AddRequestHeaders( sNewCookie.GetString() ); //这时设置的COOKIE
pFile->AddRequestHeaders("\r\n");
pFile->SendRequest();
//pFile->EndRequest();
memset(szBuff,0,1024);
bool first = true;
while( (nRead=pFile->Read(szBuff,1023))>0 )
{
m_strHtml = szBuff;
if( first ){
if( -1 != m_strHtml.Find("起点中文网--用户登录") )
{
//跳转失败,,,,,,,,,,,,现在总是执行到这里
break;
}else{
first = false;
}

}
}

// delete []cookie;
}
exit:
delete pFile;
delete pServer;
{
sct.info->ischeck = true;
sct.dlg->AddInfo( &sct );
}

//sct.dlg->Start();
}
catch (CInternetException* e){
//CString s;
char info[234];
e->GetErrorMessage(info,234);


AfxMessageBox(info);
}
return 0;

}
...全文
2737 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
pku2009 2009-01-06
  • 打赏
  • 举报
回复
我也正想写一个类似的东西, 呵呵

就是实现自动输入网站用户名和密码,并且可以登录。现在还不清楚怎么自动输入,也不清楚怎么POST,呵呵,楼主可以发下源码吗??
lhsxsh 2008-12-04
  • 打赏
  • 举报
回复
支持一下
qq525931 2008-11-28
  • 打赏
  • 举报
回复
你没加浏览器类型。
aa3000 2008-11-21
  • 打赏
  • 举报
回复
建议使用抓包工具看看你发出的是什么,接收的是什么。

如果使用 WinInet 只需要使用 InternetSetCookie 或 InternetGetCookie 就可以了。
beyound 2008-11-21
  • 打赏
  • 举报
回复
你用InetSession的话cookie是自动的不用手工干预。
spotatoes 2008-11-21
  • 打赏
  • 举报
回复
pFile->QueryInfoStatusCode(dwRet);//这里返回500 据说是服务器内部错误,是不是因为ASP.net 它除了表单原有数据外,还有其它隐藏值,我用本地HTML 写了模拟的表单,可以正常登陆,但程序里面始终不行;;
spotatoes 2008-11-21
  • 打赏
  • 举报
回复
up

pServer = m_InetSession.GetHttpConnection(m_strServerName,nPort);
pFile = pServer->OpenRequest(CHttpConnection::HTTP_VERB_GET,m_strObj2 );
//m_InetSession.SetCookie( pFile->GetFileURL(),"session",cookie );
CString sTmp;
// pFile->AddRequestHeaders(_T("Content-Type: application/x-www-form-urlencoded\r\n"));
pFile->AddRequestHeaders("Accept: text*/*\r\n");
pFile->AddRequestHeaders(_T("Connection: keep-alive\r\n"));
//sTmp.Format(_T("Cookie: %s\r\n"), sNewCookie);
pFile->AddRequestHeaders("Cookie: ");
pFile->AddRequestHeaders( sNewCookie.GetString() ); //这时设置的COOKIE
pFile->AddRequestHeaders("\r\n");
pFile->SendRequest();
//pFile->EndRequest();
pFile->QueryInfoStatusCode(dwRet);

//这里返回500 据说是服务器内部错误,是不是因为ASP.net 它除了表单原有数据外,还有其它隐藏值,我用本地HTML 写了模拟的表单,可以正常登陆,但程序里面始终没值;;
yjgx007 2008-11-19
  • 打赏
  • 举报
回复
建议你用开源的curl库.
yurenwjq 2008-11-19
  • 打赏
  • 举报
回复
不好意思, 我有没看懂. 我也正想写一个类似的东西, 写好了麻烦你发份给我哟 E-mail: douya3020@qq.com.
janreyho 2008-11-19
  • 打赏
  • 举报
回复
支持一下

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧