From 8d39f24876a598572a1eaeaafc95f69f3503a16f Mon Sep 17 00:00:00 2001 From: chinosk Date: Sat, 2 May 2026 14:29:54 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20metamogu.js?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- metamogu.js | 246 ++++++++++++++++++++++++++-------------------------- 1 file changed, 123 insertions(+), 123 deletions(-) diff --git a/metamogu.js b/metamogu.js index b6e9d58..282cf05 100644 --- a/metamogu.js +++ b/metamogu.js @@ -1,124 +1,124 @@ -// ==UserScript== -// @name Metamogu 补货自动检测 (Fetch 终极版) -// @namespace http://tampermonkey.net/ -// @version 3.0 -// @description 使用原生 Fetch 突破拦截,响应非 500 时直接替换页面或重定向,避免重复访问消耗兑换码。 -// @author Gemini -// @match https://metamogu.sa-vrc-media.com/redeem-code/redirect* -// @grant GM_notification -// @run-at document-idle -// ==/UserScript== - -(function() { - 'use strict'; - - let checkCount = 0; - let countdownTimer = null; - - // 1. 创建右下角浮窗 UI - const ui = document.createElement('div'); - ui.style.cssText = ` - position: fixed; - bottom: 20px; - right: 20px; - padding: 15px 20px; - background-color: rgba(0, 0, 0, 0.75); - color: #00FF00; - font-family: 'Microsoft YaHei', sans-serif; - font-size: 14px; - border-radius: 8px; - z-index: 2147483647; - box-shadow: 0 4px 10px rgba(0,0,0,0.3); - pointer-events: none; - backdrop-filter: blur(4px); - line-height: 1.6; - transition: all 0.3s ease; - `; - if (document.body) { - document.body.appendChild(ui); - } else { - document.documentElement.appendChild(ui); - } - - // 更新浮窗内容 - function updateUI(text, color = "#00FF00") { - ui.style.color = color; - ui.innerHTML = text; - } - - // 2. 核心检测逻辑 (原生 async/await fetch) - async function doCheck() { - checkCount++; - updateUI(`🔄 第 ${checkCount} 次检测中...`, "#FFD700"); - - try { - // 使用原生 fetch,完美伪装成正常的页面加载请求 - const response = await fetch(window.location.href, { - method: "GET", - cache: "no-store", // 强制不缓存,确保获取最新状态 - headers: { - // 模拟常见的浏览器请求头,避免被 WAF 拦截 - "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8" - } - }); - - const status = response.status; - // 如果发生了 301/302 重定向,fetch 默认会跟随,response.redirected 会变为 true - const finalUrl = response.url; - const isRedirected = response.redirected; - - if (status === 500) { - // 缺货状态:随机 5~30 秒倒计时 - const delaySec = Math.floor(Math.random() * (30 - 5 + 1)) + 5; - let currentSec = delaySec; - - updateUI(`❌ 状态: 缺货中 (500)
⏱️ 倒计时: ${currentSec} 秒后检测
📊 累计检测: ${checkCount} 次`, "#FF4500"); - document.title = `[等待 ${currentSec}s] 监控中...`; - - countdownTimer = setInterval(() => { - currentSec--; - if (currentSec <= 0) { - clearInterval(countdownTimer); - doCheck(); - } else { - updateUI(`❌ 状态: 缺货中 (500)
⏱️ 倒计时: ${currentSec} 秒后检测
📊 累计检测: ${checkCount} 次`, "#FF4500"); - document.title = `[等待 ${currentSec}s] 监控中...`; - } - }, 1000); - - } else { - // 已补货!状态不再是 500 - updateUI(`✅ 状态: ${status}
🎉 已补货,正在处理...
📊 累计检测: ${checkCount} 次`, "#00FF00"); - document.title = `[已补货!] 状态 ${status}`; - - GM_notification({ - title: "🌟 Metamogu 补货啦!", - text: `检测到状态变化,已为您渲染最新页面!`, - timeout: 10000, - highlight: true, - onclick: () => window.focus() - }); - - // 处理 302 重定向或 200 成功 - if (isRedirected || finalUrl !== window.location.href) { - console.log("检测到重定向,正在跳转至:", finalUrl); - window.location.replace(finalUrl); // 使用 replace 避免产生多余的历史记录 - } else { - console.log("状态 200,正在替换页面 DOM..."); - const htmlText = await response.text(); - document.open(); - document.write(htmlText); - document.close(); - } - } - } catch (error) { - // 请求出错处理 (例如断网或跨域异常) - console.error("Fetch 请求出错:", error); - updateUI(`⚠️ 网络请求异常
⏱️ 10秒后重试...
📊 累计检测: ${checkCount} 次`, "#FF6347"); - setTimeout(doCheck, 10000); - } - } - - // 启动检测 - doCheck(); +// ==UserScript== +// @name Metamogu 补货自动检测 +// @namespace http://tampermonkey.net/ +// @version 3.0 +// @description 响应非 500 时直接替换页面或重定向。 +// @author Gemini +// @match https://metamogu.sa-vrc-media.com/redeem-code/redirect* +// @grant GM_notification +// @run-at document-idle +// ==/UserScript== + +(function() { + 'use strict'; + + let checkCount = 0; + let countdownTimer = null; + + // 1. 创建右下角浮窗 UI + const ui = document.createElement('div'); + ui.style.cssText = ` + position: fixed; + bottom: 20px; + right: 20px; + padding: 15px 20px; + background-color: rgba(0, 0, 0, 0.75); + color: #00FF00; + font-family: 'Microsoft YaHei', sans-serif; + font-size: 14px; + border-radius: 8px; + z-index: 2147483647; + box-shadow: 0 4px 10px rgba(0,0,0,0.3); + pointer-events: none; + backdrop-filter: blur(4px); + line-height: 1.6; + transition: all 0.3s ease; + `; + if (document.body) { + document.body.appendChild(ui); + } else { + document.documentElement.appendChild(ui); + } + + // 更新浮窗内容 + function updateUI(text, color = "#00FF00") { + ui.style.color = color; + ui.innerHTML = text; + } + + // 2. 核心检测逻辑 (原生 async/await fetch) + async function doCheck() { + checkCount++; + updateUI(`🔄 第 ${checkCount} 次检测中...`, "#FFD700"); + + try { + // 使用原生 fetch,完美伪装成正常的页面加载请求 + const response = await fetch(window.location.href, { + method: "GET", + cache: "no-store", // 强制不缓存,确保获取最新状态 + headers: { + // 模拟常见的浏览器请求头,避免被 WAF 拦截 + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8" + } + }); + + const status = response.status; + // 如果发生了 301/302 重定向,fetch 默认会跟随,response.redirected 会变为 true + const finalUrl = response.url; + const isRedirected = response.redirected; + + if (status === 500) { + // 缺货状态:随机 5~30 秒倒计时 + const delaySec = Math.floor(Math.random() * (30 - 5 + 1)) + 5; + let currentSec = delaySec; + + updateUI(`❌ 状态: 缺货中 (500)
⏱️ 倒计时: ${currentSec} 秒后检测
📊 累计检测: ${checkCount} 次`, "#FF4500"); + document.title = `[等待 ${currentSec}s] 监控中...`; + + countdownTimer = setInterval(() => { + currentSec--; + if (currentSec <= 0) { + clearInterval(countdownTimer); + doCheck(); + } else { + updateUI(`❌ 状态: 缺货中 (500)
⏱️ 倒计时: ${currentSec} 秒后检测
📊 累计检测: ${checkCount} 次`, "#FF4500"); + document.title = `[等待 ${currentSec}s] 监控中...`; + } + }, 1000); + + } else { + // 已补货!状态不再是 500 + updateUI(`✅ 状态: ${status}
🎉 已补货,正在处理...
📊 累计检测: ${checkCount} 次`, "#00FF00"); + document.title = `[已补货!] 状态 ${status}`; + + GM_notification({ + title: "🌟 Metamogu 补货啦!", + text: `检测到状态变化,已为您渲染最新页面!`, + timeout: 10000, + highlight: true, + onclick: () => window.focus() + }); + + // 处理 302 重定向或 200 成功 + if (isRedirected || finalUrl !== window.location.href) { + console.log("检测到重定向,正在跳转至:", finalUrl); + window.location.replace(finalUrl); // 使用 replace 避免产生多余的历史记录 + } else { + console.log("状态 200,正在替换页面 DOM..."); + const htmlText = await response.text(); + document.open(); + document.write(htmlText); + document.close(); + } + } + } catch (error) { + // 请求出错处理 (例如断网或跨域异常) + console.error("Fetch 请求出错:", error); + updateUI(`⚠️ 网络请求异常
⏱️ 10秒后重试...
📊 累计检测: ${checkCount} 次`, "#FF6347"); + setTimeout(doCheck, 10000); + } + } + + // 启动检测 + doCheck(); })(); \ No newline at end of file