Всем привет! Я разрабатываю телеграмм бота для отслеживания геопозиции пользователей в реальном времени (при этом важное условие - это именно не 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() -> 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() -> ReplyKeyboardMarkup: location_button = KeyboardButton(text='Отправить свою локацию', request_location=True) markup = ReplyKeyboardMarkup(keyboard=[[location_button]], resize_keyboard=True, one_time_keyboard=T
Отслеживание геопозиции в реальном времени с помощью телеграм-бота требует использования некоторых возможностей 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, пока не пройдёт заданный пользователем период отслеживания или пользователь сам не остановит отслеживание.