Greasy Fork

Greasy Fork is available in English.

Telegram web 屏蔽指定频道

屏蔽Telegram特定频道的搜索和打开,触发会重定向到首页

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         Telegram web 屏蔽指定频道
// @version      0.7
// @description  屏蔽Telegram特定频道的搜索和打开,触发会重定向到首页
// @author       涵有闲
// @homepage     https://hyx.ink
// @match        https://web.telegram.org/*
// @grant        none
// @namespace http://greasyfork.icu/users/1385884
// ==/UserScript==

(function () {
  "use strict";

  // 核心配置
  const config = {
    // 需要屏蔽的完整用户名列表
    blockList: ["@v114bot","@jisou"],
    // 重定向目标
    baseUrl: "https://web.telegram.org/k/",
    // 选择器配置
    selectors: {
      searchContainer: ".search-super",
      searchGroup: ".search-group-contacts",
      chatItem: ".row.chatlist-chat",
      subtitle: ".row-subtitle",
    },
  };

  /**
   * 检查URL是否需要屏蔽
   * @param {string} url 当前URL
   * @returns {boolean}
   */
  function shouldBlockUrl(url) {
    // 移除@符号并转换为小写进行匹配
    const blockPatterns = config.blockList.map(
      (item) => new RegExp(item.replace("@", ""), "i")
    );
    return blockPatterns.some((pattern) => pattern.test(url));
  }

  /**
   * 处理重定向
   */
  function handleRedirect() {
    const currentUrl = window.location.href;
    if (shouldBlockUrl(currentUrl) && currentUrl !== config.baseUrl) {
      window.location.replace(config.baseUrl);
    }
  }

  /**
   * 处理搜索结果
   */
  function handleSearchResults() {
    const observer = new MutationObserver(() => {
      document
        .querySelectorAll(config.selectors.searchGroup)
        .forEach((group) => {
          group.querySelectorAll(config.selectors.chatItem).forEach((item) => {
            const subtitle = item
              .querySelector(config.selectors.subtitle)
              ?.textContent?.trim();
            // 严格匹配完整用户名
            if (config.blockList.includes(subtitle)) {
              item.style.display = "none";
            }
          });
        });
    });

    // 观察搜索结果区域
    const searchContainer = document.querySelector(
      config.selectors.searchContainer
    );
    if (searchContainer) {
      observer.observe(searchContainer, {
        childList: true,
        subtree: true,
      });
    }
  }

  /**
   * 防抖函数
   */
  function debounce(func, wait) {
    let timeout;
    return function (...args) {
      clearTimeout(timeout);
      timeout = setTimeout(() => func.apply(this, args), wait);
    };
  }

  // 主函数
  const main = debounce(() => {
    if (window.location.hostname === "web.telegram.org") {
      handleRedirect(); // 保留重定向功能
      handleSearchResults();
    }
  }, 100);

  // 初始化
  function init() {
    main();
    // 监听 URL 变化
    const pushState = history.pushState;
    history.pushState = function () {
      pushState.apply(history, arguments);
      main();
    };
    window.addEventListener("popstate", main);
  }

  // 启动
  if (document.readyState === "loading") {
    document.addEventListener("DOMContentLoaded", init);
  } else {
    init();
  }
})();