Как реализовать подсчет 2 и более нажатий на разные InlineKeyboardButton

Рейтинг: 0Ответов: 1Опубликовано: 26.04.2023

В общем такая ситуация, есть несколько кнопок InlineKeyboardButton с разным текстом. И нужно чтобы от кол-ва нажатых кнопок(разных) происходили разные действия. То есть, если пользователь нажимает одну кнопку, то происходит одно действие. Если пользователь нажимает на две разные кнопки, то происходит другое действие. Если пользователь нажимает на три разные кнопки, то происходит иное действие. Если такое возможно конечно. Пока имеется код только самих кнопок:

symptoms_list = InlineKeyboardMarkup(row_width=2)
symptoms_list.add(InlineKeyboardButton(text='Высокая температру', callback_data= 'filte:1'),
                  InlineKeyboardButton(text='Болит горло', callback_data= 'filter:2'),
                  InlineKeyboardButton(text='Насморк', callback_data= 'filter:3'),

Если пользователь нажмет на кнопку "Высокая температура" и "Болит горло", то ему напишет бот какое то сообщение. Если пользователь нажмет на кнопку "Высокая температура", "Насморк", "Болит горло", то напишет иное сообщение

Ответы

▲ 0

Пример кода на 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, который напрямую уже имеет интеграцию машины состояний, но там на каждом шаге нужно будет выбирать симптомы, в примере же просто выбираешь симптомы и выводишь выбранные(опционально, из примера выше можно дополнить рекомендациями. Удачи)