Задать вопрос
@Kim_Diana

Как сделать, чтобы ответы появлялись только после ввода вопроса пользователем?

Есть бот, который просто накидывает ответы при нажатии на кнопку.
как сделать так, чтобы рандомайзер срабатывал только после ответа пользователя?
Вот так выглядит то, что работает только при нажатии на кнопку. Есть сообщение "Задай свой вопрос", но следом за ним приходит один из вариантов переменной а.

import telebot
from telebot import types
import random

bot = telebot.TeleBot('токен')

@bot.message_handler (commands=['start'])
def privet (message):
    btn = types.ReplyKeyboardMarkup ()
    btn1 = types.KeyboardButton('Магический шар ')
    btn2 = types.KeyboardButton('Пока не хочу')
    btn.add(btn1,btn2)
    bot.send_message(message.chat.id, f'Привет, <'b>{message.from_user.first_name}<'/b>!\n Можешь задавать <'b>простые вопросы (да/нет)<'/b>, а я буду отвечать.', parse_mode='html',reply_markup=btn)

a = ['Да','Возможно да','Определенно да','Нет','Определенно нет','Точно нет','Может быть','Наверное','Вероятнее всего','Никаких сомнений','Бесспорно','Знаки говорят "ДА"','Знаки говорят "нет"','По моему да','По моему нет']

@bot.message_handler(content_types=['text'])
def magic (message):
    if message.text == 'Магический шар ':
        bot.send_message(message.chat.id, 'Задай свой вопрос')
        q = message.text.strip().lower()
        if message.text == 'q':
            bot.send_message(message.chat.id, random.choice(a))
    elif message.text == 'stop':
        bot.send_message(message.chat.id,'Хорошего дня!')

bot.polling (none_stop = True)
  • Вопрос задан
  • 211 просмотров
Подписаться 2 Простой 5 комментариев
Решения вопроса 1
@I0I0I0I
нужно использовать машины состояний
я не знаю как через telebot сделать но через aiogram делается так
советую использовать для ботов aiogram

from aiogram import Bot, Dispatcher, types
from aiogram.contrib.fsm_storage.memory import MemoryStorage
from aiogram.dispatcher.filters.state import State, StatesGroup
from aiogram.types import ReplyKeyboardMarkup, KeyboardButton
import asyncio
import logging
import random

bot = Bot(token='токен')
storage = MemoryStorage()
dp = Dispatcher(bot, storage=storage)

class states(StatesGroup): 
    state0 = State()   #состояние когда кнопка еще не нажата
    state1 = State()   #когда кнопку нажали и надо только чтобы после ответа срабатывал рандомайзер

keyboard = ReplyKeyboardMarkup(
    keyboard=[
        [KeyboardButton(text='Магический шар')],
        [KeyboardButton(text='Пока не хочу')],
    ],
    resize_keyboard=True)

keyboard1 = ReplyKeyboardMarkup(
    keyboard=[
        [KeyboardButton(text='Stop')],
    ],
    resize_keyboard=True)

@dp.message_handler(commands=['start'], state="*")
async def start_handler(message: types.Message):
    await states.state0.set()
    await bot.send_message(chat_id=message.chat.id, text=f'Привет, <b>{message.from_user.first_name}</b>!\n Можешь '
        f'задавать <b>простые вопросы (да/нет)</b>, а я буду отвечать.', reply_markup=keyboard, parse_mode='html')

a = ['Да','Возможно да','Определенно да','Нет','Определенно нет','Точно нет','Может быть','Наверное','Вероятнее всего',
     'Никаких сомнений','Бесспорно','Знаки говорят "ДА"','Знаки говорят "нет"','По моему да','По моему нет']

@dp.message_handler(text='Магический шар', state=states.state0)
async def handler1(message: types.Message):
    await states.state1.set() # переходит в состояния где будет срабатывать рандомайзер после ответа
    await bot.send_message(chat_id=message.chat.id, text='Задай свой вопрос', reply_markup=keyboard1)

@dp.message_handler(text='Stop', state=states.state1)
async def handler1(message: types.Message):
    await states.state0.set()  #переходит обратно в состояние где не будет срабатывать рандомайзер после ответа
    await bot.send_message(chat_id=message.chat.id, text='Хорошего дня!', reply_markup=keyboard)

@dp.message_handler(state=states.state1)  #сюда будут попадать соощения только если кнопка нажата и нужно чтобы срабатывал рандомайзер
async def any_text_handler(message: types.Message):
    await bot.send_message(chat_id=message.chat.id, text=random.choice(a))  #срабатывает рандомайзер
    await bot.send_message(chat_id=message.chat.id, text='Задай свой вопрос') #повторно отправляет текст

async def main():
    logging.basicConfig(level=logging.INFO)
    await dp.start_polling()

if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    loop.run_until_complete(main())

тут я улучшил код сделав чтобы можно было постоянно задавать вопросы и бот отвечал на них,
и еще добавил кнопку stop

вот вариант как у вас и было но бот отвечает только после ответа пользователя

from aiogram import Bot, Dispatcher, types
from aiogram.contrib.fsm_storage.memory import MemoryStorage
from aiogram.dispatcher.filters.state import State, StatesGroup
from aiogram.types import ReplyKeyboardMarkup, KeyboardButton
import asyncio
import logging
import random

bot = Bot(token=токен)
storage = MemoryStorage()
dp = Dispatcher(bot, storage=storage)

class states(StatesGroup):
    state0 = State()
    state1 = State()

keyboard = ReplyKeyboardMarkup(
    keyboard=[
        [KeyboardButton(text='Магический шар')],
        [KeyboardButton(text='Пока не хочу')],
    ],
    resize_keyboard=True)

@dp.message_handler(commands=['start'], state="*")
async def start_handler(message: types.Message):
    await states.state0.set()
    await bot.send_message(chat_id=message.chat.id, text=f'Привет, <b>{message.from_user.first_name}</b>!\n Можешь '
        f'задавать <b>простые вопросы (да/нет)</b>, а я буду отвечать.', reply_markup=keyboard, parse_mode='html')

a = ['Да','Возможно да','Определенно да','Нет','Определенно нет','Точно нет','Может быть','Наверное','Вероятнее всего',
     'Никаких сомнений','Бесспорно','Знаки говорят "ДА"','Знаки говорят "нет"','По моему да','По моему нет']

@dp.message_handler(text='Магический шар', state=states.state0)
async def handler1(message: types.Message):
    await states.state1.set()
    await bot.send_message(chat_id=message.chat.id, text='Задай свой вопрос')

@dp.message_handler(state=states.state1)
async def any_text_handler(message: types.Message):
    await states.state0.set()
    await bot.send_message(chat_id=message.chat.id, text=random.choice(a))

async def main():
    logging.basicConfig(level=logging.INFO)
    await dp.start_polling()

if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    loop.run_until_complete(main())


спрашивайте если будут какие-то вопросы
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы