koishi-plugin-maichuni-scorehelper 0.0.11-test → 0.0.13-test
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -118,6 +118,11 @@ class MaimaiStatus extends koishi_1.Service {
|
|
|
118
118
|
}
|
|
119
119
|
const list = heartbeatData.heartbeatList;
|
|
120
120
|
if (!list) {
|
|
121
|
+
// 兼容直接返回 heartbeatList 的情况(某些部署可能直接返回对象)
|
|
122
|
+
if (heartbeatData && typeof heartbeatData === 'object' && !Array.isArray(heartbeatData)) {
|
|
123
|
+
this.clientLogger.warn('Heartbeat data missing heartbeatList, using raw object keys fallback.');
|
|
124
|
+
return await this.analyzeAndNotify(heartbeatData);
|
|
125
|
+
}
|
|
121
126
|
this.clientLogger.warn('Heartbeat data format invalid: list missing', Object.keys(heartbeatData));
|
|
122
127
|
return;
|
|
123
128
|
}
|
|
@@ -294,8 +299,34 @@ class MaimaiStatus extends koishi_1.Service {
|
|
|
294
299
|
try {
|
|
295
300
|
data = JSON.parse(data);
|
|
296
301
|
}
|
|
297
|
-
catch {
|
|
298
|
-
|
|
302
|
+
catch (err) {
|
|
303
|
+
const snippet = data.slice(0, 200);
|
|
304
|
+
this.clientLogger.warn(`Heartbeat JSON parse failed: ${err.message}; snippet=${snippet}`);
|
|
305
|
+
// 如果返回的是 CC HTML,尝试使用 Puppeteer 绕过
|
|
306
|
+
if (this.ctx.puppeteer && snippet.includes('<!DOCTYPE')) {
|
|
307
|
+
try {
|
|
308
|
+
const page = await this.ctx.puppeteer.page();
|
|
309
|
+
const body = await page.evaluate(async (url, ua) => {
|
|
310
|
+
const res = await fetch(url, { headers: { 'User-Agent': ua } });
|
|
311
|
+
return await res.text();
|
|
312
|
+
}, this.API_URL, this.UA);
|
|
313
|
+
await page.close();
|
|
314
|
+
try {
|
|
315
|
+
data = JSON.parse(body);
|
|
316
|
+
}
|
|
317
|
+
catch (err2) {
|
|
318
|
+
this.clientLogger.warn(`Puppeteer heartbeat parse failed: ${err2.message}; body=${body.slice(0, 200)}`);
|
|
319
|
+
return null;
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
catch (pe) {
|
|
323
|
+
this.clientLogger.warn(`Puppeteer heartbeat fetch failed: ${pe.message}`);
|
|
324
|
+
return null;
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
else {
|
|
328
|
+
return null;
|
|
329
|
+
}
|
|
299
330
|
}
|
|
300
331
|
}
|
|
301
332
|
// 返回原始对象,包含 heartbeatList 和 uptimeList
|
package/package.json
CHANGED
|
@@ -164,6 +164,11 @@ export class MaimaiStatus extends Service {
|
|
|
164
164
|
|
|
165
165
|
const list = heartbeatData.heartbeatList
|
|
166
166
|
if (!list) {
|
|
167
|
+
// 兼容直接返回 heartbeatList 的情况(某些部署可能直接返回对象)
|
|
168
|
+
if (heartbeatData && typeof heartbeatData === 'object' && !Array.isArray(heartbeatData)) {
|
|
169
|
+
this.clientLogger.warn('Heartbeat data missing heartbeatList, using raw object keys fallback.')
|
|
170
|
+
return await this.analyzeAndNotify(heartbeatData)
|
|
171
|
+
}
|
|
167
172
|
this.clientLogger.warn('Heartbeat data format invalid: list missing', Object.keys(heartbeatData))
|
|
168
173
|
return
|
|
169
174
|
}
|
|
@@ -350,11 +355,34 @@ export class MaimaiStatus extends Service {
|
|
|
350
355
|
|
|
351
356
|
// 如果不是对象,尝试解析 JSON (因为 Object.keys 打印出了索引,说明是字符串)
|
|
352
357
|
if (typeof data === 'string') {
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
358
|
+
try {
|
|
359
|
+
data = JSON.parse(data)
|
|
360
|
+
} catch (err) {
|
|
361
|
+
const snippet = data.slice(0, 200)
|
|
362
|
+
this.clientLogger.warn(`Heartbeat JSON parse failed: ${(err as any).message}; snippet=${snippet}`)
|
|
363
|
+
// 如果返回的是 CC HTML,尝试使用 Puppeteer 绕过
|
|
364
|
+
if (this.ctx.puppeteer && snippet.includes('<!DOCTYPE')) {
|
|
365
|
+
try {
|
|
366
|
+
const page = await this.ctx.puppeteer.page()
|
|
367
|
+
const body = await page.evaluate(async (url: string, ua: string) => {
|
|
368
|
+
const res = await fetch(url, { headers: { 'User-Agent': ua } })
|
|
369
|
+
return await res.text()
|
|
370
|
+
}, this.API_URL, this.UA)
|
|
371
|
+
await page.close()
|
|
372
|
+
try {
|
|
373
|
+
data = JSON.parse(body)
|
|
374
|
+
} catch (err2) {
|
|
375
|
+
this.clientLogger.warn(`Puppeteer heartbeat parse failed: ${(err2 as any).message}; body=${body.slice(0,200)}`)
|
|
376
|
+
return null
|
|
377
|
+
}
|
|
378
|
+
} catch (pe) {
|
|
379
|
+
this.clientLogger.warn(`Puppeteer heartbeat fetch failed: ${(pe as any).message}`)
|
|
356
380
|
return null
|
|
381
|
+
}
|
|
382
|
+
} else {
|
|
383
|
+
return null
|
|
357
384
|
}
|
|
385
|
+
}
|
|
358
386
|
}
|
|
359
387
|
|
|
360
388
|
// 返回原始对象,包含 heartbeatList 和 uptimeList
|