From d9f47daf290b8735d96f92551d8b878a76dc91a6 Mon Sep 17 00:00:00 2001 From: duorameng <2997944583@qq.com> Date: Wed, 27 May 2026 17:46:03 +0800 Subject: [PATCH] fix(sdk): handle api error response code correctly and improve missing token hints - Fixed an issue where the request function silently resolved on HTTP 200 even when the JSON body contained an API error (e.g. code 401). Now explicitly throws when code != 200. - Improved error messages when OpenAPI or Notify tokens are completely missing, explicitly instructing the user to configure them in the panel. --- builtin/nodejs/env.js | 9 +++++++-- builtin/nodejs/notify.js | 2 +- builtin/nodejs/task.js | 9 +++++++-- builtin/python/baihu/env.py | 8 ++++++-- builtin/python/baihu/task.py | 8 ++++++-- 5 files changed, 27 insertions(+), 9 deletions(-) diff --git a/builtin/nodejs/env.js b/builtin/nodejs/env.js index a1f4b53..4fbaa12 100644 --- a/builtin/nodejs/env.js +++ b/builtin/nodejs/env.js @@ -8,7 +8,7 @@ const { URL } = require('url'); function request(urlStr, method = 'GET', data = null) { const token = process.env.BHPKG_OPENAPI_TOKEN || process.env.OPENAPI_TOKEN || process.env.BHPKG_NOTIFY_TOKEN; if (!token) { - throw new Error("缺少 BHPKG_OPENAPI_TOKEN 或 BHPKG_NOTIFY_TOKEN 环境变量,无法使用环境管理操作"); + throw new Error("没有正确配置或缺少 BHPKG_OPENAPI_TOKEN 等环境变量,无法使用环境管理操作"); } const parsedUrl = new URL(urlStr); @@ -41,7 +41,12 @@ function request(urlStr, method = 'GET', data = null) { res.on('end', () => { if (res.statusCode >= 200 && res.statusCode < 300) { try { - resolve(body ? JSON.parse(body) : {}); + const parsed = body ? JSON.parse(body) : {}; + if (parsed && typeof parsed === 'object' && parsed.code !== undefined && parsed.code !== 200) { + reject(new Error(`请求失败 [${parsed.code}]: ${parsed.msg || parsed.message || '未知错误'}`)); + } else { + resolve(parsed); + } } catch (e) { resolve(body); } diff --git a/builtin/nodejs/notify.js b/builtin/nodejs/notify.js index 44da672..5e4052b 100644 --- a/builtin/nodejs/notify.js +++ b/builtin/nodejs/notify.js @@ -13,7 +13,7 @@ function notify(title, text, channelId) { const missing = []; if (!token) missing.push("BHPKG_NOTIFY_TOKEN"); if (!channel) missing.push("BHPKG_NOTIFY_CHANNEL"); - throw new Error(`缺少必要的环境变量以使用 notify 函数: ${missing.join(", ")}。请在白虎面板的任务设置中配置这些 Key。`); + throw new Error(`没有正确配置或缺少 ${missing.join(" 和 ")} 环境变量以使用 notify 函数。请在白虎面板的任务设置中配置这些 Key。`); } const notifyUrl = process.env.BHPKG_NOTIFY_URL || 'http://localhost:8052/api/v1/notify/send'; diff --git a/builtin/nodejs/task.js b/builtin/nodejs/task.js index 93cefe5..da2d916 100644 --- a/builtin/nodejs/task.js +++ b/builtin/nodejs/task.js @@ -8,7 +8,7 @@ const { URL } = require('url'); function request(urlStr, method = 'GET', data = null) { const token = process.env.BHPKG_OPENAPI_TOKEN || process.env.OPENAPI_TOKEN || process.env.BHPKG_NOTIFY_TOKEN; if (!token) { - throw new Error("缺少 BHPKG_OPENAPI_TOKEN 或 BHPKG_NOTIFY_TOKEN 环境变量,无法使用任务管理操作"); + throw new Error("没有正确配置或缺少 BHPKG_OPENAPI_TOKEN 等环境变量,无法使用任务管理操作"); } const parsedUrl = new URL(urlStr); @@ -41,7 +41,12 @@ function request(urlStr, method = 'GET', data = null) { res.on('end', () => { if (res.statusCode >= 200 && res.statusCode < 300) { try { - resolve(body ? JSON.parse(body) : {}); + const parsed = body ? JSON.parse(body) : {}; + if (parsed && typeof parsed === 'object' && parsed.code !== undefined && parsed.code !== 200) { + reject(new Error(`请求失败 [${parsed.code}]: ${parsed.msg || parsed.message || '未知错误'}`)); + } else { + resolve(parsed); + } } catch (e) { resolve(body); } diff --git a/builtin/python/baihu/env.py b/builtin/python/baihu/env.py index 4fc1de9..0772739 100644 --- a/builtin/python/baihu/env.py +++ b/builtin/python/baihu/env.py @@ -6,7 +6,7 @@ import urllib.error def _get_headers(): token = os.environ.get("BHPKG_OPENAPI_TOKEN") or os.environ.get("OPENAPI_TOKEN") or os.environ.get("BHPKG_NOTIFY_TOKEN") if not token: - raise RuntimeError("缺少 BHPKG_OPENAPI_TOKEN 或 BHPKG_NOTIFY_TOKEN 环境变量,无法使用环境管理操作") + raise RuntimeError("没有正确配置或缺少 BHPKG_OPENAPI_TOKEN 等环境变量,无法使用环境管理操作") return { "Content-Type": "application/json", "Authorization": f"Bearer {token}" @@ -36,7 +36,11 @@ def _request(url, method="GET", data=None): body = resp.read().decode("utf-8") if not body: return {} - return json.loads(body) + parsed = json.loads(body) + if isinstance(parsed, dict) and parsed.get("code") is not None and parsed.get("code") != 200: + msg = parsed.get("msg") or parsed.get("message") or "未知错误" + raise RuntimeError(f"请求失败 [{parsed.get('code')}]: {msg}") + return parsed except urllib.error.HTTPError as e: err_body = e.read().decode("utf-8") try: diff --git a/builtin/python/baihu/task.py b/builtin/python/baihu/task.py index 8502654..9afcfce 100644 --- a/builtin/python/baihu/task.py +++ b/builtin/python/baihu/task.py @@ -6,7 +6,7 @@ import urllib.error def _get_headers(): token = os.environ.get("BHPKG_OPENAPI_TOKEN") or os.environ.get("OPENAPI_TOKEN") or os.environ.get("BHPKG_NOTIFY_TOKEN") if not token: - raise RuntimeError("缺少 BHPKG_OPENAPI_TOKEN 或 BHPKG_NOTIFY_TOKEN 环境变量,无法使用任务管理操作") + raise RuntimeError("没有正确配置或缺少 BHPKG_OPENAPI_TOKEN 等环境变量,无法使用任务管理操作") return { "Content-Type": "application/json", "Authorization": f"Bearer {token}" @@ -41,7 +41,11 @@ def _request(url, method="GET", data=None): body = resp.read().decode("utf-8") if not body: return {} - return json.loads(body) + parsed = json.loads(body) + if isinstance(parsed, dict) and parsed.get("code") is not None and parsed.get("code") != 200: + msg = parsed.get("msg") or parsed.get("message") or "未知错误" + raise RuntimeError(f"请求失败 [{parsed.get('code')}]: {msg}") + return parsed except urllib.error.HTTPError as e: err_body = e.read().decode("utf-8") try: