// ==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);
}
})();