МУНИЦИПАЛЬНОЕ АВТОНОМНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ДОПОЛНИТЕЛЬНОГО ОБРАЗОВАНИЯ
«ЦЕНТР ДЕТСКОГО ТЕХНИЧЕСКОГО ТВОРЧЕСТВА»
Методическая разработка
«Создание Telegram-бота на Python.
Прогноз погоды»
к дополнительной общеобразовательной
общеразвивающей программе
технической направленности
«Программирование на Python»
Возраст детей: 10-17 лет
Автор: Костычев Вадим Александрович
г. Заречный Пензенской области
2025 г.
В современном мире мессенджеры, такие как Telegram, стали неотъемлемой частью повседневной жизни. Telegram насчитывает более 700 миллионов активных пользователей (по данным на 2023 год), и число продолжает расти. Боты в Telegram активно используются для автоматизации задач, предоставления информации, развлечений, обучения и бизнеса. Создание Telegram-бота — это востребованный навык, который позволяет:
Автоматизировать процессы: Боты могут отвечать на запросы клиентов, отправлять уведомления, собирать данные.
Развивать проекты: От личных помощников до коммерческих сервисов (например, боты для интернет-магазинов).
Изучать программирование: Работа с API Telegram помогает освоить навыки работы с сетевыми запросами, асинхронным программированием и Python.
Создавать портфолио: Бот — это практический проект, который демонстрирует навыки разработчика.
Адаптироваться к трендам: В 2025 году автоматизация и чат-боты остаются ключевыми направлениями в IT, особенно в сочетании с ИИ.
Этот материал актуален для начинающих программистов, которые хотят изучить Python на практике, а также для опытных разработчиков, желающих освоить новые инструменты. Telegram-боты просты в создании, но предоставляют широкие возможности для масштабирования (например, интеграция с базами данных, ИИ, вебхуками).
Цель: создать Telegram-бота, который по запросу пользователя предоставляет текущую погоду в указанном городе.
Задачи:
Зарегистрировать бота в Telegram через BotFather.
Настроить окружение для разработки на Python.
Освоить библиотеку python-telegram-bot и API OpenWeatherMap.
Реализовать функционал обработки команд и запросов погоды.
Протестировать и развернуть бота.
Для создания бота вам понадобится:
Python (версия 3.8 или выше).
IDE или текстовый редактор: PyCharm, VS Code или другой.
Библиотеки:
python-telegram-bot — для работы с Telegram API.
requests — для отправки запросов к API погоды.
Telegram — приложение для тестирования бота.
Аккаунт OpenWeatherMap — для получения API-ключа.
Интернет-соединение.
Шаг 1: Регистрация бота в Telegram
Найдите @BotFather в Telegram.
Создайте бота:
Отправьте команду /start.
Затем выполните /newbot.
Укажите имя бота, например, «Погодный Бот».
Задайте уникальное имя пользователя, заканчивающееся на «Bot» (например, @WeatherBot).
Получите токен:
@BotFather отправит токен вида: 123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11.
Сохраните токен в безопасном месте и не делитесь им.
Шаг 2: Регистрация на OpenWeatherMap
Создайте аккаунт:
Перейдите на openweathermap.org.
Зарегистрируйтесь или войдите.
Получите API-ключ:
Перейдите в раздел «API keys» в личном кабинете.
Скопируйте ключ (например, abcdef1234567890abcdef1234567890).
Сохраните ключ — он понадобится для запросов погоды.
Примечание: Бесплатный план OpenWeatherMap позволяет делать до 60 запросов в минуту, что достаточно для тестирования.
Шаг 3: Настройка окружения
Установите Python:
Скачайте Python с python.org, если он не установлен.
Создайте проект:
Создайте папку weather_bot.
Откройте терминал в этой папке.
Установите библиотеки:
pip install python-telegram-bot
pip install requests
Создайте файл:
Создайте файл weather_bot.py в папке проекта.
Шаг 4: Написание кода бота
Бот будет:
Отвечать на команду /start приветствием.
Обрабатывать команду /weather и отправлять текущую погоду.
Отвечать на некорректные запросы с подсказкой.
Код бота
Откройте weather_bot.py и вставьте код:
import requests
from telegram import Update
from telegram.ext import (
Application,
CommandHandler,
MessageHandler,
filters,
ContextTypes,
)
# Токен Telegram-бота
TOKEN = "ВАШ_ТЕЛЕГРАМ_ТОКЕН"
# Ключ API OpenWeatherMap
WEATHER_API_KEY = "ВАШ_OPENWEATHERMAP_КЛЮЧ"
# URL для запроса погоды
WEATHER_API_URL = "http://api.openweathermap.org/data/2.5/weather"
# Функция для команды /start
async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
await update.message.reply_text(
"Привет! Я бот, который расскажет о погоде. "
"Используй команду /weather , например: /weather Москва"
)
# Функция для получения погоды
def get_weather(city: str) - str:
params = {
"q": city,
"appid": WEATHER_API_KEY,
"units": "metric", # Температура в градусах Цельсия
"lang": "ru" # Язык ответа — русский
}
try:
response = requests.get(WEATHER_API_URL, params=params)
response.raise_for_status() # Проверка на ошибки HTTP
data = response.json()
if data.get("cod") != 200:
return "Город не найден. Попробуй ещё раз!"
# Извлекаем данные о погоде
temp = data["main"]["temp"]
description = data["weather"][0]["description"]
humidity = data["main"]["humidity"]
wind_speed = data["wind"]["speed"]
return (
f"Погода в {city}:\n"
f"Температура: {temp}°C\n"
f"Описание: {description}\n"
f"Влажность: {humidity}%\n"
f"Скорость ветра: {wind_speed} м/с"
)
except requests.RequestException:
return "Ошибка при запросе погоды. Проверь соединение или попробуй позже."
# Функция для команды /weather
async def weather(update: Update, context: ContextTypes.DEFAULT_TYPE):
# Проверяем, указан ли город
if not context.args:
await update.message.reply_text("Укажи город, например: /weather Москва")
return
city = " ".join(context.args) # Объединяем аргументы в строку
weather_info = get_weather(city)
await update.message.reply_text(weather_info)
# Функция для обработки текстовых сообщений
async def echo(update: Update, context: ContextTypes.DEFAULT_TYPE):
await update.message.reply_text(
"Я понимаю только команды /start и /weather . Попробуй снова!"
)
# Основная функция
def main():
application = Application.builder().token(TOKEN).build()
# Регистрируем команды
application.add_handler(CommandHandler("start", start))
application.add_handler(CommandHandler("weather", weather))
# Обрабатываем текстовые сообщения
application.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, echo))
print("Бот запущен...")
application.run_polling(allowed_updates=Update.ALL_TYPES)
if __name__ == "__main__":
main()
Объяснение кода
Импорты библиотек:
requests — для отправки HTTP-запросов к OpenWeatherMap.
Модули из telegram.ext — для работы с Telegram API.
Константы:
TOKEN — токен Telegram-бота (замените на свой).
WEATHER_API_KEY — ключ OpenWeatherMap (замените на свой).
WEATHER_API_URL — базовый URL для API погоды.
Функция start:
Функция get_weather:
Формирует запрос к OpenWeatherMap с параметрами: город, ключ API, единицы измерения (градусы Цельсия), язык (русский).
Обрабатывает ответ, извлекая температуру, описание, влажность и скорость ветра.
Возвращает отформатированную строку или сообщение об ошибке.
Функция weather:
Проверяет, указан ли город (context.args).
Вызывает get_weather и отправляет результат пользователю.
Функция echo:
Отвечает на некорректные сообщения, напоминая о доступных командах.
Функция main:
Создаёт приложение Telegram.
Регистрирует обработчики для команд /start, /weather и текстовых сообщений.
Запускает бота в режиме polling.
Шаг 5: Запуск и тестирование
Обновите код:
Запустите бота:
В терминале выполните:
python weather_bot.py
Увидите сообщение: Бот запущен....
Протестируйте:
Найдите бота в Telegram (например, @WeatherBot).
Отправьте /start — бот ответит приветствием.
Попробуйте /weather Москва — бот отправит погоду.
Напишите что-то вроде «Привет» — бот напомнит о командах.
Тестируйте с разными городами: /weather Лондон, /weather Токио.
Остановите бота:
Пример ответа бота:
Погода в Москва:
Температура: 5°C
Описание: небольшой дождь
Влажность: 80%
Скорость ветра: 3 м/с
Шаг 6: Расширение функционала
Добавьте дополнительные возможности, чтобы бот стал полезнее:
1. Прогноз на несколько дней
Используйте API /forecast от OpenWeatherMap:
WEATHER_FORECAST_URL = "http://api.openweathermap.org/data/2.5/forecast"
Создайте команду /forecast :
async def forecast(update: Update, context: ContextTypes.DEFAULT_TYPE):
if not context.args:
await update.message.reply_text("Укажи город, например: /forecast Москва")
return
city = " ".join(context.args)
params = {"q": city, "appid": WEATHER_API_KEY, "units": "metric", "lang": "ru"}
try:
response = requests.get(WEATHER_FORECAST_URL, params=params)
data = response.json()
forecast = data["list"][0] # Первый прогноз (на ближайшее время)
temp = forecast["main"]["temp"]
description = forecast["weather"][0]["description"]
await update.message.reply_text(
f"Прогноз в {city}:\nТемпература: {temp}°C\nОписание: {description}"
)
except:
await update.message.reply_text("Ошибка прогноза. Попробуй снова!")
Добавьте в main():
application.add_handler(CommandHandler("forecast", forecast))
2. Отправка эмодзи
Добавьте эмодзи для погоды (например, ☀️ для ясной погоды):
def get_weather_emoji(description: str) - str:
if "ясно" in description:
return "☀️"
elif "дождь" in description:
return "🌧️"
elif "облачно" in description:
return "☁️"
return ""
# В get_weather добавьте:
emoji = get_weather_emoji(description)
return f"Погода в {city} {emoji}:\n..."
3. Уведомления о погоде
Используйте job_queue для отправки погоды по расписанию:
async def daily_weather(context: ContextTypes.DEFAULT_TYPE):
city = context.job.data
weather_info = get_weather(city)
await context.bot.send_message(
chat_id=context.job.context, text=weather_info
)
async def set_notification(update: Update, context: ContextTypes.DEFAULT_TYPE):
if not context.args:
await update.message.reply_text("Укажи город, например: /notify Москва")
return
city = " ".join(context.args)
chat_id = update.message.chat_id
# Устанавливаем уведомление на 8 утра каждый день
context.job_queue.run_daily(
daily_weather,
time=datetime.time(hour=8, minute=0),
data=city,
context=chat_id
)
await update.message.reply_text(f"Уведомления о погоде в {city} включены!")
# В main():
application.add_handler(CommandHandler("notify", set_notification))
Шаг 7: Развёртывание
Для работы бота 24/7 разверните его на сервере:
Выберите платформу:
Бесплатные: PythonAnywhere, Render.
Платные: AWS, DigitalOcean.
Пример для PythonAnywhere:
pip install python-telegram-bot requests
Мониторинг:
Проверяйте логи сервера, чтобы бот работал стабильно.
Вы создали Telegram-бота, который предоставляет информацию о погоде по запросу пользователя. Этот проект — отличный старт для изучения Python, API и автоматизации. Бот можно улучшить, добавив прогнозы, уведомления или даже интеграцию с ИИ для рекомендаций (например, «Возьми зонт!»).