koishi-plugin-maichuni-scorehelper 0.0.12-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.
@@ -302,7 +302,31 @@ 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
+ 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
+ }
306
330
  }
307
331
  }
308
332
  // 返回原始对象,包含 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.13-test",
4
4
  "description": "一个基础的 Koishi 插件,未来用于舞萌中二节奏分数辅助。",
5
5
  "keywords": [
6
6
  "koishi",
@@ -355,13 +355,34 @@ 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
+ 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}`)
363
380
  return null
381
+ }
382
+ } else {
383
+ return null
364
384
  }
385
+ }
365
386
  }
366
387
 
367
388
  // 返回原始对象,包含 heartbeatList 和 uptimeList