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

@@ -2,6 +2,7 @@ import base64
import json
import time
import uuid
from pathlib import Path
from typing import Optional, Tuple, List
from requests import Response
@@ -50,7 +51,11 @@ class AliyunHelper:
# 获取下载链接
download_url = "https://api.aliyundrive.com/v2/file/get_download_url"
# 移动文件
move_file_url = "https://api.aliyundrive.com/v3/file/move"
move_file_url = "https://api.aliyundrive.com/v2/file/move"
# 创建文件
create_file_url = "https://api.aliyundrive.com/adrive/v2/file/create"
# 上传文件完成
upload_file_complete_url = "https://api.aliyundrive.com/v2/file/complete"
def __init__(self):
self.systemconfig = SystemConfigOper()
@@ -71,32 +76,32 @@ class AliyunHelper:
if action:
if code == "DeviceSessionSignatureInvalid":
logger.warn("设备已失效,正在重新建立会话...")
self.create_session(self.get_headers(self.auth_params))
self.__create_session(self.get_headers(self.__auth_params))
if code == "UserDeviceOffline":
logger.warn("设备已离线,尝试重新登录,如仍报错请检查阿里云盘绑定设备数量是否超限!")
self.create_session(self.get_headers(self.auth_params))
self.__create_session(self.get_headers(self.__auth_params))
if code == "AccessTokenInvalid":
logger.warn("访问令牌已失效,正在刷新令牌...")
self.__update_accesstoken(self.auth_params, self.auth_params.get("refreshToken"))
self.__update_accesstoken(self.__auth_params, self.__auth_params.get("refreshToken"))
else:
logger.info(f"Aliyun {apiname}成功")
@property
def auth_params(self):
def __auth_params(self):
"""
获取阿里云盘认证参数并初始化参数格式
"""
return self.systemconfig.get(SystemConfigKey.UserAliyunParams) or {}
def update_params(self, params: dict):
def __update_params(self, params: dict):
"""
设置阿里云盘认证参数
"""
current_params = self.auth_params
current_params = self.__auth_params
current_params.update(params)
self.systemconfig.set(SystemConfigKey.UserAliyunParams, current_params)
def clear_params(self):
def __clear_params(self):
"""
清除阿里云盘认证参数
"""
@@ -173,8 +178,8 @@ class AliyunHelper:
"defaultDriveId": pds_login_result.get('defaultDriveId'),
"updateTime": time.time(),
})
self.update_params(data)
self.get_user_info()
self.__update_params(data)
self.user_info()
except Exception as e:
return {}, f"bizExt 解码失败:{str(e)}"
return data, ""
@@ -198,9 +203,9 @@ class AliyunHelper:
code = data.get("code")
if code in ["RefreshTokenExpired", "InvalidParameter.RefreshToken"]:
logger.warn("刷新令牌已过期,请重新登录!")
self.clear_params()
self.__clear_params()
return False
self.update_params({
self.__update_params({
"accessToken": data.get('access_token'),
"expiresIn": data.get('expires_in'),
"updateTime": time.time()
@@ -211,10 +216,11 @@ class AliyunHelper:
self.__handle_error(res, "更新令牌", action=False)
return False
def create_session(self, headers: dict):
def __create_session(self, headers: dict):
"""
创建会话
"""
def __os_name():
"""
获取操作系统名称
@@ -233,11 +239,12 @@ class AliyunHelper:
})
self.__handle_error(res, "创建会话", action=False)
def get_access_params(self) -> Optional[dict]:
@property
def __access_params(self) -> Optional[dict]:
"""
获取阿里云盘访问参数,如果超时则更新后返回
"""
params = self.auth_params
params = self.__auth_params
if not params:
logger.warn("阿里云盘访问令牌不存在,请先扫码登录!")
return None
@@ -246,7 +253,7 @@ class AliyunHelper:
refresh_token = params.get("refreshToken")
if not expires_in or not update_time or not refresh_token:
logger.warn("阿里云盘访问令牌参数错误,请重新扫码登录!")
self.clear_params()
self.__clear_params()
return None
# 是否需要更新设备信息
update_device = False
@@ -262,11 +269,11 @@ class AliyunHelper:
if not x_device_id:
x_device_id = uuid.uuid4().hex
params['x_device_id'] = x_device_id
self.update_params({"x_device_id": x_device_id})
self.__update_params({"x_device_id": x_device_id})
update_device = True
# 更新设备信息重新创建会话
if update_device:
self.create_session(self.get_headers(params))
self.__create_session(self.get_headers(params))
return params
def get_headers(self, params: dict):
@@ -286,18 +293,18 @@ class AliyunHelper:
"x-signature": self._X_SIGNATURE
}
def get_user_info(self) -> dict:
def user_info(self) -> dict:
"""
获取用户信息drive_id等
"""
params = self.get_access_params()
params = self.__access_params
if not params:
return {}
headers = self.get_headers(params)
res = RequestUtils(headers=headers, timeout=10).post_res(self.user_info_url)
if res:
result = res.json()
self.update_params({
self.__update_params({
"resourceDriveId": result.get("resource_drive_id"),
"backDriveId": result.get("backup_drive_id")
})
@@ -306,8 +313,8 @@ class AliyunHelper:
self.__handle_error(res, "获取用户信息")
return {}
def list_files(self, drive_id: str = None, parent_file_id: str = 'root', list_type: str = None,
limit: int = 100, order_by: str = 'updated_at') -> List[dict]:
def list(self, drive_id: str = None, parent_file_id: str = 'root', list_type: str = None,
limit: int = 100, order_by: str = 'updated_at') -> List[dict]:
"""
浏览文件
limit 返回文件数量,默认 50最大 100
@@ -315,7 +322,7 @@ class AliyunHelper:
parent_file_id 根目录为root
type all | file | folder
"""
params = self.get_access_params()
params = self.__access_params
if not params:
return []
# 请求头
@@ -379,7 +386,7 @@ class AliyunHelper:
"""
创建目录
"""
params = self.get_access_params()
params = self.__access_params
if not params:
return None
headers = self.get_headers(params)
@@ -414,11 +421,11 @@ class AliyunHelper:
self.__handle_error(res, "创建目录")
return None
def delete_file(self, file_id: str) -> bool:
def delete(self, file_id: str) -> bool:
"""
删除文件
"""
params = self.get_access_params()
params = self.__access_params
if not params:
return False
headers = self.get_headers(params)
@@ -432,11 +439,11 @@ class AliyunHelper:
self.__handle_error(res, "删除文件")
return False
def get_file_detail(self, file_id: str) -> Optional[dict]:
def detail(self, file_id: str) -> Optional[dict]:
"""
获取文件详情
"""
params = self.get_access_params()
params = self.__access_params
if not params:
return None
headers = self.get_headers(params)
@@ -450,11 +457,11 @@ class AliyunHelper:
self.__handle_error(res, "获取文件详情")
return None
def rename_file(self, file_id: str, name: str) -> bool:
def rename(self, file_id: str, name: str) -> bool:
"""
重命名文件
"""
params = self.get_access_params()
params = self.__access_params
if not params:
return False
headers = self.get_headers(params)
@@ -470,11 +477,11 @@ class AliyunHelper:
self.__handle_error(res, "重命名文件")
return False
def get_download_url(self, file_id: str) -> Optional[str]:
def download(self, file_id: str) -> Optional[str]:
"""
获取下载链接
"""
params = self.get_access_params()
params = self.__access_params
if not params:
return None
headers = self.get_headers(params)
@@ -492,7 +499,7 @@ class AliyunHelper:
"""
移动文件
"""
params = self.get_access_params()
params = self.__access_params
if not params:
return False
headers = self.get_headers(params)
@@ -507,3 +514,52 @@ class AliyunHelper:
else:
self.__handle_error(res, "移动文件")
return False
def upload(self, parent_file_id: str, name: str, filepath: Path) -> Optional[dict]:
"""
上传文件,并标记完成
"""
params = self.__access_params
if not params:
return None
headers = self.get_headers(params)
res = RequestUtils(headers=headers, timeout=10).post_res(self.create_file_url, json={
"drive_id": params.get("resourceDriveId"),
"parent_file_id": parent_file_id,
"name": name,
"type": "file",
"check_name_mode": "refuse"
})
if not res:
self.__handle_error(res, "创建文件")
return None
# 获取上传参数
result = res.json()
drive_id = result.get("drive_id")
file_id = result.get("file_id")
upload_id = result.get("upload_id")
part_info_list = result.get("part_info_list")
if part_info_list:
# 上传地址
upload_url = part_info_list[0].get("upload_url")
# 上传文件
res = RequestUtils(headers=headers).put_res(upload_url, data=filepath.read_bytes())
if not res:
self.__handle_error(res, "上传文件")
return None
# 标记文件上传完毕
res = RequestUtils(headers=headers, timeout=10).post_res(self.upload_file_complete_url, json={
"drive_id": drive_id,
"file_id": file_id,
"upload_id": upload_id
})
if not res:
self.__handle_error(res, "标记上传状态")
return None
return {
"drive_id": drive_id,
"file_id": file_id
}
else:
logger.warn("上传文件失败:无法获取上传地址!")
return None