2025-08-09 09:27:54 +08:00

110 lines
3.5 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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