Ошибка в телеграмм боте

Решил я сделать Телеграмм бота. Сначала сделал ему одну функцию(курс доллара), а на следующий день решил добавить другую(погода), но тк. я еще новичок то возникают некоторые проблемы :( Питон учил вообще для ОГЭ, но чуть завис, когда узнал что он умеет. Пишу боту "/weather", а он не откликается. На команду "/price" отвечает курсом доллара. Понимаю, что никому не надо читать этот говнокод, но у меня правда нет других идей. Спасибо тем кто откликнется :) UPD: Исправляю код, когда вижу какие-то косяки UPD1: Продвинулся до того, что бот запрашивает название города

from time import strftime, strptime
import requests 
import datetime 
from pprint import pprint
import math 
import telebot 
import bs4 
from auth_token import *
from aiogram import Bot, types 
from aiogram.dispatcher import Dispatcher
from aiogram.utils import executor

bot = Bot(token=tg_bot_token)
dp = Dispatcher(bot)



@dp.message_handler(commands=['price'])
async def get_data(message: types.Message):
    req = requests.get('http://api.currencylayer.com/live?access_key=7fe2ed73dbae3284b2086b88a6a3d992')
    response = req.json()
    sell_price = response['quotes']['USDRUB']
    sell_price = int(sell_price * 100) / 100 
    await message.reply(f'Сейчас {datetime.datetime.now().strftime("%d-%m-%y, %H:%M")}\nДоллар стоит: {sell_price}')
    print(f'Это в гет дата{message.text}')

@dp.message_handler(commands=['start'])
async def start_command(message: types.Message):
  await message.reply('Привет! Выбери команду!')
  print(f'Это в старте{message.text}')


@dp.message_handler(commands=['weather'])
async def get_weather(message: types.Message):
    print(f'Это в гет везер {message.text}')
    city1 = await message.reply('Введите название города')
    async def print_weather(city1): #Вот это странная какая-то строчка
      code_to_smile = {
      'Clear': "Ясно \U00002600",
      'Clouds': 'Облачно \U00002601',
      'Rain': 'Дождь \U00002614',
      'Drizzle': "Дождь \U00002614",
      'Thunderstorm': 'Гроза \U000026A1',
      'Snow': 'Снег \U0001F328',
      'Mist': 'Туман \U0001F32B',
          }
      try:
            r = requests.get(
              f'http://api.openweathermap.org/geo/1.0/direct?q={city1}&appid={open_weather_token}&units=metric'
            )
            data = r.json()
            lat = data[0]['lat']
            lon = data[0]['lon']
            city = data['name']
            
            g = requests.get(f'https://api.openweathermap.org/data/2.5/weather?lat={lat}&lon={lon}&appid={open_weather_token}&units=metric')
            weather = g.json()
            
            cur_weather = weather['main']['temp']

            weather_description = weather['weather'][0]['main']
            if weather_description in code_to_smile:
              wd = code_to_smile[weather_description]
            else: 
              wd = 'Посмотри в окно, я не понимаю что там за погода!'

            humidity = weather['main']['humidity']
            pressure = weather['main']['pressure']
            wind_speed = weather['wind']['speed']
            sunrise_timestamp = datetime.datetime.fromtimestamp(weather['sys']['sunrise'])
            sunset_timestamp = datetime.datetime.fromtimestamp(weather['sys']['sunset'])
            length_of_the_day = sunset_timestamp - sunrise_timestamp

            await message.reply(f'***{datetime.datetime.now().strftime("%d-%m-%y, %H:%M")}***\n'
                  f'Погода в городе: {city}\nТемпература: {cur_weather}C° {wd}\n'
                  f'Влажность: {humidity}%\nДавление: {pressure} мм.рт.ст\nВетер: {wind_speed}м/c\n'
                  f'Восход солнца: {sunrise_timestamp}\nЗакат солнца: {sunset_timestamp}\nПродолжительность дня: {length_of_the_day}\n'
                  f'***Хорошего дня!***')

      except Exception as ex:
            await print(ex)
            await message.reply( 'Что ты сейчас написал? Посмотри команды, друг')

