Библиотеки Telegram для Python: выбор пакета и локальный тест
Автор: Казачкин Даниил Михайлович · Обновлено
Слово telegram встречается и в имени Python-модуля, и в именах нескольких разных дистрибутивов. В этом практикуме вы выберете подходящую библиотеку для проекта и проверите…
Слово telegram встречается и в имени Python-модуля, и в именах нескольких разных дистрибутивов. В этом практикуме вы выберете подходящую библиотеку для проекта и проверите обработку сообщения без токена, polling и отправки запросов Telegram. Такой старт позволяет отделить установку SDK от сетевой настройки бота.
Какую библиотеку устанавливать
| Выбор проекта | Установка | Импорт в программе |
|---|---|---|
| python-telegram-bot | python -m pip install python-telegram-bot | telegram, telegram.ext |
| pyTelegramBotAPI | python -m pip install pytelegrambotapi | telebot |
Это самостоятельные 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.