// ==UserScript== // @name AGJ 实时显示当前返回资源 // @namespace http://tampermonkey.net/ // @version 5.0 // @description 只在agj.php显示,实时展示接口本次返回的resources,不累加 // @author assistant // @match *://718zf.xyz/agj.php // @grant none // @run-at document-start // ==/UserScript== (function() { 'use strict'; // 资源名称映射 const RES_MAP = { 1: '🌲木材', 2: '⚙️钢铁', 3: '🌾粮食', 4: '💎宝石' }; // ==================== 全局配置 ==================== let captured = false; let requestTemplate = null; let intervalTimer = null; let currentResources = { 1: 0, 2: 0, 3: 0, 4: 0 }; // 只存当前值 // ==================== 超小面板 ==================== function createPanel() { const panel = document.createElement('div'); panel.style.cssText = ` position:fixed; top:10px; right:10px; width:170px; background:#fff; border-radius:6px; padding:6px; box-shadow:0 0 5px rgba(0,0,0,0.15); z-index:999999; font-size:12px; color:#222; `; // 标题 const title = document.createElement('div'); title.textContent = 'AGJ 当前资源'; title.style.cssText = 'font-weight:bold; text-align:center; margin-bottom:5px;'; panel.appendChild(title); // 每秒请求次数 const line = document.createElement('div'); line.style.cssText = 'display:flex; gap:4px; align-items:center; margin-bottom:6px;'; line.innerHTML = '每秒:'; const input = document.createElement('input'); input.type = 'number'; input.value = 2; input.style.cssText = 'width:40px; padding:2px; font-size:12px;'; const btn = document.createElement('button'); btn.textContent = '启动'; btn.style.cssText = 'padding:2px 4px; font-size:12px;'; line.append(input, btn); panel.appendChild(line); // 显示当前返回值 const show = document.createElement('div'); show.style.lineHeight = '1.4'; show.id = 'resDisplay'; panel.appendChild(show); document.body.appendChild(panel); // 启动:每秒 N 次请求 btn.onclick = () => { if (!requestTemplate) return alert('先触发一次游戏请求!'); clearInterval(intervalTimer); const perSecond = parseFloat(input.value) || 1; intervalTimer = setInterval(doRequest, 1000 / perSecond); btn.textContent = '运行中'; }; window.resDisplay = show; } // ==================== 渲染:只显示当前值 ==================== function render() { window.resDisplay.innerHTML = ` ${RES_MAP[1]}:${currentResources[1]}
${RES_MAP[2]}:${currentResources[2]}
${RES_MAP[3]}:${currentResources[3]}
${RES_MAP[4]}:${currentResources[4]} `; } // ==================== 发送请求 + 只保存当前值 ==================== function doRequest() { const xhr = new XMLHttpRequest(); xhr.open(requestTemplate.method, requestTemplate.url, true); Object.entries(requestTemplate.headers).forEach(([k, v]) => { xhr.setRequestHeader(k, v); }); xhr.onload = () => { try { const res = JSON.parse(xhr.responseText); // ✅ 只赋值当前返回的 resources,不累加! if (res.resources) { currentResources = res.resources; } } catch (e) {} render(); }; xhr.send(requestTemplate.body); } // ==================== 捕获第一次请求 ==================== const rawOpen = XMLHttpRequest.prototype.open; const rawSend = XMLHttpRequest.prototype.send; XMLHttpRequest.prototype.open = function(method, url) { this._m = method; this._u = url; this._h = {}; const rawSetHeader = this.setRequestHeader; this.setRequestHeader = function(k, v) { this._h[k] = v; rawSetHeader.call(this, k, v); }; rawOpen.apply(this, arguments); }; XMLHttpRequest.prototype.send = function(data) { if (!captured && this._u.includes('agj_api.php?action=generate')) { captured = true; requestTemplate = { method: this._m, url: this._u, headers: this._h, body: data }; } rawSend.call(this, data); }; // 只在 agj.php 显示 if (location.pathname === '/agj.php') { window.addEventListener('DOMContentLoaded', createPanel); } })();