как сделать викторину на aiogram?
форумчане.Уже вторую неделю не пойму как сделать викторину на Aiogram, python.Получилось такое решение:

МЫ создаём кнопки, но под каждый вопрос отдельно, ибо если ввести переменную с номером вопроса, то ответить сможет только один юзер;
а здесь я обрабатываю ответы:

Прошу вас помочь мне грамотно и главное кратко реализовать такую викторину, ведь вопросов планируется 43, а делать кнопки под каждый вопрос не очень компитентно...
Вот код:
exit_key = InlineKeyboardButton('Выход>', callback_data='exit')
replay_test_key = InlineKeyboardButton('Заного?', callback_data='replaytest')
christmas_yes_key1 = InlineKeyboardButton('?', callback_data='да1')
christmas_no_key1 = InlineKeyboardButton('?', callback_data='нет1')
christmas_keyboard1 = InlineKeyboardMarkup().add(christmas_yes_key1, christmas_no_key1).add(exit_key)
christmas_yes_key2 = InlineKeyboardButton('?', callback_data='да2')
christmas_no_key2 = InlineKeyboardButton('?', callback_data='нет2')
christmas_keyboard2 = InlineKeyboardMarkup().add(christmas_yes_key2, christmas_no_key2).add(exit_key,)
christmas_yes_key3 = InlineKeyboardButton('?', callback_data='да3')
christmas_no_key3 = InlineKeyboardButton('?', callback_data='нет3')
christmas_keyboard3 = InlineKeyboardMarkup().add(christmas_yes_key3, christmas_no_key3).add(exit_key)
christmas_yes_key4 = InlineKeyboardButton('?', callback_data='да4')
christmas_no_key4 = InlineKeyboardButton('?', callback_data='нет4')
christmas_keyboard4 = InlineKeyboardMarkup().add(christmas_yes_key4, christmas_no_key4).add(exit_key, replay_test_key)
end_vic_keyboard = InlineKeyboardMarkup().add(replay_test_key)
@dp.callback_query_handler(lambda c: c.data)
async def inlines(c):
if c.data == 'нет1':
await bot.answer_callback_query(c.id, text='')
await bot.edit_message_text(chat_id=c.message.chat.id, message_id=c.message.message_id,
text='Вы дарите подарки?', reply_markup=christmas_keyboard2)
if c.data == 'да1':
await bot.answer_callback_query(c.id, text='')
await bot.edit_message_text(chat_id=c.message.chat.id, message_id=c.message.message_id,
text='Вы дарите подарки?', reply_markup=christmas_keyboard2)
if c.data == 'нет2':
await bot.answer_callback_query(c.id, text='')
await bot.edit_message_text(chat_id=c.message.chat.id, message_id=c.message.message_id,
text='Вы любите новый год?', reply_markup=christmas_keyboard3)
if c.data == 'да2':
await bot.answer_callback_query(c.id, text='')
await bot.edit_message_text(chat_id=c.message.chat.id, message_id=c.message.message_id,
text='Вы любите новый год?', reply_markup=christmas_keyboard3)
if c.data == 'нет3':
await bot.answer_callback_query(c.id, text='')
await bot.edit_message_text(chat_id=c.message.chat.id, message_id=c.message.message_id,
text='Викторина закончена, спасибо за участие!', reply_markup=end_vic_keyboard)
if c.data == 'да3':
await bot.answer_callback_query(c.id, text='')
await bot.edit_message_text(chat_id=c.message.chat.id, message_id=c.message.message_id,
text='Викторина закончена, спасибо за участие!', reply_markup=end_vic_keyboard)
if c.data == 'replaytest':
await bot.answer_callback_query(c.id, text='')
await bot.edit_message_text(chat_id=c.message.chat.id, message_id=c.message.message_id,
text='У вас появилось новогоднее настроение??', reply_markup=christmas_keyboard1)
if c.data == 'exit':
await bot.answer_callback_query(c.id, text='')
await bot.edit_message_text(chat_id=c.message.chat.id, message_id=c.message.message_id,
text='Спасибо за участие, викторина закончена!', reply_markup=end_vic_keyboard)
Ответы (2 шт):
Автор решения: Макс Соловьев
→ Ссылка
Это для отправки викторины при нажатии на инлайн кнопку:
await bot.send_poll(call.message.chat.id, 'Мессенджер, автор которого Павел Дуров',
['Telegram', 'Viber', 'WhatsApp', 'Messenger'],
type='quiz', correct_option_id=0, is_anonymous=False)
А это при отправке сообщения чтоб получить викторину:
await bot.send_poll(message.chat.id, 'Мессенджер, автор которого Павел Дуров',
['Telegram', 'Viber', 'WhatsApp', 'Messenger'],
type='quiz', correct_option_id=0, is_anonymous=False)
Автор решения: Creeper Hack
→ Ссылка
для этого же есть FSM
и ещё пользуйся elif ` ами
from aiogram import Bot, Dispatcher, types, executor
from aiogram.types import InlineKeyboardButton, InlineKeyboardMarkup
from aiogram.dispatcher import FSMContext
from aiogram.dispatcher.filters.state import State, StatesGroup
from config import TOKEN
bot = Bot(TOKEN)
dp = Dispatcher(bot)
exit_key = InlineKeyboardButton('Выход>', callback_data='exit')
replay_test_key = InlineKeyboardButton('Заного?', callback_data='replaytest')
christmas_yes_key = InlineKeyboardButton('?', callback_data='нет')
christmas_no_key = InlineKeyboardButton('?', callback_data='да')
christmas_keyboard = InlineKeyboardMarkup().add(christmas_yes_key, christmas_no_key).add(exit_key)
end_vic_keyboard = InlineKeyboardMarkup().add(replay_test_key)
class Questions(StatesGroup):
q1 = State()
q2 = State()
@dp.message_handler(commands=['start'])
async def start(msg: types.Message):
await Questions.next()
await msg.answer('викторина началась!')
await msg.answer('Вы дарите подарки?', reply_markup=christmas_keyboard)
@dp.callback_query_handler(state=Questions.q1)
async def q1(c: types.CallbackQuery, state: FSMContext):
# Получаем ответ от первого вопроса и отправляем второй вопрос
# Вы можете сохранить ответ пользователя так (если надо):
await state.set_data(q1=c.data)
# переходим в следущий state и задаем вопрос
await Questions.next()
await bot.edit_message_text(chat_id=c.message.chat.id, message_id=c.message.message_id,
text='Вы любите новый год?', reply_markup=christmas_keyboard)
# if c.data == 'нет':
# await bot.answer_callback_query(c.id, text='')
# elif c.data == 'да':
# await bot.answer_callback_query(c.id, text='')
@dp.callback_query_handler(state=Questions.q2)
async def q2(c: types.CallbackQuery, state: FSMContext):
await state.set_data(q2=c.data)
await Questions.next()
await bot.edit_message_text(chat_id=c.message.chat.id, message_id=c.message.message_id,
text='Викторина закончена, спасибо за участие!', reply_markup=end_vic_keyboard)
# if c.data == 'нет':
# await bot.answer_callback_query(c.id, text='')
# elif c.data == 'да':
# await bot.answer_callback_query(c.id, text='')
@dp.callback_query_handler(state='*')
async def inlines(c: types.CallbackQuery, state: FSMContext):
# передаём ответы пользователя в переменную перед тем как завершить fsm
answers = await state.get_data()
# завершаем fsm
await state.finish()
if c.data == 'replaytest':
# заново начинаем вопрос
await Questions.next()
# в конце ты мошежь показать ответы пользователя так
await c.message.answer('1-вопрос: ' + answers['q1'] +\
'2-вопрос: ' + answers['q2'])
await bot.answer_callback_query(c.id, text='')
await bot.edit_message_text(chat_id=c.message.chat.id, message_id=c.message.message_id,
text='У вас появилось новогоднее настроение??', reply_markup=christmas_keyboard)
await c.message.answer('викторина началась!')
await c.message.answer('Вы дарите подарки?', reply_markup=christmas_keyboard)
elif c.data == 'exit':
await bot.answer_callback_query(c.id, text='')
await bot.edit_message_text(chat_id=c.message.chat.id, message_id=c.message.message_id,
text='Спасибо за участие, викторина закончена!', reply_markup=end_vic_keyboard)
executor.start_polling(dp, skip_updates=True)