Puregram: типобезопасный SDK для Telegram-ботов на Node.js

Puregram — библиотека для создания Telegram-ботов на Node.js и TypeScript. Она дает типизированный доступ к Telegram Bot API, обработку обновлений, middleware, polling, webhooks и систему расширений. При этом Puregram не пытается заранее решить за разработчика, как должны быть устроены команды, модули и хранилище.

Если нужен современный Telegram-бот на TypeScript, эту библиотеку стоит рассмотреть как модульный SDK, а не как «магический» фреймворк.

Puregram = Telegram Bot API + типы + управляемая обработка updates.

Проверено 3 августа 2026 года.

Хорошая библиотека не отменяет архитектуру. Она делает правильные решения проще, а неправильные — заметнее.


Что такое Puregram

Puregram работает поверх Telegram Bot API и превращает его методы и обновления в удобные TypeScript-объекты. Когда пользователь пишет боту, Telegram присылает update — событие, например сообщение, нажатие inline-кнопки или inline-запрос.

Puregram принимает это событие, создает типизированный объект, пропускает его через цепочку middleware и передает подходящему обработчику. Ответ можно отправить привычным вызовом message.send(), через короткий метод клиента или через точный метод API.

Именно поэтому Puregram называют SDK, а не полноценным application framework. В ядре есть транспорт, dispatch, фильтры, middleware, hooks и плагины. Сессии, сцены, flow, rate limit и хранилища подключаются отдельно.

SDK оставляет разработчику больше решений, чем крупный фреймворк с готовой структурой проекта. Это удобно, если вы хотите собрать приложение под себя, но требует понимать, какие компоненты действительно нужны.

Три уровня API

В Puregram можно выбрать уровень абстракции под конкретную задачу:

УровеньПримерКогда удобен
Контекст объекта updatemessage.send("Привет")Когда ответ относится к текущему сообщению и чат уже известен
Shortcut клиентаtelegram.send(...)Для частых операций, когда не хочется писать лишний шаблонный код
Сгенерированный APItelegram.api.sendMessage(params)Когда нужен полный контроль над контрактом Telegram
Универсальный вызовtelegram.api.call(method, params)Для динамического или нестандартного кода

Контекстный API обычно читается проще всего: объект сообщения уже знает, куда отправлять ответ. Сгенерированный API ближе к документации Telegram и полезен в инфраструктурном коде. Универсальный api.call() остается запасным выходом, если для нового или динамического метода еще нет удобной оболочки.

Чем Puregram не является

Puregram не навязывает:

Это не недостаток само по себе. Для небольшого бота готовый фреймворк может привести к результату быстрее. Для растущего TypeScript-проекта полезнее бывает модульность: нужные функции подключаются явно, а ненужные не становятся обязательными зависимостями.

Как устроена обработка обновления

Общий путь выглядит так:

Telegram → polling или webhook → типизированный update → фильтры и middleware → обработчик → запрос к Telegram API

Транспорт и бизнес-логика разделены. Поэтому обработчик сообщения не обязан знать, пришло ли событие через long polling или HTTP webhook.

Диспетчеры и фильтры

Для разных типов событий есть отдельные обработчики: onMessage, onCallbackQuery, onInlineQuery и другие. Это позволяет не писать один большой switch по всем вариантам Telegram update.

Фильтры проверяют тип события, команду, текст, чат и другие признаки. После успешной проверки TypeScript может сузить тип объекта. В результате ошибка вроде «у этого update нет поля, которое я пытаюсь прочитать» обнаруживается раньше запуска бота.

Middleware

Middleware образуют цепочку обработки. Вызов next() передает управление следующему middleware или обработчику. Если next() не вызвать, распространение update останавливается.

Такая onion-модель подходит для логирования, авторизации, метрик, корреляционных идентификаторов и ограничения доступа:

ts
telegram.use(async (update, next) => {
  const startedAt = performance.now()

  try {
    await next()
  } finally {
    const duration = performance.now() - startedAt

    console.log({
      updateId: update.updateId,
      duration
    })
  }
})

Middleware можно использовать и как пропускной пункт. Например, сначала проверить пользователя в базе, а затем передать update дальше только разрешенной группе. Это место для политики доступа, а не повод дублировать проверку в каждом обработчике.

Long polling и webhooks

