Spaces:
Sleeping
Sleeping
import os | |
import asyncio | |
import json | |
import logging | |
import httpx | |
from pikpakapi import PikPakApi | |
from typing import Union, Any, Dict, List, Optional | |
from fastapi import ( | |
FastAPI, | |
APIRouter, | |
Depends, | |
Request, | |
Body, | |
Response, | |
HTTPException, | |
status, | |
Request, | |
) | |
from fastapi.responses import StreamingResponse, HTMLResponse, JSONResponse | |
from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials | |
from fastapi.templating import Jinja2Templates | |
from fastapi.middleware.cors import CORSMiddleware | |
from pydantic import BaseModel, Extra | |
class PostRequest(BaseModel): | |
class Config: | |
extra = Extra.allow | |
class FileRequest(BaseModel): | |
size: int = 100 | |
parent_id: str | None = "" | |
next_page_token: str | None = "" | |
additional_filters: Dict | None = {} | |
class Config: | |
extra = Extra.allow | |
class OfflineRequest(BaseModel): | |
file_url: str = "" | |
parent_id: str | None = "" | |
name: str | None = "" | |
class Config: | |
extra = Extra.allow | |
security = HTTPBearer() | |
# SECRET_TOKEN = "SECRET_TOKEN" | |
SECRET_TOKEN = os.getenv("SECRET_TOKEN") | |
if SECRET_TOKEN is None: | |
raise ValueError("请在环境变量中设置SECRET_TOKEN,确保安全!") | |
THUNDERX_USERNAME = os.getenv("THUNDERX_USERNAME") | |
if THUNDERX_USERNAME is None: | |
raise ValueError("请在环境变量中设置THUNDERX_USERNAME,用户名【邮箱】用来登陆!") | |
THUNDERX_PASSWORD = os.getenv("THUNDERX_PASSWORD") | |
if THUNDERX_PASSWORD is None: | |
raise ValueError("请在环境变量中设置THUNDERX_PASSWORD,密码用来登陆!") | |
PROXY_URL = os.getenv("PROXY_URL") | |
async def verify_token( | |
request: Request, credentials: HTTPAuthorizationCredentials = Depends(security) | |
): | |
# excluded_paths = ["/"] # 需要排除的路径列表 | |
# if request.url.path in excluded_paths: | |
# return # 直接跳过验证 | |
# 验证Bearer格式 | |
if credentials.scheme != "Bearer": | |
raise HTTPException( | |
status_code=status.HTTP_401_UNAUTHORIZED, | |
detail="Invalid authentication scheme", | |
) | |
# 验证令牌内容 | |
if credentials.credentials != SECRET_TOKEN: | |
raise HTTPException( | |
status_code=status.HTTP_401_UNAUTHORIZED, detail="Invalid or expired token" | |
) | |
app = FastAPI() | |
app.add_middleware( | |
CORSMiddleware, | |
allow_origins=["*"], | |
allow_credentials=True, | |
allow_methods=["*"], | |
allow_headers=["*"], | |
) | |
api_router = APIRouter(dependencies=[Depends(verify_token)]) | |
front_router = APIRouter() | |
templates = Jinja2Templates( | |
directory="templates", variable_start_string="{[", variable_end_string="]}" | |
) | |
THUNDERX_CLIENT = None | |
async def log_token(THUNDERX_CLIENT, extra_data): | |
logging.info(f"Token: {THUNDERX_CLIENT.encoded_token}, Extra Data: {extra_data}") | |
async def init_client(): | |
global THUNDERX_CLIENT | |
if not os.path.exists("thunderx.txt"): | |
THUNDERX_CLIENT = PikPakApi( | |
username=THUNDERX_USERNAME, | |
password=THUNDERX_PASSWORD, | |
httpx_client_args=None, | |
token_refresh_callback=log_token, | |
token_refresh_callback_kwargs={"extra_data": "test"}, | |
) | |
await THUNDERX_CLIENT.login() | |
await THUNDERX_CLIENT.refresh_access_token() | |
with open("thunderx.json", "w") as f: | |
f.write(json.dumps(THUNDERX_CLIENT.to_dict(), indent=4)) | |
else: | |
with open("thunderx.txt", "r") as f: | |
data = json.load(f) | |
THUNDERX_CLIENT = PikPakApi.from_dict(data) | |
# await client.refresh_access_token() | |
print(json.dumps(THUNDERX_CLIENT.get_user_info(), indent=4)) | |
print( | |
json.dumps( | |
await THUNDERX_CLIENT.events(), | |
indent=4, | |
) | |
) | |
async def home(request: Request): | |
return templates.TemplateResponse("index.html", {"request": request}) | |
async def get_files(item: FileRequest): | |
return await THUNDERX_CLIENT.file_list( | |
item.size, item.parent_id, item.next_page_token, item.additional_filters | |
) | |
async def get_file_info(file_id: str): | |
return await THUNDERX_CLIENT.get_download_url(file_id) | |
async def emptytrash(): | |
return await THUNDERX_CLIENT.emptytrash() | |
async def offline(item: OfflineRequest): | |
return await THUNDERX_CLIENT.offline_download( | |
item.file_url, item.parent_id, item.name | |
) | |
async def userinfo(): | |
return THUNDERX_CLIENT.get_user_info() | |
async def quota_info(): | |
return await THUNDERX_CLIENT.get_quota_info() | |
app.include_router(front_router) | |
app.include_router(api_router) | |