Skip to content

Как использовать вебхуки

Telegram Bot API поддерживает два способа получения обновлений: long-polling и webhook. GramIO хорошо работает с обоими.

Вот пример использования вебхуков

Поддерживаемые фреймворки

Пример

ts
import { Bot, webhookHandler } from "gramio";
import Fastify from "fastify";

const bot = new Bot(process.env.BOT_TOKEN as string);
const fastify = Fastify();

fastify.post("/telegram-webhook", webhookHandler(bot, "fastify"));

fastify.listen({ port: 3445, host: "::" });

bot.on("message", (context) => {
    return context.send("Fastify!");
});

bot.start({
    webhook: {
        url: "https://example.com:3445/telegram-webhook",
    },
});

Использование вебхуков только в продакшене

Вместо использования туннелей вы можете просто использовать polling в среде разработки!

ts
const bot = new Bot(process.env.BOT_TOKEN);

await bot.start({
    webhook:
        process.env.NODE_ENV === "production"
            ? {
                  url: `${process.env.API_URL}/${process.env.BOT_TOKEN}`,
              }
            : undefined,
});

Локальная разработка с вебхуками

Для локальной разработки с вебхуками мы рекомендуем использовать untun Logounjs/untun.

Untun — это инструмент для создания туннеля между вашим локальным HTTP(s) сервером и внешним миром!

IMPORTANT

Примеры запуска с конкретными фреймворками опущены. Смотрите этот пример.

Через API

Этот метод позволяет установить ссылку на наш туннель непосредственно в скрипте.

Установите пакет:

bash
npm install untun
bash
yarn add untun
bash
pnpm install untun
bash
bun install untun

Запустите туннель и установите вебхук:

ts
import { startTunnel } from "untun";

const tunnel = await startTunnel({ port: 3000 });

bot.start({
    webhook: {
        url: await tunnel.getURL(),
    },
});

Через CLI

Мы прослушиваем порт 3000 локально. Поэтому открываем туннель следующим образом:

bash
npx untun@latest tunnel http://localhost:3000
bash
yarn dlx untun@latest tunnel http://localhost:3000
bash
pnpm dlx untun@latest tunnel http://localhost:3000
bash
bunx untun@latest tunnel http://localhost:3000
bash
 Starting cloudflared tunnel to http://localhost:3000
 Waiting for tunnel URL...
 Tunnel ready at https://unjs-is-awesome.trycloudflare.com

Теперь мы используем эту ссылку при установке вебхука:

ts
bot.start({
    webhook: {
        url: "https://unjs-is-awesome.trycloudflare.com",
    },
});

Напишите свой собственный обработчик обновлений

ts
// не существующий фреймворк для примера
import { App } from "some-http-framework";
import { Bot } from "gramio";

const bot = new Bot(process.env.BOT_TOKEN as string).on("message", (context) =>
    context.send("Hello!")
);

// init обязателен. Он используется для ленивой загрузки плагинов, а также получает информацию о боте.
await bot.init();

const app = new App().post("/telegram", async (req) => {
    // req.body должен быть json эквивалентом TelegramUpdate
    await bot.updates.handleUpdate(req.body);
});

app.listen(80);