if __name__ == '__main__':
   executor.start_polling(dp)

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

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

Aiogram работает с состояниями. Через них очень легко можно получать данные и сохоранять их.

import requests 
import datetime 
from auth_token import *
from aiogram import Bot, types 
from aiogram.dispatcher import Dispatcher, FSMContext

# Импортируем функцию State, для создания  состояния.
from aiogram.dispatcher.filters.state import State

# Так же импортируем хранилище в котором будут хранится данные
from aiogram.contrib.fsm_storage.memory import MemoryStorage

from aiogram.utils import executor

bot = Bot(token=tg_bot_token)
storage = MemoryStorage() # Создаем хранилище.
dp = Dispatcher(bot, storage=storage)

get_city = State() # Создаем состояние


@dp.message_handler(commands=['price'])
async def get_data(message: types.Message):
    req = requests.get('http://api.currencylayer.com/live?access_key=7fe2ed73dbae3284b2086b88a6a3d992')
    response = req.json()
    sell_price = response['quotes']['USDRUB']
    sell_price = int(sell_price * 100) / 100 
    await message.reply(f'Сейчас {datetime.datetime.now().strftime("%d-%m-%y, %H:%M")}\nДоллар стоит: {sell_price}')
    print(f'Это в гет дата{message.text}')


@dp.message_handler(commands=['start'])
async def start_command(message: types.Message):
  await message.reply('Привет! Выбери команду!')
  print(f'Это в старте{message.text}')


@dp.message_handler(commands=['weather'])
async def get_weather(message: types.Message):
    await get_city.set() # Устанавливаем состояние когда собираемся получить данные.
    await message.reply(
        text="Пришлите название города",
    )


# Пишим хэндлер, который сработает при установленном состоянии
@dp.message_handler(state=get_city)
async def show_weather(message: types.Message):
    city = message.text # Получаем данные
    code_to_smile = {
        'Clear': "Ясно \U00002600",
        'Clouds': 'Облачно \U00002601',
        'Rain': 'Дождь \U00002614',
        'Drizzle': "Дождь \U00002614",
        'Thunderstorm': 'Гроза \U000026A1',
        'Snow': 'Снег \U0001F328',
        'Mist': 'Туман \U0001F32B',
    }
    try:
        r = requests.get(
            f'http://api.openweathermap.org/geo/1.0/direct?q={city}&appid={open_weather_token}&units=metric'
        )
        data = r.json()
        lat = data[0]['lat']
        lon = data[0]['lon']
        city = data['name']
        
        g = requests.get(f'https://api.openweathermap.org/data/2.5/weather?lat={lat}&lon={lon}&appid={open_weather_token}&units=metric')
        weather = g.json()
        
        cur_weather = weather['main']['temp']

        weather_description = weather['weather'][0]['main']
        if weather_description in code_to_smile:
            wd = code_to_smile[weather_description]
        else: 
            wd = 'Посмотри в окно, я не понимаю что там за погода!'

        humidity = weather['main']['humidity']
        pressure = weather['main']['pressure']
        wind_speed = weather['wind']['speed']
        sunrise_timestamp = datetime.datetime.fromtimestamp(weather['sys']['sunrise'])
        sunset_timestamp = datetime.datetime.fromtimestamp(weather['sys']['sunset'])
        length_of_the_day = sunset_timestamp - sunrise_timestamp

        await message.reply(f'***{datetime.datetime.now().strftime("%d-%m-%y, %H:%M")}***\n'
                f'Погода в городе: {city}\nТемпература: {cur_weather}C° {wd}\n'
                f'Влажность: {humidity}%\nДавление: {pressure} мм.рт.ст\nВетер: {wind_speed}м/c\n'
                f'Восход солнца: {sunrise_timestamp}\nЗакат солнца: {sunset_timestamp}\nПродолжительность дня: {length_of_the_day}\n'
                f'***Хорошего дня!***')

    except Exception as ex:
        print(ex)
        await message.reply( 'Что ты сейчас написал? Посмотри команды, друг')

if __name__ == '__main__':
   executor.start_polling(dp)
→ Ссылка