Пример кода на aio
Как работает? Выбираешь симптом(ы), жмешь подтвердить.
Полный код без использования рекомендаций, добавлена кнопка подтверждения, чтобы бот тянул из словаря selected_symptoms = []
выбранные симптомы:
import logging
from aiogram import Bot, Dispatcher, types
from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton, CallbackQuery
from aiogram.utils import executor
logging.basicConfig(level=logging.INFO)
# инициализация бота и диспетчера
API_TOKEN = 'token'
bot = Bot(token=API_TOKEN)
dp = Dispatcher(bot)
# обработчик команды /start
@dp.message_handler(commands=['start'])
async def start_handler(message: types.Message):
keyboard = InlineKeyboardMarkup(row_width=2)
keyboard.add(
InlineKeyboardButton(text='Выбрать симптомы', callback_data='choose_symptoms')
)
await message.answer('Привет! Выбери, что тебе нужно.', reply_markup=keyboard)
# обработчик нажатия на кнопку "Выбрать симптомы"
@dp.callback_query_handler(text='choose_symptoms')
async def choose_symptoms_handler(callback_query: CallbackQuery):
symptoms_list = InlineKeyboardMarkup(row_width=2)
symptoms_list.add(
InlineKeyboardButton(text='Высокая температура', callback_data='symptom:1'),
InlineKeyboardButton(text='Болит горло', callback_data='symptom:2'),
InlineKeyboardButton(text='Насморк', callback_data='symptom:3'),
InlineKeyboardButton(text='Подтвердить выбор', callback_data='confirm_symptoms')
)
await bot.send_message(chat_id=callback_query.from_user.id, text='Выбери симптомы:', reply_markup=symptoms_list)
# список выбранных пользователем симптомов:
selected_symptoms = []
# обработчик нажатия на кнопку выбора симптомов
@dp.callback_query_handler(text_contains='symptom:')
async def choose_symptom_callback_handler(callback_query: CallbackQuery):
symptom_id = callback_query.data.split(':')[1]
if symptom_id not in selected_symptoms:
selected_symptoms.append(symptom_id)
# показываем уведомление, о выбранных симптомах
await bot.answer_callback_query(callback_query.id, text=f'Выбран симптом {symptom_id}')
# обработчик нажатия на кнопку подтверждения выбранных симптомов
@dp.callback_query_handler(text='confirm_symptoms')
async def confirm_symptoms_callback_handler(callback_query: CallbackQuery):
if len(selected_symptoms) == 0:
await bot.answer_callback_query(callback_query.id, text='Ты не выбрал ни одного симптома!')
else:
await bot.answer_callback_query(callback_query.id, text=f'Выбрано симптомов: {len(selected_symptoms)}')
await bot.send_message(chat_id=callback_query.from_user.id, text=f'Ты выбрал симптомы с ID: {selected_symptoms}')
# здесь можно произвести дополнительную обработку выбранных симптомов
selected_symptoms.clear() # очищаем список выбранных симптомов
# запуск бота
if __name__ == '__main__':
executor.start_polling(dp, skip_updates=True)
Дополнил обработчик, чтобы было понятнее где и что прописывать, если выбран один симптом или оба вместе, таким же образом можно дописать для каждого случая отдельно, либо же, если выбраны все симптомы одновременно:
# обработчик нажатия на кнопку подтверждения выбранных симптомов
@dp.callback_query_handler(text='confirm_symptoms')
async def confirm_symptoms_callback_handler(callback_query: CallbackQuery):
if len(selected_symptoms) == 0:
await bot.answer_callback_query(callback_query.id, text='Ты не выбрал ни одного симптома!')
else:
# проверяем, был ли выбран симптом 2
if '2' in selected_symptoms:
# Проверяем, был ли выбран симптом 3
if '3' in selected_symptoms:
await bot.answer_callback_query(callback_query.id, text='Ты выбрал симптомы 2 и 3 вместе!')
else:
await bot.answer_callback_query(callback_query.id, text='Ты выбрал только симптом 2!')
# Проверяем, был ли выбран симптом 3
elif '3' in selected_symptoms:
await bot.answer_callback_query(callback_query.id, text='Ты выбрал только симптом 3!')
else:
await bot.answer_callback_query(callback_query.id, text='Ты выбрал другие симптомы!')
# здесь можно произвести дополнительную обработку выбранных симптомов
selected_symptoms.clear() # очищаем список выбранных симптомов
Либо можешь использовать Telebot, который напрямую уже имеет интеграцию машины состояний, но там на каждом шаге нужно будет выбирать симптомы, в примере же просто выбираешь симптомы и выводишь выбранные(опционально, из примера выше можно дополнить рекомендациями. Удачи)