// ==UserScript== // @name YouTube AI广告终极旗舰版 (国际增强版 v3.0) // @namespace http://tampermonkey.net/ // @version 1.4 // @description AI智能广告净化、反检测、国际多语言、限额保护、日志管理,终身可用稳定版! // @author // @match *://www.youtube.com/* // @grant GM_xmlhttpRequest // @grant GM_getValue // @grant GM_setValue // @grant GM_registerMenuCommand // @grant GM_setClipboard // @connect openkey.cloud // @run-at document-end // @downloadURL none // ==/UserScript== (function () { 'use strict'; const OPENKEY_API = 'https://openkey.cloud/v1/chat/completions'; let API_KEY = GM_getValue('yt_adblock_api_key', ''); const DAILY_LIMIT = 20; // 每日最多更新规则 20 次,保护你OpenAI额度 const LOG_LIMIT = 100; // 保留最近 100 条日志 const DEBUG = true; let dynamicSelectors = []; let lastUpdate = 0; let lastDefendTrigger = 0; let dailyUsage = GM_getValue('daily_usage', 0); let todayDate = new Date().toISOString().slice(0, 10); let storedDate = GM_getValue('daily_date', todayDate); // 日期重置每日计数 if (storedDate !== todayDate) { GM_setValue('daily_usage', 0); GM_setValue('daily_date', todayDate); dailyUsage = 0; } const languages = { en: ['ad blocker', "looks like you're using"], zh: ['广告拦截', '检测到广告拦截器'], jp: ['広告ブロッカー', '広告ブロック検出'], ko: ['광고 차단기', '광고 차단 감지'], fr: ['bloqueur de publicités', 'détection de blocage de publicité'], es: ['bloqueador de anuncios', 'detección de bloqueador de anuncios'] }; function log(...args) { if (DEBUG) console.log(...args); storeLog(args.join(' ')); } function storeLog(message) { const logs = GM_getValue('yt_adblock_logs', []); logs.push(`[${new Date().toLocaleString()}] ${message}`); if (logs.length > LOG_LIMIT) logs.shift(); GM_setValue('yt_adblock_logs', logs); } function detectAdblockWarning() { const bodyText = document.body.innerText.toLowerCase(); return Object.values(languages).some(arr => arr.some(word => bodyText.includes(word.toLowerCase()))); } function checkQuota() { if (dailyUsage >= DAILY_LIMIT) { log('[配额保护] 今日更新次数已达上限'); return false; } dailyUsage++; GM_setValue('daily_usage', dailyUsage); return true; } async function updateSelectorsViaAI(defensive = false, manual = false) { if (!API_KEY) { log('[AI规则] API KEY 未设置'); alert("请先设置API KEY"); return; } if (!manual && !defensive && (Date.now() - lastUpdate < 3600000)) return; if (!checkQuota()) return; GM_xmlhttpRequest({ method: 'POST', url: OPENKEY_API, headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${API_KEY}` }, data: JSON.stringify({ model: "gpt-4o", messages: [{ role: "user", content: defensive ? "YouTube 检测到广告拦截器被检测,请提供更稳妥的CSS选择器数组以规避检测。返回纯JSON数组格式,如 ['.ytp-ad-module', ...],不要解释。" : "请提供用于屏蔽YouTube广告元素的CSS选择器数组,使用JSON格式返回。不要解释,仅返回形如 ['.ytp-ad-module', ...] 的数组" }], temperature: 0.3 }), onload: res => { try { const data = JSON.parse(res.responseText); let content = data.choices[0].message.content.trim(); content = content.replace(/```json|```/g, '').trim(); const list = JSON.parse(content); if (Array.isArray(list)) { dynamicSelectors = list; GM_setValue('yt_ad_selectors', list); lastUpdate = Date.now(); log(defensive ? '[AI防御模式] 规则更新成功' : '[AI规则] 更新成功'); updatePanelStatus("AI规则已更新 ✔"); } else { log('[AI规则] 返回格式异常'); } } catch (e) { log('[AI规则] 解析失败: ' + e); } } }); } const defaultSelectors = ['.ytp-ad-module', '.ytp-ad-overlay-container', '.ytp-ad-player-overlay', '.ad-showing .video-ads', '#player-ads']; function hideAds() { const selectors = [...defaultSelectors, ...dynamicSelectors]; selectors.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; } } let lastVideoTime = 0, stalledCount = 0; setInterval(() => { const video = document.querySelector('video'); if (video && !document.querySelector('.ad-showing')) { if (video.currentTime === lastVideoTime) { stalledCount++; updatePanelStatus(`卡顿: ${stalledCount}`); if (stalledCount > 10) location.reload(); } else { stalledCount = 0; lastVideoTime = video.currentTime; } } }, 2000); setInterval(() => { hideAds(); clickSkip(); accelerateAd(); if (detectAdblockWarning()) { if (Date.now() - lastDefendTrigger > 10 * 60 * 1000) { log('[反检测] 触发AI防御更新'); updateSelectorsViaAI(true); lastDefendTrigger = Date.now(); } } }, 1000); function createPanel() { const style = document.createElement('style'); style.innerHTML = `#panel{position:fixed;top:60px;right:20px;background:rgba(0,0,0,0.85);color:#fff;padding:10px;border-radius:8px;z-index:9999;font-size:12px} #panel button{margin-top:5px;width:100%}`; document.head.appendChild(style); const div = document.createElement('div'); div.id = 'panel'; div.innerHTML = `
AI广告屏蔽 v3.0
运行中
`; document.body.appendChild(div); document.getElementById('btn-refresh').onclick = () => { updateSelectorsViaAI(false, true); }; document.getElementById('btn-key').onclick = () => { const key = prompt("请输入你的API KEY", API_KEY); if (key) { GM_setValue('yt_adblock_api_key', key); API_KEY = key; alert("已保存"); } }; document.getElementById('btn-log').onclick = () => { const logs = GM_getValue('yt_adblock_logs', []).join('\n'); GM_setClipboard(logs); alert("日志已复制到剪贴板"); }; } function updatePanelStatus(msg) { const el = document.getElementById('panel-status'); if (el) el.textContent = msg; } GM_registerMenuCommand("设置API Key", () => { const key = prompt("请输入你的API KEY", API_KEY); if (key) { GM_setValue('yt_adblock_api_key', key); API_KEY = key; alert("已保存"); } }); // 初始化 (function init() { dynamicSelectors = GM_getValue('yt_ad_selectors', []); updateSelectorsViaAI(); setInterval(updateSelectorsViaAI, 3600000); createPanel(); log('初始化完成 v3.0'); })(); })();