Ошибка в телеграмм боте
Решил я сделать Телеграмм бота. Сначала сделал ему одну функцию(курс доллара), а на следующий день решил добавить другую(погода), но тк. я еще новичок то возникают некоторые проблемы :( Питон учил вообще для ОГЭ, но чуть завис, когда узнал что он умеет. Пишу боту "/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)