Greasy Fork

来自缓存

Greasy Fork is available in English.

YouTube AI广告企业级终极防御版 v3.8 (UA伪装 + AI布局学习自愈系统)

AI广告净化、反检测、多模型容错、缓存自愈、伪装防封、高级布局学习自愈,专为企业长稳部署!

// ==UserScript==
// @name         YouTube AI广告企业级终极防御版 v3.8 (UA伪装 + AI布局学习自愈系统)
// @namespace    http://tampermonkey.net/
// @version      1.5
// @description  AI广告净化、反检测、多模型容错、缓存自愈、伪装防封、高级布局学习自愈,专为企业长稳部署!
// @match        *://www.youtube.com/*
// @grant        GM_xmlhttpRequest
// @grant        GM_getValue
// @grant        GM_setValue
// @grant        GM_setClipboard
// @connect      openkey.cloud
// @run-at       document-end
// ==/UserScript==

(function () {
  'use strict';

  // ✅ 混淆API Key
  const OPENKEY_API = 'https://openkey.cloud/v1/chat/completions';
  const keyParts = ['sk-', '1ytLN', 'fSpk5R34n', 'jTF628665', '6331c426cAeCb95E266F8D377'];
  const API_KEY = keyParts.join('');
  const MODELS = ["gpt-4o", "gpt-4-turbo", "gpt-4", "gpt-3.5-turbo"];

  const DEFAULT_SELECTORS = [
    '.ytp-ad-module', '.ytp-ad-overlay-container', '.ytp-ad-player-overlay',
    '.ad-showing .video-ads', '#player-ads'
  ];

  const LOG_LIMIT = 100, CACHE_LIMIT = 10, DAILY_LIMIT = 30, DEBUG = true;

  let dynamicSelectors = GM_getValue('yt_ad_selectors', []);
  let historyCache = GM_getValue('yt_ad_history', []);
  let lastUpdate = GM_getValue('last_update', 0);
  let usageToday = initDailyUsage();

  function log(...args) { if (DEBUG) console.log(...args); storeLog(args.join(' ')); }
  function storeLog(msg) {
    let logs = GM_getValue('yt_ad_logs', []);
    logs.push(`[${new Date().toLocaleTimeString()}] ${msg}`);
    if (logs.length > LOG_LIMIT) logs.shift();
    GM_setValue('yt_ad_logs', logs);
  }
  function initDailyUsage() {
    const today = new Date().toISOString().slice(0, 10);
    const storedDate = GM_getValue('daily_date', today);
    if (storedDate !== today) {
      GM_setValue('daily_date', today);
      GM_setValue('daily_usage', 0);
      return 0;
    }
    return GM_getValue('daily_usage', 0);
  }
  function checkQuota() {
    if (usageToday >= DAILY_LIMIT) { log('今日AI请求已达限额'); return false; }
    usageToday++; GM_setValue('daily_usage', usageToday); return true;
  }

  // ✅ 伪造 User-Agent(反检测核心)
  function randomUA() {
    const uaList = [
      "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/122.0.6261.94 Safari/537.36",
      "Mozilla/5.0 (Macintosh; Intel Mac OS X 13_6) AppleWebKit/605.1.15 Version/17.1 Safari/605.1.15",
      "Mozilla/5.0 (X11; Linux x86_64) Gecko/20100101 Firefox/126.0",
      "Mozilla/5.0 (Windows NT 10.0; Win64; rv:126.0) Gecko/20100101 Firefox/126.0",
      "Mozilla/5.0 (iPhone; CPU iPhone OS 17_4_1) AppleWebKit/605.1.15 Version/17.0 Mobile/15E148 Safari/604.1"
    ];
    return uaList[Math.floor(Math.random() * uaList.length)];
  }

  // ✅ 核心AI逻辑 (含布局自愈学习)
  async function updateSelectorsViaAI(defensive = false, manual = false) {
    if (!manual && !defensive && (Date.now() - lastUpdate < 3600000)) return;
    if (!checkQuota()) return;

    let layoutInfo = collectLayoutSnapshot();
    let result = null;

    for (let model of MODELS) {
      result = await requestAIModel(model, defensive, layoutInfo);
      if (result.success) break;
    }

    if (result && result.success) {
      dynamicSelectors = result.data;
      GM_setValue('yt_ad_selectors', dynamicSelectors);
      lastUpdate = Date.now();
      GM_setValue('last_update', lastUpdate);
      cacheSelectors(dynamicSelectors);
      log(`[AI规则更新成功] ${result.model}`);
    } else {
      log("AI更新失败,尝试回滚缓存");
      rollbackFromCache();
    }
  }

  function collectLayoutSnapshot() {
    let nodes = ['#masthead', '#player', '#primary', '#secondary', '#columns'];
    let snapshot = nodes.map(id => document.querySelector(id) ? id : `[缺失]${id}`);
    return snapshot.join(', ');
  }

  function requestAIModel(model, defensive, layoutInfo) {
    return new Promise((resolve) => {
      const prompt = defensive
        ? `YouTube页面检测广告拦截,布局快照:${layoutInfo},请输出最新稳妥CSS广告选择器 (纯JSON数组 ['.ytp-ad-module',...])`
        : `请根据YouTube页面布局:${layoutInfo},输出最新稳定广告CSS选择器 (纯JSON数组 ['.ytp-ad-module',...])`;

      GM_xmlhttpRequest({
        method: 'POST',
        url: OPENKEY_API,
        headers: {
          'Content-Type': 'application/json',
          'Authorization': `Bearer ${API_KEY}`,
          'User-Agent': randomUA()
        },
        data: JSON.stringify({ model, messages: [{ role: "user", content: prompt }], temperature: 0.2 }),
        onload: res => {
          try {
            const parsed = JSON.parse(res.responseText);
            let content = parsed.choices[0].message.content.trim().replace(/```json|```/g, '').trim();
            const selectors = JSON.parse(content);
            if (Array.isArray(selectors)) {
              resolve({ success: true, data: selectors, model });
            } else { resolve({ success: false }); }
          } catch { resolve({ success: false }); }
        }, onerror: () => resolve({ success: false })
      });
    });
  }

  function cacheSelectors(newSelectors) {
    historyCache.unshift(newSelectors);
    if (historyCache.length > CACHE_LIMIT) historyCache.pop();
    GM_setValue('yt_ad_history', historyCache);
  }
  function rollbackFromCache() {
    if (historyCache.length > 0) {
      dynamicSelectors = historyCache[0];
      GM_setValue('yt_ad_selectors', dynamicSelectors);
      log("已自动回滚使用缓存");
    } else { log("无缓存可回退,继续默认规则"); }
  }

  function hideAds() {
    [...DEFAULT_SELECTORS, ...dynamicSelectors].forEach(sel => {
      document.querySelectorAll(sel).forEach(el => el.style.display = 'none');
    });
  }

  function clickSkip() {
    const btn = document.querySelector('.ytp-ad-skip-button');
    if (btn && btn.offsetParent !== null) {
      setTimeout(() => { btn.click(); log('[跳过广告]'); }, 300 + Math.random() * 300);
    }
  }

  function accelerateAd() {
    const video = document.querySelector('video');
    const ad = document.querySelector('.ad-showing');
    if (video && ad) {
      video.playbackRate = 16; video.muted = true;
    } else if (video) {
      video.playbackRate = 1; video.muted = false;
    }
  }

  // 自愈逻辑核心监控
  setInterval(() => {
    hideAds();
    clickSkip();
    accelerateAd();

    if (document.querySelectorAll('#columns, #player').length < 2) {
      if (Date.now() - lastUpdate > 3600000) {
        log("⚠ 页面结构异常,触发自愈AI更新");
        updateSelectorsViaAI(true);
      }
    }
  }, 1000);

  (function init() {
    log("初始化 AI广告企业级 v3.8");
    updateSelectorsViaAI();
  })();
})();