python-telegram-bot, ConversationHandler(states)去到最后一个键,忽略其余



我想写一个简单的注册机器人,但是我犯了一个错误,不知道如何修复,请帮助我。我的问题是没有消息从这样的函数发送:name_handler, age_handler。

from telegram import Update
from telegram import (ReplyKeyboardMarkup, ReplyKeyboardRemove)
from telegram.ext import (Updater, CommandHandler, MessageHandler, Filters,
ConversationHandler)
NAME, GENDER, AGE = 0, 0, 0
user_data = {}

def start_handler(update: Update, context):
update.message.reply_text(
"enter ur name",
reply_markup=ReplyKeyboardRemove(),
)
return NAME

def name_handler(update: Update, context):
user_data[NAME] = update.message.text
update.message.reply_text("enter ur gender")
return GENDER

def age_handler(update: Update, context):
user_data[GENDER] = update.message.text
update.message.reply_text("enter ur age")
return AGE

def finish_handler(update: Update, context):
user_data[AGE] = update.message.text
update.message.reply_text(f"registered successfully, you are {user_data[NAME]}, {user_data[GENDER]}, "
f"{user_data[AGE]}")
return ConversationHandler.END

def cancel_handler(update: Update, context):
print("bye")

def main():
updater = Updater(
token="token",
use_context=True,
)
dp = updater.dispatcher
conv_handler = ConversationHandler(
entry_points=[
CommandHandler("start", start_handler),
],
states={
NAME: [MessageHandler(Filters.all, name_handler)],
GENDER: [MessageHandler(Filters.all, age_handler)],
AGE: [MessageHandler(Filters.all, finish_handler)]
},
fallbacks=[CommandHandler("cancel", cancel_handler)],
)
dp.add_handler(conv_handler)
updater.start_polling()
updater.idle()

main()

在"后输入您的姓名"必须是"输入性别";但电报上写着"注册成功">

因为NAME,GENDERAGE都等于0,所以您的会话处理程序只有一个状态,即最后一个状态。要理解这一点,请尝试在python控制台中运行print({0:1, 0:2, 0:3})。因此,要解决这个问题,请确保您的状态具有唯一的值。


免责声明:我目前是python-telegram-bot的维护者。

试试这样写:

NAME, GENDER, AGE = range(3)

相关内容

最新更新