@rekursy

Как в Python телеграм боте обработать запросы пользователя с задержкой?

Добрый день, я ещё начинающий программист и вот уже прошёл основы и пишу бота, которые использует API
Вот мой код:
Я пишу бота, которому вводят команду /lowprice далее вводят Город в котором будет производиться поиск и потом уже, когда запрос API Обработан бот просит ввести максимальное кол-во отелей, так вот я хочу сделать так, чтобы при каждом выведенном отеле бот спрашивал нужно ли вывести фотографию этого отеля. Сам запрос у меня работает, выводит отели цены, но бот сразу выводит n количество раз, нужно ли ввести фото не дожидаясь ответа пользователя.

Мой вопрос состоит в том, как сделать так, чтобы бот дождался ответа пользователя, а потом уже выводил нужную информацию, не прошу написать код за меня, хотел бы услышать ваше мнение на этот счёт, например, что нужно использовать генераторы или например какую-то функцию бота. И ещё мини вопрос(Чтобы в функции запрашивать у пользователя какую-то новую информацию всегда нужно использовать bot.register_next_step_handler(message, low_price_hotels) и писать новую функцию:?) Спасибо!

from decouple import config
import telebot
from bots_requests.low_price_req import Lowprice
from requests import get
bot = telebot.TeleBot(config('KEY'))


@bot.message_handler(content_types=['text'])
def get_text_messages(message):
    if message.text == "/lowprice":
        bot.send_message(message.from_user.id, "Введите город: ")
        bot.register_next_step_handler(message, low_price_hotels)
    else:
        bot.send_message(message.from_user.id, 'Я вас не понимаю')


def low_price_hotels(message):
    hotels_request = Lowprice(message.text)
    sorted_function = hotels_request.sorted_hotels()
    bot.reply_to(message, f'Введите количетсво отелей(max: {len(sorted_function)}): ')
    bot.register_next_step_handler(message, hotels_max, sorted_function)


def hotels_max(message, *args):
    maximum_hotels = int(message.text)
    for sorted_hotels in range(0, maximum_hotels):
        hotel_name, hotel_price, hotel_id = args[0][sorted_hotels].split(',')
        bot.send_message(message.from_user.id, hotel_name, hotel_price)
        bot.send_message(message.from_user.id, 'Хотите ли вы получить фото?')
        bot.register_next_step_handler(message, photo_funct, hotel_id)


def photo_funct(message, *args):
    if message.text == 'да':
        bot.send_photo(message.chat.id, get("https://exp.cdn-hotels.com/hotels/37000000/36790000/36789900/36789845/895ded4a.jpg").content)


if __name__ == '__main__':
    bot.polling(none_stop=True, interval=0)
  • Вопрос задан
  • 124 просмотра
Решения вопроса 1
SoreMix
@SoreMix Куратор тега Python
yellow
Я бы добавил просто инлайн кнопку. Для пользователя удобно, да и работа не прекращается.

def hotels_max(message, *args):
    maximum_hotels = int(message.text)
    for sorted_hotel in args[0][:maximum_hotels]:
        hotel_name, hotel_price, hotel_id = sorted_hotel.split(',')
        kb = types.InlineKeyboardMarkup()
        kb.add(types.InlineKeyboardButton('Получить фото', callback_data=f'hotel_{hotel_id}'))
        bot.send_message(message.from_user.id, f'{hotel_name}, {hotel_price}', reply_markup=kb)

@bot.callback_query_handler(func=lambda call: call.data.startswith('hotel_'))
def hotel_photo(call):
    # Предположу, что фото можно будет получить по ID отеля, поэтому достаем его
    hotel_id = call.data.split('_')[-1]
    # ну и дальше уже получаем фото и отправляем
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы