110 lines
3.5 KiB
Python
110 lines
3.5 KiB
Python
import requests
|
||
import time
|
||
from app.log import logger
|
||
|
||
|
||
class CloudSyncMediaClient:
|
||
"""CloudSyncMedia客户端"""
|
||
|
||
def __init__(self, base_url: str, username: str, password: str):
|
||
self.base_url = base_url.rstrip('/')
|
||
self.username = username
|
||
self.password = password
|
||
self.token = None
|
||
self.token_expiry = 0
|
||
|
||
# 配置请求会话
|
||
self.session = requests.Session()
|
||
self.session.headers.update({
|
||
'Content-Type': 'application/json',
|
||
'Accept': 'application/json'
|
||
})
|
||
|
||
# CMS一般为内网服务,禁用代理访问
|
||
self.session.proxies = {
|
||
'http': None,
|
||
'https': None
|
||
}
|
||
|
||
# 初始化时获取token
|
||
self._ensure_valid_token()
|
||
|
||
def _login(self) -> dict:
|
||
"""登录CMS系统获取token"""
|
||
try:
|
||
response = self.session.post(
|
||
f'{self.base_url}/api/auth/login',
|
||
json={
|
||
'username': self.username,
|
||
'password': self.password
|
||
},
|
||
timeout=(10, 30)
|
||
)
|
||
response.raise_for_status()
|
||
data = response.json()
|
||
|
||
if data.get('code') != 200 or 'data' not in data:
|
||
raise ValueError(f'CMS登录失败: {data}')
|
||
|
||
return data['data']
|
||
|
||
except requests.exceptions.RequestException as e:
|
||
logger.error(f'CMS登录失败: {str(e)}')
|
||
raise
|
||
|
||
def _ensure_valid_token(self):
|
||
"""确保有效的token"""
|
||
current_time = time.time()
|
||
|
||
# 如果token不存在或距离过期时间不到1小时,重新获取token
|
||
if not self.token or current_time >= (self.token_expiry - 3600):
|
||
login_data = self._login()
|
||
self.token = login_data['token']
|
||
|
||
# 设置token过期时间为24小时后
|
||
self.token_expiry = current_time + 86400
|
||
|
||
# 更新session的Authorization header
|
||
self.session.headers.update({
|
||
'Authorization': f'Bearer {self.token}'
|
||
})
|
||
|
||
logger.info("CMS token已更新")
|
||
|
||
def add_share_down(self, url: str) -> dict:
|
||
"""添加分享链接到CMS系统进行转存"""
|
||
if not url:
|
||
raise ValueError('转存链接不能为空')
|
||
|
||
try:
|
||
self._ensure_valid_token()
|
||
|
||
response = self.session.post(
|
||
f'{self.base_url}/api/cloud/add_share_down',
|
||
json={'url': url},
|
||
timeout=(10, 30)
|
||
)
|
||
response.raise_for_status()
|
||
result = response.json()
|
||
|
||
logger.info(f"CMS转存请求已发送: {url}")
|
||
return result
|
||
|
||
except requests.exceptions.HTTPError as e:
|
||
if e.response.status_code == 401:
|
||
# token可能过期,强制重新获取
|
||
self.token = None
|
||
self._ensure_valid_token()
|
||
|
||
# 重试请求
|
||
response = self.session.post(
|
||
f'{self.base_url}/api/cloud/add_share_down',
|
||
json={'url': url},
|
||
timeout=(10, 30)
|
||
)
|
||
response.raise_for_status()
|
||
return response.json()
|
||
raise
|
||
except Exception as e:
|
||
logger.error(f'CMS转存请求失败: {str(e)}')
|
||
raise |