如何通过chrome.history.search获取我的整个历史记录?

时间:2014-03-06 13:25:21

标签: google-chrome-extension browser-history

我正在构建一个扩展程序,用于读取Chrome历史记录并分析关键字的链接。

我使用chrome.history.search方法检索浏览器历史记录,如下所示:

chrome.history.search({
        'text': '',
        'maxResults': 500,
    }, function(historyItems){
    });

此时,我将检索到的URL存储在数组中并开始阅读它们。

但我没有得到一切。检索到的URL数量因不同的运行而异。我尝试在搜索方法中尝试参数,但我无法影响返回的链接数。

任何人都可以帮我理解这个吗?

编辑:当我说我没有得到所有内容时,我的意思是与我可以看到的浏览器历史记录相比,通过扩展程序获得的内容更加有限。

3 个答案:

答案 0 :(得分:1)

这是我编写的一些代码,用于尝试使用搜索检索所有历史记录项。试一试,看看这是否有帮助:

var nextEndTimeToUse = 0;

var allItems = [];
var itemIdToIndex = {};

function getMoreHistory(callback) {
  var params = {text:"", maxResults:500};
  params.startTime = 0;
  if (nextEndTimeToUse > 0)
    params.endTime = nextEndTimeToUse;

  chrome.history.search(params, function(items) {
    var newCount = 0;
    for (var i = 0; i < items.length; i++) {
      var item = items[i];
      if (item.id in itemIdToIndex)
        continue;
      newCount += 1;
      allItems.push(item);
      itemIdToIndex[item.id] = allItems.length - 1;
    }
    if (items && items.length > 0) {
      nextEndTimeToUse = items[items.length-1].lastVisitTime;
    }
    callback(newCount);
  });
}

function go() {
  getMoreHistory(function(cnt) { 
    console.log("got " + cnt);
    if (cnt > 0)
      go();
  });
}

答案 1 :(得分:1)

https://bugs.chromium.org/p/chromium/issues/detail?id=73812

你需要添加startime

  var microsecondsBack = 1000 * 60 * 60 * 24 * days;

  var startTime = (new Date).getTime() - microsecondsBack;

答案 2 :(得分:0)

有趣的是,Justaman在Chromium bug中提到的answer表明,传递maxResults: 0实际上会返回所有历史记录项。所以如果你真的想要整个历史,你可以这样做:

chrome.history.search({ text: "", startTime: 0, maxResults: 0 }, 
    items => console.log(items));

我还没有尝试过,因为我预计将数千个历史项目中的数十(?)加载到内存中会占用Chrome。但我确实在几天前用startTime尝试了,并且返回了645项。

如果您正在使用方便的chrome-promise库,这里是Antony的answer版本,它使用promises而不是回调来遍历API调用,直到所需找到历史项目的数量:

import ChromePromise from 'chrome-promise';

const chromep = new ChromePromise();

function loop(fn)
{
    return fn().then(val => (val === true && loop(fn)) || val);
}

function getHistory(requestedCount)
{
    var history = [],
        ids = {};

    return loop(() => {
        var endTime = history.length &&
                history[history.length - 1].lastVisitTime || Date.now();

        return chromep.history.search({
            text: "",
            startTime: 0,
            endTime: endTime,
            maxResults: 1000
        })
            .then(historyItems => {
                var initialHistoryLength = history.length;

                historyItems.forEach(item => {
                    var id = item.id;

                        // history will often return duplicate items
                    if (!ids[id] && history.length < requestedCount) {
                        addURLs(item);
                        history.push(item);
                        ids[id] = true;
                    }
                });

                    // only loop if we found some new items in the last call
                    // and we haven't reached the limit yet
                if (history.length > initialHistoryLength && 
                        history.length < requestedCount) {
                    return true;
                } else {
                    return history;
                }
            });
    });
}

您可以像这样使用此功能:

getHistory(2000).then(items => console.log(items));