65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 MSN Desktop Search 索引您的完整浏览器历史记录

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.17/5 (6投票s)

2005年7月15日

5分钟阅读

viewsIcon

55641

downloadIcon

719

索引您的完整浏览器历史记录,使用 MSN Desktop Search。

Sample Image - MSNDesktopSearchWebCache.png

引言

MSN Desktop Search 应用程序是标准索引服务 (Indexing Service) 的一个进化版本,该服务自 Windows 2000 起就作为 Windows 的一部分提供。它们都利用相同的 IFilter 组件,允许第三方为其文件格式添加索引支持。其中一个标准的 IFilter 组件用于解析 HTML 文档。MSN Desktop Search 的 beta 版本包含一个索引您网络浏览器历史记录的选项,但由于隐私问题,此功能已从最终版本中移除。

我经常发现自己会搜索一个大概在几个月前读过的网页。如果我然后使用 Google 或 MSN 来搜索该页面,可能会花费很长时间才能再次找到相同的页面,因为你经常会被包含搜索词的其他页面淹没。但这些页面往往不是你想要的,而是销售页面。

理想的情况是根据你记得在页面中阅读过的一些词语执行索引搜索,但将搜索范围限制在仅你实际访问过的网页。换句话说,如果你有一个完整副本,而不是仅仅一个你访问过的每个网页的小缓存子集,那么你就可以对这个完整的浏览器历史记录使用本地桌面搜索。

更进一步,在保留你访问或收到的所有内容的电子副本方面(包括纸质副本),有一个名为 MyLifeBits 的项目。Channel9 还有一个对参与 MyLifeBits 项目的几位人士的 采访

实现细节

为了存储每个访问过的网页的副本,我有几个选择。一种方法是实现一个代理服务器,它可以看到所有返回到浏览器的响应;另一种方法是定期枚举浏览器的缓存。代理服务器方法的优点是它与浏览器无关,而枚举浏览器缓存则与浏览器有关。

我选择了更简单的方法,即使用 WinInet API 定期枚举浏览器的缓存。这意味着它只能用于使用 WinInet API 下载 URL 的浏览器,而使用此 API 的主要浏览器是 Internet Explorer。

为了枚举浏览器缓存,使用了 FindFirstUrlCacheEntryFindNextUrlCacheEntry 函数。由于 API 中没有内置基于日期的查询过滤器,因此我们在检索 INTERNET_CACHE_ENTRY_INFO 结构时首先要做的是比较 URL 的下载日期/时间与程序上次运行的日期/时间。这是为了避免在每次运行缓存复制程序时都处理和复制相同的缓存条目。

接下来,我们检查 MIME 类型,以确定我们是否有兴趣复制此特定缓存条目。我目前检查的 MIME 类型集如下:

text/html
application/pdf
application/msword

因此,我基本上只复制与网页相关的文本,而不复制相关的图像。此外,我还复制了我在浏览器中可能阅读过的任何 PDF 和 Word 文档。

接下来,我确定在哪里存储缓存条目,并为我们要创建的副本创建一个文件名。下面是缓存条目名称和位置的示例。

My Documents\WebCache\2005\4\10\1c582c0-cab8d650-18be.html

我将我的 WebCache 历史记录存储在“我的文档”文件夹下,以便 MSN Desktop Search 能够自动索引其内容。子目录树基于访问 URL 的日期,文件名是访问 URL 的 FILETIME。这种方案还可以处理用户在同一天多次访问同一 URL(例如 www.cnn.com)的情况。

如果 MIME 类型是 HTML,则会在 HTML 文件顶部添加一个类似于 Google 和 MSN 显示的标题的标题,以便在查看缓存版本时能够轻松加载 URL 的当前版本。

对正在复制的文件所做的最后一次修改是创建一个文件属性集,并将 Keywords 属性设置为该 URL。记录原始 URL 作为关键字的原因是可以根据 URL 过滤查询。因此,例如,如果你想查找一个你记得在 CNN 上读过的、包含“space shuttle launch”这个词的网页,你可以在 MSN Desktop Search 中发出以下查询:

path:webcache keywords:cnn "space shuttle launch"

这将查询限制在路径名中包含“webcache”的项目,即只包含我们 webcache 目录中的文件,而不包含其他文档位置或电子邮件消息中的文件等。此外,查询将限制在 keywords 属性中包含“cnn”的文件。

下面的 AddURLKeywordProperty 函数通过利用 NTFS 实现的 IPropertySetStorage 接口来创建文件的属性集。

void AddURLKeywordProperty(LPCWSTR pszFileName, LPWSTR pszURL)
{
    IPropertySetStorage *pPropSetStg = NULL;
    IPropertyStorage *pPropStg = NULL;
    
    HRESULT hr = StgOpenStorageEx(
                    pszFileName, 
                    STGM_SHARE_EXCLUSIVE|STGM_READWRITE,
                    STGFMT_FILE, 0, NULL, 0, 
                    IID_IPropertySetStorage, 
                    reinterpret_cast<void**>(&pPropSetStg) );
                    
    if(SUCCEEDED(hr))
    {
        hr = pPropSetStg->Create(
                    FMTID_SummaryInformation, NULL, 
                    PROPSETFLAG_DEFAULT, 
                    STGM_CREATE|STGM_READWRITE|STGM_SHARE_EXCLUSIVE, 
                    &pPropStg );
                    
        if(SUCCEEDED(hr))
        {
            PROPSPEC propspec; 
            PROPVARIANT propvarWrite; 

            propspec.ulKind = PRSPEC_PROPID;
            propspec.propid = PIDSI_KEYWORDS;

            propvarWrite.vt = VT_LPWSTR;
            propvarWrite.pwszVal = pszURL;

            hr = pPropStg->WriteMultiple(1, &propspec, 
                                         &propvarWrite, 
                                         PID_FIRST_USABLE);

            pPropStg->Release();
        }
        pPropSetStg->Release();
    }
}

结论

我使用此应用程序已经三个多月了,我的 WebCache 共有 8126 个文件,总大小为 368 MB,使用 NTFS 文件压缩后压缩到 218 MB。照此速度,我的 WebCache 每年将消耗将近 1 GB 的浏览空间。结合 MSN Desktop Search,这使得查找我过去访问过的、以后需要查找的网页变得容易多了。

© . All rights reserved.