Как использовать вебхуки
Telegram Bot API поддерживает два способа получения обновлений: long-polling и webhook. GramIO хорошо работает с обоими.
Вот пример использования вебхуков
Поддерживаемые фреймворки
Пример
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 в среде разработки!
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,
});
Локальная разработка с вебхуками
Для локальной разработки с вебхуками мы рекомендуем использовать unjs/untun.
Untun — это инструмент для создания туннеля между вашим локальным HTTP(s) сервером и внешним миром!
IMPORTANT
Примеры запуска с конкретными фреймворками опущены. Смотрите этот пример.
Через API
Этот метод позволяет установить ссылку на наш туннель непосредственно в скрипте.
Установите пакет:
npm install untun
yarn add untun
pnpm install untun
bun install untun
Запустите туннель и установите вебхук:
import { startTunnel } from "untun";
const tunnel = await startTunnel({ port: 3000 });
bot.start({
webhook: {
url: await tunnel.getURL(),
},
});
Через CLI
Мы прослушиваем порт 3000
локально. Поэтому открываем туннель следующим образом:
npx untun@latest tunnel http://localhost:3000
yarn dlx untun@latest tunnel http://localhost:3000
pnpm dlx untun@latest tunnel http://localhost:3000
bunx untun@latest tunnel http://localhost:3000
◐ Starting cloudflared tunnel to http://localhost:3000
ℹ Waiting for tunnel URL...
✔ Tunnel ready at https://unjs-is-awesome.trycloudflare.com
Теперь мы используем эту ссылку при установке вебхука:
bot.start({
webhook: {
url: "https://unjs-is-awesome.trycloudflare.com",
},
});
Напишите свой собственный обработчик обновлений
// не существующий фреймворк для примера
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);