From 27841b842251fe81154d88110f0c6f185f047dd8 Mon Sep 17 00:00:00 2001 From: passthem Date: Wed, 25 Feb 2026 16:11:11 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20man=20=E6=8C=87?= =?UTF-8?q?=E4=BB=A4=E7=9A=84=E6=B8=B2=E6=9F=93=20Fallback?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- konabot/plugins/man/__init__.py | 11 ++++++++--- konabot/plugins/markdown/core.py | 11 +++++------ 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/konabot/plugins/man/__init__.py b/konabot/plugins/man/__init__.py index a7b9585..b70afce 100644 --- a/konabot/plugins/man/__init__.py +++ b/konabot/plugins/man/__init__.py @@ -5,6 +5,7 @@ import nonebot.adapters import nonebot.rule from nonebot import on_command from nonebot_plugin_alconna import Alconna, Args, UniMessage, on_alconna +import playwright.async_api from konabot.common.nb.is_admin import is_admin from konabot.common.path import DOCS_PATH_MAN1, DOCS_PATH_MAN3, DOCS_PATH_MAN7, DOCS_PATH_MAN8 @@ -87,7 +88,7 @@ async def _( return mans_dict: dict[tuple[int, str], Path] = {} for section in section_set: - mans_dict: dict[tuple[int, str], Path] = {**mans_dict, **search_man(section)} + mans_dict = {**mans_dict, **search_man(section)} mans_dict_2 = {key[1]: val for key, val in mans_dict.items()} mans_fp = mans_dict_2.get(doc.lower()) if mans_fp is None: @@ -95,8 +96,12 @@ async def _( return mans_msg = mans_fp.read_text('utf-8', 'replace') # await man.send(UniMessage().text(mans_msg)) - img = await MarkDownCore.render_markdown(mans_msg) - await man.send(UniMessage.image(raw=img)) + try: + img = await MarkDownCore.render_markdown(mans_msg) + await man.send(UniMessage.image(raw=img)) + except playwright.async_api.Error: + # 图片渲染出错,改成发纯文本 + await man.send(UniMessage.text(mans_msg)) help_deprecated = on_command('help', rule=nonebot.rule.to_me()) diff --git a/konabot/plugins/markdown/core.py b/konabot/plugins/markdown/core.py index b9d2202..2c97ce0 100644 --- a/konabot/plugins/markdown/core.py +++ b/konabot/plugins/markdown/core.py @@ -1,5 +1,4 @@ -from loguru import logger -from playwright.async_api import ConsoleMessage, Page +from playwright.async_api import Page from konabot.common.web_render import konaweb from konabot.common.web_render.core import WebRenderer @@ -12,7 +11,7 @@ class MarkDownCore: await page.locator('textarea[name=content]').fill(markdown_text) await page.locator('#button').click() - + # 等待 checkState 函数加载完成 await page.wait_for_function("typeof checkState === 'function'", timeout=1000) # 访问 checkState 函数,确保渲染完成 @@ -27,7 +26,7 @@ class MarkDownCore: ) return out - + @staticmethod async def render_latex(text: str, theme: str = "dark") -> bytes: params = { @@ -40,7 +39,7 @@ class MarkDownCore: await page.locator('textarea[name=content]').fill(f"$$ {text} $$") page.wait_for_selector('#button') await page.locator('#button').click() - + # 等待 checkState 函数加载完成 await page.wait_for_function("typeof checkState === 'function'", timeout=2000) # 访问 checkState 函数,确保渲染完成 @@ -54,4 +53,4 @@ class MarkDownCore: params=params ) - return out \ No newline at end of file + return out -- 2.49.0 From 91769f93aedec3dcc54f12f7b2c4c8c514e79f86 Mon Sep 17 00:00:00 2001 From: passthem Date: Wed, 25 Feb 2026 16:11:23 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=B8=B2=E6=9F=93?= =?UTF-8?q?=E9=94=99=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 # 收集所有组的文本输出和附件 -- 2.49.0 From 34175e8c17b0ff1f71287627fc21373510a6f556 Mon Sep 17 00:00:00 2001 From: passthem Date: Wed, 25 Feb 2026 16:20:44 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=94=99=E8=AF=AF?= =?UTF-8?q?=E6=8D=95=E8=8E=B7=E8=8C=83=E5=9B=B4=EF=BC=8C=E8=B0=83=E6=95=B4?= =?UTF-8?q?=E6=97=A5=E5=BF=97=E6=B3=A8=E5=85=A5=E5=8F=82=E6=95=B0=E6=96=B9?= =?UTF-8?q?=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- konabot/common/render_error_message.py | 4 ++-- konabot/plugins/man/__init__.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/konabot/common/render_error_message.py b/konabot/common/render_error_message.py index 57796d5..9bdcf63 100644 --- a/konabot/common/render_error_message.py +++ b/konabot/common/render_error_message.py @@ -28,7 +28,7 @@ async def render_error_message(message: str) -> UniMessage[Any]: other_function=page_function, ) return UniMessage.image(raw=img_data) - except playwright.async_api.Error as e: - logger.warning(f"渲染报错信息图片时出错了,回退到文本 ERR={e}") + except (playwright.async_api.Error, ConnectionError) as e: + logger.warning("渲染报错信息图片时出错了,回退到文本 ERR={}", e) return UniMessage.text(message) diff --git a/konabot/plugins/man/__init__.py b/konabot/plugins/man/__init__.py index b70afce..7dad88b 100644 --- a/konabot/plugins/man/__init__.py +++ b/konabot/plugins/man/__init__.py @@ -99,7 +99,7 @@ async def _( try: img = await MarkDownCore.render_markdown(mans_msg) await man.send(UniMessage.image(raw=img)) - except playwright.async_api.Error: + except (playwright.async_api.Error, ConnectionError): # 图片渲染出错,改成发纯文本 await man.send(UniMessage.text(mans_msg)) -- 2.49.0 From df409a13a9f5bc8b673826d1e406de32f3b4a00b Mon Sep 17 00:00:00 2001 From: passthem Date: Wed, 25 Feb 2026 16:24:19 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E6=8A=8A=20timeout=20=E8=B0=83=E9=95=BF?= =?UTF-8?q?=E4=B8=80=E7=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- konabot/common/render_error_message.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/konabot/common/render_error_message.py b/konabot/common/render_error_message.py index 9bdcf63..9c89f92 100644 --- a/konabot/common/render_error_message.py +++ b/konabot/common/render_error_message.py @@ -15,7 +15,7 @@ async def render_error_message(message: str) -> UniMessage[Any]: """ async def page_function(page: Page): - await page.wait_for_function("typeof setContent === 'function'", timeout=1000) + await page.wait_for_function("typeof setContent === 'function'", timeout=3000) await page.evaluate( """(message) => {return setContent(message);}""", message, -- 2.49.0