Обновление бота многопользовательский режим в Телеграмм
### Описание проекта
Существующий бот написан на Python и управляется через Telegram. Он выполняет торговые операции на спотовом рынке по заданным условиям. Управление ботом осуществляется через меню, созданное с использованием библиотеки aiogram.
Бот взаимодействует с биржей через API MEXC и поддерживает динамическое обновление настроек через JSON-файлы.
### Цель доработки
Добавить возможность предоставления доступа к боту до 100 пользователей Telegram. Пользователи должны быть авторизованы на основе их Telegram ID. Доступ предоставляется на ограниченный период, задаваемый вручную через файл JSON.
### Требования к доработке
#### 1. Структура данных для управления доступомСоздать файл JSON (например, `users.json`) для хранения информации о пользователях. Формат файла:```json[ { "id": 123456789, "api_key": "example_api_key", "start_date": "2024-01-01T00:00:00", "end_date": "2024-01-31T23:59:59", "name": "John Doe" }, { "id": 987654321, "api_key": "another_api_key", "start_date": "2024-01-01T00:00:00", "end_date": "2024-01-15T23:59:59", "name": "Jane Smith" }]```- `id`: Telegram ID пользователя (уникальный идентификатор).- `api_key`: API-ключ для взаимодействия с биржей MEXC.- `start_date` и `end_date`: временные метки начала и окончания доступа в формате ISO 8601.- `name`: имя пользователя для удобства.
#### 2. Авторизация пользователей- При запуске бота и при каждом новом сообщении проверять, авторизован ли пользователь.
- Проверка включает: 1. Наличие Telegram ID в файле `users.json`. 2. Проверку, что текущая дата находится в диапазоне между `start_date` и `end_date`.
Если пользователь не авторизован:
- Вывести сообщение: "Ваш доступ к боту неактивен. Обратитесь к администратору."
- Прекратить обработку дальнейших сообщений от данного пользователя.
#### 3. Изменение структуры существующего кода- Добавить функцию `is_user_authorized(user_id: int) -> bool`:```pythonimport jsonfrom datetime import datetime
def is_user_authorized(user_id: int) -> bool: try: with open('users.json', 'r') as file: users = json.load(file) for user in users: if user['id'] == user_id: now = datetime.utcnow() start_date = datetime.fromisoformat(user['start_date']) end_date = datetime.fromisoformat(user['end_date']) return start_date <= now <= end_date return False except (FileNotFoundError, json.JSONDecodeError): return False```
- Добавить вызов `is_user_authorized` в обработчики сообщений (например, в `handle_message`). Если пользователь не авторизован, отправить соответствующее уведомление.
#### 4. Логирование действий
- Логировать попытки неавторизованного доступа с указанием Telegram ID и временной метки.
- Добавить запись успешных авторизаций в лог-файл (например, `access_log.txt`). Формат:```[2024-01-01 12:00:00] User 123456789 authorized.[2024-01-01 12:05:00] Unauthorized access attempt by user 987654321.```
#### 5. Тестирование
- Проверить корректную работу авторизации при различных условиях:
- Пользователь есть в `users.json`, доступ активен.
- Пользователь есть в `users.json`, доступ истёк.
- Пользователя нет в `users.json`.
- Убедиться, что пользователи с активным доступом могут пользоваться функционалом бота без ограничений.
### Доступные функции и переменныеДля интеграции в существующий код доступны:
- **Функции:** - `handle_message`: основная функция для обработки сообщений. - `update_json_param(param_name, new_value)`: обновляет параметры в JSON-файлах. - `get_json_param(param_name, default_value=None)`: читает параметры из JSON-файлов. - `is_user_authorized(user_id: int) -> bool`: добавляемая функция для проверки авторизации пользователя.- **Глобальные переменные:** - `dp`: объект диспетчера aiogram. - `keyboard_main`, `keyboard_settings`: готовые клавиатуры для управления ботом.
### Ограничения
- Исходный код предоставляется частично. Работать нужно исключительно через указанные функции и добавленные новые функции.
- Не вносить изменения в существующие файлы бота, кроме указанных в задании.
- Внешние библиотеки не должны быть использованы, за исключением стандартных (например, `json`, `datetime`).
### Сроки выполнения
Ожидаемое время выполнения: любое.
### Результат работы
- Обновлённый бот с поддержкой авторизации до 100 пользователей.
- Файл `users.json` для управления пользователями.
- Лог-файл для мониторинга авторизаций.