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")