Редактор API Telegram бота InlineKeyboard с python-telegram-bot не работает - PullRequest
2 голосов
/ 17 марта 2019

Я пытаюсь создать меню, в котором пользователь может перемещаться по нему.Это мой код:

MENU, HELP = range(2)

def start(bot, update):
    keyboard = [
                 [InlineKeyboardButton('Help', callback_data='help')]
               ]

    # Create initial message:
    message = 'Welcome.'

    update.message.reply_text(message, reply_markup=InlineKeyboardMarkup(keyboard))

def help(bot, update):

    keyboard = [
                 [InlineKeyboardButton('Leave', callback_data='cancel')]
               ]


    update.callback_query.edit_message_reply_markup('Help ... help..', reply_markup=InlineKeyboardMarkup(keyboard))

def cancel(bot, update):

    update.message.reply_text('Bye.', reply_markup=ReplyKeyboardRemove())

    return ConversationHandler.END     


# Create the EventHandler and pass it your bot's token.
updater = Updater(token=config.TELEGRAM_API_TOKEN)

# Get the dispatcher to register handlers:
dispatcher = updater.dispatcher

dispatcher.add_handler(CommandHandler('start', start))
dispatcher.add_handler(CallbackQueryHandler(help, pattern='help'))
dispatcher.add_handler(CallbackQueryHandler(cancel, pattern='cancel'))

updater.start_polling()

updater.idle()

Как и ожидалось, при / start пользователь получает меню «Помощь».Когда пользователь нажимает на него, функция help () также запускается, как и ожидалось.

Исходя из моего понимания документации python-telegram-bot предполагается, что update.callback_query.inline_message_id заполнено, но его значение равно Нет .

Мне нужно update.callback_query.inline_message_id , чтобы обновить меню InlineKeyboard, верно?Почему inline_message_id пуст (нет)?

Python 3.6.7
python-telegram-bot==11.1.0

С наилучшими пожеланиями.Клейсон Риос.

1 Ответ

0 голосов
/ 17 марта 2019

Я считаю, что в вашем коде есть 2 проблемы.

Первый .В вашей функции help вы пытаетесь изменить как текст сообщения, так и разметку его.Но метод edit_message_reply_markup только изменяет разметку .Поэтому вместо

update.callback_query.edit_message_reply_markup(
    'Help ... help..',
    reply_markup=InlineKeyboardMarkup(keyboard)
)

Сделайте следующее:

bot.edit_message_text(
    text='Help ... help..',
    chat_id=update.callback_query.message.chat_id,
    message_id=update.callback_query.message.message_id,
    reply_markup=InlineKeyboardMarkup(keyboard)
)
bot.answer_callback_query(update.callback_query.id, text='')

Обратите внимание на изменения:

  • Я заменил update.callback_query на bot.
  • ВАЖНО : я заменил edit_message_reply_markup на edit_message_text;Потому что первый только изменяет разметку , а второй может делать и то и другое.
  • Я добавил chat_id и message_id аргументы;Потому что это то, что говорится в документах .
  • ВАЖНО : я добавил новый метод (bot.answer_callback_query);Потому что каждый раз, когда вы обрабатываете обратный вызов , вам нужно ответить (используя этот метод).Однако вы можете оставить аргумент text пустым , чтобы он ничего не показывал.

Second .Поправьте меня, если я ошибаюсь, но я верю, что когда пользователь нажимает кнопку cancel, вы хотите, чтобы текст сообщения был изменен на "Пока".и уберите клавиатуру .Если это так, то, что вы делаете неправильно, вы отправляете новое сообщение (reply_text) при попытке удалить клавиатуру (reply_markup=ReplyKeyboardRemove()).Вы можете просто сделать это следующим образом:

bot.edit_message_text(
    text='Bye',
    chat_id=update.callback_query.message.chat_id,
    message_id=update.callback_query.message.message_id,
)
bot.answer_callback_query(update.callback_query.id, text='')

Здесь идея заключается в том, что когда вы редактируете текст сообщения и не используете клавиатуру разметки, предыдущая клавиатура автоматически удаляется , поэтому вам не нужно использовать ReplyKeyboardRemove().

Вот GIF (с жестким G), который работает!

enter image description here

...