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
- return null;
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "koishi-plugin-maichuni-scorehelper",
3
- "version": "0.0.12-test",
3
+ "version": "0.0.14-test",
4
4
  "description": "一个基础的 Koishi 插件,未来用于舞萌中二节奏分数辅助。",
5
5
  "keywords": [
6
6
  "koishi",
@@ -355,13 +355,42 @@ export class MaimaiStatus extends Service {
355
355
 
356
356
  // 如果不是对象,尝试解析 JSON (因为 Object.keys 打印出了索引,说明是字符串)
357
357
  if (typeof data === 'string') {
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}`)
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