如何让Chrome历史记录忽略URL的一部分

如何让Chrome历史记录忽略URL的一部分,url,google-chrome-extension,browser-history,Url,Google Chrome Extension,Browser History,由于我的工作涉及到从一个网站上查看许多项目,我需要知道哪些项目已被访问,哪些未被访问,以避免重复查看 问题是这些项目的URL包含一些动态变化的垃圾参数。这意味着浏览器的历史记录在识别哪些项目已经被查看时几乎毫无用处 这是URL的一个示例: 只有“item_id=e6de72e”部分可用于识别每个项目。其他参数是动态垃圾 我的问题是:如何让Chrome仅将“example.com/showtItemDetail/?item_id=e6de72e”部分标记为已访问,而忽略其余参数 请注意,我不想修

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

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

这是URL的一个示例:

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

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

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

我知道这不容易。我正在提出一个可能的解决办法,但不知道能否实施。是这样的:

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

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

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


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

假设指向项目的链接总是有项目id,那就行了,是的

您需要执行以下步骤:

记录元素

  • 将代码添加到产品页面并跟踪它
  • 在访问产品页面时:

    一,。您可以通过检查URL参数来提取当前产品id(请参阅)

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

    iii.使用.has()检查当前元素是否在列表中。如果是,则跳过它。如果一切都是好的,它应该总是新的,但检查没有坏处。如果没有,则使用add()添加新的产品id(尽管Set不允许您添加重复的项目,因此您可以跳过检查,直接保存并添加)。确保将其存储到Chrome

  • 现在,您已经注册了对产品的访问

    检查访问的元素

  • 如果需要,可以再次使用内容脚本插入产品页面或所有页面

  • 您可以使用()获得页面的所有链接。您可以应用类似的:
    a[href*=”example.com/showitemdetail/?item_id=“]
    ,它将选择href包含该URL部分的所有链接

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

  • 捕获id后,可以使用.has()检查第一部分的集合,以查看它是否在列表中

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


  • 我希望这能让你领先一步。也许你可以试一试,如果你不能让它发挥作用,你可以提出一个新的问题,说明你的困境。

    非常感谢,fvbuendia。经过反复试验,我成功了。 我不会在这里发布所有代码,但会给出一些提示供其他用户参考:

    1) 要获取新打开网页的URL并提取ID,请使用chrome.tabs.onUpdated.addListener和extractedEditEMID=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 });
        };
    
    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] }); }
    }
    
    for(var i=0;i-1){chrome.history.addUrl({url:url[i]});}
    }
    
    谢谢你,fvbuendia。虽然我需要花相当长的时间来弄清楚如何使用这些API,但知道正确的方法仍然可以节省大量的尝试和错误工作。我现在就要开始我的精彩课程了。当你开始尝试和进步时,请毫不犹豫地回来提出新的问题,以便我们能够提供帮助;)然而,你必须先尝试!
    for (var i = 0; i < urls.length; i++) {
    if (storedIDs.indexOf(idinlist) > -1 ) { chrome.history.addUrl({ url: urls[i] }); }
    }