| 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), |
| ): |
| |
| 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) |
|
|
| |
| 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)) |