keywordFilter

通过关键字过滤页面内容

  1. // ==UserScript==
  2. // @name keywordFilter
  3. // @namespace http://tampermonkey.net/
  4. // @version 0.2
  5. // @description 通过关键字过滤页面内容
  6. // @author wasdjkl
  7. // @match *://*/*
  8. // @icon data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==
  9. // @grant none
  10. // @license MIT
  11. // @require https://cdn.jsdelivr.net/npm/jquery@3.6.1/dist/jquery.min.js
  12. // @require https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js
  13. // ==/UserScript==
  14.  
  15. (function () {
  16. 'use strict';
  17.  
  18. // 为防止激进的方法调用造成性能问题,这里可以设置一个延迟时间
  19. const wait = 500
  20.  
  21. // 过滤的关键字(预设仅用于测试并不代表作者个人喜好)
  22. const blockWords = ["置顶", "利昂内尔·梅西", "LGD"]
  23.  
  24. // 过滤层级手动配置
  25. const blockRules = [
  26. // B站 评论过滤
  27. {url: 'https://www.bilibili.com/video/', selector: 'div.reply-item'},
  28. // Score 文章列表过滤
  29. {url: 'https://www.scoregg.com', selector: 'div.article-item'},
  30. // 百度搜索 结果过滤
  31. {url: 'https://www.baidu.com/s', selector: 'div.c-container'},
  32. // 百度百科 百科星图过滤
  33. {url: 'https://baike.baidu.com/item/', selector: 'div.starmap-lemma-item'},
  34. // 通用兜底规则
  35. {url: '', selector: 'li'}, {url: '', selector: 'p'}, {url: '', selector: 'a'}, {url: '', selector: 'span'}
  36. ]
  37.  
  38. function hasKeyword(node) {
  39. if (node.textContent === null) return true;
  40. return blockWords.find(keyword => node.textContent.includes(keyword))
  41. }
  42.  
  43. function replaceContent(node) {
  44. if (!hasKeyword(node)) return;
  45. if (node.nodeName === "#text") {
  46. const rules = blockRules.filter(rule => location.href.startsWith(rule.url))
  47. rules.forEach(rule => {
  48. $(node).closest(rule.selector).remove()
  49. })
  50. }
  51. node.childNodes.forEach(replaceContent);
  52. }
  53.  
  54. const debounceReplaceContent = _.debounce(replaceContent, wait)
  55.  
  56. debounceReplaceContent(document);
  57. new MutationObserver(() => {
  58. debounceReplaceContent(document)
  59. }).observe(document, {
  60. childList: true, attributes: false, subtree: true,
  61. });
  62. })();