Добавляем Telegram Widgets в React-приложение

Инструкция по добавлению Telegram Widgets в React-приложение с помощью npm-пакета @baranov-guru/react-telegram-widgets: посты, комментарии, кнопка «Поделиться» и вход через Telegram.

Добавляем Telegram Widgets в React-приложение
Дата публикации
15.07.25
Дата обновления
23.09.26
Время чтения
6 мин.

В этой статье расскажем что такое Telegram Widgets, зачем они нужны и как максимально просто добавить их в своё React приложение.

Что такое Telegram Widgets?

Telegram Widgets - API от Telegram, которое позволяет быстро добавить на сайт кнопку "Поделиться", встроить посты из публичных каналов или групп. С его помощью пользователи также могут авторизоваться через Telegram или просматривать обсуждения прямо на сайте.

Проблема с использованием в React приложениях

Дело в том что Telegram Widget - это script-тег вида:

<script
  async
  src="https://telegram.org/js/telegram-widget.js?22"
  data-telegram-post="baranov_guru/61"
  data-width="100%"
></script>

Он инициализируется и добавляет в родительский контейнер iframe, который рендерит контент с нужными параметрами.

Из-за этого с виджетами очень неудобно работать в декларативном стиле, присущем React-компонентам. Поэтому нам пришлось написать небольшую обёртку над скриптами, позволяющую:

  • Подписываться на события загрузки;
  • Отслеживать ошибки;
  • В удобном декларативном стиле пробрасывать необходимые свойства виджетов;
  • Корректно обрабатывать изменения свойств и перерендеры компонентов;

А так как официального React-пакета для виджетов нет и не предвиделось, поэтому мы решили оформить её в виде npm-пакета @baranov-guru/react-telegram-widgets.

Что делает пакет @baranov-guru/react-telegram-widgets?

С версии 1.1.0 пакет поддерживает:

  • Комментарии (TelegramDiscussionWidget) — обсуждение постов прямо на сайте.
  • Посты из ТГ-каналов (TelegramPostWidget) — отдельный пост из публичного Telegram-канала или группы.
  • Кнопку «Поделиться» (TelegramShareWidget) — шаринг ссылки в Telegram.
  • Вход через Telegram (TelegramLoginWidget и хук useTelegramLogin) — текущий OpenID Connect-логин.
  • Legacy Login Widget (TelegramLegacyLoginWidget) — старый iframe-виджет с hash; для новых интеграций лучше OIDC.

Установка

npm install @baranov-guru/react-telegram-widgets

Примеры использования

Виджет комментариев (TelegramDiscussionWidget)

import { TelegramDiscussionWidget } from "@baranov-guru/react-telegram-widgets";

function App() {
  return (
    <div>
      <h1>Discussion</h1>
      <TelegramDiscussionWidget
        discussion="baranov_guru"
        commentsLimit={10}
        height={400}
        color="#ff0000"
        colorful={true}
        dark={true}
        onLoad={() => console.log("Comments loaded!")}
        onError={(error) => console.error("Failed to load comments:", error)}
      />
    </div>
  );
}

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

Встраивание поста (TelegramPostWidget)

import { TelegramPostWidget } from "@baranov-guru/react-telegram-widgets";

const App = () => (
  <TelegramPostWidget
    post="baranov_guru/61"
    userpic
    onLoad={() => console.log("Post loaded!")}
    onError={(error) => console.error("Failed to load post:", error)}
    className="w-full flex p-2"
  />
);

Просто указываете название канала и ID поста — и он появляется на странице.

Кнопка «Поделиться» (TelegramShareWidget)

import { TelegramShareWidget } from "@baranov-guru/react-telegram-widgets";

function ShareSection() {
  return (
    <TelegramShareWidget
      url="https://example.com/article"
      comment="Check out this article!"
      size="large"
    />
  );
}

Нужны абсолютный url и при желании comment и size (large | medium | small).

Вход через Telegram (TelegramLoginWidget)

Актуальный способ — OpenID Connect login. Зарегистрируйте origin сайта в @BotFather (Login Widget → Allowed URLs) и используйте числовой Client ID.

telegram-login.js открывает попап. Если сайт отдаёт заголовок Cross-Origin-Opener-Policy: same-origin, логин не сработает — нужен same-origin-allow-popups (или без этого заголовка).

import {
  TelegramLoginWidget,
  TelegramLoginSuccess,
} from "@baranov-guru/react-telegram-widgets";

function LoginPage() {
  const handleAuth = async (result: TelegramLoginSuccess) => {
    // Отправьте id_token на бэкенд и проверьте его там.
    await fetch("/api/auth/telegram", {
      method: "POST",
      headers: { "Content-Type": "application/json" },
      body: JSON.stringify({ id_token: result.id_token }),
    });
  };

  return (
    <TelegramLoginWidget
      clientId={123456789}
      scope={["profile", "write"]}
      onAuth={handleAuth}
      onError={(error) => console.error("Login failed:", error)}
    />
  );
}

Без готовой кнопки — хук useTelegramLogin:

import { useTelegramLogin } from "@baranov-guru/react-telegram-widgets";

function CustomLoginButton() {
  const { login, isReady, isLoading, error } = useTelegramLogin({
    clientId: 123456789,
    scope: ["profile"],
    onAuth: (result) => console.log(result.id_token, result.user),
  });

  return (
    <button type="button" disabled={!isReady || isLoading} onClick={() => login()}>
      Continue with Telegram
    </button>
  );
}

id_token всегда проверяйте на сервере. Хелперов для верификации в пакете нет — примеры проверки есть в README на npm и в репозитории.

