如何让Chrome历史记录忽略部分网址

时间:2017-04-13 14:04:23

标签: url google-chrome-extension browser-history

由于我的工作涉及从网站查看许多项目,我需要知道哪些项目已被访问过哪些项目,以及哪些项目未被访问,以避免重复查看。

问题是这些项的URL包含一些动态变化的垃圾参数。这意味着浏览器的历史记录几乎无法识别哪些项目已被查看过。

这是网址的示例:

https://example.com/showitemdetail/?item_id=e6de72e&hitkey=true&index=234&cur_page=1&pageSize=30

只有“item_id = e6de72e”部分才能识别每个项目。其他参数是动态垃圾。

我的问题是:如何让Chrome仅将“example.com/showitemdetail/?item_id=e6de72e”部分标记为已访问,并忽略其余参数?

请注意,我不想修改网址,因为这可能会警告网站服务器怀疑我滥用他们的数据库。我希望垃圾参数仍然存在,但浏览器历史机制忽略它们。

我知道这并不容易。我提出了一个可能的解决方案,但不知道它是否可以实现。就像这样:

步骤:1)扩展后台脚本,用于从我打开的每个页面中提取item_id,然后将其存储在字符串集合中。这个字符串集应该保存在某个文件中。

步骤:2)每次打开包含各种项目列表的网页时,后台脚本都会验证每个URL是否包含与上述集合中的任何一个匹配的字符串。如果是这样,该URL将自动添加到历史记录中。然后该项目将自然显示为已访问。

逻辑听起来不错吗?如果是这样,如何通过简单的扩展来实现它?

当然,如果你有其他更整洁的解决方案,我会非常有兴趣学习。

2 个答案:

答案 0 :(得分:0)

假设到项目的链接总是有item_id,那就行了,是的。

您需要执行以下步骤:

录制元素

  1. content_script,它会在产品页面中添加代码并对其进行跟踪。
  2. 访问产品页面时:

    我。您可以通过检查网址参数来提取当前产品ID(请参阅one of these codes)。

    II。您使用storage api检索某个存储的变量,例如:visited_products。您需要将此变量实现为Set,因为它是处理唯一元素的最佳数据类型。

    III。使用.has()检查当前元素是否在列表中。如果是,那么你跳过它。如果一切都好,它应该总是新的,但检查没有坏处。如果没有,那么你使用add()添加新的产品ID(虽然Set不允许你添加重复的项目,所以你可以跳过检查,只需保存直接添加)。请务必将其存储到Chrome。

  3. 现在您已经注册了对产品的访问。

    检查已访问的元素

    1. 如果需要,您可以再次使用content_script插入产品页面或所有页面。

    2. 您可以使用document.querySelectorAll()获取页面的所有链接。您可以应用CSS selector之类的:a[href*="example.com/showitemdetail/?item_id="],它会选择其href包含该网址部分的所有链接。

    3. 然后,使用for循环迭代链接。在每次迭代中,您都会提取item_id。可能最简单的方法是:/(?:item_id=)(.*?)(?:&|$)/。这匹配所有前面带有item_id =(未捕获)的字符,直到找到&或者字符串的结尾(以先发生者为准,但未捕获)。

    4. 捕获到ID后,您可以使用.has()检查第一部分的Set,看看它是否在列表中。

    5. 现在,关于如何处理它是否在列表中,取决于你。你可以隐藏访问过的元素。或者对它们应用不同的CSS类或样式,以便您轻松区分它们。

    6. 我希望这能让你有个先机。也许你可以尝试一下,如果你不能使它工作,你可以打开一个新的问题,你被卡住了。

答案 1 :(得分:0)

非常感谢,fvbuendia。经过一些试验和错误的肘部油脂,我做到了。 我不会在这里发布所有代码,但会提供其他用户参考的几个提示:

1)要获取新打开的网页的URL并提取ID,请使用chrome.tabs.onUpdated.addListener和extractedItemId = tab.url.replace(/....,....);

2)然后使用chrome.storage.local.set和chrome.storage.local.get将ID保存到storage.local。 ID应保存到对象数组中。

  • 1)和2)应该写在后台脚本中。

3)每次打开项目列表页面时,后台调用内容脚本中的一个函数,询问页面中的所有URL。像这样:

chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) {
 if(changeInfo.status == "complete") {
  if(tab.url.indexOf("some string typical of the item list page URL") > -1) {
   chrome.tabs.executeScript(null, { code: 'getalltheurls();' });
}  }
});

4)要在内容脚本中执行的功能:

function getalltheurls() {
 var urls = [];
 var links = document.links;
  for (var i = 0; i < links.length; i++) {
   if(links[i].href.indexOf("some string typical of the item list URLs") > -1) { urls.push(links[i].href);}
  }
 chrome.runtime.sendMessage({ urls: urls });
    };

5)后台接收URL,然后使用

将它们转换为ID数组
idinlist = urls[i].replace(........)

6)然后,后台使用chrome.storage.local.get获取本地存储,并检查这些ID是否在存储的数组中。如果是,请将URL添加到历史记录。

for (var i = 0; i < urls.length; i++) {
if (storedIDs.indexOf(idinlist) > -1 ) { chrome.history.addUrl({ url: urls[i] }); }
}