由于我的工作涉及从网站查看许多项目,我需要知道哪些项目已被访问过哪些项目,以及哪些项目未被访问,以避免重复查看。
问题是这些项的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将自动添加到历史记录中。然后该项目将自然显示为已访问。
逻辑听起来不错吗?如果是这样,如何通过简单的扩展来实现它?
当然,如果你有其他更整洁的解决方案,我会非常有兴趣学习。
答案 0 :(得分:0)
假设到项目的链接总是有item_id,那就行了,是的。
您需要执行以下步骤:
录制元素
访问产品页面时:
我。您可以通过检查网址参数来提取当前产品ID(请参阅one of these codes)。
II。您使用storage api检索某个存储的变量,例如:visited_products。您需要将此变量实现为Set,因为它是处理唯一元素的最佳数据类型。
III。使用.has()检查当前元素是否在列表中。如果是,那么你跳过它。如果一切都好,它应该总是新的,但检查没有坏处。如果没有,那么你使用add()添加新的产品ID(虽然Set不允许你添加重复的项目,所以你可以跳过检查,只需保存直接添加)。请务必将其存储到Chrome。
现在您已经注册了对产品的访问。
检查已访问的元素
如果需要,您可以再次使用content_script插入产品页面或所有页面。
您可以使用document.querySelectorAll()获取页面的所有链接。您可以应用CSS selector之类的:a[href*="example.com/showitemdetail/?item_id="]
,它会选择其href包含该网址部分的所有链接。
然后,使用for循环迭代链接。在每次迭代中,您都会提取item_id。可能最简单的方法是:/(?:item_id=)(.*?)(?:&|$)/
。这匹配所有前面带有item_id =(未捕获)的字符,直到找到&或者字符串的结尾(以先发生者为准,但未捕获)。
捕获到ID后,您可以使用.has()检查第一部分的Set,看看它是否在列表中。
现在,关于如何处理它是否在列表中,取决于你。你可以隐藏访问过的元素。或者对它们应用不同的CSS类或样式,以便您轻松区分它们。
我希望这能让你有个先机。也许你可以尝试一下,如果你不能使它工作,你可以打开一个新的问题,你被卡住了。
答案 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应保存到对象数组中。
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] }); }
}