koishi-plugin-maichuni-scorehelper 0.0.12-test → 0.0.14-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.
|
@@ -302,7 +302,43 @@ class MaimaiStatus extends koishi_1.Service {
|
|
|
302
302
|
catch (err) {
|
|
303
303
|
const snippet = data.slice(0, 200);
|
|
304
304
|
this.clientLogger.warn(`Heartbeat JSON parse failed: ${err.message}; snippet=${snippet}`);
|
|
305
|
-
|
|
305
|
+
// 如果返回的是 CC HTML,尝试使用 Puppeteer 绕过
|
|
306
|
+
if (this.ctx.puppeteer && snippet.includes('<!DOCTYPE')) {
|
|
307
|
+
let page = null;
|
|
308
|
+
try {
|
|
309
|
+
page = await this.ctx.puppeteer.page();
|
|
310
|
+
if (page.setUserAgent) {
|
|
311
|
+
await page.setUserAgent(this.UA);
|
|
312
|
+
}
|
|
313
|
+
await page.goto(this.API_URL, { waitUntil: 'networkidle0', timeout: 15000 });
|
|
314
|
+
const body = await page.evaluate(() => {
|
|
315
|
+
const text = document.body?.innerText || document.body?.textContent || '';
|
|
316
|
+
return text;
|
|
317
|
+
});
|
|
318
|
+
try {
|
|
319
|
+
data = JSON.parse(body);
|
|
320
|
+
}
|
|
321
|
+
catch (err2) {
|
|
322
|
+
this.clientLogger.warn(`Puppeteer heartbeat parse failed: ${err2.message}; body=${body.slice(0, 200)}`);
|
|
323
|
+
return null;
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
catch (pe) {
|
|
327
|
+
this.clientLogger.warn(`Puppeteer heartbeat fetch failed: ${pe.message}`);
|
|
328
|
+
return null;
|
|
329
|
+
}
|
|
330
|
+
finally {
|
|
331
|
+
if (page) {
|
|
332
|
+
try {
|
|
333
|
+
await page.close();
|
|
334
|
+
}
|
|
335
|
+
catch { /* ignore */ }
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
else {
|
|
340
|
+
return null;
|
|
341
|
+
}
|
|
306
342
|
}
|
|
307
343
|
}
|
|
308
344
|
// 返回原始对象,包含 heartbeatList 和 uptimeList
|
package/package.json
CHANGED
|
@@ -355,13 +355,42 @@ export class MaimaiStatus extends Service {
|
|
|
355
355
|
|
|
356
356
|
// 如果不是对象,尝试解析 JSON (因为 Object.keys 打印出了索引,说明是字符串)
|
|
357
357
|
if (typeof data === 'string') {
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
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
|
+
let page: any = null
|
|
366
|
+
try {
|
|
367
|
+
page = await this.ctx.puppeteer.page()
|
|
368
|
+
if (page.setUserAgent) {
|
|
369
|
+
await page.setUserAgent(this.UA)
|
|
370
|
+
}
|
|
371
|
+
await page.goto(this.API_URL, { waitUntil: 'networkidle0', timeout: 15000 })
|
|
372
|
+
const body = await page.evaluate(() => {
|
|
373
|
+
const text = document.body?.innerText || document.body?.textContent || ''
|
|
374
|
+
return text
|
|
375
|
+
})
|
|
376
|
+
try {
|
|
377
|
+
data = JSON.parse(body)
|
|
378
|
+
} catch (err2) {
|
|
379
|
+
this.clientLogger.warn(`Puppeteer heartbeat parse failed: ${(err2 as any).message}; body=${body.slice(0,200)}`)
|
|
380
|
+
return null
|
|
381
|
+
}
|
|
382
|
+
} catch (pe) {
|
|
383
|
+
this.clientLogger.warn(`Puppeteer heartbeat fetch failed: ${(pe as any).message}`)
|
|
384
|
+
return null
|
|
385
|
+
} finally {
|
|
386
|
+
if (page) {
|
|
387
|
+
try { await page.close() } catch { /* ignore */ }
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
} else {
|
|
363
391
|
return null
|
|
364
|
-
|
|
392
|
+
}
|
|
393
|
+
}
|
|
365
394
|
}
|
|
366
395
|
|
|
367
396
|
// 返回原始对象,包含 heartbeatList 和 uptimeList
|