# 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)}"))