Бот доступен под логином antontravel_bot
version: '3'
services:
travelbot:
build: .
command: python main.py
restart: always
volumes:
- "/DB/"
База данных хранится в директории DB, для этого мы указываем её в volumes, чтобы сохранить при перезагрузке. Помимо docker-compose.yml
, создан Dockerfile
FROM python:3.11
COPY requirements.txt requirements.txt
RUN pip3 install -r requirements.txt
COPY . .
CMD ["python", "main.py"]
Из него мы устанавливаем все зависимости, которые требуются для работы бота
Достаточно перейти в корень проекта и написать команду
docker compose up -d
- Перейдите в корневую директорию
- Установите все зависимости
pip3 install -r requirements.txt
- Запустите файл
main.py
в корне проекта:python main.py
Перейдите в корень проекта и введите команду
python -m unittest discover -s tests
При первом посещении бота включается сценарий регистрации пользователя, в ходе которого пользователь регистрируется в системе
После регистрации пользователю представляется главное меню. Из которого он может управлять всеми функциями бота. При посещении каждого раздела первый раз, пользователю показывается небольшая информация об этом разделе
Данный раздел запрашивает первоначальные данные для путешествия и создаёт его
Пользователю присылается список путешествий, в которых он состоит. Нажав на список путешествий, ему открывается панель управления путешествием
В данном разделе можно добавить локации, заметки и делать всю работу с путешествием. Так-же выводится информация, сколько дней займёт путешествие, оно считается исходя из дат посещения локаций
Бот просит ввести страну и город, а так-же дату посещения локации. После добавления локаций, он сортирует все локации в порядке возрастания по дате посещения
Бот выводит информацию о локации, сколько дней займёт её посещение, а так-же из него можно посмотреть различную полезную информацию, например погоду, отели в этом городе и так далее
Из этого раздела можно управлять путешествием. Приглашать друзей в него, редактировать участников, размещать на бирже, подбирать участников и так далее
Раздел, в который пользователи могут выставить своё путешествие, чтобы найти для него участников. Здесь нет ограничений на возраст и интересы, путешествия показывается пользователям всего бота
Управление профилем пользователя. Редактирование интересов, личных данных и так далее
Для этой задачи используется сервис OpenStreetMap, у него есть открытый метод, который позволяет получить координаты и полную информацию по названию страны и города
https://nominatim.openstreetmap.org/search?q={name}&format=json&adressdetails=1
Этот метод полностью бесплатный, и на него не распространяются какие-либо ограничения. Именно поэтому он был выбран
У Yandex есть страница, на которой размещён прогноз погоды на весь год, для заданных координат
https://yandex.ru/pogoda/month/june?lat=55&lon=55&via=cnav
Был написан парсер этого сайта, который может получить прогноз погоды на любую дату. Данный сайт был выбран, так как некоторые путешествия планируются за несколько месяцев вперёд, и прогноз погоды от других сервсиов не в силах предсказать такое
Была проведена колоссальная работа в данном направлении. После чательного анализа, самым оптимальным вариантов для решения текущей задачи показалось внедрение карты с уже построенным маршрутом прямо в Telegram. В Telegram есть возможность отобразить содержимое сайта в Webview, который открывается внутри бота. За основу было взято API по построению веб версии Яндекс карты. Нужные данные подставляются в ссылку, а затем данная ссылка загружается в WebView Telegram и отображается пользователю внутри бота:
https://yandex.ru/maps/?rtext=59.967870,30.242658~59.898495,30.299559&rtt=mt
Данный метод был выбран, так как наиболее лучше справляется с поставленой задачой. Он отображает пользователю маршрут в самом привычном для него формате. Так-же не мало важную роль в выборе данного метода сыграло то, что пользователь может взаимодействовать с картой, а значит и более подробно изучить маршрут
В решении текущей задачи так-же использовалось API по построению веб версии Яндекс карты и отображение результата в WebView, прямо так-же, как это указано в пункте Построение маршрута
https://yandex.ru/maps/?ll={cords[1]},{cords[0]}&z=16&text=кафе и рестораны
В запрос подставляются координаты города, а так-же текст того, что мы ищем. В ответ мы получаем список отелей/кафе/достопримечательностей. Данный метод был выбран так-же для удобности пользователя. Вся информация подаётся в привычном ему виде, можно почитать отзывы реальных людей, а так-же по карте увидеть где именно находится объект
В качестве СУБД была выбрана SQLite. Для текущей задачи она является самой оптимальной, вот почему
- Большое количество данных в проекте будет получаться из API других сервисов, и соотвественно масштабной базы данных просто не потребуется
- Низкая требовательность к ресурсам. Так-как масштабной базы данных нам не потрбуется, то рациональнее будет выбрать ту, которая не ест много ресусов. SQLite вовсе хранится в файле и максимальна проста в развёртывании
- Быстрый доступ к данным. Это один из самых важных аспектов при разработке бота - чем он быстрее отвечает, тем счасливее пользователь
Описание модели данных и связи между ними
Название таблицы | Основное назначение | С какими таблицами связана |
---|---|---|
Users | Хранит в себе инфомацию о пользователях | UsersFullInfo |
UsersFullInfo | Хранит дополнительную информацию о пользователях | - |
Places | Хранит информацию о стране и городе пользователя, в котором он живем | Users |
Traveles | Хранит путешествия и информацию о них | Users |
Locations | Хранит информацию о локациях для путешествий | Traveles |
FriendsInTravel | Хранит информацию о том, какие люди добавлены в путешествие | Traveles, Users |
Notes | Информация о заметках | Traveles |
NotesInfo | Информация о файле к заметках | Notes |
PlacesInfo | Служит для того, чтобы хранить ID города и его координаты | - |
SearchExchange | Хранит путешествия, выставленные на биржу | Traveles |
Payments | Информация о тратах к путешествию | Traveles |
PaymentsInfo | Информация о участниках траты к путешествию | Payments |
GuideInfo | Хранит информацию, просмотрел ли пользователь информацию о разделе | Users |