McStatus-API/app.py
Murasame Noa 099a79fe5f
重写成 FastAPI (#3)
* 重写成FastAPI

* 修改依赖相关配置
- pyproject `uvicorn[standard] -> fastapi[standard]`
- requirements.txt 使用 `uv export` 生成
- Dockerfile 换用 `python:3.13`
- README pip 安装增加版本提示

---------

Co-authored-by: wyf9 <wyf9@wyf9.top>
2025-08-28 11:29:23 +08:00

80 lines
No EOL
2.2 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# -*- coding: utf-8 -*-
# 重写 Flask-MCMOTD,早期版本用的是面向过程的方式进行写的一个文件写了400多行真是要爆了T.T
# 2025/8/28 by Murasame:使用 *Claude Sonnet 4* 重写成了 FastAPI
# API
from fastapi import FastAPI, HTTPException, Query
from fastapi.middleware.cors import CORSMiddleware
# Java版查询模块
from JavaServerStatus import java_status
# 基岩版查询模块
from BedrockServerStatus import bedrock_status
# 此API优先解析 srv 记录
from dnslookup import dns_lookup
# 格式化文本
from FormatData import format_java_data, format_bedrock_data, format_index, format_java_index, format_bedrock_index
app = FastAPI(
title="McStatus API",
description="Minecraft服务器状态查询API",
version="2.0.0"
)
# 添加CORS中间件
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
@app.get("/")
async def index():
message = format_index()
return message
# Java 服务器状态查询
@app.get("/java")
async def get_java_status(ip: str = Query(None, description="服务器IP地址或域名")):
# 空值输出 API 用法
if not ip:
message = format_java_index()
raise HTTPException(status_code=400, detail=message)
try:
ip, type = dns_lookup(ip)
print(f"解析Java版IP: {ip}, 是否为 SRV: {type}")
status = java_status(ip)
data = format_java_data(ip, type, status)
return data
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
# 基岩版服务器状态查询
@app.get("/bedrock")
async def get_bedrock_status(ip: str = Query(None, description="服务器IP地址或域名")):
# 空值输出 API 用法
if not ip:
message = format_bedrock_index()
raise HTTPException(status_code=400, detail=message)
try:
print(f"解析基岩版IP: {ip}")
status = bedrock_status(ip)
data = format_bedrock_data(ip, status)
return data
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
if __name__ == '__main__':
import uvicorn
uvicorn.run("app:app", host="0.0.0.0", port=5000, reload=True)