СпособКогда подходитЧто важно
Long pollingЛокальная разработка, небольшой сервис, сервер без публичного endpointБот сам запрашивает новые updates через getUpdates
WebhookProduction с доступным HTTPS endpoint, serverless или существующий HTTP-серверTelegram отправляет updates на ваш URL
Webhook handlerИнтеграция с Fastify, Express или собственным серверомPuregram обрабатывает update, а HTTP-жизненным циклом управляете вы

Polling поддерживает параллельную обработку. Если сообщения одного чата должны идти строго по порядку, можно сериализовать их по ключу, например по chat_id, не делая последовательным весь бот.

Установка и первый бот

Что требуется

Для Puregram v3 нужны:

CommonJS в v3 не поддерживается. Для базовой работы отдельный HTTP-клиент не нужен: современный Node.js уже предоставляет fetch.

Установка

bash
npm install puregram

Для других менеджеров пакетов:

bash
pnpm add puregram
bash
yarn add puregram

Минимальный package.json должен включать ESM-режим:

json
{
  "type": "module",
  "scripts": {
    "dev": "tsx src/bot.ts",
    "start": "node dist/bot.js"
  }
}

Для запуска TypeScript без отдельной сборки можно добавить tsx:

bash
npm install --save-dev typescript tsx @types/node

Минимальный бот

В этом примере нет роутера, базы данных и отдельного сервера. Он показывает базовую идею: создать клиент, зарегистрировать обработчик и запустить получение updates.

В production токен храните в переменной окружения или секретном хранилище. Не записывайте его в репозиторий и не вставляйте в исходный код.

Минимальный чек-лист перед первым запуском

Какие модули подключать

Встроенное ядро закрывает базовый путь от update до ответа. Остальные задачи разделены на официальные пакеты:

ПакетЗадача
@puregram/apiТипы, методы и модели Telegram Bot API
@puregram/sessionСостояние пользователя или чата между updates
@puregram/storageАбстракции хранилищ для stateful-компонентов
@puregram/scenesСцены и многошаговые диалоги
@puregram/flowПоследовательные сценарии и ожидание следующего действия
@puregram/callback-dataТипизированные данные для inline-кнопок
@puregram/markupКлавиатуры и Telegram markup
@puregram/richФорматированное содержимое
@puregram/rate-limitОграничение частоты операций
@puregram/throttlerУправление скоростью исходящих запросов
@puregram/media-cacherПовторное использование загруженных медиа
@puregram/file-idРазбор Telegram file ID
@puregram/inline-message-idРабота с inline message ID
@puregram/streamПотоковые абстракции
@puregram/utilsОбщие вспомогательные функции
@puregram/testИнструменты тестирования

Не нужно устанавливать все пакеты сразу. Сначала определите сценарий:

Контекстный API помогает писать обработчики короче, но структура приложения всё равно остается вашей ответственностью.

Что на Puregram можно построить

Обычный бот с командами и сообщениями

Для небольшого бота достаточно нескольких диспетчеров, фильтров и контекстных методов. Команды, бизнес-правила и формат ответа можно держать в отдельных модулях, не смешивая их с транспортом.

Inline-кнопки и callback data

Связка @puregram/markup и @puregram/callback-data подходит для:

Хорошая практика — кодировать в callback data только короткий идентификатор действия и нужный контекст, а подробные данные читать из базы. Это сохраняет кнопку компактной и уменьшает риск доверять устаревшему payload.

Анкеты и многошаговые процессы

Для onboarding, заявки, заказа или анкеты есть несколько уровней:

Важный момент: эти возможности не находятся в ядре. Это плюс для модульного проекта, но вам придется заранее выбрать модель состояния и политику ее хранения.

Ограничение нагрузки

Telegram может ответить ошибкой 429, если бот отправляет слишком много запросов. Для этой зоны есть rate limit, throttler и повтор после flood wait.

Автоматическая повторная попытка не заменяет очередь и идемпотентность. Если одна и та же операция меняет данные, сначала решите, как отличить безопасный повтор от повторного побочного эффекта.

Coding agents и skills

У Puregram есть отдельный репозиторий skills для coding agents. Это инструкции и lookup-инструменты, которые помогают агенту сверяться с установленной версией API и официальных пакетов.

Такой набор полезен, когда разработчик использует Codex, Claude Code, Cursor или другую среду со skills. Но сгенерированный код все равно нужно проверить компилятором и тестами.

Почему TypeScript здесь имеет смысл

Можно писать на JavaScript, но сильная сторона Puregram раскрывается в TypeScript:

Это не отменяет runtime-проверки. Telegram может вернуть ошибку из-за прав бота, лимита, состояния чата или неверных данных. Типы помогают не передать очевидно неправильную структуру, но не могут проверить внешний мир.

