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

    @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())


    спрашивайте если будут какие-то вопросы
    Ответ написан
    1 комментарий