From 9b7d57a853ca99fd426691cca044e2527c1bdaa5 Mon Sep 17 00:00:00 2001 From: jxxghp Date: Sat, 29 Mar 2025 09:42:23 +0800 Subject: [PATCH] fix alipan api --- app/modules/filemanager/storages/alipan.py | 34 ++++++++++---- app/modules/filemanager/storages/u115.py | 53 ++++++++++++---------- app/schemas/file.py | 2 +- 3 files changed, 53 insertions(+), 36 deletions(-) diff --git a/app/modules/filemanager/storages/alipan.py b/app/modules/filemanager/storages/alipan.py index 14a1f115..6f154030 100644 --- a/app/modules/filemanager/storages/alipan.py +++ b/app/modules/filemanager/storages/alipan.py @@ -64,6 +64,17 @@ class AliPan(StorageBase, metaclass=Singleton): if not self.access_token: raise Exception("【阿里云盘】请先扫码登录!") + @property + def _default_drive_id(self) -> str: + """ + 获取默认存储桶ID + """ + conf = self.get_conf() + drive_id = conf.get("resource_drive_id") or conf.get("backup_drive_id") or conf.get("default_drive_id") + if not drive_id: + raise Exception("请先登录阿里云盘!") + return drive_id + @property def access_token(self) -> Optional[str]: """ @@ -72,8 +83,6 @@ class AliPan(StorageBase, metaclass=Singleton): with lock: tokens = self.get_conf() refresh_token = tokens.get("refresh_token") - if not refresh_token: - return None expires_in = tokens.get("expires_in", 0) refresh_time = tokens.get("refresh_time", 0) if expires_in and refresh_time + expires_in < int(time.time()): @@ -183,6 +192,8 @@ class AliPan(StorageBase, metaclass=Singleton): """ 刷新access_token """ + if not refresh_token: + raise Exception("会话失效,请重新扫码登录!") resp = self.session.post( f"{self.base_url}/oauth/access_token", json={ @@ -287,9 +298,9 @@ class AliPan(StorageBase, metaclass=Singleton): next_marker = None while True: resp = self._request_api( - "GET", + "POST", "/adrive/v1.0/openFile/list", - params={ + json={ "drive_id": drive_id, "limit": 100, "marker": next_marker, @@ -381,18 +392,20 @@ class AliPan(StorageBase, metaclass=Singleton): if fileitem.path == "/": parent_file_id = "root" + drive_id = self._default_drive_id else: parent_file_id = fileitem.fileid + drive_id = fileitem.drive_id items = [] next_marker = None while True: resp = self._request_api( - "GET", + "POST", "/adrive/v1.0/openFile/list", - params={ - "drive_id": fileitem.drive_id, + json={ + "drive_id": drive_id, "limit": 100, "marker": next_marker, "parent_file_id": parent_file_id, @@ -406,7 +419,7 @@ class AliPan(StorageBase, metaclass=Singleton): for item in resp.get("items", []): # 更新缓存 path = f"{fileitem.path}{item.get('name')}" - self._id_cache[path] = item["fid"] + self._id_cache[path] = (drive_id, item.get("file_id")) items.append(self.__get_fileitem(item)) if len(resp.get("items")) < 100: break @@ -518,9 +531,10 @@ class AliPan(StorageBase, metaclass=Singleton): """ try: resp = self._request_api( - "GET", + "POST", "/adrive/v1.0/openFile/get_by_path", - params={ + json={ + "drive_id": self._default_drive_id, "file_path": str(path) } ) diff --git a/app/modules/filemanager/storages/u115.py b/app/modules/filemanager/storages/u115.py index 6d4bd9b2..fca8d18b 100644 --- a/app/modules/filemanager/storages/u115.py +++ b/app/modules/filemanager/storages/u115.py @@ -47,7 +47,7 @@ class U115Pan(StorageBase, metaclass=Singleton): base_url = "https://proapi.115.com" # CID和路径缓存 - _id_cache: Dict[str, int] = {} + _id_cache: Dict[str, str] = {} def __init__(self): super().__init__() @@ -233,13 +233,13 @@ class U115Pan(StorageBase, metaclass=Singleton): return ret_data.get(result_key) return ret_data - def _path_to_id(self, path: str) -> int: + def _path_to_id(self, path: str) -> str: """ 路径转FID(带缓存机制) """ # 根目录 if path == "/": - return 0 + return '0' if len(path) > 1 and path.endswith("/"): path = path[:-1] # 检查缓存 @@ -282,8 +282,8 @@ class U115Pan(StorageBase, metaclass=Singleton): if not current_id: raise FileNotFoundError(f"【115】{path} 不存在") # 缓存路径 - self._id_cache[path] = current_id - return current_id + self._id_cache[path] = str(current_id) + return str(current_id) @staticmethod def _calc_sha1(filepath: Path, size: Optional[int] = None) -> str: @@ -315,7 +315,7 @@ class U115Pan(StorageBase, metaclass=Singleton): return [item] return [] if fileitem.path == "/": - cid = 0 + cid = '0' else: cid = fileitem.fileid @@ -327,7 +327,7 @@ class U115Pan(StorageBase, metaclass=Singleton): "GET", "/open/ufile/files", "data", - params={"cid": cid, "limit": 1000, "offset": offset, "cur": True, "show_dir": 1} + params={"cid": int(cid), "limit": 1000, "offset": offset, "cur": True, "show_dir": 1} ) if resp is None: raise FileNotFoundError(f"【115】{fileitem.path} 检索出错!") @@ -336,12 +336,13 @@ class U115Pan(StorageBase, metaclass=Singleton): for item in resp: # 更新缓存 path = f"{fileitem.path}{item['fn']}" - self._id_cache[path] = item["fid"] + self._id_cache[path] = str(item["fid"]) file_path = path + ("/" if item["fc"] == "0" else "") items.append(schemas.FileItem( storage=self.schema.value, - fileid=item["fid"], + fileid=str(item["fid"]), + parent_fileid=cid, name=item["fn"], basename=Path(item["fn"]).stem, extension=item["ico"] if item["fc"] == "1" else None, @@ -367,7 +368,7 @@ class U115Pan(StorageBase, metaclass=Singleton): "POST", "/open/folder/add", data={ - "pid": parent_item.fileid, + "pid": int(parent_item.fileid), "file_name": name } ) @@ -380,10 +381,10 @@ class U115Pan(StorageBase, metaclass=Singleton): logger.warn(f"【115】创建目录失败: {resp.get('error')}") return None # 缓存新目录 - self._id_cache[str(new_path)] = resp["data"]["file_id"] + self._id_cache[str(new_path)] = str(resp["data"]["file_id"]) return schemas.FileItem( storage=self.schema.value, - fileid=resp["data"]["file_id"], + fileid=str(resp["data"]["file_id"]), path=str(new_path) + "/", name=name, basename=name, @@ -500,7 +501,8 @@ class U115Pan(StorageBase, metaclass=Singleton): logger.info(f"【115】{target_name} 秒传成功") return schemas.FileItem( storage=self.schema.value, - fileid=file_id, + fileid=str(file_id), + parent_fileid=target_cid, path=target_path, name=target_name, basename=Path(target_name).stem, @@ -606,7 +608,8 @@ class U115Pan(StorageBase, metaclass=Singleton): # 返回结果 return schemas.FileItem( storage=self.schema.value, - fileid=file_id, + fileid=str(file_id), + parent_fileid = target_cid, type="file", path=target_path, name=target_name, @@ -655,7 +658,7 @@ class U115Pan(StorageBase, metaclass=Singleton): "POST", "/open/ufile/delete", data={ - "file_ids": fileitem.fileid + "file_ids": int(fileitem.fileid) } ) return True @@ -670,7 +673,7 @@ class U115Pan(StorageBase, metaclass=Singleton): "POST", "/open/ufile/update", data={ - "file_id": fileitem.fileid, + "file_id": int(fileitem.fileid), "file_name": name } ) @@ -700,14 +703,14 @@ class U115Pan(StorageBase, metaclass=Singleton): "/open/folder/get_info", "data", params={ - "file_id": file_id + "file_id": int(file_id) } ) if not resp: return None return schemas.FileItem( storage=self.schema.value, - fileid=resp["file_id"], + fileid=str(resp["file_id"]), path=str(path) + ("/" if resp["file_category"] == "1" else ""), type="file" if resp["file_category"] == "1" else "dir", name=resp["file_name"], @@ -772,20 +775,20 @@ class U115Pan(StorageBase, metaclass=Singleton): "POST", "/open/ufile/copy", data={ - "file_id": src_fid, - "pid": dest_cid + "file_id": int(src_fid), + "pid": int(dest_cid) } ) if not resp: return False if resp["state"]: new_path = Path(path) / fileitem.name - new_file = self.get_item(new_path) - self.rename(new_file, new_name) + new_item = self.get_item(new_path) + self.rename(new_item, new_name) # 更新缓存 del self._id_cache[fileitem.path] rename_new_path = Path(path) / new_name - self._id_cache[str(rename_new_path)] = int(new_file.fileid) + self._id_cache[str(rename_new_path)] = new_item.fileid return True return False @@ -800,8 +803,8 @@ class U115Pan(StorageBase, metaclass=Singleton): "POST", "/open/ufile/move", data={ - "file_ids": src_fid, - "to_cid": dest_cid + "file_ids": int(src_fid), + "to_cid": int(dest_cid) } ) if not resp: diff --git a/app/schemas/file.py b/app/schemas/file.py index bc662596..7891e2ce 100644 --- a/app/schemas/file.py +++ b/app/schemas/file.py @@ -23,7 +23,7 @@ class FileItem(BaseModel): # 子节点 children: Optional[list] = Field(default_factory=list) # ID - fileid: Optional[Union[str, int]] = None + fileid: Optional[str] = None # 父ID parent_fileid: Optional[str] = None # 缩略图