This commit is contained in:
Mikan
2025-08-07 01:09:33 +03:00
parent a7346ac17f
commit 913832454a
2 changed files with 108 additions and 36 deletions

View File

@@ -1,44 +1,113 @@
import logging import logging
from aiogram import types from typing import Dict, List
from aiogram import Bot, types # Импортируем Bot из aiogram
from aiogram.dispatcher import Dispatcher from aiogram.dispatcher import Dispatcher
from config import MODERATORS_CHAT_ID from config import MODERATORS_CHAT_ID
# Логирование # Логирование
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
# Словарь для временного хранения альбомов
media_albums: Dict[str, List[types.Message]] = {}
# Обработчик медиа-сообщений # Обработчик медиа-сообщений
async def handle_media_message(message: types.Message): async def handle_media_message(message: types.Message):
user_id = message.from_user.id user_id = message.from_user.id
content_type = message.content_type 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: try:
if content_type == "photo": if content_type == "photo":
await message.bot.send_photo(chat_id=MODERATORS_CHAT_ID, photo=message.photo[-1].file_id) await message.bot.send_photo(
chat_id=MODERATORS_CHAT_ID,
photo=message.photo[-1].file_id,
caption=f"Анонимное фото:\n{caption}"
)
elif content_type == "video": elif content_type == "video":
await message.bot.send_video(chat_id=MODERATORS_CHAT_ID, video=message.video.file_id) await message.bot.send_video(
chat_id=MODERATORS_CHAT_ID,
video=message.video.file_id,
caption=f"Анонимное видео:\n{caption}"
)
elif content_type == "audio": elif content_type == "audio":
await message.bot.send_audio(chat_id=MODERATORS_CHAT_ID, audio=message.audio.file_id) await message.bot.send_audio(
chat_id=MODERATORS_CHAT_ID,
audio=message.audio.file_id,
caption=f"Анонимное аудио:\n{caption}"
)
elif content_type == "document": elif content_type == "document":
await message.bot.send_document(chat_id=MODERATORS_CHAT_ID, document=message.document.file_id) await message.bot.send_document(
chat_id=MODERATORS_CHAT_ID,
document=message.document.file_id,
caption=f"Анонимный документ:\n{caption}"
)
elif content_type == "sticker": elif content_type == "sticker":
await message.bot.send_sticker(chat_id=MODERATORS_CHAT_ID, sticker=message.sticker.file_id) 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": elif content_type == "voice":
await message.bot.send_voice(chat_id=MODERATORS_CHAT_ID, voice=message.voice.file_id) await message.bot.send_voice(
chat_id=MODERATORS_CHAT_ID,
voice=message.voice.file_id,
caption=f"Анонимное голосовое сообщение:\n{caption}"
)
elif content_type == "video_note": 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_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("Ваше медиа-сообщение успешно отправлено администраторам!") await message.answer("Ваше медиа-сообщение успешно отправлено администраторам!")
except Exception as e: except Exception as e:
logger.error(f"Ошибка при отправке медиа-сообщения: {e}") logger.error(f"Ошибка при отправке медиа-сообщения: {e}")
await message.answer("Произошла ошибка при отправке сообщения. Попробуйте позже.") await message.answer("Произошла ошибка при отправке сообщения. Попробуйте позже.")
# Регистрация обработчика медиа-сообщений # Отправка альбома
async def send_album(media_group_id: str, bot: Bot): # Используем Bot из aiogram
try:
album = media_albums.pop(media_group_id) # Получаем и удаляем альбом из временного хранилища
# Формируем медиа-группу
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}")
for msg in album:
await msg.answer("Произошла ошибка при отправке галереи. Попробуйте позже.")
# Регистрация обработчиков
def register_media_handler(dp: Dispatcher): def register_media_handler(dp: Dispatcher):
dp.register_message_handler( dp.register_message_handler(handle_media_message, content_types=[
handle_media_message,
content_types=[
types.ContentType.PHOTO, types.ContentType.PHOTO,
types.ContentType.VIDEO, types.ContentType.VIDEO,
types.ContentType.AUDIO, types.ContentType.AUDIO,
@@ -46,5 +115,4 @@ def register_media_handler(dp: Dispatcher):
types.ContentType.STICKER, types.ContentType.STICKER,
types.ContentType.VOICE, types.ContentType.VOICE,
types.ContentType.VIDEO_NOTE types.ContentType.VIDEO_NOTE
] ])
)

12
main.py
View File

@@ -6,17 +6,21 @@ from handlers.text_handler import register_text_handler
from handlers.media_handler import register_media_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) bot = Bot(token=BOT_TOKEN)
dp = Dispatcher(bot) dp = Dispatcher(bot)
# Регистрация обработчиков # Регистрация обработчиков
register_commands_handlers(dp) register_commands_handlers(dp) # Команды (/start, /whereiam)
register_text_handler(dp) register_text_handler(dp) # Текстовые сообщения
register_media_handler(dp) register_media_handler(dp) # Медиа-сообщения
# Запуск бота # Запуск бота
if __name__ == "__main__": if __name__ == "__main__":
logging.info("Бот запущен")
executor.start_polling(dp, skip_updates=True) executor.start_polling(dp, skip_updates=True)