геолокация пользователя с помощью aiogram python

Рейтинг: 0Ответов: 2Опубликовано: 19.04.2023

Мне нужно, чтобы по нажатию кнопки "Поделиться своей геолокацией" пользователь отправлял геолокацию, но я реализовываю все по callback'ам, а в документации нашла инфу только про message. Можно ли как-то получить геолокацию не переделываю функцию под message, либо совместить ее с callback, как я попыталась сделать ниже?

but = types.InlineKeyboardButton("Отправить свою геолокацию", request_location=True, callback_data='btn_geo')
inline_kb4 = InlineKeyboardMarkup().add(but)

@dp.callback_query_handler(lambda c: c.data == "btn_geo")
async def process_callback_button_menu(callback_query: types.CallbackQuery, message: types.Message):
    lat = message.location.latitude
    lon = message.location.longitude
    await bot.answer_callback_query(callback_query.id)
    await bot.send_message(callback_query.from_user.id, lat, lon)

Либо возможно сделать так, чтобы по callback бот отправлял сообщение от лица пользователя(например, "Поделиться геолокацией"), после чего функция от message реагировала на это сообщение, запрашивая геолокацию?

Ответы

▲ 0
  1. Создайте кнопку с запросом на геолокацию
but = types.InlineKeyboardButton("Отправить свою геолокацию", request_location=True, callback_data='btn_geo')
inline_kb4 = InlineKeyboardMarkup().add(but)
  1. Создайте колбэк-функцию
class MyClass:
    location = None

    @dp.callback_query_handler(lambda c: c.data == "btn_geo")
    async def process_callback_button_menu(callback_query: types.CallbackQuery):
        MyClass.location = callback_query.location
        await bot.answer_callback_query(callback_query.id)
        await bot.send_message(callback_query.from_user.id, "Спасибо! Теперь вы можете отправить мне сообщение с вашим вопросом.")
  1. Создайте функцию, которая будет вызываться при получении сообщения от пользователя
@dp.message_handler(content_types=types.ContentTypes.TEXT)
async def handle_text_message(message: types.Message):
    if MyClass.location is not None:
        # использование геолокации
        lat = MyClass.location.latitude
        lon = MyClass.location.longitude
        MyClass.location = None
        await bot.send_message(message.chat.id, f"Ваша геолокация: {lat}, {lon}")
    else:
        # сообщение без геолокации
        await bot.send_message(message.chat.id, "Пожалуйста, отправьте свою геолокацию с помощью кнопки.")
▲ 0

Взято отсюда https://stackoverflow.com/questions/68021560/how-i-can-request-the-users-location-in-inline-keyboard-within-telegram!

Как поясняется в официальном API Telegram Bot , InlineKeyboardMarkupButton должно содержать ровно одно из следующих необязательных полей: callback_data, login_url, switch_inline_query, switch_inline_query_current_chat, callback_game,pay

Это означает, что на встроенной клавиатуре не может быть кнопки, запрашивающей местоположение пользователя, так называемой request_location.

Исходя из этого указанная в примерах инлайн кнопка:

but = types.InlineKeyboardButton("Отправить свою геолокацию", request_location=True, callback_data='btn_geo')

возвращать геолокацию при нажатии не будет.