From 237cb274ba7a047fbddca92e1143ba608589be2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=9B=9E=E5=BD=92=E5=A4=A9=E7=A9=BA?= Date: Fri, 29 Aug 2025 23:12:54 +0800 Subject: [PATCH] =?UTF-8?q?[fix]=20(pyppeteer)=20pyppeteer=20=E5=AE=89?= =?UTF-8?q?=E8=A3=85=EF=BC=8C=E6=83=85=E5=86=B5=E8=AF=B4=E6=98=8E=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=EF=BC=8C=E9=A6=96=E6=AC=A1=E5=AE=89=E8=A3=85=E7=83=AD?= =?UTF-8?q?=E9=87=8D=E5=90=AF=E6=8F=92=E4=BB=B6=E6=B2=A1=E6=9C=89=E6=95=88?= =?UTF-8?q?=E6=9E=9C=EF=BC=8C=E9=9C=80=E8=A6=81=E9=87=8D=E5=90=AF=20astrbo?= =?UTF-8?q?t?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.py | 116 ++++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 88 insertions(+), 28 deletions(-) diff --git a/main.py b/main.py index 4459c01..c977c3c 100644 --- a/main.py +++ b/main.py @@ -27,22 +27,72 @@ from astrbot.core.star.filter.permission import PermissionType PYPPETEER_AVAILABLE = False PYPPETEER_VERSION = None -# 尝试导入 pyppeteer -try: - import pyppeteer - from pyppeteer import launch - PYPPETEER_AVAILABLE = True - - # 检查版本 +def check_pyppeteer_availability(): + """检查 pyppeteer 可用性""" + global PYPPETEER_AVAILABLE, PYPPETEER_VERSION try: - PYPPETEER_VERSION = pyppeteer.__version__ - logger.info(f"使用 pyppeteer {PYPPETEER_VERSION} 作为 PDF 引擎") - except AttributeError: - PYPPETEER_VERSION = "unknown" - logger.info("使用 pyppeteer (版本未知) 作为 PDF 引擎") + import pyppeteer + from pyppeteer import launch + PYPPETEER_AVAILABLE = True -except ImportError: - logger.warning("pyppeteer 未安装,PDF 功能将不可用。请使用 /安装PDF 命令安装 pyppeteer==1.0.2") + # 检查版本 + try: + PYPPETEER_VERSION = pyppeteer.__version__ + logger.info(f"使用 pyppeteer {PYPPETEER_VERSION} 作为 PDF 引擎") + except AttributeError: + PYPPETEER_VERSION = "unknown" + logger.info("使用 pyppeteer (版本未知) 作为 PDF 引擎") + + return True + except ImportError: + PYPPETEER_AVAILABLE = False + PYPPETEER_VERSION = None + logger.warning("pyppeteer 未安装,PDF 功能将不可用。请使用 /安装PDF 命令安装 pyppeteer==1.0.2") + return False + +def reload_pyppeteer(): + """重新加载 pyppeteer 模块""" + global PYPPETEER_AVAILABLE, PYPPETEER_VERSION + import sys + import importlib + + try: + logger.info("开始重新加载 pyppeteer 模块...") + + # 移除所有 pyppeteer 相关模块 + modules_to_remove = [mod for mod in sys.modules.keys() if mod.startswith('pyppeteer')] + logger.info(f"移除模块: {modules_to_remove}") + for mod in modules_to_remove: + del sys.modules[mod] + + # 强制重新导入 + try: + import pyppeteer + from pyppeteer import launch + + # 更新全局变量 + PYPPETEER_AVAILABLE = True + try: + PYPPETEER_VERSION = pyppeteer.__version__ + logger.info(f"重新加载成功,pyppeteer 版本: {PYPPETEER_VERSION}") + except AttributeError: + PYPPETEER_VERSION = "unknown" + logger.info("重新加载成功,pyppeteer 版本未知") + + return True + + except ImportError as e: + logger.error(f"重新导入 pyppeteer 失败: {e}") + PYPPETEER_AVAILABLE = False + PYPPETEER_VERSION = None + return False + + except Exception as e: + logger.error(f"重新加载 pyppeteer 时出错: {e}") + return False + +# 初始检查 +check_pyppeteer_availability() @dataclass @@ -349,22 +399,17 @@ class QQGroupDailyAnalysis(Star): yield event.plain_result("✅ pyppeteer 安装成功!") # 重新检查可用性 - try: - # 重新导入以获取最新版本 - import importlib - if 'pyppeteer' in sys.modules: - importlib.reload(sys.modules['pyppeteer']) - - from pyppeteer import launch - PYPPETEER_AVAILABLE = True + reload_success = reload_pyppeteer() + if reload_success: yield event.plain_result("🎉 PDF 功能安装完成!") + yield event.plain_result(f"✅ pyppeteer {PYPPETEER_VERSION} 已成功加载") yield event.plain_result("💡 现在可以使用 /设置格式 pdf 启用 PDF 报告") - yield event.plain_result("✨ 使用稳定版本 pyppeteer 1.0.2,兼容性更好") - yield event.plain_result("� 注意:首次生成 PDF 时会自动下载 Chromium") - - except ImportError: - yield event.plain_result("⚠️ pyppeteer 安装可能未完成,请重启插件后重试") + yield event.plain_result("📝 注意:首次生成 PDF 时会自动下载 Chromium") + else: + yield event.plain_result("⚠️ pyppeteer 重新加载失败") + yield event.plain_result("🔄 需要你手动去重启一次 AstrBot 程序") + yield event.plain_result("💡 pyppeteer 包已安装,但需要重启程序才能生效") except Exception as e: logger.error(f"安装 PDF 依赖失败: {e}", exc_info=True) @@ -502,11 +547,17 @@ class QQGroupDailyAnalysis(Star): async def _install_chromium(self) -> bool: """安装 Chromium 浏览器""" try: + # 确保 pyppeteer 可用 + if not PYPPETEER_AVAILABLE: + logger.error("pyppeteer 不可用,无法安装 Chromium") + return False + # 尝试直接启动浏览器,这会触发自动下载 logger.info("尝试通过启动浏览器来触发 Chromium 下载") import pyppeteer - browser = await pyppeteer.launch(headless=True, args=['--no-sandbox']) + from pyppeteer import launch + browser = await launch(headless=True, args=['--no-sandbox']) await browser.close() logger.info("成功安装并测试 Chromium") @@ -1267,6 +1318,15 @@ class QQGroupDailyAnalysis(Star): async def _html_to_pdf(self, html_content: str, output_path: str) -> bool: """将 HTML 内容转换为 PDF 文件""" try: + # 确保 pyppeteer 可用 + if not PYPPETEER_AVAILABLE: + logger.error("pyppeteer 不可用,无法生成 PDF") + return False + + # 动态导入 pyppeteer + import pyppeteer + from pyppeteer import launch + # 尝试启动浏览器,如果 Chromium 不存在会自动下载 logger.info("启动浏览器进行 PDF 转换")