From 1ef9dc18bb578a3b236f9c488c8a33fba54cc0ea Mon Sep 17 00:00:00 2001 From: "Evgeniy L." Date: Sat, 15 Mar 2025 10:10:55 +0500 Subject: [PATCH] Initial commit --- .gitignore | 5 ++ Modules/getAnecdote.py | 57 +++++++++++++++++ README.md | 73 +++++++++++++++++++++ assets/pressetation.pptx | Bin 0 -> 33527 bytes assets/tech_doc.docx | Bin 0 -> 36623 bytes config.py | 19 ++++++ keyboard.py | 22 +++++++ main.py | 133 +++++++++++++++++++++++++++++++++++++++ requirements.txt | 4 ++ 9 files changed, 313 insertions(+) create mode 100644 .gitignore create mode 100644 Modules/getAnecdote.py create mode 100644 README.md create mode 100644 assets/pressetation.pptx create mode 100644 assets/tech_doc.docx create mode 100644 config.py create mode 100644 keyboard.py create mode 100644 main.py create mode 100644 requirements.txt diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5fe22d1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +__pycache__/ +.env +.venv/ +.idea/ +.vscode/ diff --git a/Modules/getAnecdote.py b/Modules/getAnecdote.py new file mode 100644 index 0000000..1707ac7 --- /dev/null +++ b/Modules/getAnecdote.py @@ -0,0 +1,57 @@ +import asyncio +import aiohttp +from bs4 import BeautifulSoup + +import random +import logging + +URL = 'https://nekdo.ru/random/' +HEADERS = { + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36" +} + +JOKES_list = [ + '''— Доктор, у меня проблема: я всё время забываю, что хотел сказать. +— Сколько это уже продолжается? +— Что «это»?''', + + '''— Почему вы опоздали на работу? +— Проспал. +— И что, до 16:00 спали? +— Нет, до 15:55.''', + + '''— Папа, а кто такой пессимист? +— Это человек, который, когда ему дают выбор между двумя злами, выбирает оба.''', +] + +def findInSoup(soup: BeautifulSoup): + element = soup.find('div', id=True, class_=True) + return element + +async def getAnecdote() -> str: + logging.info("Запрашиваю анекдот с сайта.") + async with aiohttp.ClientSession(headers=HEADERS) as session: + try: + async with session.get(URL) as response: + if response.status == 200: + logging.info("Успешно получен ответ от сервера.") + html = await response.text() + soup = BeautifulSoup(html, 'html.parser') + + element = findInSoup(soup) + if element: + logging.info("Анекдот успешно найден на странице.") + return element.text.strip() + + logging.warning(f"Получен неудачный статус ответа: {response.status}. Использую локальный анекдот.") + return random.choice(JOKES_list) + except Exception as e: + logging.error(f"Ошибка при запросе: {e}. Использую локальный анекдот.") + return random.choice(JOKES_list) + +if __name__ == "__main__": + async def main(): + text = await getAnecdote() + print(text) + + asyncio.run(main()) \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..adb3dd1 --- /dev/null +++ b/README.md @@ -0,0 +1,73 @@ +# Telegram Бот для Проекта SRSP + +Телеграм-бот для предоставления информации о команде разработчиков, документации и презентации проекта. + +## Описание + +Этот бот предоставляет удобный интерфейс для доступа к информации о команде разработчиков, технической документации и презентации проекта. Бот разработан с использованием библиотеки aiogram 3.x. + +## Функциональность + +- `/start` - Начать работу с ботом и отобразить основную клавиатуру. +- В ответном сообщение отправляется случайный анекдот с сайта nekdo.ru +- `/team_members` - Показать информацию о членах команды разработчиков +- `/documentation` - Скачать техническую документацию проекта +- `/presentation` - Скачать презентацию проекта +- `/help` - Показать список доступных команд + +## Установка и запуск + +### Предварительные требования + +- Python 3.8 или выше +- pip (менеджер пакетов Python) + +### Шаги по установке + +1. Клонировать репозиторий: +```bash +git clone https://github.com/ArtzSU/SRSP-bot +cd tgbotsrsp +``` + +2. Создать и активировать виртуальное окружение: +```bash +python -m venv .venv +# Для Windows +.venv\Scripts\activate +# Для macOS/Linux +source .venv/bin/activate +``` + +3. Установить зависимости: +```bash +pip install -r requirements.txt +``` + +4. Создать файл `.env` в корневой директории проекта и добавить токен бота: +``` +BOT_TOKEN=ваш_токен_бота +``` + +### Запуск бота + +```bash +python main.py +``` + +## Структура проекта + +- `main.py` - Основной файл с логикой бота +- `config.py` - Конфигурационный файл с константами и настройками +- `keyboard.py` - Файл с определениями клавиатур для бота +- `assets/` - Директория с ресурсами (документация, презентация) +- `Modules/` - Директория с модулями +- `Modules/getAnecdote.py` - Модуль запроса случайного анекдота +- `requirements.txt` - Список зависимостей проекта + +## Команда разработчиков + +- Лукьянов Е. - @artzsu +- Серик Т. - @tam_serik +- Скрипченко В. - @Sunny_Vls +- Исламберди А. - @Y191900 diff --git a/assets/pressetation.pptx b/assets/pressetation.pptx new file mode 100644 index 0000000000000000000000000000000000000000..85761c308c6978f3a004830a061142497f4635f6 GIT binary patch literal 33527 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 TUQkeUpf46=D5%1BKkxkyoG^=@ literal 0 HcmV?d00001 diff --git a/assets/tech_doc.docx b/assets/tech_doc.docx new file mode 100644 index 0000000000000000000000000000000000000000..9bfc08828c30c78c458bfb0e7ebee870be1ddc7f GIT binary patch literal 36623 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 F9ssk%s@ebm literal 0 HcmV?d00001 diff --git a/config.py b/config.py new file mode 100644 index 0000000..d67787f --- /dev/null +++ b/config.py @@ -0,0 +1,19 @@ +import os +from dotenv import load_dotenv + +if not load_dotenv(): + raise FileNotFoundError('.env file does not exist') + +TOKEN = os.environ.get('BOT_TOKEN') +if not TOKEN: + raise ValueError("BOT_TOKEN is not set in the environment variables") + +DEBUG = os.environ.get('DEBUG', 'False').lower() in ('true', '1', 'yes', 'on') + +TEAM_MEMBERS_STR = """ +Team: +- Lukyanov E. - @queue_qq +- Serik T. - @tam_serik +- Skripchenko V. - @Sunny_Vls +- Islamberdi A. - @Y191900 +""" diff --git a/keyboard.py b/keyboard.py new file mode 100644 index 0000000..5356dde --- /dev/null +++ b/keyboard.py @@ -0,0 +1,22 @@ +from aiogram.types import ( + KeyboardButton, + ReplyKeyboardMarkup, +) + +# REPLY_KEYBOARDS +main_kb = ReplyKeyboardMarkup( + keyboard = [ + [ + KeyboardButton(text="/team_members") + ], + [ + KeyboardButton(text="/documentation"), + KeyboardButton(text="/presentation"), + ], + [ + KeyboardButton(text="/help") + ] + ], + resize_keyboard=True, + input_field_placeholder="Choose one option", +) diff --git a/main.py b/main.py new file mode 100644 index 0000000..fae81d7 --- /dev/null +++ b/main.py @@ -0,0 +1,133 @@ +import asyncio +import logging + +from aiogram.filters import Command +from aiogram.enums import ParseMode, ChatType +from aiogram.client.default import DefaultBotProperties +from aiogram import ( + F, + Bot, + html, + Dispatcher, +) +from aiogram.types import ( + Message, + FSInputFile, + BotCommand, +) + +from Modules.getAnecdote import getAnecdote + +import config + +from keyboard import main_kb + + +logger = logging.getLogger(__name__) +logging.basicConfig( + level=logging.DEBUG if config.DEBUG else logging.INFO, + format='%(asctime)s - %(levelname)s - %(message)s' +) + +dp = Dispatcher() +bot = Bot( + token=config.TOKEN, + default=DefaultBotProperties( + parse_mode=ParseMode.HTML + ) +) + + +async def set_commands(service: Bot): + """ + Регистрация команд бота в меню команд Telegram + """ + commands = [ + BotCommand(command="start", description="Start the bot"), + BotCommand(command="help", description="Help"), + BotCommand(command="team_members", description="Show members of development team"), + BotCommand(command="documentation", description="Show documentation"), + BotCommand(command="presentation", description="Show presentation"), + ] + + await service.set_my_commands(commands) + logger.info("Команды бота успешно зарегистрированы") + + + +@dp.message(Command("start")) +async def command_start_handler(message: Message) -> None: + """ + Handler for the `/start` command + """ + + await message.reply( + text=f"Hello, {html.bold(message.from_user.full_name)}! {await getAnecdote()}", + reply_markup=main_kb + ) + + +@dp.message(Command("team_members")) +async def command_of_devers(message: Message): + """ + Handler for the `/team_members` command + """ + + await message.reply(text=config.TEAM_MEMBERS_STR) + + +@dp.message(Command("help")) +async def cmd_help(message: Message): + """ + Handler for the `/help` command + """ + + await message.reply( + text = """Вот список команд: +/start - начать работу +/help - вывести это сообщение +/documentation - отправляет отчет проделанной работы +/presentation - отправляет презентацию о боте""" + + ) + + +@dp.message(Command("documentation")) +async def cmd_doc(message: Message): + """ + Handler for the `/documentation` command + """ + + await message.reply_document( + document=FSInputFile(path="assets/tech_doc.docx", filename="техническая документация.docx") + ) + + +@dp.message(Command("presentation")) +async def cmd_presentation(message: Message): + """ + Handler for the `/presentation` command + """ + + await message.reply_document( + document=FSInputFile(path="assets/pressetation.pptx", filename="презентация.pptx") + ) + + +async def main() -> None: + """ + Main function to start the bot + """ + + logging.info("Starting bot") + + dp.message.filter(F.chat.type == ChatType.PRIVATE) + dp.callback_query.filter(F.message.chat.type == ChatType.PRIVATE) + + await set_commands(bot) + await bot.delete_webhook(drop_pending_updates=True) + await dp.start_polling(bot) + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..3ee397a --- /dev/null +++ b/requirements.txt @@ -0,0 +1,4 @@ +aiogram~=3.18.0 +python-dotenv~=1.0.1 +beautifulsoup4~=4.13.3 +requests~=2.32.3