Как настроить бота на AioGram, чтобы он отправлял текущую температуру воздуха по запросу?

Как я понимаю, вы хотите, чтобы бот отправлял текущую температуру в указанном вами городе, когда вы вводите его название. Я использую aiogram для создания бота и python-weather для запроса погоды. Вот как выглядит мой код:

<pre><code class="python">import asyncio
import logging
import python_weather

from config import TOKEN2
from aiogram import Bot, Dispatcher
from aiogram.filters import CommandStart
from aiogram.types import Message


bot = Bot(TOKEN2)
dp = Dispatcher()

async def main():
    await dp.start_polling(bot)

@dp.message()
async def get_weather(message: Message):
    async with python_weather.Client(unit=python_weather.METRIC) as client:
        weather = await client.get(message.text)
        await message.answer(weather.temperature)

if __name__ == '__main__':
    asyncio.run(main())</code></pre>

Однако, когда я запускаю код, он выдает ошибку при вызове <br/> await message.answer(weather.temperature). <br/> Вместо этого, если я использую <br/> print(weather.temperature), <br/> ошибок не возникает, и температура отображается в консоли. <br/> Можете ли вы подсказать, как правильно изменить вызов для отправки температуры пользователю?
  • 23 ноября 2024 г. 13:53
Ответы на вопрос 2
В вашем коде вы столкнулись с ошибкой при попытке отправить пользователю температуру с помощью `await message.answer(weather.temperature)`. Это происходит, потому что `weather.temperature` — это не просто число, а объект, содержащий температурную информацию. Вам нужно получить конкретное значение температуры и отправить его пользователю в формате строки.

Давайте исправим ваш код. Также важно добавить обработку команд и более корректно обрабатывать ошибки, чтобы избежать проблем в случае неверного ввода.

Вот исправленный вариант вашего кода:

```python
import asyncio
import logging
import python_weather

from config import TOKEN2
from aiogram import Bot, Dispatcher
from aiogram.filters import CommandStart
from aiogram.types import Message

# Установка уровня логирования
logging.basicConfig(level=logging.INFO)

bot = Bot(TOKEN2)
dp = Dispatcher()

@dp.message(CommandStart())
async def start_command(message: Message):
    await message.answer("Привет! Напишите название города, чтобы получить текущую температуру.")

@dp.message()
async def get_weather(message: Message):
    async with python_weather.Client(unit=python_weather.METRIC) as client:
        try:
            # Получаем прогноз погоды для указанного города
            weather = await client.get(message.text)
            # Если погода получена, выводим температуру
            if weather.current:
                temperature = weather.current.temperature
                await message.answer(f"Температура в {message.text}: {temperature}°C")
            else:
                await message.answer("Не удалось получить данные о погоде. Пожалуйста, проверьте название города.")
        except Exception as e:
            logging.error(f"Ошибка при получении погоды: {e}")
            await message.answer("Произошла ошибка. Пожалуйста, попробуйте еще раз.")

async def main():
    await dp.start_polling(bot)

if __name__ == '__main__':
    asyncio.run(main())
```

### Объяснение внесённых изменений:
1. **Обработка стартовой команды:** Добавлен обработчик для команды `/start`, который приветствует пользователя и объясняет, как получить погоду.
2. **Проверка на наличие данных о погоде:** Используется условие `if weather.current`, чтобы убедиться, что мы получили актуальные данные о погоде. Если данных нет, бот отправит соответствующее сообщение.
3. **Форматирование текста сообщения:** Теперь сообщение отправляется в более удобочитаемом формате, включая название города и значение температуры.
4. **Логирование ошибок:** Добавлено логирование ошибок для лучшей диагностики проблем, которые могут возникнуть при получении данных.

Этот код должен исправно работать и корректно отправлять пользователю текущую температуру по запросу.
import asyncio
import logging
import python_weather

from config import TOKEN2
from aiogram import Bot, Dispatcher
from aiogram.filters import CommandStart
from aiogram.types import Message


bot = Bot(TOKEN2)
dp = Dispatcher()

async def main():
    await dp.start_polling(bot)

@dp.message()
async def get_weather(message: Message):
    async with python_weather.Client(unit=python_weather.METRIC) as client:
        try:
            weather = await client.get(message.text)
            temperature = weather.current.temperature
            response_message = f"Текущая температура в {message.text}: {temperature}°C"        
            await message.answer(response_message)
        except Exception as e:
            await message.answer("Не удалось получить данные о погоде.")

if __name__ == '__main__':
    asyncio.run(main())
Похожие вопросы