Legacy Login Widget (TelegramLegacyLoginWidget)

Старый iframe Login Widget с полем hash. Для новых интеграций лучше TelegramLoginWidget.

import {
  TelegramLegacyLoginWidget,
  TelegramLegacyLoginData,
} from "@baranov-guru/react-telegram-widgets";

function LegacyLoginPage() {
  const handleAuth = async (user: TelegramLegacyLoginData) => {
    await fetch("/api/auth/telegram-legacy", {
      method: "POST",
      headers: { "Content-Type": "application/json" },
      body: JSON.stringify(user),
    });
  };

  return (
    <TelegramLegacyLoginWidget
      botName="SampleBot"
      size="large"
      radius={8}
      requestAccess={true}
      onAuth={handleAuth}
      onError={(error) => console.error("Login widget error:", error)}
    />
  );
}

Вместо (или вместе с) onAuth можно задать authUrl для редиректа после входа.

Документация

Все доступные пропсы и примеры есть в npm-профиле пакета. Там всё кратко и по делу.

Поддержите проект ⭐️

Если вам пригодился этот пакет — будем рады, если поставите ему звёздочку на GitHub. Это поможет другим разработчикам найти его.

Расскажите о вашем проекте

Связаться иначе

Часто задаваемые вопросы

Это виджеты Telegram: встраивание постов и обсуждений, кнопка «Поделиться», авторизация через Telegram на сайте. Посты, обсуждения, шаринг и legacy-логин идут через скрипт telegram-widget.js (iframe). Текущий логин (OIDC) — через telegram-login.js.

Официальный способ — императивный script-тег с атрибутами data-*. В React нужны подписки на загрузку, обработка ошибок и пересоздание виджета при смене пропсов — для этого и сделан пакет-обёртка.

Наш open-source npm-пакет: декларативные компоненты TelegramDiscussionWidget, TelegramPostWidget, TelegramShareWidget, TelegramLoginWidget (и хук useTelegramLogin), а также TelegramLegacyLoginWidget. Это не официальный пакет Telegram. Установка: npm install @baranov-guru/react-telegram-widgets.

Discussion — обсуждение под контентом на сайте (параметр discussion, лимит комментариев, высота). Post — один пост из публичного канала (post в формате channel/id, например baranov_guru/61).

У компонентов есть колбэки onLoad и onError — в статье они в примерах. Так проще отладить блокировщики, неверный post или недоступность telegram.org.

В README на npm и в репозитории на GitHub. О проекте пакета как о работе агентства — на странице NPM пакет @baranov-guru/react-telegram-widgets.

Вам может быть интересно

NPM пакет @baranov-guru/react-telegram-widgets
NPM пакет @baranov-guru/react-telegram-widgets

NPM пакет @baranov-guru/react-telegram-widgets

Бесплатный NPM-пакет для интеграции Telegram Widgets в React-приложения.

Проект#react#telegram
CollabiC
CollabiC

CollabiC

Как из одного каталога связок сделать lead magnet: сотни посадочных страниц, сигнал спроса и заявки — без своего бэкенда.

Проект#маркетинг#frontend
У нас праздник
У нас праздник

У нас праздник

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

Проект#стартапы под ключ#frontend
Автоматизируем публикацию npm-пакета с помощью Github Actions
Автоматизируем публикацию npm-пакета с помощью Github Actions

Автоматизируем публикацию npm-пакета с помощью Github Actions

7 мин.

Инструкция по подготовке npm-пакета к автоматизированному релизу с помощью Github Actions...

Пост#DevOps#github
Брендированные типы (branded types) в TypeScript
Брендированные типы (branded types) в TypeScript

Брендированные типы (branded types) в TypeScript

4 мин.

Что такое branded types в Typescript и как с их помощью улучшить type safety в рантайме...

Пост#typescript
Настройка MAX-бота для работы в Yandex Cloud Functions
Настройка MAX-бота для работы в Yandex Cloud Functions

Настройка MAX-бота для работы в Yandex Cloud Functions

4 мин.

Инструкция по настройке и хостингу простейшего MAX-бота в Yandex Cloud Functions.

Пост#yandex#max
Добавляем рекомендации постов и блок "Поделиться в соц. сетях"
Добавляем рекомендации постов и блок "Поделиться в соц. сетях"

Добавляем рекомендации постов и блок "Поделиться в соц. сетях"

4 мин.

Изучали различные блоги, аналогичные нашему и решили добавить блок "Поделиться в соц. сетях", а так же простейший механизм рекомендаций статей. Вот что из этого вышло...

Пост#туториалы
Новые требования по работе с персональными данными
Новые требования по работе с персональными данными

Новые требования по работе с персональными данными

9 мин.

Обзор новых требований к обработке персональных данных для владельцев сайтов и чат-ботов и чек-лист для самопроверки...

Пост#законы
Добавляем поддержку MDX в Next.js приложение
Добавляем поддержку MDX в Next.js приложение

Добавляем поддержку MDX в Next.js приложение

3 мин.

Инструкция по добавлению поддержки MDX в Next.js приложение...

Пост#nextjs
Разработка Telegram-бота
Разработка Telegram-бота

Разработка Telegram-бота

Telegram-бот под ваш бизнес: сценарии, интерфейс, интеграции и запуск. От MVP до масштабируемого решения.

Услуга#боты#telegram
Frontend разработка
Frontend разработка

Frontend разработка

Разрабатываю интерфейсы, которые быстро работают, удобно используются и масштабируются вместе с продуктом.

Услуга#frontend#веб-разработка