Здравствуйте, только обучаюсь в python, хочу написать бота в telegram
Хочу написать погодного бота в telegram, чтоб можно было написать город, а он в нем показал температуру, мучаюсь уже всю ночь, и не могу понять что я не так делаю, может может кто нибудь помочь в написании данного кода) Суть в том что я запускаю код, а по итогу ничего не происходит, пробовал как то переписывать по другому, но все равно как то не получается.
from aiogram import Bot, types, Dispatcher, executor
import python_weather
bot = Bot(token="*token*")
dp = Dispatcher(bot)
@dp.message_handler(commands=["start"])
async def process_start_command(message):
async with python_weather.Client(format=python_weather.IMPERIAL) as client:
weather = await client.get(message.text)
celsius = (weather.current.temperature - 32) * 5 / 9
resp_msg = weather.location_name + "\n"
resp_msg += f"Текущая температура: {celsius}\n"
await message.answer(resp_msg)
if __name__ == '__main__':
executor.start_polling(dp)
Ответы (1 шт):
Автор решения: RAMe0
→ Ссылка
Есть несколько проблем с данным кодом:
- Первая и, наверное, основная - у вас нет логирования. Чтобы понимать что идет не так, включите логирование, как в примере на
aiogram. - У вас только один обработчик сообщений
process_start_command, который обрабатывает комманду/start. Больше он ни за чем не следит. Вам нужно создать второй обработчик, который будет следить за сообщениями пользователей и уже их обрабатывать. - У объекта
weatherнет свойстваlocation_name(если бы вы подключили логгер, увидели бы это в логе ошибок). Если нужны данные о городе и/или стране, можно использоватьnearest_area. В нем есть информация о ближайшем к прогнозу городе и его стране. - Вам не обязательно заморачиваться с конвертацией в цельсии. Можно клиенту указать, что вы хотите данные получать в метрической системе:
format=python_weather.METRIC
Вот как-то, приблизительно так (большая часть кода - пример quick start из доки aiogram):
import logging
import python_weather
from aiogram import Bot, Dispatcher, executor, types
API_TOKEN = 'TOKEN'
# Configure logging
logging.basicConfig(level=logging.INFO)
# Initialize bot and dispatcher
bot = Bot(token=API_TOKEN)
dp = Dispatcher(bot)
@dp.message_handler(commands=['start', 'help'])
async def send_welcome(message: types.Message):
await message.reply(f"Напиши город и узнаешь погоду!")
@dp.message_handler()
async def echo(message: types.Message):
async with python_weather.Client(format=python_weather.METRIC) as client:
weather = await client.get(message.text)
# Инфа о стране и городе
resp_msg = f"{weather.nearest_area.country} {weather.nearest_area.name} \n"
# Температура
resp_msg += f"Текущая температура: {weather.current.temperature}\n"
await message.answer(resp_msg)
if __name__ == '__main__':
executor.start_polling(dp, skip_updates=True)
