Hitokoto / app.py
vomebook's picture
Upload 4 files
e9af68c verified
Raw
History Blame Contribute Delete
1.51 kB
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))