mirror of
https://github.com/Cp0204/quark-auto-save.git
synced 2026-01-15 08:50:42 +08:00
修复 inner error 误判问题
- 添加对 "inner error" 类型错误的识别和处理 - 将 "inner error" 归类为可恢复的网络错误而非资源失效 - 前端多个方法中添加对 "inner error" 的识别和忽略 - 后端添加 is_recoverable_error 工具方法 - 后端 _send_request 方法中自动转换 "inner error" 为 "request error" - 后端 get_detail 方法中添加重试机制处理临时网络问题 - 避免因临时网络问题误判资源状态,提升用户体验
This commit is contained in:
parent
8e5332918a
commit
5170760331
@ -2834,6 +2834,15 @@
|
|||||||
formatShareUrlBanMessage(message) {
|
formatShareUrlBanMessage(message) {
|
||||||
if (!message) return 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("分享者用户封禁链接查看受限") ||
|
if (message.includes("分享者用户封禁链接查看受限") ||
|
||||||
message.includes("文件涉及违规内容") ||
|
message.includes("文件涉及违规内容") ||
|
||||||
message.includes("分享地址已失效")) {
|
message.includes("分享地址已失效")) {
|
||||||
@ -3366,10 +3375,15 @@
|
|||||||
.then(response => {
|
.then(response => {
|
||||||
const share_detail = response.data.data;
|
const share_detail = response.data.data;
|
||||||
if (!response.data.success) {
|
if (!response.data.success) {
|
||||||
// 检查是否是 request error,如果是则忽略
|
// 检查是否是可恢复的网络错误或服务端临时错误
|
||||||
if (share_detail.error && share_detail.error.includes("request error")) {
|
if (share_detail.error && (
|
||||||
// 忽略 request error,不设置 shareurl_ban
|
share_detail.error.includes("request error") ||
|
||||||
console.log('检查分享链接时出现网络错误,忽略此错误:', share_detail.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;
|
return;
|
||||||
}
|
}
|
||||||
// 使用格式化函数处理其他错误信息
|
// 使用格式化函数处理其他错误信息
|
||||||
@ -4237,10 +4251,15 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 检查是否是 request error,如果是则忽略
|
// 检查是否是可恢复的网络错误或服务端临时错误
|
||||||
if (share_detail.error && share_detail.error.includes("request error")) {
|
if (share_detail.error && (
|
||||||
// 忽略 request error,不设置 shareurl_ban
|
share_detail.error.includes("request error") ||
|
||||||
console.log('修改分享链接时出现网络错误,忽略此错误:', share_detail.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;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4487,8 +4506,12 @@
|
|||||||
const error = response.data.data.error || "";
|
const error = response.data.data.error || "";
|
||||||
let isInvalid = false;
|
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++;
|
this.smart_param.validateProgress.valid++;
|
||||||
resolve(link);
|
resolve(link);
|
||||||
return;
|
return;
|
||||||
@ -4876,7 +4899,11 @@
|
|||||||
const rawError = (response && response.data && response.data.data && response.data.data.error) ? response.data.data.error : '';
|
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 errorText = typeof rawError === 'string' ? rawError : String(rawError || '');
|
||||||
const isIllegalToken = errorText.includes('非法token') || errorText.includes('Bad Parameter');
|
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 (isIllegalToken || isRequestError) {
|
||||||
if (retryCount < maxRetries) {
|
if (retryCount < maxRetries) {
|
||||||
console.log(`分享详情获取失败(${isIllegalToken ? '非法token' : 'request error'}),进行第 ${retryCount + 1} 次重试...`);
|
console.log(`分享详情获取失败(${isIllegalToken ? '非法token' : 'request error'}),进行第 ${retryCount + 1} 次重试...`);
|
||||||
|
|||||||
@ -1124,6 +1124,19 @@ class Quark:
|
|||||||
response = requests.request(method, url, headers=headers, **kwargs)
|
response = requests.request(method, url, headers=headers, **kwargs)
|
||||||
# print(f"{response.text}")
|
# print(f"{response.text}")
|
||||||
# response.raise_for_status() # 检查请求是否成功,但返回非200也会抛出异常
|
# 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
|
return response
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"_send_request error:\n{e}")
|
print(f"_send_request error:\n{e}")
|
||||||
@ -1206,9 +1219,38 @@ class Quark:
|
|||||||
else:
|
else:
|
||||||
return False, response["message"]
|
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 = []
|
list_merge = []
|
||||||
page = 1
|
page = 1
|
||||||
|
retry_count = 0
|
||||||
|
|
||||||
while True:
|
while True:
|
||||||
url = f"{self.BASE_URL}/1/clouddrive/share/sharepage/detail"
|
url = f"{self.BASE_URL}/1/clouddrive/share/sharepage/detail"
|
||||||
querystring = {
|
querystring = {
|
||||||
@ -1231,6 +1273,26 @@ class Quark:
|
|||||||
except Exception:
|
except Exception:
|
||||||
return {"error": "request error"}
|
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 字段
|
||||||
code = response.get("code")
|
code = response.get("code")
|
||||||
status = response.get("status")
|
status = response.get("status")
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user