Telegram-бот "Узнай погоду в своём городе!☀️

Введение


В рамках вариативной части задания я, Леоненко Роман Александрович, студент учебной группы 241-3211, выбрал технологию Python: How To Create a Telegram Bot Using Python из репозитория build your own x.

Docker-образ бота в данный момент расположен на хостинге Amvera, поэтому вы можете протестировать его (юзернейм @weather_mpu_practice_bot)

Telegram Bot

Техническое руководство


Запуск проекта на своём устройстве

Для реализации технологии рекомендуется использовать Python 3.13 (чтобы избежать возможных ошибок при интерпритации).

Мануал по загрузке бота на своё устройство и запуск вы можете найти здесь.

В качестве фреймворка для функционирования Telegram-бота Узнай погоду в своём городе!☀️ я использовал pyTelegramBotAPI, который позволяет эффективно отправлять запросы на сервера Telegram, используя асинхронный цикл событий.

Структура проекта telegram-бота

В качестве внутренней структуры директории проекта я решил разместить хендлеры и служебные функции в соответствующих папках (./handlers и ./service_functions):

├── README.md
├── handlers/
│   ├── handlers.py
│   ├── practice_documentation.md
├── service_functions/
│   ├── add_filters.py # добавление кастомных фильтров в бота. Функция, расположенная в файле, вызывается в main.py.
│   ├── api_weather.py # функции для GET-запросов по получению погоды по координатам или названию местности.
│   ├── custom_error.py # собственный класс для ошибок. Используется с ключевым словом raise. Содержит в себе текст ошибки и указатель на последнюю ошибку.
│   ├── keyboard.py # функции для получения клавиатуры. Используются в handlers/handlers.py.
│   ├── states.py # функция необходима для присваивания различных состояний (например: ожидание ввода от пользователя). Используется в handlers/handlers.py
├── .gitignore # файл необходим для указания git какие файлы ему нужно игнорировать при добавлении в индекс.
├── Dockerfile # файл, содержащий инструкции по построению файловой системы образа. Необходим для контейнеризации проекта.
├── README.md # документация к репозиторию. Оформлен в стиле markdown.
├── main.py # файл, содержащий в себе точку входа. При запуске проекта необходимо запускать именно этот файл.
└── requirements.txt # текстовый документ, в котором содержатся необходимые библиотеки, необходимые для функционирования бота. Используется утилитой pip для загрузки в виртуальное окружение.

Основной принцип работы

Telegram-бот Узнай погоду в своём городе!☀️ работает по принципу long-polling.

Чтобы понять long-polling, нужно разобрать что такое polling.

Polling (с англ.языка = опрос) - метод, при котором клиент постоянно опрашивает сервер о новой информации. Это не очень удобно, поскольку создаёт лишнюю неоправданную нагрузку на сеть.

Long-polling (с англ.языка = продолжительный опрос) - метод, при котором клиент опрашивает сервер о новой информации, но прежде чем сервер отправит ответ на запрос - он ждёт N секунд (например 30-50 секунд). Если в течение этого времени сервер не получает обновлений, то он отправляет клиенту сообщение о том, что обновлений нет и разрывает соединение.

Основное отличие в том, что Long-Polling использует длительное HTTP/S подключение к серверу, в отличие от Polling.

Как указать длительность ожидания ответа от сервера в Telebot:

await Bot.polling(skip_pending=True, timeout=20) # запускаем цикл запросов на сервера Telegram c ожиданием ответа в 20 секунд.

Для эффективного взаимодействия Telegram бота библиотека PyTelegramBotAPI использует асинхронный цикл событий. Что это значит? Бот отправляет запросы (отправки сообщений и прочее) на сервера Telegram и вместо остановки программы в ожидании ответа он обрабатывает запросы от других пользователей (получение хендлерами сообщений).

Финальный результат


Результатом моей работы является Telegram-бот "Узнай погоду в своём городе!☀️", который обладает следующим функционалом:

Результат работы Функционал бота