#python #telegram #telegram-bot #python-telegram-bot
#python #telegram #telegram-бот #python-telegram-бот
Вопрос:
Я делаю бота для агентства недвижимости. Бот отправляет сообщения, содержащие информацию о квартире. Бот может отправлять несколько сообщений одновременно, чтобы пользователь мог выбирать из них. Как я могу реализовать процесс выбора одного из сообщений? Когда я делаю встроенную кнопку в сообщении, когда пользователь нажимает на нее, то по какой-то причине боту возвращается идентификатор последнего сообщения, то есть, если бот отправил три сообщения с кнопками «выбрать», то при нажатии на первое, последнеевозвращается. Я думал сделать так, чтобы, например, пользователь мог сделать ответ на сообщение и тем самым выбрать конкретное, но я не понимаю, как соотнести сообщение пользователя и сообщение, на которое он ответил. Как я могу сделать это лучше?
Ответ №1:
когда пользователь нажимает на него, то по какой-то причине идентификатор последнего сообщения возвращается боту
Это не ожидаемое поведение, если вы отправляете 3 разных сообщения, содержащих встроенную кнопочную клавиатуру, при нажатии на любую из кнопок создается новое обновление обратного вызова, которое содержит идентификатор сообщения, которое пользователь также нажал на его кнопку. Вы должны проверить это, чтобы убедиться.
Что вам нужно, так это callback_data
:
InlineKeyboardButton имеет callback_data
поле. Это специально для вашей цели, вы можете поместить в callback_data
apartment_id, а затем, когда пользователь нажимает на любую из кнопок, вы также получите, callback_data
и с этим вы узнаете, apartment_id
на что нажал пользователь.
Вы не указали, какую библиотеку используете, но проверьте этот пример в библиотеке на python.
def start(update: Update, context: CallbackContext) -> None:
keyboard = [
[
InlineKeyboardButton("Option 1", callback_data='1'),
InlineKeyboardButton("Option 2", callback_data='2'),
],
[InlineKeyboardButton("Option 3", callback_data='3')],
]
reply_markup = InlineKeyboardMarkup(keyboard)
update.message.reply_text('Please choose:', reply_markup=reply_markup)
def button(update: Update, context: CallbackContext) -> None:
query = update.callback_query
# CallbackQueries need to be answered, even if no notification to the user is needed
# Some clients may have trouble otherwise. See https://core.telegram.org/bots/api#callbackquery
query.answer()
query.edit_message_text(text="Selected option: {}".format(query.data))
def main():
# Create the Updater and pass it your bot's token.
# Make sure to set use_context=True to use the new context based callbacks
# Post version 12 this will no longer be necessary
updater = Updater("TOKEN", use_context=True)
updater.dispatcher.add_handler(CommandHandler('start', start))
updater.dispatcher.add_handler(CallbackQueryHandler(button))
В примере, если пользователь нажимает на первую кнопку Option 1
query
, внутренняя button
функция будет «1». Если они нажмут на вторую кнопку Option 2
, вы получите 2
as query
. Теперь вместо 1
и 2
вы можете хранить идентификатор каждой квартиры. Если у вас есть кнопки для нескольких целей, вы можете различать их с помощью коротких фраз, таких как: apartment_id:1
или close_button
. Во время обработки обновления вы можете разделить запрос на :
, если split[0]
было apartment_id
, тогда вы обработаете split[2]
, иначе вы узнаете, что пользователь нажал на другие кнопки.
Таким callback_data
образом, ограниченная база данных является решением таких проблем.