Создание системы рекомендаций для Telegram-бота на базе библиотеки aiogram — это интересное и непростое задание. Давайте разберем основные шаги, которые вам необходимо проделать для реализации такой системы.
### 1. Определите структуру базы данных
Вам действительно понадобятся две основные таблицы:
- **Пользователи** (users)
- `user_id` (уникальный идентификатор пользователя)
- `username` (имя пользователя или идентификатор в Telegram)
- Другие поля (например, возраст, местоположение и т. д.)
- **Оценки** (ratings)
- `rating_id` (уникальный идентификатор оценки)
- `user_id` (идентификатор пользователя, который поставил лайк)
- `liked_user_id` (идентификатор пользователя, которому поставили лайк)
- `created_at` (дата и время оценки)
Пример можно реализовать с помощью SQLite, PostgreSQL или другой СУБД на ваш выбор.
### 2. Создание бота на aiogram
Создайте базовую структуру бота с aiogram, включая обработчики команд (start, help и т. д.).
```python
from aiogram import Bot, Dispatcher, types
from aiogram.contrib.fsm_storage.memory import MemoryStorage
from aiogram.utils import executor
import sqlite3
bot = Bot(token='YOUR_BOT_TOKEN')
dp = Dispatcher(bot, storage=MemoryStorage())
# Подключение к базе данных
conn = sqlite3.connect('my_bot.db')
cursor = conn.cursor()
```
### 3. Регистрация пользователей
Когда новый пользователь запускает бота, вам следует зарегистрировать его в базе данных.
```python
@dp.message_handler(commands=['start'])
async def start_command(message: types.Message):
user_id = message.from_user.id
username = message.from_user.username
cursor.execute("INSERT OR IGNORE INTO users (user_id, username) VALUES (?, ?)", (user_id, username))
conn.commit()
await message.answer("Добро пожаловать! Используйте /like или /liked для работы с лайками.")
```
### 4. Лайки и управление оценками
Создайте команду для того, чтобы пользователь мог ставить лайк другому пользователю.
```python
@dp.message_handler(commands=['like'])
async def like_command(message: types.Message):
user_id = message.from_user.id
# Допустим, мы хотим лайкнуть пользователя с ID 123
liked_user_id = 123
cursor.execute("INSERT INTO ratings (user_id, liked_user_id, created_at) VALUES (?, ?, datetime('now'))", (user_id, liked_user_id))
conn.commit()
await message.answer("Вы поставили лайк пользователю {}!".format(liked_user_id))
```
### 5. Отображение пользователей, которые лайкнули вас
Создайте команду, чтобы показать список пользователей, которые лайкнули текущего пользователя.
```python
@dp.message_handler(commands=['liked'])
async def liked_command(message: types.Message):
user_id = message.from_user.id
cursor.execute("SELECT user_id FROM ratings WHERE liked_user_id = ?", (user_id,))
liked_users = cursor.fetchall()
if liked_users:
response = "Вы были лайкнуты пользователями:\n"
for (liked_user_id,) in liked_users:
response += f"Пользователь ID: {liked_user_id}\n"
else:
response = "Никто не лайкнул вас."
await message.answer(response)
```
### 6. Рекомендательная система
Для создания рекомендаций можно использовать разные методы, например, учитывать, кто из пользователей нравится другим пользователям. Вы можете строить простую рекомендательную систему, анализируя лайки и предлагая пользователям пользователей с высокой взаимной оценкой.
Вот пример простейшего подхода:
```python
def recommend_users(user_id):
# Поиск пользователей, которые имеют перекрестные лайки с данным пользователем
cursor.execute("""
SELECT liked_user_id
FROM ratings
WHERE user_id IN (
SELECT liked_user_id
FROM ratings
WHERE user_id = ?
)
AND liked_user_id != ?
GROUP BY liked_user_id
""", (user_id, user_id))
recommendations = cursor.fetchall()
return recommendations
```
### 7. Тестирование и доработка
После реализации этих функций протестируйте систему, пополняйте базу данных тестовыми пользователями и отслеживайте, как работает система рекомендаций. Это поможет вам понять, как можно улучшить алгоритмы для более точных рекомендаций.