Делаю бота на Python Telebot API. Пропускаются условия, в которых есть только два варианта. Объясню ниже
Условия, в которых три варианта ответа, выполняются, а условия, в которых два варианта ответа, просто пропускаются, и бот почему-то выбирает вариант самостоятельно. Затем идет следующий вопрос. Код:
@bot.message_handler(commands = ['start'])
def start(message):
sent = bot.reply_to(message, f'Привет, {message.from_user.first_name}!')
time.sleep(0.5)
markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
btn = types.KeyboardButton('Выбрать масло для волос.')
markup.add(btn)
bot.send_message(message.chat.id, 'Что хотите сделать?', reply_markup=markup)
@bot.message_handler(content_types=['text'])
def answers(message):
if message.chat.type == 'private':
if message.text == 'Выбрать масло для волос.':
bot.send_message(message.chat.id, 'С удовольствием! Приступим:')
time.sleep(0.5)
markup1qw = types.ReplyKeyboardMarkup(resize_keyboard=True)
btn1qw1 = types.KeyboardButton('Каждый день.')
btn2qw1 = types.KeyboardButton('Через день.')
btn3qw1 = types.KeyboardButton('Пару раз в неделю.')
markup1qw.add(btn1qw1, btn2qw1, btn3qw1)
bot.send_message(message.chat.id, 'Как часто Вы моете голову?', reply_markup=markup1qw)
#first question:
flag = False
if message.text == 'Каждый день.':
ans = 'Календула'
bot.send_message(message.chat.id, 'Ваш первый компонент - ' + ans)
flag = True
if message.text == 'Через день.':
ans = 'Каштан конский'
bot.send_message(message.chat.id, 'Ваш первый компонент - ' + ans)
flag = True
if message.text == 'Пару раз в неделю.':
ans = 'Василек'
bot.send_message(message.chat.id, 'Ваш первый компонент - ' + ans)
flag = True
time.sleep(0.5)
#second question:
if flag == True:
markup2qw = types.ReplyKeyboardMarkup(resize_keyboard=True)
btn1qw2 = types.KeyboardButton('Короткие.')
btn2qw2 = types.KeyboardButton('До плеч.')
btn3qw2 = types.KeyboardButton('До лопаток и длиннее.')
markup2qw.add(btn1qw2, btn2qw2, btn3qw2)
bot.send_message(message.chat.id, 'Какова длина Ваших волос?', reply_markup=markup2qw)
flag1 = False
if message.text == 'Короткие.':
ans2 = 'Ангелика'
bot.send_message(message.chat.id, 'Ваш второй компонент - ' + ans2)
flag1 = True
if message.text == 'До плеч.':
ans2 = 'Донник'
bot.send_message(message.chat.id, 'Ваш второй компонент - ' + ans2)
flag1 = True
if message.text == 'До лопаток и длиннее.':
ans2 = 'Крапива двудомная'
bot.send_message(message.chat.id, 'Ваш второй компонент - ' + ans2)
flag1 = True
# third question:
if flag1 == True:
markup3qw = types.ReplyKeyboardMarkup(resize_keyboard=True)
btn1qw3 = types.KeyboardButton('Да.')
btn2qw3 = types.KeyboardButton('Нет.')
markup3qw.add(btn1qw3, btn2qw3)
bot.send_message(message.chat.id, 'Есть ли у Вас перхоть?', reply_markup=markup3qw)
flag2 = False
if message.text == 'Да.':
ans3 = 'Арника'
bot.send_message(message.chat.id, 'Ваш третий компонент - ' + ans3)
flag2 = True
if message.text == 'Нет.':
ans3 = 'Лопух'
bot.send_message(message.chat.id, 'Ваш третий компонент - ' + ans3)
flag2 = True
#fourth question:
if flag2 == True:
markup4qw = types.ReplyKeyboardMarkup(resize_keyboard=True)
btn1qw4 = types.KeyboardButton('Да.')
btn2qw4 = types.KeyboardButton('Нет.')
markup4qw.add(btn1qw4, btn2qw4)
bot.send_message(message.chat.id, 'Красите ли Вы волосы?', reply_markup=markup4qw)
flag3 = False
if message.text == 'Да.':
ans4 = 'Пижма'
bot.send_message(message.chat.id, 'Ваш четвертый компонент - ' + ans4)
flag3 = True
if message.text == 'Нет.':
ans4 = 'Мать-и-мачеха'
bot.send_message(message.chat.id, 'Ваш четвертый компонент - ' + ans4)
flag3 = True
#fifth question:
if flag3 == True:
markup5qw = types.ReplyKeyboardMarkup(resize_keyboard=True)
btn1qw5 = types.KeyboardButton('Да.')
btn2qw5 = types.KeyboardButton('Нет.')
markup5qw.add(btn1qw5, btn2qw5)
bot.send_message(message.chat.id, 'Делали ли Вы химическую завивку?', reply_markup=markup5qw)
flag4 = False
if message.text == 'Да.':
ans5 = 'Гранат'
bot.send_message(message.chat.id, 'Ваш пятый компонент - ' + ans5)
flag4 = True
if message.text == 'Нет.':
ans5 = 'Облепиха'
bot.send_message(message.chat.id, 'Ваш пятый компонент - ' + ans5)
flag4 = True
#sixth question:
if flag4 == True:
markup6qw = types.ReplyKeyboardMarkup(resize_keyboard=True)
btn1qw6 = types.KeyboardButton('Почти не выпадают.')
btn2qw6 = types.KeyboardButton('До 30 шт в день.')
btn3qw6 = types.KeyboardButton('Сильно выпадают.')
markup6qw.add(btn1qw6, btn2qw6, btn3qw6)
bot.send_message(message.chat.id, 'Выпадают ли у Вас волосы?', reply_markup=markup6qw)
if message.text == 'Почти не выпадают.':
ans6 = 'Полынь горькая'
bot.send_message(message.chat.id, 'Ваш шестой компонент - ' + ans6)
if message.text == 'До 30 шт в день.':
ans6 = 'Ангелика'
bot.send_message(message.chat.id, 'Ваш шестой компонент - ' + ans6)
if message.text == 'Сильно выпадают.':
ans6 = 'Бессмертник'
bot.send_message(message.chat.id, 'Ваш шестой компонент - ' + ans6)
Написал код и вывод бота выше. Вопрос: почему бот пропускает вопросы с двумя вариантами ответов? И как это пофиксить. Заранее спасибо.
Ответы (2 шт):
Ваш код обрабатывает все ответы пользователя в одной функции answers. Однако, она обрабатывает все ответы одновременно, и вместо того чтобы ждать каждого ответа на каждый вопрос, ваш код обрабатывает все ответы в одном блоке и проверяет условия для всех вопросов сразу. Вам нужно изменить код так, чтобы он дожидался ответа пользователя на каждый вопрос перед тем, как переходить к следующему вопросу.
Чтобы сделать это, вы можете использовать состояния (states) для вашего бота. Для этого вам потребуется создать переменную, которая будет хранить состояние бота для каждого пользователя, и изменять ее после каждого ответа пользователя.
Вот пример кода, который вы можете использовать в качестве основы:
from enum import Enum
class States(Enum):
CHOOSE_HAIR_OIL = 1
QUESTION_1 = 2
QUESTION_2 = 3
QUESTION_3 = 4
QUESTION_4 = 5
QUESTION_5 = 6
QUESTION_6 = 7
user_states = {}
@bot.message_handler(commands=['start'])
def start(message):
# ...
user_states[message.chat.id] = States.CHOOSE_HAIR_OIL
@bot.message_handler(content_types=['text'])
def answers(message):
if message.chat.type == 'private':
state = user_states.get(message.chat.id)
if state == States.CHOOSE_HAIR_OIL:
# ...
user_states[message.chat.id] = States.QUESTION_1
elif state == States.QUESTION_1:
# ...
user_states[message.chat.id] = States.QUESTION_2
elif state == States.QUESTION_2:
# ...
user_states[message.chat.id] = States.QUESTION_3
elif state == States.QUESTION_3:
# ...
user_states[message.chat.id] = States.QUESTION_4
elif state == States.QUESTION_4:
# ...
user_states[message.chat.id] = States.QUESTION_5
elif state == States.QUESTION_5:
# ...
user_states[message.chat.id] = States.QUESTION_6
elif state == States.QUESTION_6:
# ...
user_states[message.chat.id] = None
Этот код создает перечисление States, которое используется для хранения состояний бота. Затем создается словарь user_states, который будет хранить состояние бота для каждого пользователя. В каждой ветке условия if и elif код проверяет состояние бота и обрабатывает соответствующий вопрос, после чего обновляет состояние пользователя.
Решение: Просто поменял надписи на кнопках и в условиях, чтобы ничего не повторялось. Все заработало так, как я планировал.
