Не работает код парсера функции
Не работает код, когда я пишу боту "погода", он отвечает "ошибка! Город не найден", код парсера погоды рабочий и код бота тоже, как сделать так что бы после ввода слова "погода" бот запрашивал ввести город, после чего он говорил погоду в указанном городе, но при этом код должен работать только после ввода слова "погода". Вот код:
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 шт):
Дело в том, что ваш бот декоратором @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)