通过接收来的头部信息中,将cookie信息解析出来,就可以判断是否登录成功了。然后,如果有或许的操作,在请求中挂上这些cook
C++模拟Http/Https POST登录web站点(二)
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; } } }
| 评论 |
|
|