我正在构建一个扩展程序,用于读取Chrome历史记录并分析关键字的链接。
我使用chrome.history.search
方法检索浏览器历史记录,如下所示:
chrome.history.search({
'text': '',
'maxResults': 500,
}, function(historyItems){
});
此时,我将检索到的URL存储在数组中并开始阅读它们。
但我没有得到一切。检索到的URL数量因不同的运行而异。我尝试在搜索方法中尝试参数,但我无法影响返回的链接数。
任何人都可以帮我理解这个吗?
编辑:当我说我没有得到所有内容时,我的意思是与我可以看到的浏览器历史记录相比,通过扩展程序获得的内容更加有限。
答案 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));