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
- return null;
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "koishi-plugin-maichuni-scorehelper",
3
- "version": "0.0.11-test",
3
+ "version": "0.0.13-test",
4
4
  "description": "一个基础的 Koishi 插件,未来用于舞萌中二节奏分数辅助。",
5
5
  "keywords": [
6
6
  "koishi",
@@ -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
- try {
354
- data = JSON.parse(data)
355
- } catch {
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