zoukankan      html  css  js  c++  java
  • C++获取上网记录 支持获取IE, Chrome,FireFox历史记录

    // FileName: BrowsHistory.h
    
    // ------------------------------------------------------------------------------------------------------------------------
    // Remarks:
    //   BrowsHistory对象应该设置成全局,或者静态;防止还没有获取完网址,对象就析构了;
    // ------------------------------------------------------------------------------------------------------------------------
    
    
    #pragma once
    #include <iostream>
    #include <algorithm>
    #include <functional>
    #include <vector>
    
    struct BrowsData
    {
    public:
        // 网址
        CString strURL;
        
        // 对应网址访问次数
        unsigned int nCount;
        
        // 重载<操作符
        bool operator < (const BrowsData &m)const
        {
            return nCount > m.nCount;
        }
    };
    
    class BrowsHistory
    {
    private:
        
        // 保存获得的网址和访问次数
        std::vector<BrowsData> m_BrowsHistroy;
    
    private:
    
        // IE网址过滤,如只取网址com前边的
        void urlFiltrateIE (LPWSTR lpszSourceUrlName);
        
        // Chrome网址过滤,如只取网址com前边的
        void urlFiltrateChrome (CString strUrlName);
    
        // Firefox网址过滤,如只去网址com前边的
        void urlFiltrateFirefox (CString strUrlName, int nCount);
    
        // 查询进程是否已存在, 返回true表示存在;自动结束其进程
        bool IsRunning(CString exe);
    
        // 编码转换
        void ConvertUtf8ToGBK(CStringA &strUtf8);
    
        // 获取浏览器历史记录
        void InitHistroy (void);
    
        // 多线程函数
        static void ThreadPro (LPVOID * ptr);
    
        // 对获得的网址进行排序
        void Sort (void);
    
    public:
        BrowsHistory();
        ~BrowsHistory();
    
        // 获取网址的进程,是否执行完;执行完时为true;
        bool m_bStatus;
    
        // 初始化
        void Init (void);
    
        // 获取浏览器历史记录
        std::vector<BrowsData> GetBrowsHistory(void) const;
    };
    // // FileName: BrowsHistory.cpp
    
    #include "stdafx.h"                    // 如果编译出错请删除此行
    #include "BrowsHistory.h"
    
    #include <wininet.h>
    #include "Common\\CppSQLite3.h"
    #include <shlobj.h> 
    #include "Shlwapi.h"
    #pragma  comment(lib,"Shlwapi.lib")
    #include "tlhelp32.h"
    #pragma comment(lib,"common\\sqlite3.lib")
    
    #include <atlconv.h>
    
    
    
    BrowsHistory::BrowsHistory()
    {
        m_bStatus = false;
    }
    
    BrowsHistory::~BrowsHistory()
    {
    
    }
    
    void BrowsHistory::urlFiltrateIE (LPWSTR lpszSourceUrlName)
    {
        BrowsData browsDate;
        browsDate.nCount = 0;
    
        CString strTemp(lpszSourceUrlName);
        
    
        std::vector<BrowsData>::iterator iter;
    
        // 排除非必要的网址
        if (strTemp.Find(_T("@http://")) != -1)
        {
            strTemp.Delete(0, strTemp.Find(_T("@http://"))+8);
    
            // 排除非必要网址
            if (strTemp.Find(_T(":")) != -1)
            {
                return;
            }
    
            int nIndex = strTemp.Find(_T("/"));
            if (nIndex != -1)
            {
                for (iter=m_BrowsHistroy.begin(); iter != m_BrowsHistroy.end(); iter++)
                {
                    if (iter->strURL == strTemp.Left(nIndex))
                    {
                        iter->nCount += 1;
                        return;
                    }
                }
    
                browsDate.strURL = strTemp.Left(nIndex);
                browsDate.nCount = 1;
                m_BrowsHistroy.push_back(browsDate);
            }
            else
            {
                for (iter=m_BrowsHistroy.begin(); iter != m_BrowsHistroy.end(); iter++)
                {
                    if (iter->strURL == strTemp)
                    {
                        iter->nCount += 1;
                        return;
                    }
                }
    
                browsDate.strURL = strTemp;
                browsDate.nCount = 1;
                m_BrowsHistroy.push_back(browsDate);
            }
        }
    }
    
     void BrowsHistory::urlFiltrateChrome (CString strUrlName)
     {
         // 删除开始的"https://"
        
        if (strUrlName.Find(_T("https://")) != -1)
        {
            strUrlName.Delete(0, 8);
        }
        else if(strUrlName.Find(_T("http://")) != -1)
        {
             strUrlName.Delete(0, 7);
        }
    
         int nIndex = strUrlName.Find(_T("/"));
    
        BrowsData browsDate;
        browsDate.nCount = 0;
        std::vector<BrowsData>::iterator iter;
    
        if (nIndex != -1)
        {
            for (iter=m_BrowsHistroy.begin(); iter != m_BrowsHistroy.end(); iter++)
            {
                if (iter->strURL == strUrlName.Left(nIndex))
                {
                    iter->nCount += 1;
                    return;
                }
            }
    
            browsDate.strURL = strUrlName.Left(nIndex);
            browsDate.nCount = 1;
            m_BrowsHistroy.push_back(browsDate);
        }
        else
        {
            for (iter=m_BrowsHistroy.begin(); iter != m_BrowsHistroy.end(); iter++)
            {
                if (iter->strURL == strUrlName)
                {
                    iter->nCount += 1;
                    return;
                }
            }
    
            browsDate.strURL = strUrlName;
            browsDate.nCount = 1;
            m_BrowsHistroy.push_back(browsDate);
        }
     }
    
    void BrowsHistory::urlFiltrateFirefox (CString strUrlName, int nCount)
    {
        BrowsData browsDate;
        browsDate.nCount = 0;
    
        int nIndex = strUrlName.Find(_T("/"));
        if (nIndex != -1)
        {
            strUrlName = strUrlName.Left(nIndex);
        }
    
        std::vector<BrowsData>::iterator iter;
        for (iter=m_BrowsHistroy.begin(); iter != m_BrowsHistroy.end(); iter++)
        {
            if (iter->strURL == strUrlName)
            {
                iter->nCount += nCount;
                return;
            }
        }
    
        browsDate.strURL = strUrlName;
        browsDate.nCount += nCount;
        m_BrowsHistroy.push_back(browsDate);
    }
    
    bool BrowsHistory::IsRunning(CString exe)
    {
        PROCESSENTRY32 pe32;
        HANDLE hprocess;
        hprocess = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
        pe32.dwSize = sizeof(PROCESSENTRY32);
    
        if(Process32First(hprocess,&pe32))
        {
            do
            {
                HANDLE h_id;
                h_id = OpenProcess(PROCESS_TERMINATE,false,pe32.th32ProcessID);
    
                CString exefile;
                exefile=pe32.szExeFile;
                exefile.MakeLower();
                exe.MakeLower();
                if(exefile==exe)
                {
                    if (TerminateProcess(h_id, 0) !=0)
                    {
                        return FALSE;
                    }
                    else
                    {
                        return TRUE;
                    }
                }
            }
            while(Process32Next(hprocess,&pe32));
        }
        return FALSE;
    }
    
    void BrowsHistory::ConvertUtf8ToGBK(CStringA &strUtf8)
    {
    
        int len=MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)strUtf8, -1, NULL,0);
        unsigned short * wszGBK = new unsigned short[len+1];
        memset(wszGBK, 0, len * 2 + 2);
        MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)strUtf8, -1,(LPWSTR) wszGBK, len);
        len = WideCharToMultiByte(CP_ACP, 0, (LPWSTR)wszGBK, -1, NULL, 0, NULL, NULL);
        char *szGBK=new char[len + 1];
        memset(szGBK, 0, len + 1);
        WideCharToMultiByte (CP_ACP, 0, (LPWSTR)wszGBK, -1, szGBK, len, NULL,NULL);
        strUtf8 = szGBK;
        delete[] szGBK;
        delete[] wszGBK;
    }
    
    void BrowsHistory::Init (void)
    {
        // 创建一个线程
        CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThreadPro, this, 0, NULL);
    }
    
    void BrowsHistory::InitHistroy (void)
    {
    
        // 用来支持多次调用
        m_bStatus = false;
        m_BrowsHistroy.clear();
    
        // 获取IE的历史记录
        HANDLE hCacheEnumHandle = NULL;
        LPINTERNET_CACHE_ENTRY_INFO lpCacheEntry = NULL;
        DWORD dwSize = 4096;
        BrowsData browsDate;
        browsDate.nCount = 0;
    
        lpCacheEntry = (LPINTERNET_CACHE_ENTRY_INFO) new char[dwSize];
        lpCacheEntry->dwStructSize = dwSize;
    
        hCacheEnumHandle = FindFirstUrlCacheEntry(_T("visited:"), lpCacheEntry, &dwSize);
    
        if(hCacheEnumHandle != NULL)
        {
            urlFiltrateIE(lpCacheEntry->lpszSourceUrlName);
        }
        else
        {
            switch(GetLastError())
            {
            case ERROR_INSUFFICIENT_BUFFER:
                lpCacheEntry = (LPINTERNET_CACHE_ENTRY_INFO) new char[dwSize];
                lpCacheEntry->dwStructSize = dwSize;
    
                hCacheEnumHandle = FindFirstUrlCacheEntry(_T("visited:"), lpCacheEntry, 
                    &dwSize);
                if (hCacheEnumHandle != NULL) 
                {
                    urlFiltrateIE(lpCacheEntry->lpszSourceUrlName);
                    break;        
                }
                else
                {
                    // 查找失败
                    return; 
                }
            default:
                {
                    FindCloseUrlCache(hCacheEnumHandle);
                }
            }
        }
    
        bool bSign = true;
        do 
        {
    
            if (FindNextUrlCacheEntry(hCacheEnumHandle, lpCacheEntry, &dwSize))
            {
                urlFiltrateIE(lpCacheEntry->lpszSourceUrlName);
            }
            else
            {
                switch(GetLastError())
                {
                case ERROR_INSUFFICIENT_BUFFER:
                    lpCacheEntry = 
                        (LPINTERNET_CACHE_ENTRY_INFO) new char[dwSize];
                    memset(lpCacheEntry,0,dwSize);
                    lpCacheEntry->dwStructSize = dwSize;
    
    
                    if (FindNextUrlCacheEntry(hCacheEnumHandle, lpCacheEntry, 
                        &dwSize)) 
                    {
                        urlFiltrateIE(lpCacheEntry->lpszSourceUrlName);
                        break;
                    }
                    else
                    {
                        FindCloseUrlCache(hCacheEnumHandle);
                        bSign = false;
                        break; 
                    }
                    break;
                case ERROR_NO_MORE_ITEMS:
                    FindCloseUrlCache(hCacheEnumHandle);
                    bSign = false;
                    break;
                default:
                    FindCloseUrlCache(hCacheEnumHandle);
                    bSign = false;
                    break;
                }
            }
        } while (bSign);
    
        // 获取谷歌浏览器的历史记录
        char path[MAX_PATH];
        ::SHGetSpecialFolderPathA(NULL,path,CSIDL_LOCAL_APPDATA,FALSE);
    
        strcat_s(path,"\\google\\chrome\\User Data\\default\\History");
        if (PathFileExistsA(path))
        {
            // 谷歌浏览器正在运行,强制关闭;关闭后才能得到谷歌浏览器的历史记录
            if (!IsRunning(_T("chrome.exe")))
            {
                try
                {
                    CppSQLite3DB db;
                    CppSQLite3Query query;
    
                    db.open(path);
                    query=db.execQuery("select url from urls");
    
                    while(!query.eof())
                    {
                        CStringA utf8url;
                        utf8url=query.fieldValue("url");
                        ConvertUtf8ToGBK(utf8url);
                        urlFiltrateChrome((CString)utf8url);
                        query.nextRow();
    
                    }
                    db.close();
                }
                catch (CppSQLite3Exception& e)
                {
                    return;
                }
            }
        }
    
        // 获取火狐浏览器的历史记录
        TCHAR strPath[MAX_PATH] = {0};
    
        GetModuleFileName(NULL, strPath, MAX_PATH);
        CString strPathTemp(strPath);
    
        int nPosition = strPathTemp.ReverseFind(_T('\\'));
    
        if (nPosition != -1)
        {
            USES_CONVERSION;
    
            strPathTemp = strPathTemp.Left(nPosition);
            ::SHGetSpecialFolderPathA(NULL, path, CSIDL_WINDOWS, FALSE);
            CString strDestPath(path);
    
            strPathTemp += _T("\\MozillaCacheView.exe /stext ");
            strDestPath += _T("\\temp.dat");
            strPathTemp += strDestPath;
    
            // 文件路径中不能有空格
            WinExec(T2A(strPathTemp), SW_HIDE);
    
            // 延时,防止读写冲突
            Sleep(1000);
            if (PathFileExists(strDestPath))
            {
                CStdioFile file;
                CString buffer;
                if(file.Open(strDestPath, CFile::modeRead))
                {
                    CString strTemp;
                    while(file.ReadString(buffer))
                    {
                        if (buffer.Find(_T("image/x-icon")) != -1)
                        {
                            file.ReadString(buffer);
                            buffer.Delete(0, buffer.Find(_T("http://"))+7);
                            
                            file.ReadString(strTemp);
                            file.ReadString(strTemp);
                            strTemp.Delete(0, strTemp.Find(_T(": "))+2);
    
                            urlFiltrateFirefox(buffer, atoi(T2A(strTemp)));
                        }
                    }
                }
            }
        }
    
        Sort();
    }
    
    void BrowsHistory::ThreadPro (LPVOID * ptr)
    {
        BrowsHistory * pBrowsHistroy = (BrowsHistory*)ptr;
        pBrowsHistroy->InitHistroy();
        
        // 获取网址的函数执行完了
        pBrowsHistroy->m_bStatus = true;
    }
    
    std::vector<BrowsData> BrowsHistory::GetBrowsHistory (void) const
    {
        return m_BrowsHistroy;
    }
    
    void BrowsHistory::Sort (void)
    {
        stable_sort(m_BrowsHistroy.begin(), m_BrowsHistroy.end(),std::less<BrowsData>());
    }
  • 相关阅读:
    利用URL Rewrite修改header头中的Server信息
    搭建Samba服务器
    Oracle创建数据库
    Linux下安装Oracle
    showModalDialog sesission丢失
    js写的打字游戏,功能非常简洁,菜鸟可以看看,高手就别来了
    wpf window镶嵌window,使用Frame实现
    A2-冒泡排序
    A1-递归求阶乘
    python将数据输出到excel中
  • 原文地址:https://www.cnblogs.com/calm2012/p/2958048.html
Copyright © 2011-2022 走看看