fix alipan api

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