TypeScript уменьшает класс ошибок, а не обещает отсутствие всех ошибок.

Почему типы полезнее всего на границах

На границе с Telegram много вариантов данных: сообщение может содержать текст, медиа, entities, reply markup или не содержать нужное поле вовсе. Типы помогают увидеть это различие в редакторе и не рассчитывать на поле, которого у конкретного update нет.

Как подключаются плагины

Расширения подключаются явно через telegram.extend(plugin). Плагин может добавлять методы, API, hooks или логику жизненного цикла. Puregram учитывает зависимости между плагинами и может обнаружить отсутствующую зависимость, конфликт или цикл.

Это лучше воспринимать как договор между компонентами:

1. приложение явно подключает расширение; 2. расширение объявляет, от чего зависит; 3. Puregram проверяет порядок и совместимость; 4. код получает добавленную возможность через понятный API.

Явный плагин читается лучше, чем скрытая магия, которая меняет поведение клиента при одном импорте.

Puregram, Telegraf, grammY или aiogram

У этих библиотек разные исходные идеи. Сравнивать их только по длине примера несправедливо.

БиблиотекаЯзык и runtimeОсновной стильКогда выбрать
PuregramTypeScript/JavaScript, Node.js 22+, ESMТипизированные update-классы, отдельные диспетчеры, middleware, явные плагиныНовый Node.js/TypeScript-проект, где важны точный Bot API и контроль архитектуры
TelegrafJavaScript/TypeScript, Node.jsКонтекст ctx, middleware, готовые scenes и sessionsБыстрый старт и большая экосистема Node.js-рецептов
grammYTypeScript/JavaScript, Node.js и DenoКонтекст, middleware, filter queries, официальный plugin APIСильная документация, готовые официальные плагины и переносимость
aiogramPython, asyncioDispatcher, Router, filters, middleware и FSMPython-команда, которой нужны async-архитектура и FSM

Puregram не обязан быть лучшим выбором для каждого проекта. Если команда уже пишет на Python, aiogram будет естественнее. Если важнее большое количество готовых рецептов, Telegraf или grammY могут сократить путь до первой версии. Если нужен Node.js, TypeScript и явная модульная архитектура, Puregram выглядит логичным кандидатом.

Как сравнить библиотеки честно

Если выбор влияет на production, соберите одинаковый прототип на двух-трех вариантах и измерьте:

Сетевую задержку Telegram отделяйте от overhead библиотеки. Для этого можно записывать updates, воспроизводить их локально и направлять исходящие запросы в mock-сервер.

Сильные стороны и ограничения

Что может понравиться

Что нужно принять

Кому подойдет Puregram

Puregram стоит рассматривать, если:

Не обязательно выбирать Puregram, если:

Выбирайте не библиотеку вообще, а библиотеку под способ работы вашей команды.

Частые вопросы

Puregram — это фреймворк?

Авторы описывают Puregram как типобезопасную обертку или SDK над Telegram Bot API. В нем есть транспорт, dispatch, middleware и плагины, но нет обязательного полного каркаса приложения.

Можно ли писать на JavaScript?

Да. Puregram работает с JavaScript, но v3 требует ESM и Node.js 22 или новее. TypeScript дает главное преимущество — типы и narrowing.

Есть ли в ядре сессии и FSM?

Нет. Для состояния используются @puregram/session и @puregram/storage, для flow-сценариев — @puregram/flow, для сцен — @puregram/scenes.

Поддерживаются ли webhooks?

Да. Можно использовать встроенный listener, зарегистрировать webhook через Puregram или подключить обработчик к существующему Fastify, Express или Node.js-серверу.

Puregram готов для production?

Проект поддерживает polling, webhooks, hooks, обработку ошибок и управление параллельностью. Но production-ready зависит не только от библиотеки: нужны тесты, логи, наблюдаемость, корректное хранение состояния, retry-стратегия и проверка нагрузки.

Что с лицензией?

Репозиторий Puregram указывает Mozilla Public License 2.0 (MPL-2.0). Если вы меняете исходные файлы Puregram и распространяете результат, проверьте требования лицензии; это не юридическая консультация.

Что читать дальше

Puregram — не кнопка «сделать бота автоматически». Это аккуратный типизированный слой над Telegram, который дает Node.js/TypeScript-разработчику выбор: писать коротко через контекст, работать точно через API или собрать собственную архитектуру из официальных модулей.