上一主题 下一主题
ScriptCat,新一代的脚本管理器脚本站,与全世界分享你的用户脚本油猴脚本开发指南教程目录
返回列表 发新帖
楼主: 哥哥科技 - 

已解决

[复制链接]

该用户从未签到

1

主题

5

回帖

6

积分

助理工程师

积分
6
发表于 昨天 21:23 | 显示全部楼层 | 阅读模式

本帖最后由 哥哥科技 于 2026-6-2 21:59 编辑

申诉链接:6194

image.png

如图所示,昨天的脚本更新以后是完全通过了审核的,然后今天早晨有人在 GitHub 上面提 issue 说针对他家的路由器用不了

然后我就新增了一些处理对象的方法

整个脚本非常安全,没有任何向公网传输参数的地方

并且非常的克制,对性能做了大量的优化,属于一个技术上毫无问题的脚本

请问一下是为什么被删了呢?

如果是误删,能不能帮忙恢复一下?

您可以看到我在别的平台都是强烈推荐脚本猫,在别人都在发 Greazy Fork 的时候,只有我全部发的都是脚本猫的下载链接

image.png

国内用户默认就是本站

image.png

代码内容如下:

`JavaScript
// ==UserScript==
// @name 中兴路由器增强 ZTE-Stat_Max
// @name:en ZTE-Stat_Max
// @namespace ucxn
// @version 5.9.9Ge
// @description 哥哥科技 QQ群 680464365
// @description:en https://github.com/ucxn/ZTE-Stat_Max
// @author 哥哥科技 space.bilibili.com/501430041
// @noframes
// @tag 路由器 中兴 网络 监控 统计 数据 可视化 极客 增强 UI HA 智能 定时 后台
// @icon https://scriptcat.org/api/v2/resource/image/PD6xhxddlUESIwAV
// @include /^https?:\/\/10(.[0-9]{1,3}){3}(:\d+)?\/.$/
// @include http://192.168.
.
// @match http://zte.home

// @include http://172.16.
// @include https://192.168.
.
// @match https://zte.home

// @include https://172.16.*
// @grant unsafeWindow
// @grant GM_setValue
// @storageName GBNPA_Storage
// @license AGPL-3.0-or-later
// ==/UserScript==

(function () {
'use strict';

console.log("🚀 哥哥科技 V5.9.9 终极引擎已装载...");

function escapeHTML(str) {
if (!str) return '';
return String(str).replace(/[&<>'"]/g, function (match) {
return {
'&': '&',
'<': '<',
'>': '>',
"'": ''',
'"': '"'
} [match];
});
}

// ======== [0] 用户极客环境变量配置区 ========
const CONFIG = {
routerIP: "192.168.5.1", // 路由器内网 IP
forceMeshMode: 1, // 【Mesh探测模式】0: 官方拓扑驱动 | 1: n秒智能等待(默认) | 2: 强制大包抓取(专治阉割、不出数据)
uiLayout: 1, // 【面板拓扑结构】 0: 经典版 | 1: 详细紧凑版(驾驶舱美学) | 2: 详细平铺版(报表流美学)
injectMode: 1, // 【UI注入模式】 0: 原生侧边栏(1min)| 1: 优先,10秒悬浮舱(D)| 2: 强制模式(30秒后强制霸屏)
calcMode: 1, // 1: 上行/下行倍数模式, 0: 上行占总和比例模式
ratioExtremeUp: 10, // 极端上传判定阈值 (> 1000%)
ratioWarnUp: 0.07, // 重度上传警告阈值 (> 7%)
ratioExtremeDown: 0.01, // 极端下载判定阈值 (< 1%)
ratioThreshold: 7, // (仅calcMode=0时有效) 上传占比报警阈值(%)
readSaveData: 1, // 【开关切换】 1: 读档模式(继承本次历史量) | 0: 新局模式(从打开网页此刻归零重新计流)
lanRefreshInterval: 5, // 【新增】LAN口刷新时间(秒),用于精准补偿0到唤醒时的瞬时流量
portMap: {
"eth1": "网口 1",
"eth2": "网口 2",
"eth3": "网口 3",
"eth4": "网口 4",
"wl0": "2.4G",
"wl1": "5.2G",
"wl2": "5.8G"
}
};

const S = {
lt: 0,
wInstUp: 0,
wInstDn: 0,
wTotUp: 0,
wTotDn: 0,
cls: {}
};
let isF = !1,
pr = new DOMParser(),
lCxt = null;
const oOp = unsafeWindow.XMLHttpRequest.prototype.open;
unsafeWindow.XMLHttpRequest.prototype.open = function () {
this.
addEventListener('load', function () {
try {
if (this.responseType === '' ||
this.responseType === 'text') {
let t = this.responseText;
if (t && (t.includes('') || t.includes(''))) {
if (t.includes('')) lCxt = t;
if (window.startGegePrecisionEngine) {
window.startGegePrecisionEngine();
}
}
}
}
catch (e) {
console.warn("[哥哥科技] XHR 拦截器异常:", e.message);
}
});
oOp.apply(this, arguments);
};

function s2b(s) {
let m = s?.match(/([\d.]+)\s(G|M|K)?bps/i);
if (!m) return 0;
let v = parseFloat(m[1]),
u = (m[2] || "").toUpperCase();
return u === 'G' ? v
1e9 : u === 'M' ? v 1e6 : u === 'K' ? v 1e3 : v;
}

function fB(b) {
return b >= 1e9 ? ${(b/1e9).toFixed(3)} Gbps : b >= 1e6 ? ${(b/1e6).toFixed(2)} Mbps : b >= 1e3 ? ${(b/1e3).toFixed(1)} Kbps : ${Math.round(b)} bps;
}

function fBy(b) {
return b >= 8589934592 ? ${(b/8589934592).toFixed(3)} GiB/s : b >= 8388608 ? ${(b/8388608).toFixed(2)} MiB/s : b >= 8192 ? ${(b/8192).toFixed(1)} KiB/s : ${Math.round(b/8)} B/s;
}

function fV(b) {
return b >= 8796093022208 ? ${(b/8796093022208).toFixed(4)} TiB : b >= 8589934592 ? ${(b/8589934592).toFixed(3)} GiB : b >= 8388608 ? ${(b/8388608).toFixed(2)} MiB : b >= 8192 ? ${(b/8192).toFixed(1)} KiB : ${Math.round(b/8)} B;
}

function fVD(i, o) {
return i >= 8796093022208 ? ${(o/8796093022208).toFixed(4)} | ${(i/8796093022208).toFixed(4)} TiB : i >= 8589934592 ? ${(o/8589934592).toFixed(4)} | ${(i/8589934592).toFixed(3)} GiB : i >= 8388608 ? ${(o/8388608).toFixed(3)} | ${(i/8388608).toFixed(2)} MiB : i >= 8192 ? ${(o/8192).toFixed(1)} | ${(i/8192).toFixed(2)} KiB : ${Math.round(o/8)} | ${Math.round(i/8)} B;
}

function fSV(b) {
return (b /= 8) >= 1073741824 ? (b / 1073741824).toFixed(3) + 'G' : b >= 1048576 ? (b / 1048576).toFixed(2) + 'M' : b >= 1024 ? (b / 1024).toFixed(1) + 'K' : Math.round(b) + 'B';
}

function fOT(s) {
if (s <= 0) return "";
let d = Math.floor(s / 86400),
h = Math.floor((s % 86400) / 3600),
m = Math.floor((s % 3600) / 60),
sec = Math.floor(s % 60);
return d > 0 ? ${d}天${h}时${m}分${sec}秒 : ${h}小时${m}分${sec}秒;
}

function nM(m) {
return m ? m.toLowerCase().replace(/-/g, ':').replace(/\s/g, '') : '';
}

function pI(n) {
let o = Object.create(null),
c = n.children;
for (let i = 0; i < c.length; i++) {
if (c[i].tagName === "ParaName") {
let k = c[i].textContent,
v = "",
j = i + 1;
while (j < c.length && c[j].tagName !== "ParaName") {
if (c[j].tagName === "ParaValue") {
v = c[j].textContent;
i = j;
break;
}
j++;
}
o[k] = v;
}
}
return o;
}
const st = document.createElement('style');
st.innerHTML = .config-item{ clear:both;}.config-item-box{display:flex!important; align-items:stretch!important;padding-bottom: 12px!important;}.config-item .logo{width:33%!important; float:none!important;display:flex!important;flex-direction:row;}.config-item .dev-intro{flex:1;display:flex!important;flex-direction:column;justify-content:flex-start;min-height:100px;padding-bottom:0!important;margin-bottom:0!important;}.config-item .info{width:27%!important;float:none!important;display:flex!important;flex-direction:column;justify-content:flex-start;padding:0 10px!important;border-right:1px solid #eee;}.config-item .speed{width:40%!important;float:none!important;display:flex!important;flex-direction:column;justify-content:center;padding:0 10px!important;}.geek-row{display:flex;justify-content:space-between;align-items:center;white-space:nowrap;height:20px;} .geek-label{width:110px;color:#333;font-weight:bold;}.geek-val-box{flex:1;display:flex;gap:15px;margin-left:10px;}.geek-fixed-width{display:inline-block;width:120px;}.geek-right-box{text-align:right;min-width:220px;font-weight:bold;}.c-up{color:#ff4c00;}.c-down{color:#0059fa;}.gege-up-box,.gege-down-box{margin-top:auto!important;margin-bottom:0!important;width:95%;}.gege-ratio-box{margin-top:10px;width:95%;margin-bottom:5px;}.t-row{font-size:12px;font-weight:bold;margin-bottom:2px;display:flex;justify-content:space-between;font-family:Consolas;}.zte-thin-bar{width:100%;height:3px;background:rgba(0,0,0,0.05);border-radius:1.5px;overflow:hidden;}.zte-thin-bar-inner{height:100%;transition:width 0.5s ease-out;}.zte-thin-bar-inner.up{background:#ff4c00;}.zte-thin-bar-inner.down{background:#0059fa;}.gege-ratio-top{display:flex;justify-content:space-between;font-size:12px;font-weight:bold;margin-bottom:2px;}.gege-ratio-bar{width:100%;height:4px;background:#0059fa;border-radius:2px;overflow:hidden;}.gege-ratio-bar-inner{height:100%;background:#ff4c00;transition:width 0.5s ease-out;}.zte-enhance-speed{display:flex;flex-direction:column;gap:6px;width:100%;font-family:Consolas;} .zte-bar-wrap{position:relative;width:100%;border-radius:4px;border:1px solid;font-size:13px;font-weight:bold;overflow:hidden;padding:3px 8px;display:flex;justify-content:space-between;align-items:center;z-index:1;box-sizing:border-box;}.zte-bar-wrap span{font-size:inherit;font-weight:inherit;}.zte-bar-up{color:#ff4c00;border-color:rgba(255,76,0,0.3);}.zte-bar-down{color:#0059fa;border-color:rgba(0,89,250,0.3);}.zte-bar-up::before{content:'';position:absolute;left:0;top:0;bottom:0;z-index:-1;background:rgba(255,76,0,0.12);width:var(--p-up,0%);transition:width 0.5s;}.zte-bar-down::before{content:'';position:absolute;left:0;top:0;bottom:0;z-index:-1;background:rgba(0,89,250,0.12);width:var(--p-down,0%);transition:width 0.5s;}#config-list.gege-list-container{contain:content!important;background-color:#ffffff!important;border-radius:8px!important;border:1px solid #e0e0e0!important;padding:20px 30px!important;box-shadow:0 2px 10px rgba(0,0,0,0.02)!important;margin-top:10px!important;}.gege-section{margin-bottom:10px;} .gege-section:last-child{margin-bottom:0;}.gege-list-container .config-title{font-size:16px!important;font-weight:bold!important;color:#333!important;margin:15px 0 10px 0!important;padding-bottom:5px!important;}.gege-list-container .gege-section:first-child .config-title{margin-top:0!important;}.gege-empty-state{color:#999!important;font-size:14px!important;padding:0 0 15px 5px!important;border-bottom:1px solid #f0f0f0!important;margin-bottom:5px!important;}.gege-list-item{background-color:transparent!important;border-bottom:1px solid #f0f0f0!important;padding:15px 10px!important;margin-bottom:0!important;border-radius:0!important;}.gege-list-item:last-child{border-bottom:none!important;}#zte-geek-board{contain:content;background-color:transparent!important;border-left:4px solid #0059fa!important;border-radius:0!important;padding:5px 0 5px 15px!important;margin:10px 0 15px 0!important;box-shadow:none!important;border-bottom:1px solid #f0f0f0!important;font-size:14px;display:flex;flex-direction:column;gap:6px;padding-bottom:15px!important;};
document.
head.
appendChild(st);
window.gegeRenderedMacs = new Set();
async function rSD(pWT = null, sT = null) {
if (
isF && !pWT) return;
isF = !0;
let n, wX;
try {
if (pWT) {
wX = pr.parseFromString(pWT,
"text/xml");
n = sT || performance.now();
}
else {
const wR = await fetch(/?_type=vueData&_tag=vue_home_device_data_no_update_sess&IF_OP=refresh&_=${Date.now()});
if (
!wR.ok) return;
const wT = await wR.text();
n = performance.now();
if (!wT.includes('')) return;
wX = pr.parseFromString(
wT, "text/xml");
}
let cX = lCxt ? pr.parseFromString(lCxt, "text/xml") : null;
const bIN = wX.querySelector(
"OBJ_HOME_BASICINFO_ID Instance"),
wI = bIN ? pI(bIN) : {},
cWU = s2b(wI.WANUpRate),
cWD = s2b(
wI.WANDownRate),
cI = Object.create(null);
let cSU = 0,
cSD = 0;
(cX?.querySelectorAll("OBJ_CLIENTS_ID Instance") || []).forEach(nd => {
let d = pI(
nd);
if (d.MACAddress) {
let m = nM(d.MACAddress),
u = s2b(d.UpRate),
dn = s2b(d.DownRate),
uT = (
parseFloat(d.UpThroughput) || 0) 8000,
dT = (parseFloat(d.DownThroughput) || 0)
8000;
let bN =
d.AliasName || d.HostName || d.DisplayedPictureName || "";
cI[m] = {
upRate: u,
dnRate: dn,
iface: d.Interface || "",
offUp: uT,
offDn: dT,
onSec: parseInt(d.OnlineDuration || d.OnlineTime || d.LeaseTime || 0),
name: bN,
ip: d.IPAddress || ""
};
cSU += u;
cSD += dn;
}
});
let ol = document.getElementById('gege-global-overlay'),
cM = Object.keys(
cI),
iD = window.gegeForceUIRedraw || (cM.length !== window.gegeRenderedMacs.size);
if (!iD && cM.length > 0) {
for (let i = 0; i <
cM.length; i++) {
if (!window.gegeRenderedMacs.has(cM[i])) {
iD = !0;
break;
}
}
}
let iDW = ol && ol.style.display === 'block' && !ol.querySelector(
'.gege-list-item');
if (ol && ol.style.display === 'block' && (iD || iDW)) {
bVD(ol, cX);
window.gegeRenderedMacs = new Set(
cM);
window.gegeForceUIRedraw = !1;
}
let gDt = (S.lt !== 0) ? (n - S.lt) / 1000 : 0;
if (S.wLT === undefined) {
S.wLT = n;
}
else if (cWU !== S.wInstUp || cWD !== S.wInstDn) {
let wDt = n - S.wLT;
if (S.wInstUp > 0) S.wTotUp += (S.wInstUp + cWU) wDt / 2000;
if (S.wInstDn > 0) S.wTotDn += (S.wInstDn + cWD)
wDt / 2000;
S.wLT = n;
}
for (const [m, cC] of Object.entries(cI)) {
S.cls[m] ??= {
upR: cC.upRate,
dnR: cC.dnRate,
lUT: n,
intUp: 0,
intDn: 0,
uB: CONFIG.readSaveData === 1 ? 0 : cC.offUp,
dB: CONFIG.readSaveData === 1 ? 0 : cC.offDn,
lU: cC.offUp,
lD: cC.offDn,
aR: !1,
dpU: 0,
dpD: 0,
oU: CONFIG.readSaveData === 1 ? cC.offUp : 0,
oD: CONFIG.readSaveData === 1 ? cC.offDn : 0
};
let cS = S.cls[m],
dU = cC.offUp - cS.lU,
dD = cC.offDn - cS.lD;
if (dU < 0 || dD < 0) {
if (dU < 0) {
cS.uB += dU;
cS.dpU = cS.lU;
}
if (dD < 0) {
cS.dB += dD;
cS.dpD = cS.lD;
}
cS.aR = !0;
}
else if (cS.aR) {
if (dD > 2516582400 || dU > 671088640 || (cS.dpD && dD >= cS.dpD) || (cS.dpU && dU >= cS.dpU)) {
cS.uB += dU;
cS.dB += dD;
cS.aR = !1;
cS.dpU = 0;
cS.dpD = 0;
}
}
if (cS.lOS !== cC.onSec) {
cS.onS = cC.onSec;
cS.lOS = cC.onSec;
}
else {
cS.onS = (cS.onS || cC.onSec || 0) + gDt;
}
if (cC.upRate !== cS.upR || cC.dnRate !== cS.dnR) {
let ms = n - cS.lUT;
if (cS.upR > 0) cS.intUp += (cS.upR + cC.upRate) ms / 2000;
else if (cC.upRate > 0) cS.intUp += (cC.upRate / 2)
CONFIG.lanRefreshInterval;
if (cS.dnR > 0) cS.intDn += (cS.dnR + cC.dnRate) ms / 2000;
else if (cC.dnRate > 0) cS.intDn += (cC.dnRate / 2)
CONFIG.lanRefreshInterval;
cS.upR = cC.upRate;
cS.dnR = cC.dnRate;
cS.lUT = n;
}
cS.lU = cC.offUp;
cS.lD = cC.offDn;
}
S.lt = n;
S.wInstUp = cWU;
S.wInstDn = cWD;
rUI(cWU, cWD, cSU, cSD, cI);
}
catch (e) {
console.error("[哥哥科技] 周期采样中断:", e);
}
finally {
isF = !1;
}
}

function rUI(wU, wD, sU, sD, cI) {
let tOD = 0,
LUp = 0,
LDn = 0,
hpU = 0,
hpD = 0,
abU = 0,
abD = 0,
curHpU = 0,
curHpD = 0,
cln = {};
for (const [k, s] of Object.entries(S.cls)) {
let cC = cI[k],
cU = Math.max(0, (s.lU || 0) - (s.uB || 0) - (s.oU || 0)),
cD = Math.max(0, (s.lD || 0) - (s.dB || 0) - (s.oD || 0));
LUp += s.intUp || 0;
LDn += s.intDn || 0;
hpU += cU;
hpD += cD;
if (cC) {
curHpU += cU;
curHpD += cD;
tOD += cC.offDn || 0;
abU += cC.offUp || 0;
abD += cC.offDn || 0;
}
cln[k] = {
up: cU,
down: cD,
integral_up: s.intUp || 0,
integral_down: s.intDn || 0,
status: s.aR ? "off" : (CONFIG.portMap[cC?.iface] || cC?.iface || "未知接口"),
name: cC?.name || k,
ip: cC?.ip || "",
raw_up: cC?.offUp || 0,
raw_down: cC?.offDn || 0
};
}
GM_setValue('ha_snapshot', {
timestamp: Date.now(),
global: {
wan_up: S.wTotUp,
wan_down: S.wTotDn,
lan_integral_up: LUp,
lan_integral_down: LDn,
lan_high_up: hpU,
lan_high_down: hpD,
lan_off_up: abU,
lan_off_down: abD
},
devices: cln
});
S.rTick = ((S.rTick || 0) + 1) & 31;
if (S.rTick === 1 || !S.cRT) {
const cSR = (W, I, H) => {
if (W === 0) return 1.0;
let M = Math.max(I, H),
m = Math.min(I, H),
G = Math.abs(I - H);
if (I >= 0.84 W && H >= 0.75 W && (M <= 1.5 W || G <= 0.6 W)) return ((I + H) / 2) / W;
if (m < W && W <= M && M <= 1.5 W) return M / W;
return (Math.abs(I - W) < Math.abs(H - W) ? I : H) / W;
};
let rU = cSR(S.wTotUp, LUp, hpU),
rD = cSR(S.wTotDn, LDn, hpD),
mR = Math.max(rU, rD),
rC = mR > 1.5 ? '#ff4c00' : mR > 1.15 ? '#FF9800' : '#4CAF50';
S.cRT = `${(rU
100).toFixed(2)}%,${(rD*100).toFixed(2)}%; } let bd = document.getElementById('zte-geek-board'); if (!bd) { bd = document.createElement('div'); bd.id = 'zte-geek-board'; let lH = ''; if (CONFIG.uiLayout === 1) { lH =

WAN口速率
|
局域网代数和

实时占比: |
LAN:

该用户从未签到

1

主题

5

回帖

6

积分

助理工程师

积分
6
发表于 昨天 21:24 | 显示全部楼层
本帖最后由 哥哥科技 于 2026-6-2 21:59 编辑

..........
回复

使用道具 举报

  • TA的每日心情
    开心
    2026-4-6 21:19
  • 签到天数: 226 天

    [LV.7]常住居民III

    318

    主题

    5260

    回帖

    4849

    积分

    管理员

    积分
    4849

    管理员荣誉开发者油中2周年生态建设者喜迎中秋油中3周年挑战者 lv2

    发表于 昨天 21:39 | 显示全部楼层
    已经通过了,非常抱歉,最近在改版脚本猫,发现有一些高危脚本,于是用AI全站审核,有一些误杀

    不过哥哥这个是另外的原因,进入审核流程了,还在继续优化
    上不慕古,下不肖俗。为疏为懒,不敢为狂。为拙为愚,不敢为恶。
    回复

    使用道具 举报

    该用户从未签到

    1

    主题

    5

    回帖

    6

    积分

    助理工程师

    积分
    6
    发表于 昨天 21:43 | 显示全部楼层
    本帖最后由 哥哥科技 于 2026-6-2 21:45 编辑
    王一之 发表于 2026-6-2 21:39
    已经通过了,非常抱歉,最近在改版脚本猫,发现有一些高危脚本,于是用AI全站审核,有一些误杀

    不过哥哥这 ...

    谢谢一之哥

    另外,能求助您一个问题吗?

    架构说明:https://github.com/ucxn/ZTE-Stat_HA

    这个是我的项目,就是我的项目是首先通过一个主脚本读取中兴路由器的数据,然后利用你们脚本猫特有的定时脚本功能,把它推送给 HA

    脚本猫的定时脚本有没有一种类似于只有 A 脚本在运行,才运行 B 的这种条件判断?

    因为脚本猫的定时器非常精准,比自己写会优雅的多。

    但是只有前端这个大脚本运行的时候,那个十几行的定时 Webhook 推送给 HA 的小脚本运行才是有意义的。否则不仅运行起来没有意义,还会使得浏览器自启动之类。

    请问脚本猫有,只有 A 脚本运行,定时脚本 B 才会执行这种判断,可以设置吗?
    回复

    使用道具 举报

    该用户从未签到

    1

    主题

    5

    回帖

    6

    积分

    助理工程师

    积分
    6
    发表于 昨天 21:47 | 显示全部楼层
    王一之 发表于 2026-6-2 21:39
    已经通过了,非常抱歉,最近在改版脚本猫,发现有一些高危脚本,于是用AI全站审核,有一些误杀

    不过哥哥这 ...

    推送脚本如下:

    1. return new Promise((resolve, reject) => {
    2.     // 1. 从共享黑板读取前台留下的快照
    3.     let snapshot = GM_getValue('ha_snapshot');
    4.    
    5.     if (!snapshot) {
    6.         console.warn("[态势感知] 黑板为空,前台 UI 可能未启动");
    7.         resolve(); return;
    8.     }

    9.     // 防御机制:如果时间戳超过15分钟没更新,说明前台网页挂了或电脑休眠了
    10.     if (Date.now() - snapshot.timestamp > 900000) {
    11.         console.warn("[态势感知] 数据已过期,放弃本次上报");
    12.         resolve(); return;
    13.     }

    14.     if (snapshot.timestamp) snapshot.timestamp = Math.floor(snapshot.timestamp / 1000);

    15.     // 2. 将快照推向 HA Webhook
    16.     const webhookUrl = "http://58.48.100.0:8123/api/webhook/gbnpa_router_webhook";

    17.     GM_xmlhttpRequest({
    18.         method: "POST",
    19.         url: webhookUrl,
    20.         headers: { "Content-Type": "application/json; charset=utf-8" },
    21.         data: JSON.stringify(snapshot),
    22.         onload: function(response) {
    23.             if (response.status >= 200 && response.status < 300) {
    24.                 console.log("[态势感知] ⚡ 10分钟快照已成功空投至 HA");
    25.                 resolve("上报成功");
    26.             } else {
    27.                 console.error("[态势感知] HA 拒绝了请求", response.status);
    28.                 reject(new CATRetryError("HA 服务端异常", 10)); // 10秒后系统底层自动重试!
    29.             }
    30.         },
    31.         onerror: function(err) {
    32.             console.error("[态势感知] 网络断联,无法访问 HA", err);
    33.             reject(new CATRetryError("内网瘫痪", 10));
    34.         }
    35.     });
    36. });
    复制代码
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2026-4-6 21:19
  • 签到天数: 226 天

    [LV.7]常住居民III

    318

    主题

    5260

    回帖

    4849

    积分

    管理员

    积分
    4849

    管理员荣誉开发者油中2周年生态建设者喜迎中秋油中3周年挑战者 lv2

    发表于 昨天 21:48 | 显示全部楼层
    哥哥科技 发表于 2026-6-2 21:43
    谢谢一之哥,主要是电邮说被删了,原来只是等待审核,谢谢!

    另外,能求助您一个问题吗?

    哥哥可以使用 @storegeName

    定时脚本跑的时候,检查一下GM_value中有没有数据,有就才进行推送

    没有A脚本运行,B脚本才执行这种逻辑,需要自己实现
    上不慕古,下不肖俗。为疏为懒,不敢为狂。为拙为愚,不敢为恶。
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2026-4-6 21:19
  • 签到天数: 226 天

    [LV.7]常住居民III

    318

    主题

    5260

    回帖

    4849

    积分

    管理员

    积分
    4849

    管理员荣誉开发者油中2周年生态建设者喜迎中秋油中3周年挑战者 lv2

    发表于 昨天 21:49 | 显示全部楼层

    我也是想着这个思路
    上不慕古,下不肖俗。为疏为懒,不敢为狂。为拙为愚,不敢为恶。
    回复

    使用道具 举报

    该用户从未签到

    1

    主题

    5

    回帖

    6

    积分

    助理工程师

    积分
    6
    发表于 昨天 21:55 | 显示全部楼层
    王一之 发表于 2026-6-2 21:49
    我也是想着这个思路

    好的,thans you!
    回复

    使用道具 举报

    发表回复

    本版积分规则