C++模拟Http/Https POST登录web站点(二)

2015-07-20 17:08:16 · 作者: · 浏览: 21
bRet = TRUE; } while (FALSE); return bRet; } BOOL SocketClient::SendPostData() { CString cstrSendData; CString cstrSendParam = redirect=&username=+cstrUserName+&password=+cstrPassWord+&auto_login=checked&submit=%E7%99%BB%E5%BD%95; BOOL bRet = FALSE; CString cstrSendParamLen; cstrSendParamLen.Format(%d, cstrSendParam.GetLength()); cstrSendData = POST http://account.vsochina.com/user/login HTTP/1.1 ; cstrSendData += Host: account.vsochina.com ; cstrSendData += User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0 ; cstrSendData += Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 ; cstrSendData += Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3 ; cstrSendData += Accept-Encoding: gzip, deflate ; cstrSendData += DNT: 1 ; cstrSendData += Referer: http://account.vsochina.com/user/login ; cstrSendData += Connection: keep-alive ; cstrSendData += Content-Type: application/x-www-form-urlencoded ; cstrSendData += Content-Length: + cstrSendParamLen + ; cstrSendData += ; cstrSendData += cstrSendParam; CString cstrRecvData; do { if (-1 == send(socketClient, cstrSendData.GetBuffer(), cstrSendData.GetLength(), 0)) { break; } char recvData[1000] = {0}; int nRecvLen; while((nRecvLen = recv(socketClient, recvData, sizeof(recvData), 0)) > 0) { cstrRecvData += recvData; } if (cstrRecvData.GetLength() == 0) { break; } ParseCookieFromRecvData(cstrRecvData); //!判断返回的COOKIE信息中,UID是否存在 if (cstrCookieUid.IsEmpty()) { break; } bRet = TRUE; } while (FALSE); return bRet; } void SocketClient::ParseCookieFromRecvData(const CString cstrRecvData) { list
lstCookiesLine; //!存放Set-Cookie的一行,例:Set-Cookie: vso_uname=houqd_1111; CString cstrFind = Set-Cookie:; //!查找标记 CString cstrSeperator = ; //!以 分割号来分割字符串 int nPos = 0; int nStart = cstrRecvData.Find(cstrSeperator); while(nStart != -1) { CString cstrSessionLine = cstrRecvData.Mid(nPos, nStart - nPos + 1); if (cstrSessionLine.Find(cstrFind) != -1) { CString cstrRealRecord = cstrSessionLine.Right(cstrSessionLine.GetLength() - cstrFind.GetLength() - 3); list ::iterator it = find(lstCookiesLine.begin(), lstCookiesLine.end(), cstrRealRecord); if (it == lstCookiesLine.end()) { lstCookiesLine.push_back(cstrRealRecord); } } nPos = nStart; nStart = cstrRecvData.Find(cstrSeperator, nPos + 2); } //!根据每行获取的cookie值,解析为key-value的形式 vector vecCookieSet; for (list ::iterator it = lstCookiesLine.begin(); it != lstCookiesLine.end(); it++) { CString cstrCookies = *it; CString cstrSeperator = ;; StaticUtility::StringSplit(cstrCookies, cstrSeperator, vecCookieSet); } vector vecTemp; for (vector ::iterator it = vecCookieSet.begin(); it != vecCookieSet.end(); it++) { vecTemp.clear(); CString cstrOneCookies = *it; CString cstrSeperator = =; StaticUtility::StringSplit(cstrOneCookies, cstrSeperator, vecTemp); CString cstrKey = vecTemp[0]; CString cstrVal = vecTemp[1]; if(cstrKey.Compare(vso_uid) == 0) { cstrCookieUid = cstrVal; break; } } }

通过接收来的头部信息中,将cookie信息解析出来,就可以判断是否登录成功了。然后,如果有或许的操作,在请求中挂上这些cook