cookies

// Testcookies0325.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "Testcookies0325.h"

#include <Windows.h>
#include <Stdio.h>
#include <Tchar.h>
#include <Wininet.h>
#pragma comment(lib, "Wininet.lib")


#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// The one and only application object

CWinApp theApp;

using namespace std;
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;
}

//查询Cookie
BOOL 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);
        
      
        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[], TCHAR* envp[])
{
    int nRetCode = 0;

    HMODULE hModule = ::GetModuleHandle(NULL);

    LPCOOKIE_FIELD    lpCookieFields;
    DWORD        dwCookieField;
    DWORD        i;

    dwCookieField = 100;
    lpCookieFields = new COOKIE_FIELD[dwCookieField];
    if (lpCookieFields != NULL)
    {
        memset (lpCookieFields,0,100);
    }
    

    //查询Cookie
    CookieQuery(_T("https://www.baidu.com/"), lpCookieFields, &dwCookieField);

    for(i=0; i<dwCookieField; i++)
    {
        
        cout<<lpCookieFields[i].m_szKey<<endl;
        cout<< lpCookieFields[i].m_szValue<<endl;
    }

    if (lpCookieFields != NULL)
    {
        delete []lpCookieFields;
        lpCookieFields = NULL;
    }
    system("pause");
    return nRetCode;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值