add upload api

This commit is contained in:
jxxghp
2024-06-21 08:08:23 +08:00
parent ae0e171dd2
commit 0133c6e60c
5 changed files with 162 additions and 69 deletions

View File

@ -1,6 +1,7 @@
import base64
from typing import Optional, Tuple, Generator
import oss2
import py115
from py115 import Cloud
from py115.types import LoginTarget, QrcodeSession, QrcodeStatus, Credential, File, DownloadTicket
@ -26,7 +27,7 @@ class U115Helper(metaclass=Singleton):
"""
初始化Cloud
"""
credential = self.credential
credential = self.__credential
if not credential:
logger.warn("115未登录请先登录")
return False
@ -35,12 +36,12 @@ class U115Helper(metaclass=Singleton):
self.cloud = py115.connect(credential)
except Exception as err:
logger.error(f"115连接失败请重新扫码登录{str(err)}")
self.clear_credential()
self.__clear_credential()
return False
return True
@property
def credential(self) -> Optional[Credential]:
def __credential(self) -> Optional[Credential]:
"""
获取已保存的115认证参数
"""
@ -49,13 +50,13 @@ class U115Helper(metaclass=Singleton):
return None
return Credential.from_dict(cookie_dict)
def save_credentail(self, credential: Credential):
def __save_credentail(self, credential: Credential):
"""
设置115认证参数
"""
self.systemconfig.set(SystemConfigKey.User115Params, credential.to_dict())
def clear_credential(self):
def __clear_credential(self):
"""
清除115认证参数
"""
@ -91,7 +92,7 @@ class U115Helper(metaclass=Singleton):
status = self.cloud.qrcode_poll(self._session)
if status == QrcodeStatus.Done:
# 确认完成,保存认证信息
self.save_credentail(self.cloud.export_credentail())
self.__save_credentail(self.cloud.export_credentail())
result = {
"status": 1,
"tip": "登录成功!"
@ -123,7 +124,19 @@ class U115Helper(metaclass=Singleton):
except Exception as e:
return {}, f"115登录确认失败{str(e)}"
def list_files(self, parent_file_id: str = '0') -> Optional[Generator[File, None, None]]:
def storage(self) -> Optional[Tuple[int, int]]:
"""
获取存储空间
"""
if not self.__init_cloud():
return None
try:
return self.cloud.storage().space()
except Exception as e:
logger.error(f"获取115存储空间失败{str(e)}")
return None
def list(self, parent_file_id: str = '0') -> Optional[Generator[File, None, None]]:
"""
浏览文件
"""
@ -147,7 +160,7 @@ class U115Helper(metaclass=Singleton):
logger.error(f"创建115目录失败{str(e)}")
return None
def delete_file(self, file_id: str) -> bool:
def delete(self, file_id: str) -> bool:
"""
删除文件
"""
@ -160,7 +173,7 @@ class U115Helper(metaclass=Singleton):
logger.error(f"删除115文件失败{str(e)}")
return False
def rename_file(self, file_id: str, name: str) -> bool:
def rename(self, file_id: str, name: str) -> bool:
"""
重命名文件
"""
@ -185,18 +198,6 @@ class U115Helper(metaclass=Singleton):
logger.error(f"115下载失败{str(e)}")
return None
def get_storage(self) -> Optional[Tuple[int, int]]:
"""
获取存储空间
"""
if not self.__init_cloud():
return None
try:
return self.cloud.storage().space()
except Exception as e:
logger.error(f"获取115存储空间失败{str(e)}")
return None
def move(self, file_id: str, target_id: str) -> bool:
"""
移动文件
@ -209,3 +210,40 @@ class U115Helper(metaclass=Singleton):
except Exception as e:
logger.error(f"移动115文件失败{str(e)}")
return False
def upload(self, file_path: str, parent_file_id: str) -> Optional[dict]:
"""
上传文件
"""
if not self.__init_cloud():
return None
try:
ticket = self.cloud.storage().request_upload(dir_id=parent_file_id, file_path=file_path)
if ticket is None:
logger.warn(f"115请求上传出错")
return None
elif ticket.is_done:
logger.warn(f"115请求上传失败文件已存在")
return {}
else:
auth = oss2.StsAuth(**ticket.oss_token)
bucket = oss2.Bucket(
auth=auth,
endpoint=ticket.oss_endpoint,
bucket_name=ticket.bucket_name,
)
por = bucket.put_object_from_file(
key=ticket.object_key,
filename=file_path,
headers=ticket.headers,
)
result = por.resp.response.json()
if result:
logger.info(f"115上传文件成功{result}")
return result
else:
logger.warn(f"115上传文件失败{por.resp.response.text}")
return None
except Exception as e:
logger.error(f"上传115文件失败{str(e)}")
return None