aiogram中如何获取机器人发送提示后用户输入的消息?
解决机器人提示后获取用户后续输入的问题
问题场景
机器人发送「请输入要兑换的数量:」这类提示消息后,需要接收用户在此之后发送的消息,但当前代码中用msg.text获取到的是用户之前发送的「💱 Exchange」消息,无法拿到目标输入。
错误原因
在触发exchange函数的逻辑里,msg.text对应的是用户触发该函数的那条消息(也就是「💱 Exchange」),此时用户还没输入兑换数量,自然取不到后续内容。只有切换到指定状态后的专属处理函数,才能捕获用户的下一条输入。
修正方案
- 删除
exchange函数里多余的need_message = msg.text和print(need_message)代码,这部分逻辑完全错误,拿不到目标输入。 - 确保
UserState.exchange_amount状态正确定义,第二个处理函数exchange_amount_handler会自动接收用户在状态切换后的输入,这里的msg.text才是用户输入的兑换数量。
修正后的完整代码
@router.message(F.text == "💱 Exchange") async def exchange(msg: Message, state: FSMContext): # 保存用户信息到自定义State类(注意:多用户场景建议用FSMContext的state存储,避免数据冲突) State.id = msg.from_user.id State.first_name = msg.from_user.first_name State.last_name = msg.from_user.last_name State.is_premium = msg.from_user.is_premium State.is_bot = msg.from_user.is_bot await msg.answer('请输入你要兑换的数量💱:') # 切换到兑换数量输入状态,等待用户输入 await state.set_state(UserState.exchange_amount) @router.message(UserState.exchange_amount) async def exchange_amount_handler(msg: Message, state: FSMContext): amount = msg.text print(f"你输入的数量是:{amount}") # 这里可添加数量合法性校验、执行兑换逻辑等操作 await state.clear()
额外优化建议
如果是多用户使用的机器人,不建议用全局的State类存储用户信息,容易出现并发数据混乱。更规范的做法是用FSMContext自带的存储方法:
# 在exchange函数中保存用户信息到状态 await state.update_data( user_id=msg.from_user.id, first_name=msg.from_user.first_name, last_name=msg.from_user.last_name, is_premium=msg.from_user.is_premium, is_bot=msg.from_user.is_bot ) # 在exchange_amount_handler中取出数据 user_data = await state.get_data() user_id = user_data.get('user_id')
内容的提问来源于stack exchange,提问作者Tim Hacks
相关产品推荐
相关产品推荐

