В рамках вариативной части задания я, Леоненко Роман Александрович, студент учебной группы 241-3211, выбрал технологию Python: How To Create a Telegram Bot Using Python из репозитория build your own x.
Docker-образ бота в данный момент расположен на хостинге Amvera, поэтому вы можете протестировать его (юзернейм @weather_mpu_practice_bot)
Для реализации технологии рекомендуется использовать Python 3.13 (чтобы избежать возможных ошибок при интерпритации).
Мануал по загрузке бота на своё устройство и запуск вы можете найти здесь.
В качестве фреймворка для функционирования Telegram-бота
Узнай погоду в своём городе!☀️ я использовал
pyTelegramBotAPI
, который позволяет эффективно отправлять
запросы на сервера 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-бот "Узнай погоду в своём городе!☀️", который обладает следующим функционалом: