diff --git a/handlers/media_handler.py b/handlers/media_handler.py index 422418e..cbbceae 100644 --- a/handlers/media_handler.py +++ b/handlers/media_handler.py @@ -1,50 +1,118 @@ import logging -from aiogram import types +from typing import Dict, List +from aiogram import Bot, types # Импортируем Bot из aiogram from aiogram.dispatcher import Dispatcher from config import MODERATORS_CHAT_ID # Логирование logger = logging.getLogger(__name__) +# Словарь для временного хранения альбомов +media_albums: Dict[str, List[types.Message]] = {} + # Обработчик медиа-сообщений async def handle_media_message(message: types.Message): user_id = message.from_user.id content_type = message.content_type + caption = message.caption or "Без подписи" - logger.info(f"Получено медиа-сообщение типа {content_type} от пользователя {user_id}") + # Если это часть медиа-группы + if message.media_group_id: + media_group_id = message.media_group_id + # Создаем список для медиа-группы, если его еще нет + if media_group_id not in media_albums: + media_albums[media_group_id] = [] + + # Добавляем сообщение в группу + media_albums[media_group_id].append(message) + + # Если собрано несколько элементов, отправляем альбом + if len(media_albums[media_group_id]) > 1: + await send_album(media_group_id, message.bot) + + else: + # Если это одиночное медиа + try: + if content_type == "photo": + await message.bot.send_photo( + chat_id=MODERATORS_CHAT_ID, + photo=message.photo[-1].file_id, + caption=f"Анонимное фото:\n{caption}" + ) + elif content_type == "video": + await message.bot.send_video( + chat_id=MODERATORS_CHAT_ID, + video=message.video.file_id, + caption=f"Анонимное видео:\n{caption}" + ) + elif content_type == "audio": + await message.bot.send_audio( + chat_id=MODERATORS_CHAT_ID, + audio=message.audio.file_id, + caption=f"Анонимное аудио:\n{caption}" + ) + elif content_type == "document": + await message.bot.send_document( + chat_id=MODERATORS_CHAT_ID, + document=message.document.file_id, + caption=f"Анонимный документ:\n{caption}" + ) + elif content_type == "sticker": + await message.bot.send_sticker(chat_id=MODERATORS_CHAT_ID, sticker=message.sticker.file_id) + await message.bot.send_message(chat_id=MODERATORS_CHAT_ID, text=f"Анонимный стикер") + elif content_type == "voice": + await message.bot.send_voice( + chat_id=MODERATORS_CHAT_ID, + voice=message.voice.file_id, + caption=f"Анонимное голосовое сообщение:\n{caption}" + ) + elif content_type == "video_note": + await message.bot.send_video_note(chat_id=MODERATORS_CHAT_ID, video_note=message.video_note.file_id) + await message.bot.send_message(chat_id=MODERATORS_CHAT_ID, text=f"Анонимное видеосообщение") + + await message.answer("Ваше медиа-сообщение успешно отправлено администраторам!") + except Exception as e: + logger.error(f"Ошибка при отправке медиа-сообщения: {e}") + await message.answer("Произошла ошибка при отправке сообщения. Попробуйте позже.") + +# Отправка альбома +async def send_album(media_group_id: str, bot: Bot): # Используем Bot из aiogram try: - if content_type == "photo": - await message.bot.send_photo(chat_id=MODERATORS_CHAT_ID, photo=message.photo[-1].file_id) - elif content_type == "video": - await message.bot.send_video(chat_id=MODERATORS_CHAT_ID, video=message.video.file_id) - elif content_type == "audio": - await message.bot.send_audio(chat_id=MODERATORS_CHAT_ID, audio=message.audio.file_id) - elif content_type == "document": - await message.bot.send_document(chat_id=MODERATORS_CHAT_ID, document=message.document.file_id) - elif content_type == "sticker": - await message.bot.send_sticker(chat_id=MODERATORS_CHAT_ID, sticker=message.sticker.file_id) - elif content_type == "voice": - await message.bot.send_voice(chat_id=MODERATORS_CHAT_ID, voice=message.voice.file_id) - elif content_type == "video_note": - await message.bot.send_video_note(chat_id=MODERATORS_CHAT_ID, video_note=message.video_note.file_id) + album = media_albums.pop(media_group_id) # Получаем и удаляем альбом из временного хранилища - await message.answer("Ваше медиа-сообщение успешно отправлено администраторам!") + # Формируем медиа-группу + media_group = [] + caption = album[0].caption or "Без подписи" + + for message in album: + if message.photo: + media_group.append(types.InputMediaPhoto(media=message.photo[-1].file_id)) + elif message.video: + media_group.append(types.InputMediaVideo(media=message.video.file_id)) + + # Отправляем медиа-группу + await bot.send_media_group( + chat_id=MODERATORS_CHAT_ID, + media=media_group + ) + await bot.send_message( + chat_id=MODERATORS_CHAT_ID, + text=f"Анонимная галерея:\n{caption}" + ) except Exception as e: - logger.error(f"Ошибка при отправке медиа-сообщения: {e}") - await message.answer("Произошла ошибка при отправке сообщения. Попробуйте позже.") + logger.error(f"Ошибка при отправке альбома: {e}") + for msg in album: + await msg.answer("Произошла ошибка при отправке галереи. Попробуйте позже.") -# Регистрация обработчика медиа-сообщений +# Регистрация обработчиков def register_media_handler(dp: Dispatcher): - dp.register_message_handler( - handle_media_message, - content_types=[ - types.ContentType.PHOTO, - types.ContentType.VIDEO, - types.ContentType.AUDIO, - types.ContentType.DOCUMENT, - types.ContentType.STICKER, - types.ContentType.VOICE, - types.ContentType.VIDEO_NOTE - ] - ) \ No newline at end of file + dp.register_message_handler(handle_media_message, content_types=[ + types.ContentType.PHOTO, + types.ContentType.VIDEO, + types.ContentType.AUDIO, + types.ContentType.DOCUMENT, + types.ContentType.STICKER, + types.ContentType.VOICE, + types.ContentType.VIDEO_NOTE + ]) \ No newline at end of file diff --git a/main.py b/main.py index 9eb980e..e3c4124 100644 --- a/main.py +++ b/main.py @@ -6,17 +6,21 @@ from handlers.text_handler import register_text_handler from handlers.media_handler import register_media_handler # Настройка логирования -logging.basicConfig(level=logging.INFO) +logging.basicConfig( + level=logging.INFO, + format="%(asctime)s - %(levelname)s - %(name)s - %(message)s" +) # Инициализация бота и диспетчера bot = Bot(token=BOT_TOKEN) dp = Dispatcher(bot) # Регистрация обработчиков -register_commands_handlers(dp) -register_text_handler(dp) -register_media_handler(dp) +register_commands_handlers(dp) # Команды (/start, /whereiam) +register_text_handler(dp) # Текстовые сообщения +register_media_handler(dp) # Медиа-сообщения # Запуск бота if __name__ == "__main__": + logging.info("Бот запущен") executor.start_polling(dp, skip_updates=True) \ No newline at end of file