Каким образом можно отслеживать геопозицию в реальном времени с помощью телеграм-бота?

Всем привет! Я разрабатываю телеграмм бота для отслеживания геопозиции пользователей в реальном времени (при этом важное условие - это именно не webapp). 

Что необходимо сделать: я хочу, чтобы пользователь, нажимая на кнопку, отправлял свою геопозицию, после чего бот принимал эти данные и обновлял их примерно каждые 2-5 минут. 

Вот текущий код, который принимает статичную геопозицию пользователя и генерирует картинку с его отметкой на карте: 

<pre><code class="python">from aiogram import types, Router, F
from aiogram.types import Message, ReplyKeyboardRemove, BufferedInputFile
from aiogram.filters import Command
from aiogram.fsm.context import FSMContext
from aiogram.utils.keyboard import InlineKeyboardBuilder, ReplyKeyboardMarkup, KeyboardButton
from decouple import config
from services.maps import generate_map

router = Router()

locations = []

def build_start_menu() -&gt; InlineKeyboardBuilder:
    builder = InlineKeyboardBuilder()
    builder.row(types.InlineKeyboardButton(text="Фрирайдеры", callback_data="freeriders"), types.InlineKeyboardButton(text="Новичики", callback_data="beginners"))
    builder.button(text="Средний уровень без фрирайда", callback_data="ilwithoutfreeride")
    builder.button(text="Средний уровень с фрирайдом возле трасс", callback_data="ilwithfreeride")
    builder.button(text="2 спуска и в бар", callback_data="2bar")
    builder.adjust(1)
    return builder.as_markup()

def send_location_button() -&gt; ReplyKeyboardMarkup:
    location_button = KeyboardButton(text='Отправить свою локацию', request_location=True)
    markup = ReplyKeyboardMarkup(keyboard=[[location_button]], resize_keyboard=True, one_time_keyboard=T
  • 5 апреля 2025 г. 7:35
Ответы на вопрос 2
Отслеживание геопозиции в реальном времени с помощью телеграм-бота требует использования некоторых возможностей Telegram API. Чтобы бот мог получать обновления местоположения пользователя каждые 2-5 минут, вам нужно продумать способ отправки и обработки обновлений.

### Основные шаги:

1. **Запрос геопозиции пользователя**: Использование `KeyboardButton` с параметром `request_location=True`, чтобы пользователь мог отправить свою текущую геолокацию.

2. **Получение и обработка обновлений**: Когда бот получает расположение от пользователя, он может сохранить его и установить таймер для периодического получения обновлений.

3. **Отправка обновлений**: Создание функциональности для отправки обновленной геолокации на сервер или другим пользователям.

4. **Использование `message.edit_reply_markup` для обновления кнопок**: Если вы хотите изменять интерфейс после отправки геолокации.

### Пример реализации:

Ниже приведён пример кода, который демонстрирует возможный способ отслеживания геопозиции пользователя в реальном времени:

```python
import asyncio
from aiogram import types, Router
from aiogram.types import ReplyKeyboardMarkup, KeyboardButton
from aiogram.utils.keyboard import InlineKeyboardBuilder

router = Router()

users_locations = {}

@router.message(commands=['start'])
async def start_handler(message: types.Message):
    markup = ReplyKeyboardMarkup(resize_keyboard=True)
    location_button = KeyboardButton(text='Отправить свою локацию', request_location=True)
    markup.add(location_button)
    await message.answer("Пожалуйста, отправьте свою локацию.", reply_markup=markup)

@router.message(content_types=types.ContentType.LOCATION)
async def location_handler(message: types.Message):
    user_id = message.from_user.id
    user_location = message.location

    # Сохранение информации о пользователе
    users_locations[user_id] = user_location

    await message.answer("Ваше местоположение обновлено.")
    
    # Запускаем асинхронную задачу обновления местоположения
    asyncio.create_task(update_location(user_id))

async def update_location(user_id):
    while user_id in users_locations:
        # Здесь можно добавить код для получения новой геолокации пользователем
        await asyncio.sleep(120)  # Проверяем каждые 2 минуты
        # Отправляем обновление — например, текущую локацию на карту и т. д.
        location = users_locations[user_id]
        await send_location_update(user_id, location)

async def send_location_update(user_id, location):
    # Генерация карты или обновление статуса
    await router.bot.send_message(user_id, f"Ваше текущее местоположение:\n🔵 Широта: {location.latitude}, Долгота: {location.longitude}")

# Обработчик отключения геолокации (например, если пользователь закрыл чат)
@router.message(lambda message: message.text.lower() == "стоп")
async def stop_location_handler(message: types.Message):
    user_id = message.from_user.id
    if user_id in users_locations:
        del users_locations[user_id]
        await message.answer("Отслеживание вашего местоположения остановлено.")
```

### Важные моменты:
- Убедитесь, что бот имеет разрешения на доступ к геолокации.
- Следите за тем, чтобы не превышать лимиты запросов к Telegram API.
- Вы можете использовать базу данных для более надежного хранения и управления местоположением пользователей.
- Добавьте логику, чтобы правильно обрабатывать отписку от отслеживания и другие состояния.

Этот код представляет собой основную архитектуру, и вы можете улучшать и адаптировать его под свои нужды.
Бот не может запросить у пользователя Live Location. 
Пользователь должен сам инициировать отправку Live Location, тогда она периодически будет обновляться через сообщения edited_message, пока не пройдёт заданный пользователем период отслеживания или пользователь сам не остановит отслеживание.
Похожие вопросы