Telegram Ad Filter

Collapses messages that contain words from the ad-word list

目前为 2022-01-21 提交的版本。查看 最新版本

// ==UserScript==
// @name        Telegram Ad Filter
// @version     0.4.4
// @description Collapses messages that contain words from the ad-word list
// @license     MIT
// @author      VChet
// @icon        https://web.telegram.org/favicon.ico
// @namespace   Telegram-Ad-Filter
// @include     https://web.telegram.org/k/*
// @grant       GM_addStyle
// @grant       GM_getValue
// @grant       GM_setValue
// @grant       GM_registerMenuCommand
// ==/UserScript==

/* jshint esversion: 10 */
(() => {
  let defaultList = ["#advertisement", "#promo"];
  if (navigator.language === "ru-RU") defaultList = ["#взаимопиар", "#партнерский", "#реклама", "#рекламный"];
  let adWords = GM_getValue("ad-words", defaultList);

  function applyStyles(node) {
    const message = node.querySelector(".message");
    if (!message?.innerText) return;
    const hasAdWord = adWords.some((filter) => message.innerText.toLowerCase().includes(filter.toLowerCase()));
    if (!hasAdWord || node.querySelector(".advertisement")) return;

    const trigger = document.createElement("div");
    trigger.classList.add("advertisement");
    trigger.innerText = "Advertisement";
    node.querySelector(".bubble-content").append(trigger);

    node.classList.add("has-advertisement");
    trigger.addEventListener("click", () => { node.classList.remove("has-advertisement"); });
    message.addEventListener("click", () => { node.classList.add("has-advertisement"); });
  }

  GM_addStyle(`
    .bubble:not(.has-advertisement) .advertisement,
    .bubble.has-advertisement .message,
    .bubble.has-advertisement .bubble-beside-button,
    .bubble.has-advertisement .attachment {
      display: none;
    }
    .advertisement {
      position: relative;
      padding: 0.5rem 1rem;
      text-decoration: underline dotted;
      cursor: pointer;
      font-weight: bold;
      color: var(--link-color);
    }
  `);

  GM_registerMenuCommand("Filter list", () => {
    const oldValue = GM_getValue("ad-words", adWords);
    const input = prompt("Enter words to filter, separated by comma:", oldValue);
    // Convert string to array, trim values
    const newValue = input.split(",").reduce((acc, entry) => {
      if (entry) acc.push(entry.trim());
      return acc;
    }, []);
    adWords = newValue;
    GM_setValue("ad-words", newValue);
    document.querySelectorAll(".bubble").forEach((message) => { applyStyles(message); });
  });

  const observer = new MutationObserver((mutations) => {
    mutations.forEach((mutation) => {
      if (mutation.type !== "childList" || !mutation.addedNodes.length) return;
      const nodes = [...mutation.addedNodes].filter((node) => node.nodeType === 1 && node.classList.contains("bubble"));
      if (nodes.length) document.querySelectorAll(".bubble").forEach((message) => { applyStyles(message); });
    });
  });

  observer.observe(document.documentElement, { childList: true, subtree: true, attributeFilter: ["class"] });
})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址