геолокация пользователя с помощью aiogram python
Мне нужно, чтобы по нажатию кнопки "Поделиться своей геолокацией" пользователь отправлял геолокацию, но я реализовываю все по 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 реагировала на это сообщение, запрашивая геолокацию?
Ответы (2 шт):
- Создайте кнопку с запросом на геолокацию
but = types.InlineKeyboardButton("Отправить свою геолокацию", request_location=True, callback_data='btn_geo')
inline_kb4 = InlineKeyboardMarkup().add(but)
- Создайте колбэк-функцию
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, "Спасибо! Теперь вы можете отправить мне сообщение с вашим вопросом.")
- Создайте функцию, которая будет вызываться при получении сообщения от пользователя
@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, "Пожалуйста, отправьте свою геолокацию с помощью кнопки.")
Взято отсюда 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')
возвращать геолокацию при нажатии не будет.