Netology course project#2
Бот для поиска знакомств в социальной сети ВКонтакте.
Бот производит поиск возможных вариантов для знакомства исходя из информации в профиле пользователя.
По умолчанию программа ищет в том же городе, диапазон возраста +/- 5 лет от возраста пользователя, противоположный пол.
При необходимости пользователь может задать другие возрастные рамки и другой город. Минимальный возраст для поиска - 18 лет.
Функционал бота позволяет сохранять (и удалять) пользователей в спиок "Избранное", переходить в этот список, осуществлять там навигацию.
Список избранного хранится в БД Postgres, настройки доступа к которой задаются в конфигурационном файле.
- Настройка базы данных производится через ini-файл. Файл содержит следющие парамерты
[DataBase]
IP = 127.0.0.1 - IP адрес сервера, где развернута база данных
Port = 5432 - Номер порта
DBName = PYnder - Название БД
User = postgres - Имя пользователя
Password = ****** - Пароль БД
[VK_token]
group_token = - токен группы
user_token = - токен пользователя
- Структура БД описана с использованием ORM SQLAlchemy и находится в модуле models.py. Структура выглядит следующим образом:
2.1. class Owner(Base):
В таблице owners содержатся данные о пользователях бота. Таблица содержит два атрибута:
id (Integer) - Primary key, связь "один ко многим" с таблицей favorites, атрибутом Owner_ID
vk_id (String 50) - VK ID пользователя бота
2.2. class VKUser(Base):
В таблице vk_users содержатся данные о пользователях ВК, которые были добавлены в "Избранное" пользователями бота. Таблица содержит 8 атрибутов:
id (Integer) - Primary key, связь "один ко многим" с таблицей favorites, атрибутом User_ID
vk_id (String 50) - VK ID пользователя ВК
first_name (String 20) - Имя пользователя ВК
last_name (String 20) - Фамилия пользователя ВК
city (String 20) - Город пользователя ВК
sex (Integer) - Пол пользователя ВК, 2 = мужской, 1 = женский
birth_date (Date) - Дата рождения пользователя ВК в формате ORM Alchemy
url (String) - Адрес страницы ВК пользователя
2.3. class Photo(Base):
В таблице photos содержатся данные о фотографиях пользователя ВК, который был добавлен в "Избранное". Таблица содержит 4 атрибута:
id (Integer) - Primary key
user_id (Integer) - ID пользователя ВК, связь "многие к одному" с таблицей vk_users, атрибутом ID
url (String) - Адрес фотографии
likes (Integer) - Количество лайков фотографии
2.4. class Favorite(Base):
В таблице favorites содержатся данные о сочетаниях пользователь бота/пользователь ВК для формирования "Избранного". Таблица содержит 3 атрибута:
id (Integer) - Primary key
user_id (Integer) - ID пользователя ВК, связь "многие к одному" с таблицей vk_users, атрибутом ID
owner_id (Integer) - ID пользователя бота, связь "многие к одному" с таблицей owners, атрибутом ID
- Вся работа с БД производится через экземпляр класса PYnder_DB. Класс описан в модуле db_function.py. При создании экземпляра класса необходимо указывать значение обязательного параметра rebuild. True означает, что структура БД будет полностью удалена и создана заново, False - структура останется без изменений.
Методы класса PYnder_DB:
3.1. def init(self, rebuild: bool):
Метод создает соединение с БД, используя функцию get_db_config и методы delete_structure, create_structure
На вход принимает параметр rebuild, значение True или False.
3.2. def create_structure(self):
Метод заново создает структуру БД, описанную в модуле models.py.
3.3. def delete_structure(self):
Метод удаляет существующую структуру БД вместе с данными.
3.4. def add_owner(self, owner_id_: str) -> bool:
Метод создает запись о пользователе бота в таблице owners. Перед созданием проверяет наличие пользователя с таким же VK ID. Вызывается сразу при начале работы.
На вход принимает VK ID пользователя.
Возвращает True, если запись была успешно внесена, False, если такой пользователь уже есть.
3.5. def add_favorite(self, new_record: dict, vk_owner_id_: str) -> bool:
Метод добавляет найденного пользователя ВК в "Избранное". Добавляет все данные пользователя в таблицу vk_users, фотографии в таблицу photos, создает запись в смежной таблице favorites.
На вход принимает словарь с данными пользователя, включая фотографии в виде списка словарей, и VK ID пользователя бота.
dictionary{
vk_id:str(50),
first_name:str(20),
last_name:str(20),
city(20):str,
sex:integer,
birth_date:date,
url:str,
images[{'url':'image_1.jpg', likes: 5}, {'url':'image_2.jpg', likes: 3}, {'url':'image_3.jpg', likes: 15}]}
Возвращает True, если запись была успешно внесена, False, если такой пользователь уже есть в таблице "Избранное".
3.6. def delete_favorite(self, vk_user_id_: str, vk_owner_id_: str) -> bool:
Метод удаляет запись из таблицы favorites. Также метод проверяет есть ли указанный пользователь ВК в "Избранном" у других
пользователей бота. Если нет удаляет из таблицы vk_users и photos.
На вход принимает VK ID найденного пользователя и VK ID пользователя бота.
Возвращает True, если запись на удаление была найдена, False, если записи нет.
3.7. def get_pk(self, table_, id_: str) -> int:
Метод находит соответствие VK ID к Primary key в указанной таблице.
На вход принимает объект - таблицу с атрибутом (например, vk_users.id) и VK ID.
Возвращет Primary key соответствующей записи. Если запись не найдена, возвращает -1.
3.8. def is_in_favorite(self, vk_user_id_: str, vk_owner_id_: str) -> bool:
Метод проверяет, есть ли в "Избранном" пользователя бота указанный пользователь ВК.
На вход принимает VK ID найденного пользователя и VK ID пользователя бота.
Возвращает True, если пользователь найден в "Избранном", иначе False.
3.9. def get_favorite(self, vk_owner_id_: str) -> list:
Метод возвращает список "Избранного" для конкретного пользователя ВК. Дата возвращается в формате dd.mm.yyyy
На вход принимает VK ID пользователя бота.
Возвращает список словарей:
list of dicts {
vk_id:str(50),
first_name:str(20),
last_name:str(20),
city(20):str,
sex:integer,
birth_date:date,
url:str,
images[{'url':'image_1.jpg', likes: 5}, {'url':'image_2.jpg', likes: 3}, {'url':'image_3.jpg', likes: 15}]}
3.10. def import_test_data(self):
Тестовый метод для заполнения БД произвольными данными в явном виде. Ничего не принимает и не возвращает. В релизе удалить.
-
В модуле db_function используется функция: def get_db_config(self, ini_file: str = "db.ini") -> str:
Функция читает параметры из конфигурационного файла.
На вход принимает полный путь к конфигурационному файлу в виде строки. По умолчанию "db.ini".
Возвращает DSN строку, используемую ORM Alchemy для создания подключения к БД. -
Модуль main содержит основную логику бота, реакцию на кнопки, ввод данных пользователя
-
Модуль vk_search содержит функции для запроса данных ВК и их обработки
-
Модуль functions содержит две вспомогательные функции - сортировку фото по лайкам и расчет возраста.
-
В каталоге keyboards находятся шаблоны кнопок, необходимых для работы бота.