65 lines
2.6 KiB
Python
65 lines
2.6 KiB
Python
import os
|
|
import telebot
|
|
import requests
|
|
|
|
# 1. Забираем токены из переменных окружения (вспоминаем флаг -e в Docker!)
|
|
TG_TOKEN = os.getenv("TG_TOKEN")
|
|
WEATHER_API_KEY = os.getenv("WEATHER_API_KEY")
|
|
|
|
# Проверка, что переменные действительно переданы
|
|
if not TG_TOKEN or not WEATHER_API_KEY:
|
|
print("ВНИМАНИЕ: Не заданы переменные окружения TG_TOKEN или WEATHER_API_KEY!")
|
|
exit(1)
|
|
|
|
bot = telebot.TeleBot(TG_TOKEN)
|
|
|
|
# 2. Реакция на команду /start
|
|
@bot.message_handler(commands=['start', 'help'])
|
|
def send_welcome(message):
|
|
bot.reply_to(message, "Привет! 🌍 Напиши мне название любого города, и я пришлю прогноз погоды.")
|
|
|
|
# 3. Реакция на любой другой текст (названия городов)
|
|
@bot.message_handler(func=lambda message: True)
|
|
def get_weather(message):
|
|
city = message.text.strip()
|
|
url = "https://api.openweathermap.org/data/2.5/weather"
|
|
|
|
params = {
|
|
"q": city,
|
|
"appid": WEATHER_API_KEY,
|
|
"units": "metric",
|
|
"lang": "ru"
|
|
}
|
|
|
|
try:
|
|
response = requests.get(url, params=params)
|
|
|
|
# Если API вернуло код 200 (Всё Ок)
|
|
if response.status_code == 200:
|
|
data = response.json()
|
|
temp = data["main"]["temp"]
|
|
desc = data["weather"][0]["description"]
|
|
|
|
# Формируем красивый ответ
|
|
answer = f"🌡 Погода в городе {city.capitalize()}:\n"
|
|
answer += f"Температура: {temp}°C\n"
|
|
answer += f"На улице {desc}."
|
|
|
|
bot.send_message(message.chat.id, answer)
|
|
|
|
# Если API вернуло код 404 (Город не найден)
|
|
elif response.status_code == 404:
|
|
bot.send_message(message.chat.id, f"❌ Город '{city}' не найден. Проверь опечатку!")
|
|
|
|
else:
|
|
bot.send_message(message.chat.id, "⚠️ Ошибка связи с сервером погоды.")
|
|
print(f"Ошибка API: Код {response.status_code}")
|
|
|
|
except Exception as e:
|
|
bot.send_message(message.chat.id, "🔌 Внутренняя ошибка бота.")
|
|
print(f"Ошибка кода: {e}")
|
|
|
|
# Запуск постоянного опроса серверов Telegram
|
|
print("Бот запущен и ждет сообщений...")
|
|
bot.polling(none_stop=True)
|