import json import random from pathlib import Path from fastapi import FastAPI, Query from fastapi.middleware.cors import CORSMiddleware from fastapi.responses import PlainTextResponse app = FastAPI(title="马列毛一言 API") app.add_middleware( CORSMiddleware, allow_origins=["*"], allow_methods=["GET"], allow_headers=["*"], ) DATA_PATH = Path(__file__).parent / "data.json" try: with open(DATA_PATH, encoding="utf-8") as f: DATA = json.load(f) except FileNotFoundError: DATA = [] BY_ID = {str(item["id"]): item for item in DATA} VALID_CATS = {"mx", "e", "l", "s", "mz"} def format_quote(item: dict) -> str: return f'{item["Hitokoto"]}\n{item["source"]}' @app.get("/", response_class=PlainTextResponse) def hitokoto( c: list[str] = Query(default=[]), id: str | None = Query(default=None), ): # id 优先 if id is not None: item = BY_ID.get(str(id)) if item is None: return PlainTextResponse("未找到该 id 的语录", status_code=404) return format_quote(item) # 同时支持 ?c=mx&c=e 和 ?c=mx,e cats: list[str] = [] for entry in c: cats.extend(p.strip() for p in entry.split(",") if p.strip()) if not cats: pool = DATA else: wanted = set(cats) pool = [item for item in DATA if wanted & set(item["cat"])] if not pool: return PlainTextResponse("没有符合条件的语录", status_code=404) return format_quote(random.choice(pool))