diff --git a/config.py b/config.py new file mode 100644 index 0000000..e91d4c6 --- /dev/null +++ b/config.py @@ -0,0 +1,9 @@ +import os +from dotenv import load_dotenv + +# Загрузка переменных окружения из файла .env +load_dotenv() + +# Настройки бота +BOT_TOKEN = os.getenv("BOT_TOKEN") +MODERATORS_CHAT_ID = int(os.getenv("MODERATORS_CHAT_ID")) \ No newline at end of file diff --git a/handlers/__init__.py b/handlers/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/handlers/commands.py b/handlers/commands.py new file mode 100644 index 0000000..976661f --- /dev/null +++ b/handlers/commands.py @@ -0,0 +1,24 @@ +from aiogram import types +from aiogram.dispatcher import Dispatcher +from config import MODERATORS_CHAT_ID + +# Обработчик команды /start +async def send_welcome(message: types.Message): + await message.answer( + "Привет! Я анонимный бот для связи с администрацией. " + "Просто отправьте мне сообщение, и я передам его администраторам." + ) + +# Обработчик команды /whereiam (только для групп) +async def get_group_id(message: types.Message): + chat_id = message.chat.id + chat_title = message.chat.title or "Беседа без названия" + await message.answer( + f"ID этой группы: `{chat_id}`\nНазвание: {chat_title}", + parse_mode="Markdown" + ) + +# Регистрация обработчиков команд +def register_commands_handlers(dp: Dispatcher): + dp.register_message_handler(send_welcome, commands=["start"]) + dp.register_message_handler(get_group_id, commands=["whereiam"], chat_type=[types.ChatType.GROUP, types.ChatType.SUPERGROUP]) \ No newline at end of file diff --git a/handlers/media_handler.py b/handlers/media_handler.py new file mode 100644 index 0000000..422418e --- /dev/null +++ b/handlers/media_handler.py @@ -0,0 +1,50 @@ +import logging +from aiogram import types +from aiogram.dispatcher import Dispatcher +from config import MODERATORS_CHAT_ID + +# Логирование +logger = logging.getLogger(__name__) + +# Обработчик медиа-сообщений +async def handle_media_message(message: types.Message): + user_id = message.from_user.id + content_type = message.content_type + + logger.info(f"Получено медиа-сообщение типа {content_type} от пользователя {user_id}") + + 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) + + await message.answer("Ваше медиа-сообщение успешно отправлено администраторам!") + except Exception as e: + logger.error(f"Ошибка при отправке медиа-сообщения: {e}") + await message.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 diff --git a/handlers/text_handler.py b/handlers/text_handler.py new file mode 100644 index 0000000..5215fd4 --- /dev/null +++ b/handlers/text_handler.py @@ -0,0 +1,28 @@ +import logging +from aiogram import types +from aiogram.dispatcher import Dispatcher +from config import MODERATORS_CHAT_ID + +# Логирование +logger = logging.getLogger(__name__) + +# Обработчик текстовых сообщений +async def handle_text_message(message: types.Message): + user_id = message.from_user.id + user_message = message.text + + logger.info(f"Получено текстовое сообщение от пользователя {user_id}: {user_message}") + + try: + await message.bot.send_message( + chat_id=MODERATORS_CHAT_ID, + text=f"Анонимное текстовое сообщение:\n{user_message}" + ) + await message.answer("Ваше сообщение успешно отправлено администраторам!") + except Exception as e: + logger.error(f"Ошибка при отправке сообщения: {e}") + await message.answer("Произошла ошибка при отправке сообщения. Попробуйте позже.") + +# Регистрация обработчика текстовых сообщений +def register_text_handler(dp: Dispatcher): + dp.register_message_handler(handle_text_message, content_types=types.ContentTypes.TEXT) \ No newline at end of file diff --git a/main.py b/main.py index 4237473..9eb980e 100644 --- a/main.py +++ b/main.py @@ -1,99 +1,21 @@ -import os import logging -from aiogram import Bot, Dispatcher, types -from aiogram.utils import executor -from dotenv import load_dotenv - -# Загрузка переменных окружения из файла .env -load_dotenv() - -# Инициализация бота и диспетчера -BOT_TOKEN = os.getenv("BOT_TOKEN") -MODERATORS_CHAT_ID = int(os.getenv("MODERATORS_CHAT_ID")) - -bot = Bot(token=BOT_TOKEN) -dp = Dispatcher(bot) +from aiogram import Bot, Dispatcher, executor +from config import BOT_TOKEN +from handlers.commands import register_commands_handlers +from handlers.text_handler import register_text_handler +from handlers.media_handler import register_media_handler # Настройка логирования logging.basicConfig(level=logging.INFO) -# Обработчик команды /start -@dp.message_handler(commands=["start"]) -async def send_welcome(message: types.Message): - await message.answer( - "Привет! Я анонимный бот для связи с администрацией. " - "Просто отправьте мне сообщение, и я передам его администраторам." - ) +# Инициализация бота и диспетчера +bot = Bot(token=BOT_TOKEN) +dp = Dispatcher(bot) -# Обработчик команды /whereiam (только для групп) -@dp.message_handler(commands=["whereiam"], chat_type=[types.ChatType.GROUP, types.ChatType.SUPERGROUP]) -async def get_group_id(message: types.Message): - chat_id = message.chat.id - chat_title = message.chat.title or "Беседа без названия" - await message.answer( - f"ID этой группы: `{chat_id}`\nНазвание: {chat_title}", - parse_mode="Markdown" - ) - -# Обработчик текстовых сообщений -@dp.message_handler(content_types=types.ContentTypes.TEXT) -async def handle_text_message(message: types.Message): - user_id = message.from_user.id - user_message = message.text - - # Логирование входящего сообщения - logging.info(f"Получено текстовое сообщение от пользователя {user_id}: {user_message}") - - # Пересылка текстового сообщения в чат модераторов - try: - await bot.send_message( - chat_id=MODERATORS_CHAT_ID, - text=f"Анонимное текстовое сообщение:\n{user_message}" - ) - await message.answer("Ваше сообщение успешно отправлено администраторам!") - except Exception as e: - logging.error(f"Ошибка при отправке сообщения: {e}") - await message.answer("Произошла ошибка при отправке сообщения. Попробуйте позже.") - -# Обработчик медиа-сообщений (фото, видео, аудио, документы и т.д.) -@dp.message_handler(content_types=[ - types.ContentType.PHOTO, - types.ContentType.VIDEO, - types.ContentType.AUDIO, - types.ContentType.DOCUMENT, - types.ContentType.STICKER, - types.ContentType.VOICE, - types.ContentType.VIDEO_NOTE -]) -async def handle_media_message(message: types.Message): - user_id = message.from_user.id - content_type = message.content_type - - # Логирование входящего сообщения - logging.info(f"Получено медиа-сообщение типа {content_type} от пользователя {user_id}") - - # Пересылка медиа-сообщения в чат модераторов - try: - if content_type == "photo": - # Отправляем самую большую версию фото - await bot.send_photo(chat_id=MODERATORS_CHAT_ID, photo=message.photo[-1].file_id) - elif content_type == "video": - await bot.send_video(chat_id=MODERATORS_CHAT_ID, video=message.video.file_id) - elif content_type == "audio": - await bot.send_audio(chat_id=MODERATORS_CHAT_ID, audio=message.audio.file_id) - elif content_type == "document": - await bot.send_document(chat_id=MODERATORS_CHAT_ID, document=message.document.file_id) - elif content_type == "sticker": - await bot.send_sticker(chat_id=MODERATORS_CHAT_ID, sticker=message.sticker.file_id) - elif content_type == "voice": - await bot.send_voice(chat_id=MODERATORS_CHAT_ID, voice=message.voice.file_id) - elif content_type == "video_note": - await bot.send_video_note(chat_id=MODERATORS_CHAT_ID, video_note=message.video_note.file_id) - - await message.answer("Ваше медиа-сообщение успешно отправлено администраторам!") - except Exception as e: - logging.error(f"Ошибка при отправке медиа-сообщения: {e}") - await message.answer("Произошла ошибка при отправке сообщения. Попробуйте позже.") +# Регистрация обработчиков +register_commands_handlers(dp) +register_text_handler(dp) +register_media_handler(dp) # Запуск бота if __name__ == "__main__":