修复 inner error 误判问题

- 添加对 "inner error" 类型错误的识别和处理
- 将 "inner error" 归类为可恢复的网络错误而非资源失效
- 前端多个方法中添加对 "inner error" 的识别和忽略
- 后端添加 is_recoverable_error 工具方法
- 后端 _send_request 方法中自动转换 "inner error" 为 "request error"
- 后端 get_detail 方法中添加重试机制处理临时网络问题
- 避免因临时网络问题误判资源状态,提升用户体验
This commit is contained in:
x1ao4 2025-08-31 12:23:52 +08:00
parent 8e5332918a
commit 5170760331
2 changed files with 101 additions and 12 deletions

View File

@ -2834,6 +2834,15 @@
formatShareUrlBanMessage(message) {
if (!message) return message;
// 检查是否为可恢复的网络错误或服务端临时错误
if (message.includes("inner error") ||
message.includes("request error") ||
message.includes("网络错误") ||
message.includes("服务端错误") ||
message.includes("临时错误")) {
return "网络连接异常,请稍后重试"; // 不设置shareurl_ban允许重试
}
if (message.includes("分享者用户封禁链接查看受限") ||
message.includes("文件涉及违规内容") ||
message.includes("分享地址已失效")) {
@ -3366,10 +3375,15 @@
.then(response => {
const share_detail = response.data.data;
if (!response.data.success) {
// 检查是否是 request error如果是则忽略
if (share_detail.error && share_detail.error.includes("request error")) {
// 忽略 request error不设置 shareurl_ban
console.log('检查分享链接时出现网络错误,忽略此错误:', share_detail.error);
// 检查是否是可恢复的网络错误或服务端临时错误
if (share_detail.error && (
share_detail.error.includes("request error") ||
share_detail.error.includes("inner error") ||
share_detail.error.includes("网络错误") ||
share_detail.error.includes("服务端错误") ||
share_detail.error.includes("临时错误"))) {
// 忽略可恢复的错误,不设置 shareurl_ban
console.log('检查分享链接时出现可恢复错误,忽略此错误:', share_detail.error);
return;
}
// 使用格式化函数处理其他错误信息
@ -4237,10 +4251,15 @@
}
}
// 检查是否是 request error如果是则忽略
if (share_detail.error && share_detail.error.includes("request error")) {
// 忽略 request error不设置 shareurl_ban
console.log('修改分享链接时出现网络错误,忽略此错误:', share_detail.error);
// 检查是否是可恢复的网络错误或服务端临时错误
if (share_detail.error && (
share_detail.error.includes("request error") ||
share_detail.error.includes("inner error") ||
share_detail.error.includes("网络错误") ||
share_detail.error.includes("服务端错误") ||
share_detail.error.includes("临时错误"))) {
// 忽略可恢复的错误,不设置 shareurl_ban
console.log('修改分享链接时出现可恢复错误,忽略此错误:', share_detail.error);
return;
}
@ -4487,8 +4506,12 @@
const error = response.data.data.error || "";
let isInvalid = false;
// 如果是 request error视为有效网络问题不是资源问题
if (error.includes("request error")) {
// 如果是可恢复的网络错误或服务端临时错误,视为有效(网络问题,不是资源问题)
if (error.includes("request error") ||
error.includes("inner error") ||
error.includes("网络错误") ||
error.includes("服务端错误") ||
error.includes("临时错误")) {
this.smart_param.validateProgress.valid++;
resolve(link);
return;
@ -4876,7 +4899,11 @@
const rawError = (response && response.data && response.data.data && response.data.data.error) ? response.data.data.error : '';
const errorText = typeof rawError === 'string' ? rawError : String(rawError || '');
const isIllegalToken = errorText.includes('非法token') || errorText.includes('Bad Parameter');
const isRequestError = errorText.toLowerCase().includes('request error');
const isRequestError = errorText.toLowerCase().includes('request error') ||
errorText.toLowerCase().includes('inner error') ||
errorText.toLowerCase().includes('网络错误') ||
errorText.toLowerCase().includes('服务端错误') ||
errorText.toLowerCase().includes('临时错误');
if (isIllegalToken || isRequestError) {
if (retryCount < maxRetries) {
console.log(`分享详情获取失败(${isIllegalToken ? '非法token' : 'request error'}),进行第 ${retryCount + 1} 次重试...`);

View File

@ -1124,6 +1124,19 @@ class Quark:
response = requests.request(method, url, headers=headers, **kwargs)
# print(f"{response.text}")
# response.raise_for_status() # 检查请求是否成功但返回非200也会抛出异常
# 检查响应内容中是否包含inner error将其转换为request error
try:
response_json = response.json()
if isinstance(response_json, dict) and response_json.get("message"):
error_message = response_json.get("message", "")
if "inner error" in error_message.lower():
# 将inner error转换为request error避免误判为资源失效
response_json["message"] = "request error"
response._content = json.dumps(response_json).encode('utf-8')
except:
pass # 如果JSON解析失败保持原响应不变
return response
except Exception as e:
print(f"_send_request error:\n{e}")
@ -1206,9 +1219,38 @@ class Quark:
else:
return False, response["message"]
def get_detail(self, pwd_id, stoken, pdir_fid, _fetch_share=0):
def is_recoverable_error(self, error_message):
"""
检查错误是否为可恢复的错误网络错误服务端临时错误等
Args:
error_message: 错误消息
Returns:
bool: 是否为可恢复错误
"""
if not error_message:
return False
error_message = error_message.lower()
recoverable_errors = [
"inner error",
"request error",
"网络错误",
"服务端错误",
"临时错误",
"timeout",
"connection error",
"server error"
]
return any(error in error_message for error in recoverable_errors)
def get_detail(self, pwd_id, stoken, pdir_fid, _fetch_share=0, max_retries=3):
list_merge = []
page = 1
retry_count = 0
while True:
url = f"{self.BASE_URL}/1/clouddrive/share/sharepage/detail"
querystring = {
@ -1231,6 +1273,26 @@ class Quark:
except Exception:
return {"error": "request error"}
# 检查响应中是否包含inner error或其他可恢复错误
if isinstance(response, dict) and response.get("message"):
error_message = response.get("message", "")
if "inner error" in error_message.lower():
# 对于inner error尝试重试
if retry_count < max_retries:
retry_count += 1
# 静默重试,不输出重试信息,避免日志污染
# 只有在调试模式下才记录详细重试信息
try:
import os
if os.environ.get("DEBUG", "false").lower() == "true":
print(f"[DEBUG] 遇到inner error进行第{retry_count}次重试...")
except:
pass # 如果无法获取DEBUG环境变量静默处理
time.sleep(1) # 等待1秒后重试
continue
else:
return {"error": "request error"} # 重试次数用尽返回request error
# 统一判错:某些情况下返回没有 code 字段
code = response.get("code")
status = response.get("status")