mirror of
https://github.com/Cp0204/quark-auto-save.git
synced 2026-01-12 23:30:44 +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) {
|
||||
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} 次重试...`);
|
||||
|
||||
@ -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")
|
||||
|
||||
Loading…
Reference in New Issue
Block a user