Не работает код парсера функции

Не работает код, когда я пишу боту "погода", он отвечает "ошибка! Город не найден", код парсера погоды рабочий и код бота тоже, как сделать так что бы после ввода слова "погода" бот запрашивал ввести город, после чего он говорил погоду в указанном городе, но при этом код должен работать только после ввода слова "погода". Вот код:

import pyowm
from pyowm.owm import OWM
from pyowm.utils.config import get_default_config
import telebot
from telebot import types
import conf

config_dict = get_default_config()
config_dict['language'] = 'ru'

bot = telebot.TeleBot(conf.TOKEN)
owm = OWM(conf.OWMT, config_dict)

owm = pyowm.OWM(conf.OWMT)
mgr =  owm.weather_manager()
@bot.message_handler(content_types=["text"])
def get_message(message):
    if message.text.lower() == "погода":
        bot.send_message(message.chat.id, "Введите название города", reply_markup=button_back_news)
        try:
            observation =  mgr.weather_at_place( message.text )
            w =  observation.weather
            temp = w.temperature('celsius')["temp"]

            answer = f"В городе {message.text} сейчас {w.detailed_status}\n"
            answer += "Температура сейчас в районе "+ str(temp) + "\n\n"

            if temp < 10:
                answer += "Сейчас жестко холодно, кырык кабат киын" 
            elif temp < 20:
                answer += "Сейчас холодно, оденься потеплее" 
            else:
                answer += "Температура найс, одевайся как хош" 

            bot.send_message(message.chat.id, answer)
        except:
            bot.send_message(message.chat.id, "Ошибка! Город не найден")
        
    print(conf.log(message))



bot.polling(none_stop=True, interval=0)

Ответы (1 шт):

Автор решения: NikUvolen

Дело в том, что ваш бот декоратором @bot.message_handler(content_types=["text"]) принимает n-ый текст от юзера и сразу же воспроизводит функцию get_message. Тут надо либо писать сценарии, но для малого кода это муторно; либо вынести проверку if message.text.lower() == "погода": в отдельную функцию и использовать декоратор с командой 'погода':

was_there_request = False   # Если будете писать более большой код, то советую написать "машину состояний",
                            # Но в примере ограничимся булевой переменной


@bot.message_handler(commands=['погода'])
def weather_request(message):
    if message.text.lower() == "погода":
        bot.send_message(message.chat.id, "Введите название города", reply_markup=button_back_news)
        was_there_request = True


@bot.message_handler(content_types=["text"], 
                     func=lambda message: was_there_request) 
                     #Если lambda вернёт False, то функция не выполнится
def get_message(message):
    was_there_request = False
    try:
        observation = mgr.weather_at_place(message.text)
        w = observation.weather
        temp = w.temperature('celsius')["temp"]

        answer = f"В городе {message.text} сейчас {w.detailed_status}\n"
        answer += "Температура сейчас в районе " + str(temp) + "\n\n"

        if temp < 10:
            answer += "Сейчас жестко холодно, кырык кабат киын"
        elif temp < 20:
            answer += "Сейчас холодно, оденься потеплее"
        else:
            answer += "Температура найс, одевайся как хош"

        bot.send_message(message.chat.id, answer)
    except:
        bot.send_message(message.chat.id, "Ошибка! Город не найден")

Теперь, чтобы получить у бота погоду, надо написать ему сначала /погода, а потом отправить название города.

А, ну да, или как уже написали в комментариях, можно использовать для цепочки событий bot.register_next_step_handler() тогда булевая переменная и дополнительный декоратор не нужны:

@bot.message_handler(commands=['погода'])
def weather_request(message):
    if message.text.lower() == "погода":
        msg = bot.send_message(message.chat.id, "Введите название города", reply_markup=button_back_news)
        bot.register_next_step_handler(msg, get_message)
→ Ссылка