From 91769f93aedec3dcc54f12f7b2c4c8c514e79f86 Mon Sep 17 00:00:00 2001 From: passthem Date: Wed, 25 Feb 2026 16:11:23 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=B8=B2=E6=9F=93=E9=94=99?= =?UTF-8?q?=E8=AF=AF=E4=BF=A1=E6=81=AF=E4=B8=BA=E5=9B=BE=E7=89=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- konabot/common/render_error_message.py | 34 +++++++++++++++++++++++++ konabot/plugins/handle_text/__init__.py | 5 +++- 2 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 konabot/common/render_error_message.py diff --git a/konabot/common/render_error_message.py b/konabot/common/render_error_message.py new file mode 100644 index 0000000..57796d5 --- /dev/null +++ b/konabot/common/render_error_message.py @@ -0,0 +1,34 @@ +from typing import Any +from loguru import logger +from nonebot_plugin_alconna import UniMessage +import playwright.async_api +from playwright.async_api import Page + +from konabot.common.web_render import WebRenderer, konaweb + + +async def render_error_message(message: str) -> UniMessage[Any]: + """ + 渲染文本消息为错误信息图片。 + + 如果无法访达 Web 端则返回纯文本给用户。 + """ + + async def page_function(page: Page): + await page.wait_for_function("typeof setContent === 'function'", timeout=1000) + await page.evaluate( + """(message) => {return setContent(message);}""", + message, + ) + + try: + img_data = await WebRenderer.render( + url=konaweb("error_report"), + target="#main", + other_function=page_function, + ) + return UniMessage.image(raw=img_data) + except playwright.async_api.Error as e: + logger.warning(f"渲染报错信息图片时出错了,回退到文本 ERR={e}") + return UniMessage.text(message) + diff --git a/konabot/plugins/handle_text/__init__.py b/konabot/plugins/handle_text/__init__.py index f8d417f..c8da6d1 100644 --- a/konabot/plugins/handle_text/__init__.py +++ b/konabot/plugins/handle_text/__init__.py @@ -10,6 +10,7 @@ from nonebot.adapters.onebot.v11.message import Message as OB11Message from konabot.common.apis.ali_content_safety import AlibabaGreen from konabot.common.longtask import DepLongTaskTarget +from konabot.common.render_error_message import render_error_message from konabot.plugins.handle_text.base import ( PipelineRunner, TextHandlerEnvironment, @@ -75,7 +76,9 @@ async def _(msg: UniMsg, evt: Event, bot: Bot, target: DepLongTaskTarget): # 检查是否有错误 for r in results: if r.code != 0: - await target.send_message(f"处理指令时出现问题:{r.ostream}") + message = f"处理指令时出现问题:{r.ostream}" + rendered = await render_error_message(message) + await target.send_message(rendered) return # 收集所有组的文本输出和附件