diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..ba2a6c0 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,4 @@ +{ + "python-envs.defaultEnvManager": "ms-python.python:system", + "python-envs.pythonProjects": [] +} \ No newline at end of file diff --git a/README.md b/README.md index f3cbe7f..cdcb24a 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # McStatus-API -这是一个 Flask API,主要封装了 mcstatus 包,用于查询 Minecraft 服务器状态,支持Java和基岩,以及附带其他小特性! +这是一个 FastAPI 项目,主要封装了 mcstatus 包,用于查询 Minecraft 服务器状态,支持Java和基岩,以及附带其他小特性! ## 💻用法 @@ -7,6 +7,7 @@ - `GET /java?ip= - (Required)` - 查询 Java 版服务器状态 - `GET - /bedrock?ip= - (Required)` - 查询基岩版服务器状态 +- `Get - /docs ` - FastAPI 的内建文档 ## 📦安装&▶启动 @@ -55,7 +56,7 @@ docker run --name mcstatus-api -p 8000:8000 -d mcstatus-api 2. 添加一个基于此项目的服务端(他可能只是一个API Caller,或者是一个Websocket服务器?) 服务端可以调用多个API,并将其返回的信息进行合并并输出,旨在用于检查不同地区的延迟 3. 添加是否默认使用 SRV 解析的变量 -4. *等一切尘埃落定后,我会考虑使用 FastAPI* +4. *等一切尘埃落定后,我会考虑使用 FastAPI* --- **已完成** ## 📞 联系 diff --git a/app.py b/app.py index e3552f4..347f092 100644 --- a/app.py +++ b/app.py @@ -1,9 +1,10 @@ # -*- coding: utf-8 -*- # 重写 Flask-MCMOTD,早期版本用的是面向过程的方式进行写的,一个文件写了400多行,真是要爆了T.T +# 2025/8/28 by Murasame:使用 *Claude Sonnet 4* 重写成了 FastAPI # API -from flask import Flask, request, jsonify -from flask_cors import CORS +from fastapi import FastAPI, HTTPException, Query +from fastapi.middleware.cors import CORSMiddleware # Java版查询模块 from JavaServerStatus import java_status @@ -15,27 +16,33 @@ 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" +) -app = Flask(__name__) -app.json.sort_keys = False -app.json.ensure_ascii = False -app.json.mimetype = 'application/json;charset=UTF-8' -app.json.compact = False -CORS(app) +# 添加CORS中间件 +app.add_middleware( + CORSMiddleware, + allow_origins=["*"], + allow_credentials=True, + allow_methods=["*"], + allow_headers=["*"], +) -@app.route('/') -def index(): +@app.get("/") +async def index(): message = format_index() - return jsonify(message), 200 + return message # Java 服务器状态查询 -@app.route('/java') -def get_java_status(): - ip = request.args.get('ip') +@app.get("/java") +async def get_java_status(ip: str = Query(None, description="服务器IP地址或域名")): # 空值输出 API 用法 if not ip: message = format_java_index() - return jsonify(message), 400 + raise HTTPException(status_code=400, detail=message) try: ip, type = dns_lookup(ip) @@ -44,19 +51,18 @@ def get_java_status(): data = format_java_data(ip, type, status) - return jsonify(data), 200 + return data except Exception as e: - return jsonify({"error": str(e)}), 500 + raise HTTPException(status_code=500, detail=str(e)) # 基岩版服务器状态查询 -@app.route('/bedrock') -def get_bedrock_status(): - ip = request.args.get('ip') +@app.get("/bedrock") +async def get_bedrock_status(ip: str = Query(None, description="服务器IP地址或域名")): # 空值输出 API 用法 if not ip: message = format_bedrock_index() - return jsonify(message), 400 + raise HTTPException(status_code=400, detail=message) try: print(f"解析基岩版IP: {ip}") @@ -64,10 +70,11 @@ def get_bedrock_status(): data = format_bedrock_data(ip, status) - return jsonify(data), 200 + return data except Exception as e: - return jsonify({"error": str(e)}), 500 + raise HTTPException(status_code=500, detail=str(e)) if __name__ == '__main__': - app.run(debug=True, port=5000) \ No newline at end of file + import uvicorn + uvicorn.run("app:app", host="0.0.0.0", port=5000, reload=True) \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index 78e7116..4826e4f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -5,7 +5,7 @@ description = "Add your description here" readme = "README.md" requires-python = ">=3.13" dependencies = [ - "flask>=3.1.1", - "flask-cors>=6.0.1", + "fastapi>=0.115.0", + "uvicorn[standard]>=0.30.0", "mcstatus>=12.0.5", ] diff --git a/requirements.txt b/requirements.txt index 000ae79..b91e685 100644 Binary files a/requirements.txt and b/requirements.txt differ