You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Telebot中register_next_step_handler未立即触发函数的问题排查与修复

问题描述

使用Telebot开发机器人时,start函数向用户展示「Currency Calc」和「Weather Today」两个按钮。期望用户按下按钮时直接触发where_to_go函数,但实际需要按下按钮两次或发送第二条消息才会触发,且此时where_to_go读取的是第一条消息的内容。后续从where_to_go到converter或city的流程运行正常。

相关代码:

@bot.message_handler(commands = ['start','main'])
def start(message):
    markup = types.ReplyKeyboardMarkup()  
    btn1 = types.KeyboardButton('Currency Calc')
    markup.row(btn1)
    btn2 = types.KeyboardButton('Weather Today')
    markup.row(btn2)
    file = open('./Start Photo.png', 'rb')
    bot.send_photo(message.chat.id, file, reply_markup=markup)
    bot.send_message(message.chat.id,
                         f"Good night, {message.from_user.first_name} {message.from_user.last_name} 💋. \n")
    bot.send_message(message.chat.id, f"I'm PogodiPogoda Bot. Choose a button or just talk to me.", reply_markup=markup)
    bot.register_next_step_handler(message, where_to_go)


def where_to_go(message):
    if message.text == 'Currency Calc':
        bot.register_next_step_handler(message, converter)
    elif message.text == 'Weather Today':
        bot.register_next_step_handler(message, city)
问题原因

错误地使用bot.register_next_step_handler()处理按钮点击事件。register_next_step_handler的设计目的是在当前对话步骤后,监听用户的下一条消息并传递给指定函数,它依赖对话上下文绑定。而按钮点击是独立的消息事件,用户第一次点击按钮发送的消息无法被该handler正确捕获;当用户发送第二条消息时,handler才会触发并读取第一条消息的内容,导致延迟触发的问题。

修复方案
  1. 给where_to_go函数添加message_handler装饰器,让它直接捕获按钮对应的文本消息,无需依赖对话上下文绑定。
  2. 移除start函数中的bot.register_next_step_handler(message, where_to_go)调用,避免上下文冲突。

修改后的代码示例:

@bot.message_handler(commands = ['start','main'])
def start(message):
    markup = types.ReplyKeyboardMarkup()  
    btn1 = types.KeyboardButton('Currency Calc')
    markup.row(btn1)
    btn2 = types.KeyboardButton('Weather Today')
    markup.row(btn2)
    file = open('./Start Photo.png', 'rb')
    bot.send_photo(message.chat.id, file, reply_markup=markup)
    bot.send_message(message.chat.id,
                         f"Good night, {message.from_user.first_name} {message.from_user.last_name} 💋. \n")
    bot.send_message(message.chat.id, f"I'm PogodiPogoda Bot. Choose a button or just talk to me.", reply_markup=markup)

# 添加装饰器,直接捕获按钮文本消息
@bot.message_handler(func=lambda message: message.text in ['Currency Calc', 'Weather Today'])
def where_to_go(message):
    if message.text == 'Currency Calc':
        bot.register_next_step_handler(message, converter)
    elif message.text == 'Weather Today':
        bot.register_next_step_handler(message, city)

修改后,用户点击按钮时where_to_go会立即触发,无需重复操作。

内容的提问来源于stack exchange,提问作者EssentialMarie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 12:16:35