feat(qqpush): 浏览器长图渲染公告

This commit is contained in:
2026-07-30 21:21:49 +08:00
parent f8e9544fd6
commit d2187e5545
3 changed files with 165 additions and 12 deletions

View File

@@ -6,6 +6,7 @@ from typing import Optional
from nonebot import logger
from .config import Config
from .article_render import render_article_to_base64
from .text_parser import TextParser
from .image_render import ImageRenderer
from .sender import sender
@@ -39,8 +40,17 @@ class PushRequest(BaseModel):
qq: Optional[int] = None
"""可选的被 @ QQ 号;未传时仅发送群消息"""
text: str
"""通知文本(# 表示换行)"""
text: str
"""通知文本(# 表示换行)"""
html: Optional[str] = None
"""可选的完整公告 HTML传入时使用虚拟浏览器截图"""
title: Optional[str] = None
"""公告标题"""
published_at: Optional[str] = None
"""公告发布时间"""
# 响应模型
@@ -109,16 +119,26 @@ def create_routes(token: str, config: Config):
parsed_text = text_parser.parse(data.text)
logger.info(f"解析文本: {parsed_text[:50]}..." if len(parsed_text) > 50 else parsed_text)
# 4. 生成图片 (reuse shared renderer to avoid per-request font loading)
image_base64 = await asyncio.to_thread(_get_renderer(config).render_to_base64, parsed_text)
logger.info("图片生成成功")
# 5. 发送消息
send_result = await sender.send_to_group(
group_id=data.group_id,
image_base64=image_base64,
qq=data.qq,
)
# 4. 原始公告使用 Chromium 截图,普通通知保持既有 Pillow 渲染。
if data.html:
image_base64 = await render_article_to_base64(
data.html,
data.title or "蛋定助手通知",
data.published_at,
)
send_result = await sender.send_to_group(
group_id=data.group_id,
image_base64=image_base64,
qq=data.qq,
)
else:
image_base64 = await asyncio.to_thread(_get_renderer(config).render_to_base64, parsed_text)
send_result = await sender.send_to_group(
group_id=data.group_id,
image_base64=image_base64,
qq=data.qq,
)
logger.info("图片生成成功")
if not send_result["success"]:
logger.error(f"消息发送失败: {send_result['error']}")