【问题标题】:Telegram bot not able to send message after reply keyboard电报机器人在回复键盘后无法发送消息
【发布时间】:2019-11-17 15:06:29
【问题描述】:

我是 Telegram bot api 的新手,我正在尝试使用内联键盘制作一个简单的机器人。我的机器人工作正常,但在选择最终内联键盘选项后无法发回消息。这是我的代码:

import telegram
from telegram.ext import Updater,CommandHandler,MessageHandler,Filters,CallbackQueryHandler
from telegram import InlineKeyboardButton,InlineKeyboardMarkup,KeyboardButton,ReplyKeyboardMarkup
def start(bot, update):
    bot.send_message(chat_id=update.message.chat_id, text='Hi, I am Food Bot')
    update.message.reply_text(main_menu_message(),
                            reply_markup=main_menu_keyboard())

def main_menu(bot, update):
  query = update.callback_query
  bot.edit_message_text(chat_id=query.message.chat_id,
                        message_id=query.message.message_id,
                        text=main_menu_message(),
                        reply_markup=main_menu_keyboard())

def first_menu(bot, update):
  query = update.callback_query
  bot.edit_message_text(chat_id=query.message.chat_id,
                        message_id=query.message.message_id,
                        text=first_menu_message(),
                        reply_markup=first_menu_keyboard())

def second_menu(bot, update):
  query = update.callback_query
  bot.edit_message_text(chat_id=query.message.chat_id,
                        message_id=query.message.message_id,
                        text=second_menu_message(),
                        reply_markup=second_menu_keyboard())
def main_menu_keyboard():
  keyboard = [[InlineKeyboardButton('Breakfast', callback_data='op1')],
                 [InlineKeyboardButton('Lunch or Dinner', callback_data='op2')]]
  return InlineKeyboardMarkup(keyboard)

def first_menu_keyboard():
  keyboard = [[InlineKeyboardButton('Omelette and 2 Bread slices with coffee',callback_data = 'b1')],
                     [InlineKeyboardButton('Aloo paratha with curd and tea',callback_data = 'b2')],
                     [InlineKeyboardButton('Masala dosa with sambar and chutney with coffee',callback_data = 'b3')]]
  return InlineKeyboardMarkup(keyboard)

def second_menu_keyboard():
  keyboard = [[InlineKeyboardButton('Paneer Makhni with 2 rotis and rice',callback_data = 'l1')],
                     [InlineKeyboardButton('Pasta in white sauce with 2 pieces of garlic bread',callback_data = 'l2')],
                     [InlineKeyboardButton('Biryani with raita',callback_data = 'l3')]]
  return InlineKeyboardMarkup(keyboard)
def main_menu_message():
  return 'What do you want to order?'

def first_menu_message():
  return 'Choose the food option:'

def second_menu_message():
  return 'Choose the food option:'
def breakfast1(bot,update):
    bot.send_message(chat_id=update.message.chat_id,
                        message_id=update.message.message_id,
                        text='Your order: Omelette and 2 Bread slices with coffee')
def breakfast2(bot,update):
    bot.send_message(chat_id=update.message.chat_id,
                        message_id=update.message.message_id,
                        text='Your order: Aloo paratha with curd and tea')
def breakfast3(bot,update):
    bot.send_message(chat_id=update.message.chat_id,
                        message_id=update.message.message_id,
                        text='Your order: Masala dosa with sambar and chutney with coffee')

def lunchdinner1(bot,update):
        bot.send_message(chat_id=update.message.chat_id,
                        message_id=update.message.message_id,
                        text='Your order: Paneer Makhni with 2 rotis and rice')
def lunchdinner2(bot,update):
        bot.send_message(chat_id=update.message.chat_id,
                        message_id=update.message.message_id,
                        text='Your order: Pasta in white sauce with 2 pieces of garlic bread')
def lunchdinner3(bot,update):
        bot.send_message(chat_id=update.message.chat_id,
                        message_id=update.message.message_id,
                        text='Biryani with raita')
def main():
    bot=telegram.Bot(token=TOKEN)
    updater = Updater(token=TOKEN)

    updater.dispatcher.add_handler(CommandHandler('start', start))
    updater.dispatcher.add_handler(CallbackQueryHandler(main_menu, pattern='main'))
    updater.dispatcher.add_handler(CallbackQueryHandler(first_menu, pattern='op1'))
    updater.dispatcher.add_handler(CallbackQueryHandler(second_menu, pattern='op2'))
    updater.dispatcher.add_handler(CallbackQueryHandler(breakfast1,
                                                        pattern='b1'))
    updater.dispatcher.add_handler(CallbackQueryHandler(breakfast2,
                                                        pattern='b2'))
    updater.dispatcher.add_handler(CallbackQueryHandler(breakfast3,
                                                        pattern='b3'))
    updater.dispatcher.add_handler(CallbackQueryHandler(lunchdinner1,
                                                        pattern='l1'))
    updater.dispatcher.add_handler(CallbackQueryHandler(lunchdinner2,
                                                        pattern='l2'))
    updater.dispatcher.add_handler(CallbackQueryHandler(lunchdinner3,
                                                        pattern='l3'))


    updater.start_polling()
if __name__ == '__main__':
    main()

在选择主菜单的选项之一时,会相应地出现下一个菜单,但是当从第二个菜单中选择该选项时,即使我已经为这些选项的回调数据添加了处理程序并且函数必须发送,也没有发生任何事情消息。我究竟做错了什么?

【问题讨论】:

    标签: python telegram chatbot telegram-bot python-telegram-bot


    【解决方案1】:

    我建议,read 这段代码并使用 ConversationHandler 代替它。您只需将用户返回到特定状态并等待命令、消息或回调然后获取更新,并在检测到用户操作后执行您的工作。

    • 当您初始化更新程序时,您也不必初始化机器人。 updater 对象传递两个机器人,在获得用户输入时更新到您的函数。

    【讨论】:

    • 如何在代码中使用错误处理程序以及机器人和更新参数?代码使用use_context,它通过updatecontext,但我也需要bot参数
    • 我更喜欢使用不需要 use_context 的 11.1.0 版本,而且这里的更新是更新,上下文不是机器人实例。
    • context参数的方法和bot一样吗?文档显示了不同的方法。我需要bot.edit_message_text,它不在context
    猜你喜欢
    • 2021-09-10
    • 2017-03-19
    • 1970-01-01
    • 1970-01-01
    • 2016-03-11
    • 2017-09-01
    • 2020-10-10
    • 2019-03-13
    • 2016-10-22
    相关资源
    最近更新 更多