{"id":22387767,"url":"https://github.com/j3rrryy/travel_bot","last_synced_at":"2026-04-20T05:32:40.471Z","repository":{"id":231865578,"uuid":"782902600","full_name":"j3rrryy/travel_bot","owner":"j3rrryy","description":"Telegram travel assistant bot. Written using aiogram 3","archived":false,"fork":false,"pushed_at":"2025-01-11T00:04:11.000Z","size":145,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-26T21:14:48.681Z","etag":null,"topics":["aiogram3","docker","postgresql","redis","telegram","travelling"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/j3rrryy.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-04-06T11:20:03.000Z","updated_at":"2025-01-11T00:04:14.000Z","dependencies_parsed_at":"2024-10-31T18:23:45.107Z","dependency_job_id":"ff6f53a7-f60c-46c7-95ec-c33513ea53b3","html_url":"https://github.com/j3rrryy/travel_bot","commit_stats":null,"previous_names":["j3rrryy/travel_bot"],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/j3rrryy/travel_bot","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/j3rrryy%2Ftravel_bot","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/j3rrryy%2Ftravel_bot/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/j3rrryy%2Ftravel_bot/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/j3rrryy%2Ftravel_bot/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/j3rrryy","download_url":"https://codeload.github.com/j3rrryy/travel_bot/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/j3rrryy%2Ftravel_bot/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32034647,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-20T00:18:06.643Z","status":"online","status_checked_at":"2026-04-20T02:00:06.527Z","response_time":94,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["aiogram3","docker","postgresql","redis","telegram","travelling"],"created_at":"2024-12-05T02:11:04.244Z","updated_at":"2026-04-20T05:32:40.436Z","avatar_url":"https://github.com/j3rrryy.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Aiogram [@Travel Agent Bot](https://t.me/TravelAgent3Bot)\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/j3rrryy/travel_bot/actions/workflows/main.yml\"\u003e\n    \u003cimg src=\"https://github.com/j3rrryy/travel_bot/actions/workflows/main.yml/badge.svg\" alt=\"СI/CD\"\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://www.python.org/downloads/release/python-3120/\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/Python-3.12-FFD64E.svg\" alt=\"Python 3.12\"\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://github.com/j3rrryy/travel_bot/blob/main/LICENSE\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/License-MIT-blue.svg\" alt=\"MIT License\"\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://github.com/astral-sh/ruff\"\u003e\n    \u003cimg src=\"https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json\" alt=\"Ruff\"\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\n## :scroll: О боте\n\nБот, облегчающий планирование путешествий с друзьями. Он может помочь: не потерять важные документы, построить маршрут, найти новых друзей, поделить расходы, увидеть достопримечательности и узнать прогноз погоды на протяжении маршрута.\n\nБот построен на основе асинхронной библиотеки **[Aiogram](https://aiogram.dev)** для создания Telegram ботов на языке Python. При его создании был сделан упор на хорошую производительность, поэтому все операции с внешними сервисами (PostgreSQL, Redis, различные API) и файловой системой выполняются асинхронно, а все синхронные операции, которые могут быть выполнены только локально, например: отрисовка маршрута на карте и сохранение в формате фото, выполняются в отдельном процессе.\n\n- **Обязательные функциональные возможности**\n\n  - [x] :bust_in_silhouette: Добавление данных пользователя\n\n  - [x] :earth_africa: Управлением путешествием\n\n  - [x] :notebook: Заметки к путешествию\n\n  - [x] :busts_in_silhouette: Путешествия с друзьями\n\n  - [x] :car: Прокладывание маршрута путешествия\n\n- **Опциональные функциональные возможности**\n\n  - [x] :partly_sunny: Прогноз погоды в промежуточных точках\n\n  - [x] :european_castle: Рекомендация местных достопримечательностей\n\n  - [x] :busts_in_silhouette: Поиск пользователей для совместного путешествия\n\n  - [x] :money_with_wings: Общие траты в путешествии\n\n  - [x] :bulb: Ваши собственные идеи (Конвертер валют; Возврат долга в выбранной валюте; Случайный выбор участника путешествия, который платит за всех)\n\n## :computer: Зависимости\n\n- :whale2: Docker\n\n## :page_facing_up: docker-compose.yml\n\ndocker-compose.yml содержит в себе:\n\n- :file_folder: **Тома**\n\n```yml\nvolumes:\n  files: # том с фотографиями маршрутов и файлами пользователей\n  pg_data: # том PostgreSQL\n  redis_data: # том Redis\n```\n\n- :satellite: **Сервисы**\n\n  - Бот\n\n    ```yml\n    bot:\n      # сборка на основе Dockerfile\n      build: .\n      # перезагрузка в случае ошибки\n      restart: always\n      # применение миграций и запуск бота\n      command: bash -c \"alembic upgrade head \u0026\u0026 python bot.py\"\n      # открытие портов\n      ports:\n        - 8080:8080\n      # использование файла для установки переменных окружения\n      env_file:\n        - .env\n      # том с файлами\n      volumes:\n        - files:/files\n      # ожидание запуска необходимых для работы контейнеров\n      depends_on:\n        - postgres\n        - redis\n      # установка имени контейнера\n      container_name: travel_bot\n    ```\n\n  - PostgreSQL\n\n    ```yml\n    postgres:\n      # сборка на основе легковесного alpine образа\n      image: postgres:alpine\n      # перезагрузка в случае ошибки\n      restart: always\n      # использование файла для установки переменных окружения\n      env_file:\n        - .env\n      # том с данными\n      volumes:\n      - pg_data:/var/lib/postgresql/data/\n      # установка имени контейнера\n      container_name: postgres_bot\n    ```\n\n  - Redis\n\n    ```yml\n    redis:\n      # сборка на основе легковесного alpine образа\n      image: redis:alpine\n      # перезагрузка в случае ошибки\n      restart: always\n      # запуск Redis\n      command:\n        - redis-server\n      # использование файла для установки переменных окружения\n      env_file:\n        - .env\n      # том с данными\n      volumes:\n        - redis_data:/data\n      # установка имени контейнера\n      container_name: redis_bot\n    ```\n\n- :hammer_and_wrench: **Начало работы**\n\n  - Создайте Telegram бота с помощью [@BotFather](https://t.me/BotFather) и получите токен\n  - Зарегистрируйтесь в [Openrouteservice](https://openrouteservice.org) и получите токен\n  - Зарегистрируйтесь в [Geoapify](https://www.geoapify.com) и получите токен\n  - Создайте `.env` файл с использованием шаблона `examples/.env.example`\n\n- :rocket: **Запуск бота**\n\n  ```shell\n  docker compose up --build -d\n  ```\n\n- :x: **Остановка**\n\n  ```shell\n  docker compose stop\n  ```\n\n## :globe_with_meridians: Сервисы и внешние интеграции\n\n- **[PostgreSQL](https://www.postgresql.org)** — надежная SQL СУБД с отличной производительностью и масштабируемостью. Все эти качества делают ее отличным выбором для высоконагруженных проектов. В боте используется в качестве основной БД. Также в проекте используется **[Alembic](https://alembic.sqlalchemy.org)** — удобный инструмент для проведения операций с миграциями и контроля их версий. В БД содержатся следующие таблицы:\n\n  - alembic_version (служебная таблица)\n\n  |version_num|\n  |:-:|\n  |pk, character varying(32), not null|\n\n  - users\n\n  |id|username|age|sex|latitude|longitude|city|country|currency|bio|\n  |:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|\n  |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|\n\n  - trips\n\n  |id|username|name|description|locations|friends|\n  |:-:|:-:|:-:|:-:|:-:|:-:|\n  |pk, integer, not null|fk (users.username), character varying, not null|character varying, not null|character varying|json[]|character varying[]|\n\n  - notes\n\n  |id|user_id|trip_id|name|path|file_type|width|height|is_private|\n  |:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|\n  |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|\n\n  - expenses\n\n  |id|username|trip_id|name|cost|currency|date|debtors|\n  |:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|\n  |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[]|\n\n- **[Redis](https://redis.io)** — масштабируемая NoSQL СУБД с потрясающей производительностью, которая хранит данные в виде пар «ключ — значение» прямо в оперативной памяти сервера, что и позволяет их быстро получать. В моем проекте используется для сохранения состояний пользователей и их промежуточных данных, кэширования.\n\n\u003e [!NOTE]\n\u003e **Интересный факт:** до настройки кэширования с использованием Redis среднее время ответа бота составляло около 300-350 мс, после настройки оно снизилось до 200-250 мс. Кэширование данных пользователя, а также результатов запросов к внешним сервсиам сделало бота более отзывчивым.\n\n- **[OpenStreetMap](https://www.openstreetmap.org)** — открытая карта мира, которую могут редактировать обычные люди. В моем проекте используется для обратного геокодирования (получения города и страны из координат).\n\n- **[Openrouteservice](https://openrouteservice.org)** — сервис для произведения различных действий с картой OpenStreetMap. В проекте используется для получения маршрута путешествия, он поддерживает построение маршрута на расстояния до 6 тыс. км, что является его огромным плюсом.\n\n- **[Geoapify](https://www.geoapify.com)** — тоже сервис для произведения различных действий с картой OpenStreetMap. В проекте используется для нахождения достопримечательностей рядом, был выбран за удобство использования.\n\n- **[Open-Meteo](https://open-meteo.com)** — сервис для получения прогнозов погоды с учетом множества параметров запроса. Для проекта был выбран именно он, ведь данный сервис позволяет получить погоду на целых 16 дней вперед, чего не могут вам предложить другие сервисы.\n\n- **[Calcus.ru](https://calcus.ru)** — сервис, предоставляющий огромный набор различных калькуляторов и инструментов. В проекте используется для конвертации валют.\n\n## :speech_balloon: Взаимодействие с ботом\n\n\u003e [!WARNING]\n\u003e Перед началом необходимо убедиться, что у вас в Telegram профиле указано имя пользователя в формате `@example`\n\n- По нажатию на кнопку `/start` начинается процедура регистрации пользователя\n\n- У бота есть боковое меню, которое содержит команды `/menu`, `/profile`, `/help`, они являются основными для взаимодействия с ботом\n\n- `/profile` позволяет просмотреть ваш профиль и, по желанию, отредактировать его\n\n- `/menu` бота позволяет просмотреть путешествия как созданные вами, так и те, в которые вас пригласили, они будут со значком :link:; создать новое путешествие; конвертировать валюту, которую вы указали в профиле\n\n- В процессе создания нового путешествия вы указываете только одну локацию и даты, после создания путешествия вы сможете расширить список локаций\n\n\u003e [!IMPORTANT]\n\u003e Редактировать/удалять путешествия могут только их организаторы\n\n- В разделе `Друзья` можно пригласить своих друзей, либо найти новых друзей с учетом возраста и интересов\n\n\u003e [!IMPORTANT]\n\u003e Добавлять/находить друзей для путешествия/удалять могут только организаторы путешествия\n\n\u003e [!NOTE]\n\u003e Поиск по интересам производится на основе полей `О себе` путем их сравнения и определения коэффициента подобия\n\n- В разделе `Заметки` можно создать свою заметку, которая будет прикреплена к данному путешествию. Можно просматривать не только свои заметки, но и открытые чужие, они будут со значком :link:\n\n\u003e [!IMPORTANT]\n\u003e Удалять заметки могут только их создатели\n\n- В разделе `Локации` можно создать просмотреть все локации путешествию, построить маршрут или добавить новую локацию\n\n\u003e [!IMPORTANT]\n\u003e Добавлять/удалять локации может только организатор путешествия\n\n\u003e [!NOTE]\n\u003e Первоначальная отрисовка карты с маршрутом может занимать некоторое время, после чего она будет сохранена на диск и будет загружаться оттуда. После обновления списка локаций старая карта удаляется\n\n- В разделе `Траты` можно просмотреть, кому ты должен (со значком :heavy_exclamation_mark:)/кто тебе; можно записать новые траты и указать всех должников\n\n\u003e [!IMPORTANT]\n\u003e Редактировать/использовать команду с игрой/удалять траты могут только их создатели\n\n\u003e [!NOTE]\n\u003e Бот разделит общую сумму траты поровну на всех участников с учетом валют, указанных в их профилях. Также траты сами удаляются, когда последний должник выплачивает свою часть\n\n\u003e [!CAUTION]\n\u003e Использование далее описанных инструкций может сильно ударить по вашему кошельку! В выбранной трате можно сыграть в мини игру: случайным образом выбирается человек, который связан с этой тратой, это может быть как один из должников, так и тот, кто за всех заплатил, на него будут списаны все долги\n\n## :blush: Желаю интересных и захватывающих путешествий\n\n## :sparkling_heart: PROD contest 2024\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fj3rrryy%2Ftravel_bot","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fj3rrryy%2Ftravel_bot","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fj3rrryy%2Ftravel_bot/lists"}