Python 3.x 尝试使用ConversationHandler通过MessageHandler获取用户输入

Python 3.x 尝试使用ConversationHandler通过MessageHandler获取用户输入,python-3.x,telegram,telegram-bot,python-telegram-bot,Python 3.x,Telegram,Telegram Bot,Python Telegram Bot,我正在尝试处理InlineKeyboardButton回调数据和自由文本数据。以下是我的场景: 提示一个带有多个按钮的内联键盘,用户单击一个按钮,然后要求输入一些自由文本以供使用 我曾尝试使用CallbackQueryHandler(回调函数中的几个InlineKeyboardMarkup)作为ConversationHandler的入口点,然后触发MessageHandler,但没有成功。。 我需要捕捉自由文本更新(基本上等待用户输入) def启动(更新、上下文): 键盘=[[InlineK

我正在尝试处理InlineKeyboardButton回调数据和自由文本数据。以下是我的场景:

提示一个带有多个按钮的内联键盘,用户单击一个按钮,然后要求输入一些自由文本以供使用

我曾尝试使用CallbackQueryHandler(回调函数中的几个InlineKeyboardMarkup)作为ConversationHandler的入口点,然后触发MessageHandler,但没有成功。。 我需要捕捉自由文本更新(基本上等待用户输入)


def启动(更新、上下文):
键盘=[[InlineKeyboardButton(“bal-bla”,callback_data='1'),
InlineKeyboardButton(“bla-bla”,callback_data='2')],
[InlineKeyboardButton(“bla-bla)”,回调_data='3'),
InlineKeyboardButton(“bla-bla”,callback_data='4')],
[InlineKeyboardButton(“bla-bla”,callback_data='5')]]
reply_markup=InlineKeyboardMarkup(键盘)
update.message.reply_text('请选择:',reply_标记=reply_标记)
答复_text={'text':''}
def回复_消息(更新、上下文):
message=update.message.text
回复文本['text']=消息
返回回复文本['text']
def按钮(更新、上下文、用户数据):
query=update.callback\u查询
查询。编辑消息文本(text=“正在加载…”\n\r)
如果query.data='1':
通过
elif query.data==“2”:
通过
elif query.data==“3”:
键盘=[[InlineKeyboardButton('BBB',callback_data='21'),
InlineKeyboardButton('GGG',callback_data='22')],
[InlineKeyboardButton('PPP',回调_data='23')]]
reply_markup1=InlineKeyboardMarkup(键盘)
query.edit_message_text('请选择:',reply_markup=reply_markup1)
elif query.data==“21”:
查询.编辑消息文本('输入客户名称')
返回1
if:#不知道在这里给出哪个条件
打印(回复文本['text'],“\n^此处有新的免费短信^”)
def main():
conv_handler=会话处理程序(
入境点=[
CallbackQueryHandler(按钮)
],
州={
1:[MessageHandler(Filters.text,reply_message)],
},
回退=[]
)
尝试:
updater=updater(bot\u令牌,use\u context=True)
add_处理程序(CommandHandler('start',start))
updater.dispatcher.add_处理程序(CallbackQueryHandler(按钮))
updater.dispatcher.add\u处理程序(conv\u处理程序)
updater.start_polling()
updater.idle()
例外情况除外,如e:
打印(e)

嘿,我通过创建一个函数来解析用户输入并使用上下文的user_data方法记住输入,解决了这个问题

def检查用户输入(更新、上下文):
#获取最后一个用户文本
用户输入=update.message.text
#获取用户数据上下文
user\u data=context.user\u data
#设置新的上下文用户输入
用户数据['user\u input']=用户输入
context.user_data['user_input']=user_data['user_input']
如果用户输入中有“文本”:
#做点什么。。。i、 e应答,不带键盘
update.message.reply_text(
(“{}?!,听起来很有趣,告诉我更多信息”。格式(
用户(输入)
返回客人选择
其他:
#再问
回复键盘=['Text'],['Done']]
markup=ReplyKeyboardMarkup(回复键盘,一次性键盘=True)
update.message.reply_text(
(“{}?!,我什么都不知道……”格式(
用户(输入),回复(标记=标记))
退票选择
这似乎是最受欢迎的处理和记住用户输入的方法

现在可以根据需要在ConversationHandler/MessageHandler中调用此函数。您只需返回到指定的ConversationHandler状态。因此,我将创建两个状态,一个GUEST_CHOICE和一个CHECK_CHOICE状态,以处理单用户输入验证作为示例

conv_handler=ConversationHandler(
入口点=[CommandHandler('start',start)],
州={
#询问客人
GUEST_选项:[MessageHandler(Filters.regex(“^(Text)$”),
客人选择),
],
#验证输入
选中选项:[MessageHandler(Filters.text,
检查用户输入),
],
},
回退=[MessageHandler(Filters.regex(“^Done$”),Done,CommandHandler('start',start))],
允许返回=错误,
每用户=真,
会话超时=3600,
name=“测试”
)
根据定义,/start用作启动conversationhandler的用户。这将调用start()方法,即:

def start(update, context):           
    reply_keyboard = [['Text'],['Done']]
    markup = ReplyKeyboardMarkup(reply_keyboard, one_time_keyboard=True)

    # Setup keyboard and reply
    update.message.reply_text(
            ("Hey {}, how can i help you?".format(
            update.message.chat['first_name'])),
            reply_markup=markup)

    return CHECK_CHOICE
start()将设置标记键盘,之后的任何输入都将使用CHECK_选项状态进行处理,该状态将在此处调用CHECK_user_输入(参见上文)。这将返回GUEST\u CHOICE,因此将调用GUEST\u CHOICE(),即:

def guest_选项(更新、上下文):
user\u data=context.user\u data
#检查身份验证请求
如果用户_数据['user_input']中的“bob”:
update.message.reply_text(“Hey{}”.format(user_data['user_input']))
其他:
update.message.reply_text(“鲍勃在哪里?!”)
返回检查输入
“完成”方法将清理对话

def完成(更新,上下文):
标记=获取标记(上下文)
更新。消息。回复文本(“再见”)
返回ConversationHandler.END

好吧,很快就升级了。。。我从我自己的对话处理程序工作版本中重写了代码,请检查错误:)可能必须在“完成”方法中清除用户数据。

嘿,我通过创建一个函数来解析用户输入并使用上下文的“用户数据”方法记住输入来解决这个问题

def检查用户输入(更新、上下文):
#获取最后一个用户文本