我正在尝试制作一个对用户进行测试的机器人。为了不做很多状态,我尝试循环出问题,但机器人一次发送所有问题。如何让机器人等待用户对每个响应的响应,而不为每个响应附加状态。我希望有办法...
class dialog(StatesGroup):
name = State()
victorina = State()
# тут стартует викторина
@dp.message_handler(state=dialog.name, content_types=['text'])
async def take_name_and_start_questions(msg: types.Message, state: FSMContext):
await dialog.victorina.set()
async with state.proxy() as data:
data['answers'] = []
await state.update_data(name=msg.text)
for questions in replies.q:
kb = create_kb(len(questions['a']))
text = questions['q'] + "\n"
i = 1
for ans in questions['a']:
text += f'{i}) {ans} \n'
i += 1
await msg.answer(text, reply_markup=kb)
# тут должны обрабатываться ответы
@dp.message_handler(state=dialog.victorina, content_types=['text'])
async def save_answer(msg: types.Message, state: FSMContext):
async with state.proxy() as data:
data['answers'].add(int(msg.text))
# создание клавиатуры с ответами 1-2-3 в зависимости от их числа
def create_kb(cnt: int):
kb = ReplyKeyboardMarkup()
for but in range(1, cnt):
b = KeyboardButton(but)
kb.add(b)
return kb
您可以将问题计数器推入状态。也就是说,您将写入和读取问题编号的某个变量签入状态数据。好吧,既然你给猫的代码哭了,我就让它有点不同
一般来说,我不明白你为什么决定使用键盘按钮,而不是内联,这样会更方便,而且不必用 message_handlers 弄乱你的机器人。
这是代码如何工作的示例
尝试导入时间。并使用 time.sleep() 方法,设置发送每个问题的时间。