https://github.com/j3rrryy/travel_bot
Telegram travel assistant bot. Written using aiogram 3
https://github.com/j3rrryy/travel_bot
aiogram3 docker postgresql redis telegram travelling
Last synced: 3 months ago
JSON representation
Telegram travel assistant bot. Written using aiogram 3
- Host: GitHub
- URL: https://github.com/j3rrryy/travel_bot
- Owner: j3rrryy
- License: mit
- Created: 2024-04-06T11:20:03.000Z (over 2 years ago)
- Default Branch: main
- Last Pushed: 2025-01-11T00:04:11.000Z (over 1 year ago)
- Last Synced: 2025-03-26T21:14:48.681Z (over 1 year ago)
- Topics: aiogram3, docker, postgresql, redis, telegram, travelling
- Language: Python
- Homepage:
- Size: 142 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Aiogram [@Travel Agent Bot](https://t.me/TravelAgent3Bot)
## :scroll: О боте
Бот, облегчающий планирование путешествий с друзьями. Он может помочь: не потерять важные документы, построить маршрут, найти новых друзей, поделить расходы, увидеть достопримечательности и узнать прогноз погоды на протяжении маршрута.
Бот построен на основе асинхронной библиотеки **[Aiogram](https://aiogram.dev)** для создания Telegram ботов на языке Python. При его создании был сделан упор на хорошую производительность, поэтому все операции с внешними сервисами (PostgreSQL, Redis, различные API) и файловой системой выполняются асинхронно, а все синхронные операции, которые могут быть выполнены только локально, например: отрисовка маршрута на карте и сохранение в формате фото, выполняются в отдельном процессе.
- **Обязательные функциональные возможности**
- [x] :bust_in_silhouette: Добавление данных пользователя
- [x] :earth_africa: Управлением путешествием
- [x] :notebook: Заметки к путешествию
- [x] :busts_in_silhouette: Путешествия с друзьями
- [x] :car: Прокладывание маршрута путешествия
- **Опциональные функциональные возможности**
- [x] :partly_sunny: Прогноз погоды в промежуточных точках
- [x] :european_castle: Рекомендация местных достопримечательностей
- [x] :busts_in_silhouette: Поиск пользователей для совместного путешествия
- [x] :money_with_wings: Общие траты в путешествии
- [x] :bulb: Ваши собственные идеи (Конвертер валют; Возврат долга в выбранной валюте; Случайный выбор участника путешествия, который платит за всех)
## :computer: Зависимости
- :whale2: Docker
## :page_facing_up: docker-compose.yml
docker-compose.yml содержит в себе:
- :file_folder: **Тома**
```yml
volumes:
files: # том с фотографиями маршрутов и файлами пользователей
pg_data: # том PostgreSQL
redis_data: # том Redis
```
- :satellite: **Сервисы**
- Бот
```yml
bot:
# сборка на основе Dockerfile
build: .
# перезагрузка в случае ошибки
restart: always
# применение миграций и запуск бота
command: bash -c "alembic upgrade head && python bot.py"
# открытие портов
ports:
- 8080:8080
# использование файла для установки переменных окружения
env_file:
- .env
# том с файлами
volumes:
- files:/files
# ожидание запуска необходимых для работы контейнеров
depends_on:
- postgres
- redis
# установка имени контейнера
container_name: travel_bot
```
- PostgreSQL
```yml
postgres:
# сборка на основе легковесного alpine образа
image: postgres:alpine
# перезагрузка в случае ошибки
restart: always
# использование файла для установки переменных окружения
env_file:
- .env
# том с данными
volumes:
- pg_data:/var/lib/postgresql/data/
# установка имени контейнера
container_name: postgres_bot
```
- Redis
```yml
redis:
# сборка на основе легковесного alpine образа
image: redis:alpine
# перезагрузка в случае ошибки
restart: always
# запуск Redis
command:
- redis-server
# использование файла для установки переменных окружения
env_file:
- .env
# том с данными
volumes:
- redis_data:/data
# установка имени контейнера
container_name: redis_bot
```
- :hammer_and_wrench: **Начало работы**
- Создайте Telegram бота с помощью [@BotFather](https://t.me/BotFather) и получите токен
- Зарегистрируйтесь в [Openrouteservice](https://openrouteservice.org) и получите токен
- Зарегистрируйтесь в [Geoapify](https://www.geoapify.com) и получите токен
- Создайте `.env` файл с использованием шаблона `examples/.env.example`
- :rocket: **Запуск бота**
```shell
docker compose up --build -d
```
- :x: **Остановка**
```shell
docker compose stop
```
## :globe_with_meridians: Сервисы и внешние интеграции
- **[PostgreSQL](https://www.postgresql.org)** — надежная SQL СУБД с отличной производительностью и масштабируемостью. Все эти качества делают ее отличным выбором для высоконагруженных проектов. В боте используется в качестве основной БД. Также в проекте используется **[Alembic](https://alembic.sqlalchemy.org)** — удобный инструмент для проведения операций с миграциями и контроля их версий. В БД содержатся следующие таблицы:
- alembic_version (служебная таблица)
|version_num|
|:-:|
|pk, character varying(32), not null|
- users
|id|username|age|sex|latitude|longitude|city|country|currency|bio|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|pk, bigint, not null|character varying, not null|integer, not null|character varying, not null|double precision|double precision|character varying|character varying, not null|character varying, not null|character varying|
- trips
|id|username|name|description|locations|friends|
|:-:|:-:|:-:|:-:|:-:|:-:|
|pk, integer, not null|fk (users.username), character varying, not null|character varying, not null|character varying|json[]|character varying[]|
- notes
|id|user_id|trip_id|name|path|file_type|width|height|is_private|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|pk, integer, not null|fk (users.id), bigint, not null|fk (trips.id), integer, not null|character varying, not null|character varying, not null|character varying, not null|integer|integer|boolean|
- expenses
|id|username|trip_id|name|cost|currency|date|debtors|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|pk, integer, not null|fk (users.username), character varying, not null|fk (trips.id), integer, not null|character varying, not null|double precision|character varying, not null|timestamp without time zone, default now()|character varying[]|
- **[Redis](https://redis.io)** — масштабируемая NoSQL СУБД с потрясающей производительностью, которая хранит данные в виде пар «ключ — значение» прямо в оперативной памяти сервера, что и позволяет их быстро получать. В моем проекте используется для сохранения состояний пользователей и их промежуточных данных, кэширования.
> [!NOTE]
> **Интересный факт:** до настройки кэширования с использованием Redis среднее время ответа бота составляло около 300-350 мс, после настройки оно снизилось до 200-250 мс. Кэширование данных пользователя, а также результатов запросов к внешним сервсиам сделало бота более отзывчивым.
- **[OpenStreetMap](https://www.openstreetmap.org)** — открытая карта мира, которую могут редактировать обычные люди. В моем проекте используется для обратного геокодирования (получения города и страны из координат).
- **[Openrouteservice](https://openrouteservice.org)** — сервис для произведения различных действий с картой OpenStreetMap. В проекте используется для получения маршрута путешествия, он поддерживает построение маршрута на расстояния до 6 тыс. км, что является его огромным плюсом.
- **[Geoapify](https://www.geoapify.com)** — тоже сервис для произведения различных действий с картой OpenStreetMap. В проекте используется для нахождения достопримечательностей рядом, был выбран за удобство использования.
- **[Open-Meteo](https://open-meteo.com)** — сервис для получения прогнозов погоды с учетом множества параметров запроса. Для проекта был выбран именно он, ведь данный сервис позволяет получить погоду на целых 16 дней вперед, чего не могут вам предложить другие сервисы.
- **[Calcus.ru](https://calcus.ru)** — сервис, предоставляющий огромный набор различных калькуляторов и инструментов. В проекте используется для конвертации валют.
## :speech_balloon: Взаимодействие с ботом
> [!WARNING]
> Перед началом необходимо убедиться, что у вас в Telegram профиле указано имя пользователя в формате `@example`
- По нажатию на кнопку `/start` начинается процедура регистрации пользователя
- У бота есть боковое меню, которое содержит команды `/menu`, `/profile`, `/help`, они являются основными для взаимодействия с ботом
- `/profile` позволяет просмотреть ваш профиль и, по желанию, отредактировать его
- `/menu` бота позволяет просмотреть путешествия как созданные вами, так и те, в которые вас пригласили, они будут со значком :link:; создать новое путешествие; конвертировать валюту, которую вы указали в профиле
- В процессе создания нового путешествия вы указываете только одну локацию и даты, после создания путешествия вы сможете расширить список локаций
> [!IMPORTANT]
> Редактировать/удалять путешествия могут только их организаторы
- В разделе `Друзья` можно пригласить своих друзей, либо найти новых друзей с учетом возраста и интересов
> [!IMPORTANT]
> Добавлять/находить друзей для путешествия/удалять могут только организаторы путешествия
> [!NOTE]
> Поиск по интересам производится на основе полей `О себе` путем их сравнения и определения коэффициента подобия
- В разделе `Заметки` можно создать свою заметку, которая будет прикреплена к данному путешествию. Можно просматривать не только свои заметки, но и открытые чужие, они будут со значком :link:
> [!IMPORTANT]
> Удалять заметки могут только их создатели
- В разделе `Локации` можно создать просмотреть все локации путешествию, построить маршрут или добавить новую локацию
> [!IMPORTANT]
> Добавлять/удалять локации может только организатор путешествия
> [!NOTE]
> Первоначальная отрисовка карты с маршрутом может занимать некоторое время, после чего она будет сохранена на диск и будет загружаться оттуда. После обновления списка локаций старая карта удаляется
- В разделе `Траты` можно просмотреть, кому ты должен (со значком :heavy_exclamation_mark:)/кто тебе; можно записать новые траты и указать всех должников
> [!IMPORTANT]
> Редактировать/использовать команду с игрой/удалять траты могут только их создатели
> [!NOTE]
> Бот разделит общую сумму траты поровну на всех участников с учетом валют, указанных в их профилях. Также траты сами удаляются, когда последний должник выплачивает свою часть
> [!CAUTION]
> Использование далее описанных инструкций может сильно ударить по вашему кошельку! В выбранной трате можно сыграть в мини игру: случайным образом выбирается человек, который связан с этой тратой, это может быть как один из должников, так и тот, кто за всех заплатил, на него будут списаны все долги
## :blush: Желаю интересных и захватывающих путешествий
## :sparkling_heart: PROD contest 2024