diff --git a/BotCode/routers/downloads/download_handlers.py b/BotCode/routers/downloads/download_handlers.py new file mode 100644 index 0000000..a322fc5 --- /dev/null +++ b/BotCode/routers/downloads/download_handlers.py @@ -0,0 +1,97 @@ +# BotCode/BotLibrary/analitics/log_type.py +# Закачка всех полученных медиа в бота (в разработке + сделать логирование!!!) + +import os +import requests +from aiogram import Router, types + +from BotLibrary import * +from .download_avatar_all import download_avatar + +# Создание роутера и настройка экспорта модулей +__all__ = ("router", "handle_media",) +router = Router(name="download_media_router") +log_type = "Media" + + +# Функция для скачивания медиа отправленного в бота +@router.message(F_Media) +async def handle_media(message: types.Message): + try: + await download_avatar(message) + name = find_chat_id(message) + await logginger(message) + file_id = None + + # Определяем тип контента и соответствующие параметры + if message.content_type in (types.ContentType.VIDEO, types.ContentType.ANIMATION): + media = message.video if message.content_type == types.ContentType.VIDEO else message.animation + file_extension = media.mime_type.split('/')[-1] # Получаем расширение файла (например, "mp4" или "gif") + file_name = f"{media.file_id}.{file_extension}" # Используем file_id и расширение для имени + save_dir = ImportantPath.video_directory if message.content_type == types.ContentType.VIDEO \ + else ImportantPath.gif_directory + + elif message.content_type == types.ContentType.PHOTO: + media = message.photo + # Получение file_id для самого качественного фото + file_id = max(message.photo, key=lambda x: x.width * x.height).file_id + file_info = await bot.get_file(file_id) + # Имя файла будет взято из file_path, который содержит оригинальное имя файла + file_name = file_info.file_path.split('/')[-1] # Используем имя файла из пути + save_dir = ImportantPath.photo_directory + + elif message.content_type == types.ContentType.VOICE: + media = message.voice + file_name = f"{media.file_id}.ogg" # Для голосовых сообщений используем file_id и расширение .ogg + save_dir = ImportantPath.voice_directory + + elif message.content_type == types.ContentType.VIDEO_NOTE: + media = message.video_note + file_name = f"{media.file_id}.mp4" # Для видеосообщений используем file_id и расширение .mp4 + save_dir = ImportantPath.videonote_directory + + elif message.content_type == types.ContentType.DOCUMENT: + media = message.document + file_name = media.file_name # Для видеосообщений используем file_id и расширение .mp4 + save_dir = ImportantPath.document_directory + + else: + (logger.bind(log_type=log_type, user=message.from_user.username) + .error(f"Неизвестный тип контента: {message.content_type}")) + raise ValueError() + + # Убедимся, что директория существует + os.makedirs(save_dir, exist_ok=True) + + # Если это фото, file_id был определен внутри блока обработки фото + if file_id is not None: + file_info = await bot.get_file(file_id) + else: + file_info = await bot.get_file(media.file_id) + + save_path = os.path.join(save_dir, file_name) + + # Загружаем медиафайл + if message.content_type == types.ContentType.PHOTO: + # Для фото скачиваем отдельно + file_url = f"https://api.telegram.org/file/bot{bot_token}/{file_info.file_path}" + response = requests.get(file_url) + if response.status_code == 200: + with open(save_path, "wb") as file: + file.write(response.content) + else: + await bot.download_file(file_info.file_path, save_path) + + # Логирование успешного скачивания + logger.bind(log_type=log_type, user=f"@{message.from_user.username}").info( + f"Файл из ({name}) успешно скачан! Сохранён как: {save_path}") + + except ValueError as ve: + # Обработка ошибок типа контента + (logger.bind(log_type=log_type, user=f"@{message.from_user.username}") + .error(f"ОШИБКА: {str(ve)}")) + + except Exception as e: + # Логирование общих ошибок + (logger.bind(log_type=log_type, user=f"@{message.from_user.username}") + .error(f"МЕДИЯ ОШИБКА: {str(e)}"))