Задать вопрос
@d3d_ins
Junior разработчик телеграмм ботов и не только

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

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

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

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

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=True)
    return markup

@router.message(Command("start"))
async def cmd_start(message: Message, state: FSMContext):
    """Обработчик команды /start"""
    user_id = message.from_user.id
    username = message.from_user.username
    text = f"""Привет! {username}\n\nВыбери свою группу:"""
    await message.reply(text, reply_markup=build_start_menu())

@router.callback_query(F.data == "freeriders")
async def cmd_freeride(call: types.CallbackQuery):
    await call.message.delete()
    await call.message.answer("Для дальнейшей работы нужно отправить свою геопозицию", reply_markup=send_location_button())

@router.callback_query(F.data == "beginners")
async def cmd_begginers(call: types.CallbackQuery):
    await call.message.delete()
    await call.message.answer("Для дальнейшей работы нужно отправить свою геопозицию", reply_markup=send_location_button())


@router.callback_query(F.data == "ilwithoutfreeride")
async def cmd_ilwithoutf(call: types.CallbackQuery):
    await call.message.delete()
    await call.message.answer("Для дальнейшей работы нужно отправить свою геопозицию", reply_markup=send_location_button())


@router.callback_query(F.data == "ilwithfreeride")
async def cmd_ilwithf(call: types.CallbackQuery):
    await call.message.delete()
    await call.message.answer("Для дальнейшей работы нужно отправить свою геопозицию", reply_markup=send_location_button())


@router.callback_query(F.data == "2bar")
async def cmd_2bar(call: types.CallbackQuery):
    await call.message.delete()
    await call.message.answer("Для дальнейшей работы нужно отправить свою геопозицию", reply_markup=send_location_button())

@router.message(F.location)
async def location_recived(message: Message, state: FSMContext):
    latitude = message.location.latitude
    longitude = message.location.longitude
    locations.append((latitude, longitude))

    map_image = generate_map(locations)

    photo = BufferedInputFile(map_image, filename="map.png")

    await message.answer("Ваша локация:")
    await message.answer_photo(photo=photo, reply_markup=ReplyKeyboardRemove())
    await message.answer("Хотите отслеживать где находятся люди из вашей группы?")
  • Вопрос задан
  • 458 просмотров
Подписаться 1 Простой 2 комментария
Помогут разобраться в теме Все курсы
  • Нетология
    Python-разработчик: расширенный курс + нейросети
    12 месяцев
    Далее
  • Академия Эдюсон
    Python-разработчик
    9 месяцев
    Далее
  • ProductStar × РБК
    Профессия: Python-разработчик + ИИ
    8 месяцев
    Далее
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Бот не может запросить у пользователя Live Location.
Пользователь должен сам инициировать отправку Live Location, тогда она периодически будет обновляться через сообщения edited_message, пока не пройдёт заданный пользователем период отслеживания или пользователь сам не остановит отслеживание.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
ITK academy Краснодар
от 220 000 до 300 000 ₽
ITK academy Краснодар
от 75 000 ₽
DimaTech Ltd Краснодар
от 140 000 до 140 000 ₽