Compare commits

..

1 commit
main ... school

Author SHA1 Message Date
Egor Deev
822822c2e0
v. 1.1 2022-05-17 12:11:23 +07:00
4 changed files with 16 additions and 194 deletions

156
README.md
View file

@ -1,154 +1,4 @@
# 🍽️ School Menu Bot
<h2>Бот по взятию и рассылке данных с сайта школы</h2>
Автоматизированная система управления школьным питанием с интеграцией Telegram Bot API для сбора и обработки заказов.
## 🎯 Описание проекта
School Menu Bot представляет собой многофункциональное решение для организации процесса заказа школьного питания. Система обеспечивает автоматический парсинг меню с официального сайта школы, предоставляет интерактивный интерфейс для заказов через Telegram и ведет детальную статистику по группам и пользователям.
## ⭐ Ключевые возможности
### Пользовательский функционал
- **Просмотр меню**: Получение актуального меню на текущий и следующий день
- **Интерактивные заказы**: Система выбора питания через inline-клавиатуры
- **Гибкое планирование**: Возможность заказа комбинаций (завтрак, обед, полдник)
- **Управление заказами**: Отмена и изменение активных заказов
### Административные функции
- **Групповая регистрация**: Система верификации через уникальные коды
- **Аналитика заказов**: Детальная статистика по группам и пользователям
- **Автоматические уведомления**: Ежедневная рассылка меню в 06:00
- **Мультигрупповая поддержка**: Раздельные каналы для учеников и администрации
### Техническая архитектура
- **Парсинг данных**: Автоматическое извлечение меню из Excel-файлов
- **Многоуровневая БД**: Система баз данных для пользователей, групп и заказов
- **Асинхронная обработка**: Неблокирующее выполнение операций
- **Морфологический анализ**: Корректное склонение слов в статистике
## 🛠️ Технологический стек
### Backend Framework
- **Python 3.8+** - Основной язык разработки
- **Aiogram** - Асинхронный фреймворк для Telegram Bot API
- **Asyncio** - Асинхронное программирование
### Data Processing
- **OpenPyXL** - Обработка Excel-файлов с меню
- **Requests** - HTTP-запросы к внешним ресурсам
- **PyMorphy2** - Морфологический анализ русского языка
### Database Management
- **SQLite** - Легковесная встроенная СУБД
- **Многоуровневая архитектура БД**:
- `base.db` - Основные данные групп и пользователей
- `users.db` - Пользовательские связки
- `groups.db` - Групповые данные и статистика
- `now.db` - Текущие активные заказы
## 📁 Структура проекта
```
school_menu/
├── code/
│ ├── bot.py # Основная логика бота
│ ├── pars.py # Парсер школьного меню
│ ├── sql.py # ORM для работы с БД
│ └── base.py # Конфигурация и токены
├── db/
│ ├── base.db # Основная база данных
│ ├── users.db # Пользовательские данные
│ ├── groups.db # Групповая статистика
│ └── now.db # Текущие заказы (пересоздается ежедневно)
├── requirements.txt # Зависимости проекта
└── README.md # Документация
```
## 🚀 Установка и запуск
### Предварительные требования
```bash
pip install -r requirements.txt
```
### Конфигурация
1. Создайте нового бота через [@BotFather](https://t.me/BotFather)
2. Настройте `code/base.py`:
```python
TOKEN = "ваш_токен_от_BotFather"
ID_BOT = ваш_id_бота
TEX_GROUP = "-id_технической_группы"
```
### Запуск системы
```bash
cd code/
python bot.py
```
## 💡 Алгоритм работы
### Процесс регистрации групп
1. Администратор вызывает `/add_group` в личных сообщениях
2. Система генерирует уникальные коды для основной и технической групп
3. Коды вводятся в соответствующих чатах для верификации
4. Создается связка групп с инициализацией статистики
### Система заказов
1. Парсинг актуального меню с `school01.ru/food/`
2. Пользователь выбирает комбинацию питания через `/eat`
3. Заказ фиксируется в основной группе и дублируется в техническую
4. Обновление статистики по группам и пользователям
### Автоматизация процессов
- **06:00 ежедневно**: Рассылка меню на следующий день
- **Учет выходных**: Автоматический пропуск воскресений
- **Сброс заказов**: Ежедневная очистка активных заказов
## 📊 Команды бота
| Команда | Описание | Доступность |
|---------|----------|-------------|
| `/start` | Инициализация бота | Личные сообщения |
| `/help` | Справочная информация | Универсально |
| `/today` | Меню на сегодня | Универсально |
| `/tomorrow` | Меню на завтра | Универсально |
| `/eat` | Интерфейс заказа | Только группы |
| `/stat` | Статистика группы | Только группы |
| `/add_group` | Регистрация групп | Личные сообщения |
| `/del_group` | Удаление связки | Личные сообщения |
## 🎯 Особенности реализации
### Безопасность данных
- Уникальная система кодов для верификации
- Раздельное хранение пользовательских и групповых данных
- Автоматическая очистка временных данных
### Производительность
- Асинхронная архитектура для обработки множественных запросов
- Оптимизированные SQL-запросы с контекстными менеджерами
- Кэширование статистических данных
### Масштабируемость
- Модульная архитектура классов для работы с БД
- Поддержка неограниченного количества групп
- Гибкая система расширения функционала
## 📋 Лицензия
Проект распространяется под лицензией MIT.
## 👥 Автор
**Деев Егор Викторович** - Backend Developer
- GitHub: [@EDeev](https://github.com/EDeev)
- Email: egor@deev.space
- Telegram: [@Egor_Deev](https://t.me/Egor_Deev)
---
<div align="center">
<sub>Разработано для автоматизации процессов школьного питания с упором на удобство использования и надежность системы.</sub>
<p><sub>Создано с ❤️ от вашего дорогого - deev.space ©</sub></p>
</div>
<b>Этот бот может брать данные с айта школы и отсылать, что даёться на сегодня и завтра,
также с возможной отсылкой информации в отдельную группу для уточнее блюда!</b>

View file

@ -1,4 +1,4 @@
TOKEN = "token from BotFather"
TOKEN = "5164296616:AAHwvadm3BrUovhPk8ceKHbPctg654XGkyU"
ID_BOT = **********
TEX_GROUP = "-*********"
ID_BOT = 5164296616
TEX_GROUP = "-700432173"

View file

@ -26,7 +26,15 @@ dn = sql.Now('../db/now.db')
@dp.message_handler(commands="start")
async def start(message: types.Message):
if 0 < int(message.chat.id):
await message.answer("Ghdbtn", types.ParseMode.MARKDOWN)
await message.answer("Это бот для заказов питания!\n\nДля того чтобы начать использование вам надо вызвать "
"команду <b>/add_group</b>. Вам будет выдано два кода для двух групп, первая ваша "
"классная группа со всеми учениками, вторая ваша личная в которую будут приходить "
"сообщения с заказами для удобства отслеживания! Для совершения заказа ученикам надо "
"будет вызвать команду <b>/eat</b> и из меню кнопок выбрать необходимый заказ, "
"уведомление о нём сразу же поступит во вторую группу!\n\nТакже есть две команды "
"*/today* и */tomorrow* с помощью них вы иногда можете посмотреть питание на сегодня и "
"на завтра, но работают команды не стабильно из-за нестабильности выкладки школами меню "
"питания!", types.ParseMode.HTML)
# ОБНОВЛЕНИЕ АЙДИ ГРУППЫ
@ -409,7 +417,7 @@ async def time(wait_for):
data = db.get_day()
if date != data and hour == 6:
if date != data and hour == 11:
for ids in db.get_spec_groups():
group = du.get_first_group_id(ids[0])

View file

@ -1,36 +0,0 @@
# Telegram Bot Framework
aiogram==2.25.1
# Asynchronous HTTP Client
aiohttp==3.8.4
# Excel Files Processing
openpyxl==3.1.2
# HTTP Requests Library
requests==2.31.0
# Russian Language Morphological Analyzer
pymorphy2==0.9.1
# Morphological Dictionary
pymorphy2-dicts-ru==2.4.417127.4579844
# Additional Dependencies
certifi==2023.5.7
charset-normalizer==3.1.0
idna==3.4
urllib3==2.0.3
et-xmlfile==1.1.0
Babel==2.12.1
multidict==6.0.4
yarl==1.9.2
aiosignal==1.3.1
frozenlist==1.3.3
async-timeout==4.0.2
attrs==23.1.0
# Development Dependencies (Optional)
# pytest==7.3.1
# pytest-asyncio==0.21.0
# flake8==6.0.0