From 08ff35509e7e7cae6e7b9e5faa45175231211b75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=92=95=E8=B0=B7=E9=85=B1?= Date: Fri, 19 Sep 2025 17:02:24 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BB=A3=E7=90=86=E9=97=AE?= =?UTF-8?q?=E9=A2=98=EF=BC=8C=E6=B7=BB=E5=8A=A0=E5=A4=B4=E5=83=8F=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/router/v2/user.py | 10 ++++++++-- app/service/asset_proxy_service.py | 1 + main.py | 29 ++++++++++++++++++++++++++--- 3 files changed, 35 insertions(+), 5 deletions(-) diff --git a/app/router/v2/user.py b/app/router/v2/user.py index e611145..9cda46f 100644 --- a/app/router/v2/user.py +++ b/app/router/v2/user.py @@ -352,6 +352,7 @@ async def get_user_beatmapsets( tags=["用户"], ) async def get_user_scores( + request: Request, session: Database, api_version: APIVersion, background_task: BackgroundTasks, @@ -376,7 +377,8 @@ async def get_user_scores( user_id, type, include_fails, mode, limit, offset, is_legacy_api ) if cached_scores is not None: - return cached_scores + processed_scores = await process_response_assets(cached_scores, request) + return processed_scores db_user = await session.get(User, user_id) if not db_user or db_user.id == BANCHOBOT_ID: @@ -431,4 +433,8 @@ async def get_user_scores( is_legacy_api, ) - return score_responses + # 处理资源代理 + processed_scores = await process_response_assets(score_responses, request) + return processed_scores + + diff --git a/app/service/asset_proxy_service.py b/app/service/asset_proxy_service.py index e295327..2bd5246 100644 --- a/app/service/asset_proxy_service.py +++ b/app/service/asset_proxy_service.py @@ -65,6 +65,7 @@ class AssetProxyService: r"https://a\.ppy\.sh/", f"https://{self.avatar_proxy_prefix}.{self.custom_asset_domain}/", result ) + return result else: return data diff --git a/main.py b/main.py index 7468801..d625870 100644 --- a/main.py +++ b/main.py @@ -4,7 +4,8 @@ from contextlib import asynccontextmanager from pathlib import Path from app.config import settings -from app.dependencies.database import engine, get_redis, redis_client +from app.database import User +from app.dependencies.database import Database, engine, get_redis, redis_client from app.dependencies.fetcher import get_fetcher from app.dependencies.scheduler import start_scheduler, stop_scheduler from app.log import logger @@ -38,10 +39,10 @@ from app.service.osu_rx_statistics import create_rx_statistics from app.service.redis_message_system import redis_message_system from app.utils import bg_tasks, utcnow -from fastapi import FastAPI, HTTPException, Request +from fastapi import Depends, FastAPI, HTTPException, Request from fastapi.exceptions import RequestValidationError from fastapi.middleware.cors import CORSMiddleware -from fastapi.responses import JSONResponse +from fastapi.responses import JSONResponse, RedirectResponse from fastapi_limiter import FastAPILimiter import sentry_sdk @@ -190,6 +191,28 @@ if settings.frontend_url is not None: app.include_router(redirect_router) +@app.get("/users/{user_id}/avatar", include_in_schema=False) +async def get_user_avatar_root( + user_id: int, + session: Database, +): + """用户头像重定向端点 (根路径) + + """ + user = await session.get(User, user_id) + if not user: + raise HTTPException(status_code=404, detail="User not found") + + avatar_url = user.avatar_url + if not avatar_url: + avatar_url = "https://lazer.g0v0.top/default.jpg" + + separator = "&" if "?" in avatar_url else "?" + avatar_url_with_timestamp = f"{avatar_url}{separator}" + + return RedirectResponse(url=avatar_url_with_timestamp, status_code=301) + + @app.get("/", include_in_schema=False) async def root(): """根端点"""