perf+fix(danding_qqpush): perf优化+安全修复+代码DRY

- image_render: cached draw object, font.getlength() 替代逐字符创建临时Image
- image_render: 移除PNG无效的quality参数
- api.py: ImageRenderer单例复用(避免每请求重载字体)
- api.py: 异常详情不再泄露到API响应
- sender.py: 提取_send_msg()消除重复代码
This commit is contained in:
2026-05-09 23:46:44 +08:00
parent b444bd62f5
commit f240ba2882
3 changed files with 235 additions and 291 deletions

View File

@@ -42,106 +42,47 @@ class MessageSender:
return None
async def send_to_group(
self,
group_id: int,
qq: int,
image_base64: str
) -> dict:
async def _send_msg(self, group_id: int, qq: int, segment) -> dict:
"""
向指定群发送消息@用户 + 图片
内部通用发送方法@用户 + 任意消息段
Args:
group_id: 群号
qq: 要 @ 的 QQ 号
image_base64: 图片的 base64 编码格式base64://...
segment: MessageSegment 实例
Returns:
发送结果字典
Raises:
ValueError: Bot 未设置
Exception: 发送失败
"""
bot = self.get_bot()
if not bot:
raise ValueError("Bot 实例未设置,无法发送消息")
try:
# 构造消息:@用户 + 图片
message = Message()
message.append(MessageSegment.at(qq))
message.append(MessageSegment.image(image_base64))
message.append(segment)
# 发送群消息,添加 __qqpush_source 标记供 auto_recall 识别
result = await bot.call_api(
"send_group_msg",
group_id=group_id,
message=message,
__qqpush_source="danding_qqpush" # 添加标记
__qqpush_source="danding_qqpush"
)
return {
"success": True,
"data": result,
"message": "消息发送成功"
}
return {"success": True, "data": result, "message": "消息发送成功"}
except Exception as e:
# 捕获异常并返回错误信息
return {
"success": False,
"error": str(e),
"message": f"消息发送失败: {str(e)}"
}
logger.warning(f"[QqPush] 消息发送失败 group={group_id} qq={qq}: {e}")
return {"success": False, "error": str(e), "message": f"消息发送失败: {e}"}
async def send_text_to_group(
self,
group_id: int,
qq: int,
text: str
) -> dict:
"""
向指定群发送纯文本消息(@用户 + 文本)
Args:
group_id: 群号
qq: 要 @ 的 QQ 号
text: 文本内容
Returns:
发送结果字典
"""
bot = self.get_bot()
if not bot:
raise ValueError("Bot 实例未设置,无法发送消息")
try:
# 构造消息:@用户 + 文本
message = Message()
message.append(MessageSegment.at(qq))
message.append(MessageSegment.text(text))
# 发送群消息,添加 __qqpush_source 标记供 auto_recall 识别
result = await bot.call_api(
"send_group_msg",
group_id=group_id,
message=message,
__qqpush_source="danding_qqpush" # 添加标记
)
return {
"success": True,
"data": result,
"message": "消息发送成功"
}
except Exception as e:
return {
"success": False,
"error": str(e),
"message": f"消息发送失败: {str(e)}"
}
async def send_to_group(self, group_id: int, qq: int, image_base64: str) -> dict:
"""向指定群发送消息(@用户 + 图片)"""
return await self._send_msg(group_id, qq, MessageSegment.image(image_base64))
async def send_text_to_group(self, group_id: int, qq: int, text: str) -> dict:
"""向指定群发送纯文本消息(@用户 + 文本)"""
return await self._send_msg(group_id, qq, MessageSegment.text(text))
# 全局消息发送器实例