feat(qqpush): 浏览器长图渲染公告
This commit is contained in:
@@ -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']}")
|
||||
|
||||
Reference in New Issue
Block a user