Greasy Fork

Greasy Fork is available in English.

bilinovel

去除bilinovel检测到屏蔽后隐藏内容

当前为 2025-04-23 提交的版本,查看 最新版本

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         bilinovel
// @namespace    http://tampermonkey.net/
// @version      1.4
// @description  去除bilinovel检测到屏蔽后隐藏内容
// @author       karl
// @match        https://www.bilinovel.com/*
// @grant        none
// @run-at       document-idle
// @icon         https://www.google.com/s2/favicons?sz=64&domain=bilinovel.com
// @license      GPLv3
// ==/UserScript==

(function() {
  'use strict';

  const AD_TIPS_SELECTOR = '.adblock-tips'; // 反广告拦截脚本添加的提示框的选择器
  const CONTENT_ID = 'acontent'; // 被反广告拦截脚本隐藏的内容区域的 ID
  const MAX_ATTEMPTS = 5; // 尝试清理的最大次数
  const CHECK_INTERVAL = 1000; // 每次检查清理的时间间隔 (毫秒)

  let attempts = 0;
  let cleanupInterval = null;

  function performCleanup() {
      attempts++;
      console.log(`[Anti-Anti-Adblock] 第 ${attempts} 次尝试清理...`);

      let cleanedSomething = false;

      // 1. 移除提示信息
      const adBlockTips = document.querySelector(AD_TIPS_SELECTOR);
      if (adBlockTips) {
          console.log("[Anti-Anti-Adblock] 发现并移除广告拦截提示:", adBlockTips);
          adBlockTips.remove();
          cleanedSomething = true;
      }

      // 2. 恢复内容区域
      const contentArea = document.getElementById(CONTENT_ID);
      if (contentArea && contentArea.style.display === 'none') {
          console.log("[Anti-Anti-Adblock] 发现被隐藏的内容区域,尝试恢复显示:", contentArea);
          contentArea.style.display = ''; // 恢复默认显示状态 (通常是 'block' 或 '')
          cleanedSomething = true;

          // 2.1 尝试移除可能添加的 "诱饵" div (基于原脚本逻辑)
          // 原脚本会在检测到拦截时,在 contentArea 内添加一个带随机类名的 div
          // 这里我们尝试移除 contentArea 内最后一个看起来像诱饵的 div
          // 注意:这比较脆弱,如果页面结构复杂,可能会误删
          const potentialBait = contentArea.lastElementChild;
          // 检查它是否是一个 div,并且有类名 (原脚本会添加随机类名)
          if (potentialBait && potentialBait.tagName === 'DIV' && potentialBait.classList.length > 0) {
               // 可以添加更严格的检查,比如检查 style 属性是否有 position: absolute 等
               console.log("[Anti-Anti-Adblock] 尝试移除内容区域内最后一个可能是诱饵的 DIV:", potentialBait);
               // potentialBait.remove(); // 如果确定要移除,取消此行注释。先观察效果。
          }
      }

      // 3. 尝试清除计时器 (高风险,可能影响其他功能)
      // 原脚本设置了两个 setInterval。我们无法直接获取它们的 ID,
      // 只能尝试清除所有可能的 interval。这非常不推荐,除非绝对必要。
      // 如果前面的步骤足够,通常不需要这一步。
      /*
      if (cleanedSomething) { // 只在确实执行了清理后才尝试清除计时器
          console.warn("[Anti-Anti-Adblock] 尝试清除所有 Interval (高风险)...");
          let highestIntervalId = window.setInterval(function(){}, Number.MAX_SAFE_INTEGER);
          for (let i = 1; i < highestIntervalId; i++) {
              window.clearInterval(i);
          }
          console.warn("[Anti-Anti-Adblock] Interval 清除尝试完成。");
          // 清除后,也停止我们自己的检查计时器
          if (cleanupInterval) clearInterval(cleanupInterval);
      }
      */

      // 如果达到最大尝试次数,或者连续几次未检测到需要清理的内容,则停止
      if (attempts >= MAX_ATTEMPTS) {
          console.log("[Anti-Anti-Adblock] 已达到最大尝试次数,停止检查。");
          if (cleanupInterval) clearInterval(cleanupInterval);
      }
  }

  // 使用 setInterval 定期检查,因为反广告脚本可能会延迟执行或重复执行
  // run-at document-idle 保证页面基本加载完成,但脚本可能稍后执行
  cleanupInterval = setInterval(performCleanup, CHECK_INTERVAL);

  // 也可以在页面完全加载后执行一次
  // window.addEventListener('load', performCleanup);

})();