Проверка отправки сообщения пользователем в чат в telegram-боте

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

Мне нужно проверить отправил ли пользователь чат-боту сообщение перед тем, как запускать следующую функцию. То есть чат-бот отправляет пользователю сообщение с просьбой ввести название города для вывода информации о погоде, после чего чат-бот должен подождать отправки сообщения пользователем для последующего запуска следующей функции. Код предоставлен ниже:

@bot.message_handler(func=lambda message: message.text == 'Прогноз погоди')
def handle_weather(message):
    bot.send_message(message.chat.id, 'Введіть назву міста:')
    #ПРОВЕРКА ДОЛЖНА БЫТЬ ЗДЕСЬ
    handle_city(message)

def handle_city(message):
    try:
        city = message.text
            
        owm = pyowm.OWM('2fd97ec2a34257e59b56ba466e5b52f0')
        observation = owm.weather_manager().weather_at_place(city)
        w = observation.weather

        temperature = w.temperature('celsius')['temp']
        wind_speed = w.wind()["speed"]
        wind_deg = w.wind()["deg"]
        humidity = w.humidity

        response = f'Погода у місті {city}:\n\n' \
                   f'Температура: {temperature}°C\n' \
                    f'Хмарність: {w.detailed_status}\n'\
                    f'Швидкість вітру: {wind_speed}м/с\n'\
                    f'Кут вітру: {wind_deg}°\n'\
                     f'Вологість: {humidity}%'
    except:
        response="Місто не знайдено"
    bot.send_message(message.chat.id, response)

Ответы

▲ 2Принят

Для передачи управления в другой хендлер (или функцию) можно использовать register_next_step_handler. Он ожидает следующего сообщения пользователя (в вашем случае сообщения с названием города) и вызывает переданную функцию. Таким образом, пока пользователь не отправит сообщение, следующая функция вообще не будет вызвана. Код может выглядеть, например, так:

@bot.message_handler(func=lambda message: message.text == 'Прогноз погоди')
def handle_weather(message):
    msg = bot.send_message(message.chat.id, 'Введіть назву міста:') #сначала сообщение нужно записать в переменную
    bot.register_next_step_handler(msg, handle_city) #создаём next_step_handler, передавая ему переменную с сообщением и функцию, которую будем вызывать

def handle_city(message):
    try:
        city = message.text
            
        owm = pyowm.OWM('2fd97ec2a34257e59b56ba466e5b52f0')
        observation = owm.weather_manager().weather_at_place(city)
        w = observation.weather

        temperature = w.temperature('celsius')['temp']
        wind_speed = w.wind()["speed"]
        wind_deg = w.wind()["deg"]
        humidity = w.humidity

        response = f'Погода у місті {city}:\n\n' \
                   f'Температура: {temperature}°C\n' \
                    f'Хмарність: {w.detailed_status}\n'\
                    f'Швидкість вітру: {wind_speed}м/с\n'\
                    f'Кут вітру: {wind_deg}°\n'\
                     f'Вологість: {humidity}%'
    except:
        response="Місто не знайдено"
    bot.send_message(message.chat.id, response)