仿InternetGetCookie自己解析Cookie文件

来源:互联网 发布:java nullpointer 编辑:程序博客网 时间:2024/05/06 01:28

转自:http://bbs.pediy.com/showthread.php?p=1228972

主要参考http://blog.csdn.net/whatday/article/details/7566310


名称:  QQ截图20130426135008.png查看次数: 5文件大小:  38.6 KB

代码:
#include <Windows.h>#include <Stdio.h>#include <Tchar.h>#include <Wininet.h>#pragma comment(lib, "Wininet.lib")typedef struct _COOKIE_FIELD{  TCHAR      m_szKey[128];//键  TCHAR      m_szValue[512];//值  TCHAR      m_szDomain[128];//域  TCHAR      m_szFlag[32];//标志  TCHAR      m_szLowExpire[32];//过期时间的低32位  TCHAR      m_szHighExpire[32];//过期时间的高32位  TCHAR      m_szLowCreate[32];//创建时间的低32位  TCHAR      m_szHighCreate[32];//创建时间的高32位} COOKIE_FIELD, *LPCOOKIE_FIELD;//获取Cookie的名称BOOL CookieGetUrlName(LPTSTR lpszUrl, LPTSTR lpszUrlName){  TCHAR        szUserName[32];  DWORD        cbUserName;  TCHAR        szHostName[128];  URL_COMPONENTS    urlComponents;    cbUserName = 32;  GetUserName(szUserName, &cbUserName);//获取当前用户名  memset(&urlComponents, 0, sizeof(urlComponents));  urlComponents.dwStructSize = sizeof(urlComponents);  urlComponents.dwHostNameLength = 128;//主机名长度  urlComponents.lpszHostName = szHostName;//主机名  if(InternetCrackUrl(lpszUrl, lstrlen(lpszUrl), ICU_ESCAPE, &urlComponents))//破解Url  {    lstrcpy(lpszUrlName, _T("Cookie:"));    lstrcat(lpszUrlName, szUserName);    lstrcat(lpszUrlName, _T("@"));    lstrcat(lpszUrlName, szHostName);    lstrcat(lpszUrlName, _T("/"));    return TRUE;  }  return FALSE;}//获取Cookie的路径BOOL CookieGetPath(LPTSTR lpszUrl, LPTSTR lpszFilePath){  BOOL            bRet;  HANDLE            hEnumHandle;  LPINTERNET_CACHE_ENTRY_INFO  lpCacheEntry;  DWORD            cbCacheEntry;  TCHAR            szCookieUrlName[256];  bRet = FALSE;  CookieGetUrlName(lpszUrl, szCookieUrlName);//获取Cookie的名称  cbCacheEntry = 10240;  lpCacheEntry = (LPINTERNET_CACHE_ENTRY_INFO)LocalAlloc(LMEM_FIXED, cbCacheEntry);//分配足够内存  hEnumHandle = FindFirstUrlCacheEntry(_T("cookie:"), lpCacheEntry, &cbCacheEntry);//查找Cookie缓存  if(hEnumHandle)  {    do    {      if(lpCacheEntry->CacheEntryType & COOKIE_CACHE_ENTRY)//应该是多余的      {        if(lstrcmpi(lpCacheEntry->lpszSourceUrlName, szCookieUrlName) == 0)//判断是否是我们要找的Cookie名        {          lstrcpy(lpszFilePath, lpCacheEntry->lpszLocalFileName);//复制Cookie的文件路径          bRet = TRUE;          break;        }      }      cbCacheEntry = 10240;    }    while(FindNextUrlCacheEntry(hEnumHandle, lpCacheEntry, &cbCacheEntry));//下一个    FindCloseUrlCache(hEnumHandle);//关闭句柄  }  LocalFree(lpCacheEntry);  return bRet;}//解析Cookie数据VOID CookieResolveData(LPTSTR lpszCookieData, LPCOOKIE_FIELD lpCookieFields, LPDWORD lpdwCookieField){  LPTSTR        pStr;  LPTSTR        pStr2;  LPTSTR        pStr3;  LPTSTR        pStr4;  LPTSTR        pStr5;  LPTSTR        pStr6;  LPTSTR        pStr7;  LPTSTR        pStr8;  LPTSTR        pStr9;  DWORD        i;  /*  Cookie之间以*分隔,每个字段8行,只有0x0a没有0x0d  */  pStr = lpszCookieData;  for(i=0; *pStr; i++)  {    pStr2 = _tcschr(pStr, _T('\n'));    lstrcpyn(lpCookieFields[i].m_szKey, pStr, pStr2 - pStr + 1);    pStr2 += 1;    pStr3 = _tcschr(pStr2, _T('\n'));    lstrcpyn(lpCookieFields[i].m_szValue, pStr2, pStr3 - pStr2 + 1);    pStr3 += 1;    pStr4 = _tcschr(pStr3, _T('\n'));    lstrcpyn(lpCookieFields[i].m_szDomain, pStr3, pStr4 - pStr3 + 1);        pStr4 += 1;    pStr5 = _tcschr(pStr4, _T('\n'));    lstrcpyn(lpCookieFields[i].m_szFlag, pStr4, pStr5 - pStr4 + 1);    pStr5 += 1;    pStr6 = _tcschr(pStr5, _T('\n'));    lstrcpyn(lpCookieFields[i].m_szLowExpire, pStr5, pStr6 - pStr5 + 1);    pStr6 += 1;    pStr7 = _tcschr(pStr6, _T('\n'));    lstrcpyn(lpCookieFields[i].m_szHighExpire, pStr6, pStr7 - pStr6 + 1);    pStr7 += 1;    pStr8 = _tcschr(pStr7, _T('\n'));    lstrcpyn(lpCookieFields[i].m_szLowCreate, pStr7, pStr8 - pStr7 + 1);        pStr8 += 1;    pStr9 = _tcschr(pStr8, _T('\n'));    lstrcpyn(lpCookieFields[i].m_szHighCreate, pStr8, pStr9 - pStr8 + 1);    pStr9 += 1;    pStr = _tcschr(pStr9, _T('\n'));    pStr += 1;  }  *lpdwCookieField = i;}//查询CookieBOOL CookieQuery(LPTSTR lpszUrl, LPCOOKIE_FIELD lpCookieFields, LPDWORD lpdwCookieField){  BOOL        bRet;  HANDLE        hFile;  LPVOID        lpFileBase;  DWORD        dwFileSize;  DWORD        dwRetLen;  TCHAR        szPath[MAX_PATH];  bRet = FALSE;  if(CookieGetPath(lpszUrl, szPath))  {    hFile = CreateFile(szPath,      GENERIC_READ | GENERIC_WRITE,      FILE_SHARE_READ,      NULL,      OPEN_EXISTING,      FILE_ATTRIBUTE_NORMAL,      NULL);    if(hFile != INVALID_HANDLE_VALUE)    {      dwFileSize = GetFileSize(hFile, NULL);      lpFileBase = LocalAlloc(LMEM_FIXED, dwFileSize);      if(ReadFile(hFile,        lpFileBase,        dwFileSize,        &dwRetLen,        NULL))      {        LPTSTR        lpszCookieData;        DWORD        dwCookieData;                        dwCookieData = dwRetLen + 1;        lpszCookieData = (LPTSTR)LocalAlloc(LMEM_FIXED, dwCookieData);                //给Cookie结尾加个0        memcpy(lpszCookieData, lpFileBase, dwRetLen);        memset(lpszCookieData + dwRetLen, 0, 1);                //解析Cookie数据        CookieResolveData(lpszCookieData, lpCookieFields, lpdwCookieField);        LocalFree(lpszCookieData);        bRet = TRUE;      }      LocalFree(lpFileBase);      CloseHandle(hFile);    }  }  return bRet;}int _tmain(int argc,TCHAR *argv[]){  LPCOOKIE_FIELD    lpCookieFields;  DWORD        dwCookieField;  DWORD        i;  dwCookieField = 100;  lpCookieFields = new COOKIE_FIELD[dwCookieField];    //查询Cookie  CookieQuery(_T("http://bbs.pediy.com/"), lpCookieFields, &dwCookieField);  for(i=0; i<dwCookieField; i++)  {    printf("键: %s\n", lpCookieFields[i].m_szKey);    printf("值: %s\n\n", lpCookieFields[i].m_szValue);  }  return 0;}
*转载请注明来自看雪论坛@PEdiy.com 
0 0
原创粉丝点击