仿InternetGetCookie自己解析Cookie文件
2015-12-03 21:27
288 查看
主要参考http://blog.csdn.net/whatday/article/details/7566310
代码:
代码:
#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; } //查询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); //给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; }
相关文章推荐
- 换零钱--动态规划
- access数据库转换为sqlite数据库
- 在虚拟机上linux系统上上网
- LightOJ - 1422 Halloween Costumes (区间dp)
- Mybatis判断int类型是否为空
- java中的volatile关键字
- 中间件连接异常处理方法1---------------------运维日志8
- Quartz.NET开源作业调度框架系列(四):Plugin Job
- Intent的简介以及属性的详解
- 树状数组的模版
- 头文件为什么加#ifndef #define #endif
- Java模拟post实现图片上传
- 水仙花数
- 备忘——object类
- IteratorPattern--HeadFirst学习
- 字符的特征提取
- 融资租赁
- 使用json web token
- Android SharedPreferences安全存储/AutoCompleteTextView使用/文件读写
- 《剑指offer》——二叉搜索树与双向链表