From cabb059d2257905f3c1c55ac27d275610a2fe705 Mon Sep 17 00:00:00 2001 From: Egor Deev Date: Mon, 5 Oct 2026 23:32:35 +0000 Subject: [PATCH] =?UTF-8?q?=D0=91=D0=BE=D1=82:=20=D0=BB=D0=B8=D0=BC=D0=B8?= =?UTF-8?q?=D1=82=D1=8B=20=D0=B0=D1=80=D1=85=D0=B8=D0=B2=D0=B0=20=E2=80=94?= =?UTF-8?q?=20=D0=B4=D0=BE=2010=20000=20000=20=D1=84=D0=B0=D0=B9=D0=BB?= =?UTF-8?q?=D0=BE=D0=B2=20=D0=B8=2015=20=D0=93=D0=91=20=D0=B2=20=D1=80?= =?UTF-8?q?=D0=B0=D1=81=D0=BF=D0=B0=D0=BA=D0=BE=D0=B2=D0=B0=D0=BD=D0=BD?= =?UTF-8?q?=D0=BE=D0=BC=20=D0=B2=D0=B8=D0=B4=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.en.md | 2 +- README.md | 2 +- bot.py | 8 ++++---- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/README.en.md b/README.en.md index 8d8a3b0..bf68ae4 100644 --- a/README.en.md +++ b/README.en.md @@ -58,7 +58,7 @@ The Markdown parser is custom and line-based: nested tables and lists inside tab | `.md` | a GOST-formatted `.docx` (the same md2gost, with heading numbers) | | project `.zip` | a `.txt`: folder tree and contents of text files with line numbers, handy for an LLM or a report appendix | -Files up to 20 MB. Archives are checked before extraction: at most 5000 files and 200 MB unpacked. Service +Files up to 20 MB. Archives are checked before extraction: at most 10,000,000 files and 15 GB unpacked. Service folders (`.git`, `node_modules`, `__pycache__`, `build`…) and binary files are skipped. Conversion runs in a separate thread, so the bot never freezes on big files. diff --git a/README.md b/README.md index 5a34825..832c68e 100644 --- a/README.md +++ b/README.md @@ -57,7 +57,7 @@ MarkdownToDocxConverter(settings).convert("report.md", "report.docx") | `.md` | `.docx` по ГОСТ (тот же md2gost с нумерацией заголовков) | | `.zip` с проектом | `.txt`: дерево папок и содержимое текстовых файлов с номерами строк — удобно отдать в LLM или приложить к отчёту | -Файлы — до 20 МБ. Архив проверяется до распаковки: не больше 5000 файлов и 200 МБ в распакованном виде. +Файлы — до 20 МБ. Архив проверяется до распаковки: не больше 10 000 000 файлов и 15 ГБ в распакованном виде. Служебные папки (`.git`, `node_modules`, `__pycache__`, `build`…) и бинарные файлы пропускаются. Конвертация идёт в отдельном потоке, поэтому бот не замирает на больших файлах. diff --git a/bot.py b/bot.py index e39ee36..bc5ada3 100644 --- a/bot.py +++ b/bot.py @@ -20,8 +20,8 @@ from rep_to_txt import generate_complete_project_structure BOT_TOKEN = os.getenv("BOT_TOKEN", "XXXXXXXXXXXXXXXXXXXXXXXX") # @my_convbot MAX_FILE_SIZE = 20 * 1024 * 1024 # больше Telegram-боту не скачать -MAX_UNPACKED_SIZE = 200 * 1024 * 1024 # защита от zip-бомбы -MAX_FILES_IN_ARCHIVE = 5000 +MAX_UNPACKED_SIZE = 15 * 1024 ** 3 # защита от zip-бомбы: 15 ГБ в распакованном виде +MAX_FILES_IN_ARCHIVE = 10_000_000 # Инициализация бота bot = Bot(token=BOT_TOKEN, default=DefaultBotProperties(parse_mode=ParseMode.HTML)) @@ -139,9 +139,9 @@ def check_archive(zip_ref: zipfile.ZipFile) -> None: """Архив на 20 МБ может распаковаться в гигабайты и забить диск — проверяем до распаковки""" infos = zip_ref.infolist() if len(infos) > MAX_FILES_IN_ARCHIVE: - raise ArchiveTooLarge(f"В архиве больше {MAX_FILES_IN_ARCHIVE} файлов") + raise ArchiveTooLarge(f"В архиве больше {MAX_FILES_IN_ARCHIVE:,} файлов".replace(",", " ")) if sum(info.file_size for info in infos) > MAX_UNPACKED_SIZE: - raise ArchiveTooLarge(f"Распакованный архив больше {MAX_UNPACKED_SIZE // 1024 // 1024} МБ") + raise ArchiveTooLarge(f"Распакованный архив больше {MAX_UNPACKED_SIZE / 1024 ** 3:g} ГБ") def analyze_archive(archive_path: str, temp_dir: str) -> str: