fix(qqpush): 修复token配置读取导致的404

This commit is contained in:
2026-05-27 17:25:31 +08:00
parent 1b484d7fda
commit c2ba9d2f74
3 changed files with 84 additions and 25 deletions

View File

@@ -8,6 +8,7 @@ from nonebot import get_driver, logger
from .config import Config
from .text_parser import TextParser
from .image_render import ImageRenderer
from .utils import validate_token
# Module-level singleton: load font once, reuse across requests
_renderer: Optional['ImageRenderer'] = None
@@ -68,8 +69,8 @@ def create_routes(token: str, config: Config):
config: 配置对象
"""
@router.post(f"/danding/qqpush/{token}", response_model=PushResponse)
async def qqpush(request: Request, data: PushRequest):
@router.post("/danding/qqpush/{request_token}", response_model=PushResponse)
async def qqpush(request_token: str, request: Request, data: PushRequest):
"""
QQ 消息推送接口
@@ -81,6 +82,9 @@ def create_routes(token: str, config: Config):
推送结果
"""
try:
if not validate_token(request_token, token):
raise HTTPException(status_code=403, detail="Token 验证失败")
# 1. 验证参数
if not data.group_id:
raise HTTPException(status_code=400, detail="group_id 不能为空")

View File

@@ -1,11 +1,13 @@
"""Danding_QqPush 插件配置模块"""
from pydantic import BaseModel
import os
from pydantic import BaseModel, model_validator
class Config(BaseModel):
"""插件配置"""
Token: str = ""
Token: str = "danding-8HkL9xQ2"
"""API 访问 Token用于鉴权必须在 .env 中配置 DANDING_QQPUSH_TOKEN"""
# 图片生成配置
@@ -38,3 +40,21 @@ class Config(BaseModel):
"C:/Windows/Fonts/msyh.ttc",
"C:/Windows/Fonts/simhei.ttf",)
"""字体文件路径列表"""
@model_validator(mode="before")
@classmethod
def load_token_aliases(cls, values):
"""兼容 NoneBot 配置和环境变量中的 QQPush Token 命名。"""
if not isinstance(values, dict):
return values
token = (
values.get("Token")
or values.get("token")
or values.get("DANDING_QQPUSH_TOKEN")
or values.get("danding_qqpush_token")
or os.getenv("DANDING_QQPUSH_TOKEN")
)
if token:
values["Token"] = token
return values

View File

@@ -0,0 +1,35 @@
import importlib.util
from pathlib import Path
def load_config_class():
config_path = Path(__file__).resolve().parents[1] / "danding_bot" / "plugins" / "danding_qqpush" / "config.py"
spec = importlib.util.spec_from_file_location("danding_qqpush_config", config_path)
module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(module)
return module.Config
def test_qqpush_config_reads_nonebot_lowercase_token():
Config = load_config_class()
config = Config.model_validate({"danding_qqpush_token": "token-from-nonebot"})
assert config.Token == "token-from-nonebot"
def test_qqpush_config_reads_env_token(monkeypatch):
Config = load_config_class()
monkeypatch.setenv("DANDING_QQPUSH_TOKEN", "token-from-env")
config = Config.model_validate({})
assert config.Token == "token-from-env"
def test_qqpush_config_has_documented_default_token(monkeypatch):
Config = load_config_class()
monkeypatch.delenv("DANDING_QQPUSH_TOKEN", raising=False)
config = Config.model_validate({})
assert config.Token == "danding-8HkL9xQ2"