1
0
Fork 0
mirror of https://github.com/EDeev/converterbot.git synced 2026-10-07 20:49:33 +03:00

Бот: лимиты архива — до 10 000 000 файлов и 15 ГБ в распакованном виде

This commit is contained in:
Деев Егор Викторович 2026-10-05 23:32:35 +00:00
parent ce99729477
commit cabb059d22
3 changed files with 6 additions and 6 deletions

View file

@ -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) | | `.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 | | 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 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. a separate thread, so the bot never freezes on big files.

View file

@ -57,7 +57,7 @@ MarkdownToDocxConverter(settings).convert("report.md", "report.docx")
| `.md` | `.docx` по ГОСТ (тот же md2gost с нумерацией заголовков) | | `.md` | `.docx` по ГОСТ (тот же md2gost с нумерацией заголовков) |
| `.zip` с проектом | `.txt`: дерево папок и содержимое текстовых файлов с номерами строк — удобно отдать в LLM или приложить к отчёту | | `.zip` с проектом | `.txt`: дерево папок и содержимое текстовых файлов с номерами строк — удобно отдать в LLM или приложить к отчёту |
Файлы — до 20 МБ. Архив проверяется до распаковки: не больше 5000 файлов и 200 МБ в распакованном виде. Файлы — до 20 МБ. Архив проверяется до распаковки: не больше 10 000 000 файлов и 15 ГБ в распакованном виде.
Служебные папки (`.git`, `node_modules`, `__pycache__`, `build`…) и бинарные файлы пропускаются. Служебные папки (`.git`, `node_modules`, `__pycache__`, `build`…) и бинарные файлы пропускаются.
Конвертация идёт в отдельном потоке, поэтому бот не замирает на больших файлах. Конвертация идёт в отдельном потоке, поэтому бот не замирает на больших файлах.

8
bot.py
View file

@ -20,8 +20,8 @@ from rep_to_txt import generate_complete_project_structure
BOT_TOKEN = os.getenv("BOT_TOKEN", "XXXXXXXXXXXXXXXXXXXXXXXX") # @my_convbot BOT_TOKEN = os.getenv("BOT_TOKEN", "XXXXXXXXXXXXXXXXXXXXXXXX") # @my_convbot
MAX_FILE_SIZE = 20 * 1024 * 1024 # больше Telegram-боту не скачать MAX_FILE_SIZE = 20 * 1024 * 1024 # больше Telegram-боту не скачать
MAX_UNPACKED_SIZE = 200 * 1024 * 1024 # защита от zip-бомбы MAX_UNPACKED_SIZE = 15 * 1024 ** 3 # защита от zip-бомбы: 15 ГБ в распакованном виде
MAX_FILES_IN_ARCHIVE = 5000 MAX_FILES_IN_ARCHIVE = 10_000_000
# Инициализация бота # Инициализация бота
bot = Bot(token=BOT_TOKEN, default=DefaultBotProperties(parse_mode=ParseMode.HTML)) bot = Bot(token=BOT_TOKEN, default=DefaultBotProperties(parse_mode=ParseMode.HTML))
@ -139,9 +139,9 @@ def check_archive(zip_ref: zipfile.ZipFile) -> None:
"""Архив на 20 МБ может распаковаться в гигабайты и забить диск — проверяем до распаковки""" """Архив на 20 МБ может распаковаться в гигабайты и забить диск — проверяем до распаковки"""
infos = zip_ref.infolist() infos = zip_ref.infolist()
if len(infos) > MAX_FILES_IN_ARCHIVE: 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: 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: def analyze_archive(archive_path: str, temp_dir: str) -> str: