Обновление бота многопользовательский режим в Телеграмм

Цена договорная
26 декабря 2024, 19:10 • 9 откликов • 57 просмотров
### Описание проекта
Существующий бот написан на 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`:
```python
import json
from 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` для управления пользователями.
- Лог-файл для мониторинга авторизаций.