diff --git a/app/templates/index.html b/app/templates/index.html
index b2dc35e..298926b 100644
--- a/app/templates/index.html
+++ b/app/templates/index.html
@@ -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} 次重试...`);
diff --git a/quark_auto_save.py b/quark_auto_save.py
index 8ad04a2..1cb1e25 100644
--- a/quark_auto_save.py
+++ b/quark_auto_save.py
@@ -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")