新增外链管理功能,完善外链创建、删除和获取接口,优化扫码登录逻辑,添加到期时间支持,更新前端页面以增强用户体验,确保外链使用次数和有效期的正确管理。

This commit is contained in:
dockermen
2025-04-11 18:16:21 +08:00
parent 47839acb75
commit aad2182d0c
13 changed files with 1413 additions and 134 deletions

View File

@ -13,7 +13,7 @@ class CloudDriveDatabase:
self._create_tables()
def _create_tables(self):
"""创建所需的数据库表"""
"""创建所需的数据库表并确保表结构是最新的"""
# 1. 网盘驱动表
self.cursor.execute('''
CREATE TABLE IF NOT EXISTS drive_providers (
@ -48,8 +48,23 @@ class CloudDriveDatabase:
)
''')
# 检查并添加expiry_time列到external_links表
self._add_column_if_not_exists('external_links', 'expiry_time', 'TEXT')
self.conn.commit()
def _add_column_if_not_exists(self, table_name: str, column_name: str, column_type: str):
"""检查表是否存在指定列,如果不存在则添加"""
self.cursor.execute(f"PRAGMA table_info({table_name})")
columns = [column[1] for column in self.cursor.fetchall()]
if column_name not in columns:
try:
self.cursor.execute(f"ALTER TABLE {table_name} ADD COLUMN {column_name} {column_type}")
self.conn.commit()
print(f"已成功添加列 '{column_name}' 到表 '{table_name}'")
except sqlite3.OperationalError as e:
print(f"添加列 '{column_name}' 到表 '{table_name}' 时出错: {e}")
# 网盘驱动表操作
def add_drive_provider(self, provider_name: str, config_vars: Dict[str, Any], remarks: Optional[str] = None) -> bool:
"""添加网盘服务商"""
@ -202,7 +217,7 @@ class CloudDriveDatabase:
return False
# 外链表操作
def create_external_link(self, drive_id: int, total_quota: float, remarks: Optional[str] = None) -> Optional[str]:
def create_external_link(self, drive_id: int, total_quota: float, remarks: Optional[str] = None, expiry_time: str = None) -> Optional[str]:
"""创建外链"""
try:
# 检查用户网盘是否存在
@ -213,10 +228,15 @@ class CloudDriveDatabase:
link_uuid = str(uuid.uuid4())
while self.get_external_link_by_uuid(link_uuid):
link_uuid = str(uuid.uuid4())
# 如果没有指定到期时间默认为24小时后
if not expiry_time:
from datetime import datetime, timedelta
expiry_time = (datetime.now() + timedelta(hours=24)).strftime('%Y-%m-%d %H:%M:%S')
self.cursor.execute(
"INSERT INTO external_links (drive_id, total_quota, used_quota, link_uuid, remarks) VALUES (?, ?, 0, ?, ?)",
(drive_id, total_quota, link_uuid, remarks)
"INSERT INTO external_links (drive_id, total_quota, used_quota, link_uuid, remarks, expiry_time) VALUES (?, ?, 0, ?, ?, ?)",
(drive_id, total_quota, link_uuid, remarks, expiry_time)
)
self.conn.commit()
return link_uuid

View File

@ -1,15 +1,31 @@
import requests
import time
import json
def login_quark(token):
def login_quark(token,config_vars):
"""
夸克登录
:param token: 登录token
:return: 是否登录成功
"""
aa = {
'data': {
'client_id': '515',
'kps_wg': '',
'request_id': '',
'sign_wg': '',
'token': '',
'v': '1.2',
'vcode': ''
},
'kps_wg': '',
'redirect_uri': 'https://uop.quark.cn/cas/ajax/loginWithKpsAndQrcodeToken',
'sign_wg': ''
}
if len(config_vars) > 0:
_config_vars = config_vars.get("data")
s = requests.Session()
s.headers = {
'Accept': 'application/json, text/plain, */*',
@ -22,23 +38,25 @@ def login_quark(token):
'sec-ch-ua-mobile': '?1',
'sec-ch-ua-platform': '"Android"'
}
sign_wg = "AAQHaE4ww2nnIPvofH2SfMv3N6OplcPRjxlgScTZozm/ZCMfQP74bsMLyKW883hZCGY="
kps_wg = "AARWcp9UM71t5VzV9i5pBJ4dLXjJ7EZL5a9qz2QVVQtkkmcqS4wQGYtk38CRzW6HH4+5c7qsB9/EtUgkWcd8x/k7h9+PmAHUDvxKHUWnX7iL3h2fH86XJ4cEqwvUnQ77QGs=";
# sign_wg = "AAQHaE4ww2nnIPvofH2SfMv3N6OplcPRjxlgScTZozm/ZCMfQP74bsMLyKW883hZCGY="
# kps_wg = "AARWcp9UM71t5VzV9i5pBJ4dLXjJ7EZL5a9qz2QVVQtkkmcqS4wQGYtk38CRzW6HH4+5c7qsB9/EtUgkWcd8x/k7h9+PmAHUDvxKHUWnX7iL3h2fH86XJ4cEqwvUnQ77QGs="
vcode = int(time.time() * 1000) # 相当于JavaScript中的Date.now(),返回当前时间的毫秒数
request_id = vcode + 5
is_login = False
url = 'https://uop.quark.cn/cas/ajax/loginWithKpsAndQrcodeToken'
queryParams = 'uc_param_str=dsdnfrpfbivesscpgimibtbmnijblauputogpintnwktprchmt&ds=AANx101uRUMl2l2Ot6hnNFQe%2F%2B%2Fmm2JHIQ2Gw28Yo%2FGa2g%3D%3D&dn=85507213341-12b7840e&fr=android&pf=3300&bi=35825&ve=7.9.2.771&ss=407x853&pc=AASZtg30J6cEZGl0meB9hj0E8U9brcrtYubvdgeP%2BOWEz0vpfLJPZfnxjOm%2Fxul3xW7j9n4com6OOMCVoviOk4QO&gi=bTkwBCbSxTOAXUWiJmZaMx19GVxo&mi=2312DRA50C&ni=bTkwBHemD30PJEvXSga2ki3ciKarGqoowKzIca0Rj7inq8M%3D&la=zh&ut=AANx101uRUMl2l2Ot6hnNFQe%2F%2B%2Fmm2JHIQ2Gw28Yo%2FGa2g%3D%3D&nt=5&nw=0&kt=4&pr=ucpro&ch=kk%40store&mt=73ABKMNLPFhfbAKV15H%2BDiEkS8zWXwui&__dt=31265&__t=' + str(int(time.time() * 1000))
queryParams = config_vars.get("queryParams") + str(int(time.time() * 1000))
data = {
'client_id': '532',
'v': '1.2',
'client_id': _config_vars.get("client_id"),
'v': _config_vars.get("v"),
'request_id': request_id,
'sign_wg': sign_wg,
'kps_wg': kps_wg,
'sign_wg': _config_vars.get("sign_wg"),
'kps_wg': _config_vars.get("kps_wg"),
'vcode': vcode,
'token': token
}
print(data)
res =s.post(url, data=data, params=queryParams)
print(res.json())
if res.json().get('status') == 2000000:
is_login = True
return is_login