add upload api
This commit is contained in:
@@ -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
|
||||
|
Reference in New Issue
Block a user