根据关键词屏蔽知乎首页推荐内容的火狐插件,支持批量导入与导出。可以通过 Console 查看具体匹配并屏蔽了哪些推送。
// 知乎屏蔽词 - 内容脚本
(function () {
  'use strict';

  const CONTAINER_SELECTOR = '.ContentItem';
  const TITLE_SELECTOR = '.ContentItem-title a';
  const EXCERPT_SELECTOR = '.RichText.ztext';

  let blockKeywords = [];

  function processElement(el) {
    if (el.dataset.blocked) return;
    if (blockKeywords.length === 0) return;

    const title = el.querySelector(TITLE_SELECTOR)?.textContent?.trim() || '';
    const excerpt = el.querySelector(EXCERPT_SELECTOR)?.textContent?.trim() || '';
    const text = title + ' ' + excerpt;

    const matched = blockKeywords.find(k => k && text.includes(k));
    if (matched) {
      el.style.display = 'none';
      el.dataset.blocked = '1';
      console.log(`[知乎屏蔽词] 已屏蔽关键词「${matched}」→ ${title || excerpt.slice(0, 50)}`);
    }
  }

  function processAll() {
    document.querySelectorAll(CONTAINER_SELECTOR).forEach(processElement);
  }

  // 加载屏蔽词并开始处理
  async function init() {
    const result = await browser.storage.local.get('blockKeywords');
    blockKeywords = result.blockKeywords || [];

    // 监听存储变化,实时更新屏蔽词
    browser.storage.onChanged.addListener((changes, area) => {
      if (area === 'local' && changes.blockKeywords) {
        blockKeywords = changes.blockKeywords.newValue || [];
        // 重新处理页面(清除已处理标记)
        document.querySelectorAll(CONTAINER_SELECTOR).forEach(el => {
          delete el.dataset.blocked;
          el.style.display = '';
        });
        processAll();
      }
    });

    // 监听动态加载
    new MutationObserver(mutations => {
      mutations.forEach(m => {
        m.addedNodes.forEach(node => {
          if (node.nodeType !== 1) return;
          if (node.matches?.(CONTAINER_SELECTOR)) {
            processElement(node);
          } else {
            node.querySelectorAll?.(CONTAINER_SELECTOR).forEach(processElement);
          }
        });
      });
    }).observe(document.body, { childList: true, subtree: true });

    processAll();
  }

  init();
})();