fix(qqpush): 修复token配置读取导致的404
This commit is contained in:
@@ -5,9 +5,10 @@ import asyncio
|
|||||||
from typing import Optional
|
from typing import Optional
|
||||||
from nonebot import get_driver, logger
|
from nonebot import get_driver, logger
|
||||||
|
|
||||||
from .config import Config
|
from .config import Config
|
||||||
from .text_parser import TextParser
|
from .text_parser import TextParser
|
||||||
from .image_render import ImageRenderer
|
from .image_render import ImageRenderer
|
||||||
|
from .utils import validate_token
|
||||||
|
|
||||||
# Module-level singleton: load font once, reuse across requests
|
# Module-level singleton: load font once, reuse across requests
|
||||||
_renderer: Optional['ImageRenderer'] = None
|
_renderer: Optional['ImageRenderer'] = None
|
||||||
@@ -68,8 +69,8 @@ def create_routes(token: str, config: Config):
|
|||||||
config: 配置对象
|
config: 配置对象
|
||||||
"""
|
"""
|
||||||
|
|
||||||
@router.post(f"/danding/qqpush/{token}", response_model=PushResponse)
|
@router.post("/danding/qqpush/{request_token}", response_model=PushResponse)
|
||||||
async def qqpush(request: Request, data: PushRequest):
|
async def qqpush(request_token: str, request: Request, data: PushRequest):
|
||||||
"""
|
"""
|
||||||
QQ 消息推送接口
|
QQ 消息推送接口
|
||||||
|
|
||||||
@@ -79,11 +80,14 @@ def create_routes(token: str, config: Config):
|
|||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
推送结果
|
推送结果
|
||||||
"""
|
"""
|
||||||
try:
|
try:
|
||||||
# 1. 验证参数
|
if not validate_token(request_token, token):
|
||||||
if not data.group_id:
|
raise HTTPException(status_code=403, detail="Token 验证失败")
|
||||||
raise HTTPException(status_code=400, detail="group_id 不能为空")
|
|
||||||
|
# 1. 验证参数
|
||||||
|
if not data.group_id:
|
||||||
|
raise HTTPException(status_code=400, detail="group_id 不能为空")
|
||||||
|
|
||||||
if not data.qq:
|
if not data.qq:
|
||||||
raise HTTPException(status_code=400, detail="qq 不能为空")
|
raise HTTPException(status_code=400, detail="qq 不能为空")
|
||||||
|
|||||||
@@ -1,12 +1,14 @@
|
|||||||
"""Danding_QqPush 插件配置模块"""
|
"""Danding_QqPush 插件配置模块"""
|
||||||
from pydantic import BaseModel
|
import os
|
||||||
|
|
||||||
|
from pydantic import BaseModel, model_validator
|
||||||
class Config(BaseModel):
|
|
||||||
"""插件配置"""
|
|
||||||
|
class Config(BaseModel):
|
||||||
Token: str = ""
|
"""插件配置"""
|
||||||
"""API 访问 Token,用于鉴权(必须在 .env 中配置 DANDING_QQPUSH_TOKEN)"""
|
|
||||||
|
Token: str = "danding-8HkL9xQ2"
|
||||||
|
"""API 访问 Token,用于鉴权(必须在 .env 中配置 DANDING_QQPUSH_TOKEN)"""
|
||||||
|
|
||||||
# 图片生成配置
|
# 图片生成配置
|
||||||
ImageWidth: int = 800
|
ImageWidth: int = 800
|
||||||
@@ -32,9 +34,27 @@ class Config(BaseModel):
|
|||||||
"""最大文本长度(字符数),超过将截断"""
|
"""最大文本长度(字符数),超过将截断"""
|
||||||
|
|
||||||
# 字体路径配置
|
# 字体路径配置
|
||||||
FontPaths: list = ("/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc",
|
FontPaths: list = ("/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc",
|
||||||
"/usr/share/fonts/wqy-microhei/wqy-microhei.ttc",
|
"/usr/share/fonts/wqy-microhei/wqy-microhei.ttc",
|
||||||
"/usr/share/fonts/wqy-zenhei/wqy-zenhei.ttc",
|
"/usr/share/fonts/wqy-zenhei/wqy-zenhei.ttc",
|
||||||
"C:/Windows/Fonts/msyh.ttc",
|
"C:/Windows/Fonts/msyh.ttc",
|
||||||
"C:/Windows/Fonts/simhei.ttf",)
|
"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
|
||||||
|
|||||||
35
tests/test_danding_qqpush_config.py
Normal file
35
tests/test_danding_qqpush_config.py
Normal 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"
|
||||||
Reference in New Issue
Block a user