work
This commit is contained in:
@@ -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
12
main.py
@@ -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)
|
||||||
Reference in New Issue
Block a user