ЯдроКодаподготовка к экзаменам
Учебная платформа

Загружаем материалы

Подготавливаем материалы и навигацию по разделу.

Библиотеки Telegram для Python: выбор пакета и локальный тест

Автор: · Обновлено

Слово telegram встречается и в имени Python-модуля, и в именах нескольких разных дистрибутивов. В этом практикуме вы выберете подходящую библиотеку для проекта и проверите…

Слово telegram встречается и в имени Python-модуля, и в именах нескольких разных дистрибутивов. В этом практикуме вы выберете подходящую библиотеку для проекта и проверите обработку сообщения без токена, polling и отправки запросов Telegram. Такой старт позволяет отделить установку SDK от сетевой настройки бота.

Какую библиотеку устанавливать

Выбор проектаУстановкаИмпорт в программе
python-telegram-botpython -m pip install python-telegram-bottelegram, telegram.ext
pyTelegramBotAPIpython -m pip install pytelegrambotapitelebot

Это самостоятельные API. Пример обработчика для одной библиотеки нельзя переносить в другую заменой одной строки импорта. Перед выбором сопоставьте документацию библиотеки с кодом проекта: объектами приложения, способом регистрации обработчиков и использованием async/await.

Дистрибутив с точным именем telegram на PyPI — отдельный проект. Команда pip install telegram не является сокращением установки python-telegram-bot. Для PTB сверяйтесь с официальной документацией, для telebot — с pyTelegramBotAPI.

Сравнительный стенд

В обычном приложении выбирайте одну библиотеку. Здесь в отдельном учебном окружении установим обе, чтобы сравнить представление одного входного сообщения:

python -m pip install python-telegram-bot pytelegrambotapi
python -m pip check

Сохраните telegram_libraries.py:

import json
from importlib.metadata import packages_distributions

from telegram import Update as PtbUpdate
from telebot.types import Update as TelebotUpdate

payload = {
    "update_id": 1,
    "message": {
        "message_id": 2,
        "date": 0,
        "chat": {"id": 42, "type": "private"},
        "from": {"id": 42, "is_bot": False, "first_name": "Demo"},
        "text": "/score 7",
    },
}


def answer(text):
    command, separator, raw_value = text.partition(" ")
    if command != "/score" or not separator:
        return "Используйте /score ЧИСЛО"
    try:
        value = int(raw_value)
    except ValueError:
        return "Нужно целое число"
    return f"Баллы: {max(value, 0)}"


ptb = PtbUpdate.de_json(payload)
telebot = TelebotUpdate.de_json(json.dumps(payload))
assert ptb.effective_message is not None
assert telebot.message is not None
assert "python-telegram-bot" in packages_distributions().get("telegram", [])
print(answer(ptb.effective_message.text or ""))
print(answer(telebot.message.text or ""))
print(answer("/score ошибка"))

Запуск python telegram_libraries.py должен вывести:

Баллы: 7
Баллы: 7
Нужно целое число

Идентификаторы в payload вымышлены и используются только в памяти программы. Методы de_json создают объекты по локальным данным; вызовов получения обновлений или отправки сообщения в коде нет. Update в PTB, типы pyTelegramBotAPI.

Зачем вынесена функция answer

Функция принимает обычную строку и возвращает ответ. Она не знает о токенах, transport, chats и версиях SDK. Поэтому правила разбора команды можно проверить до подключения сети и использовать с любым из двух адаптеров.

partition(" ") отделяет первую часть команды от аргумента. Для отрицательного числа выбрана явная политика: результат ограничивается нулём. Это правило нашего примера, а не требование Telegram. Измените его осознанно, если задача приложения другая.

Ошибки пакета и ошибки обработчика

При cannot import name Update from telegram проверьте python -m pip show python-telegram-bot telegram и расположение telegram.__file__. В чистом окружении PTB должен предоставлять нужный модуль. Не называйте собственный файл telegram.py или telebot.py.

Если пример из старого руководства использует API, которого нет в установленной версии, выберите документацию соответствующей версии или адаптируйте код. Установка второго одноимённого проекта не вернёт удалённый интерфейс. После исправления конфликта повторите импорт и наш локальный разбор update.

При реальном подключении возникнут другие вопросы: получение токена, polling/webhook, обработка повторных обновлений и сетевых ошибок. Они не проверяются этим стендом. Успех локального теста означает, что установлены ожидаемые пакеты и правильно работает собственная логика команды.

Практика: контракт команды

Добавьте проверки /score, /score -3, /score 2.5 и /unknown 7. Для текущего контракта ожидаются подсказка, Баллы: 0, сообщение о целом числе и подсказка. Проверьте payload без message: обработчик должен пропустить неподходящий update, а не обращаться к None.text.

Затем удалите один из адаптеров из своего проекта, оставив выбранный SDK и ту же функцию answer. Критерий готовности — все варианты входа обрабатываются без сетевых запросов и без подмены имени дистрибутива именем импорта. Стенд проверен в Linux с PTB 22.8 и pyTelegramBotAPI 4.36.1.

Источники