Skip to content

xTCry/max-io

Repository files navigation

Max IO

npm npm downloads license Max Bot API schema 0.0.30 GitHub last commit

Max IO β€” TypeScript-Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Ρ‡Π°Ρ‚-Π±ΠΎΡ‚ΠΎΠ² Π² мСссСндТСрС Max. Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π΄Π°Ρ‘Ρ‚ middleware-runtime, typed context, long polling, webhook, upload helpers, ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹ ΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ для session/scene/i18n.

Π’ΠΈΠΏΡ‹ API ΡΠ²Π΅Ρ€ΡΡŽΡ‚ΡΡ с ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΌ Π°Ρ€Ρ…ΠΈΠ²ΠΎΠΌ OpenAPI-схСм max-messenger-bot/max-bot-api-schemas. Π’Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€: schema_2026_05_20, вСрсия Max Bot API 0.0.30.

ВозмоТности

Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π§Ρ‚ΠΎ Π΄Π°Ρ‘Ρ‚
Middleware-runtime bot.use, bot.on, bot.command, bot.hears, bot.action
Typed Context ctx.reply, ctx.message, ctx.args, ctx.payload, ctx.state, ctx.api
Long polling bot.start(), marker API, Ρ€Π΅ΠΆΠΈΠΌ для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈ тСстирования
Webhook bot.start({ webhook }), webhookCallback, createWebhook, deleteWebhook
Upload image/video/audio/file, progress, timeout, AbortSignal, retry attachment.not.ready
ΠšΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹ inline keyboard, open_app, message, clipboard, reply keyboard types
ΠœΠΎΠ΄ΡƒΠ»ΠΈ max-io/lib/session, max-io/lib/scene, max-io/lib/i18n

Установка

npm i max-io
yarn add max-io

ВрСбуСтся Node.js >=14.13.1.

ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ Π±ΠΎΡ‚

Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Ρ‚ΠΎΠΊΠ΅Π½ Π±ΠΎΡ‚Π° Π² Max ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°ΠΉΡ‚Π΅ Π΅Π³ΠΎ Ρ‡Π΅Ρ€Π΅Π· ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ окруТСния MAX_BOT_TOKEN.

import 'dotenv/config';

import { Bot, Keyboard } from 'max-io';

const bot = new Bot(process.env.MAX_BOT_TOKEN!);

bot.command('start', async (ctx) => {
  await ctx.reply('ΠŸΡ€ΠΈΠ²Π΅Ρ‚! Π― Π±ΠΎΡ‚ Π½Π° Max IO.', {
    attachments: [
      Keyboard.inlineKeyboard([
        [Keyboard.button.callback('ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ callback', 'demo:callback')],
      ]),
    ],
  });
});

bot.command('echo', async (ctx) => {
  const text = ctx.payload || 'Напиши /echo любой тСкст';
  await ctx.reply(text);
});

bot.action('demo:callback', async (ctx) => {
  await ctx.answerOnCallback({ notification: 'Callback ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½' });
});

bot.start().then();

ΠšΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ payload ΠΈ args:

bot.command('ban', async (ctx) => {
  const [userId, ...reasonParts] = ctx.args ?? [];
  const reason = reasonParts.join(' ');

  await ctx.reply(`userId=${userId}; reason=${reason || 'Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½Π°'}`);
});

ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅: docs/01-first-bot.md ΠΈ docs/02-listen-and-respond.md.

Webhook Π·Π° ΠΌΠΈΠ½ΡƒΡ‚Ρƒ

import 'dotenv/config';

import { Bot } from 'max-io';

const bot = new Bot(process.env.MAX_BOT_TOKEN!);

bot.command('ping', async (ctx) => {
  await ctx.reply('pong from webhook');
});

await bot.start({
  webhook: {
    domain: 'https://example.com',
    port: 3000,
    secret: process.env.MAX_WEBHOOK_SECRET,
  },
});

Если path Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½, max-io создаёт бСзопасный ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ path ΠΏΠΎ Ρ‚ΠΎΠΊΠ΅Π½Ρƒ. ΠŸΡ€ΠΈ запускС webhook ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΡƒΠ΄Π°Π»ΡΡŽΡ‚ΡΡ старыС подписки с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ URL; ΠΏΡ€ΠΈ запускС polling ΡƒΠ΄Π°Π»ΡΡŽΡ‚ΡΡ всС webhook-подписки.

ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅: docs/webhook.md.

Polling marker

marker Π½ΡƒΠΆΠ΅Π½, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ long polling с ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ. Если marker Π½Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ, Max API Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ послСднСС ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅, поэтому события, накопившиСся ΠΏΠΎΠΊΠ° Π±ΠΎΡ‚ Π±Ρ‹Π» нСдоступСн, Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π½Ρ‹ автоматичСски.

const bot = new Bot(process.env.MAX_BOT_TOKEN!, {
  polling: { marker: Number(process.env.MAX_POLLING_MARKER) || undefined },
});
// ΠΈΠ»ΠΈ
bot.polling.setMarker(123456);
console.log(bot.polling.marker);
// ΠΈΠ»ΠΈ
await bot.start({ marker: bot.polling.marker });

Long polling стоит ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈ Ρ€ΡƒΡ‡Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ. Для production Max Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅Ρ‚ Webhook; с 11.05.2026 для polling заявлСны ограничСния: 2 RPS, timeout 30 сСкунд, batch Π΄ΠΎ 100 событий ΠΈ TTL событий 24 часа.

Upload и влоТСния

bot.command('video', async (ctx) => {
  const video = await ctx.api.uploadVideo({
    source: './public/video.mp4',
    onProgress: ({ loaded, total }) => {
      if (total) console.log(`upload ${Math.round((loaded / total) * 100)}%`);
    },
  });

  await ctx.reply('Π’ΠΈΠ΄Π΅ΠΎ Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½ΠΎ', {
    attachments: [video.toJson()],
  });
});

ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅: docs/03-attachments-and-uploads.md.

ΠšΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹

const keyboard = Keyboard.inlineKeyboard([
  [Keyboard.button.callback('Callback', 'payload')],
  [Keyboard.button.openApp('ΠžΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ mini app', 'my_bot', 'demo')],
  [Keyboard.button.clipboard('Π‘ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ', 'promo-code')],
]);

ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅: docs/04-keyboards.md.

Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ

import { I18n } from 'max-io/lib/i18n';
import { SceneManager, StepScene } from 'max-io/lib/scene';
import { SessionManager } from 'max-io/lib/session';
  • max-io/lib/session β€” session middleware с memory/Redis storage.
  • max-io/lib/scene β€” сцСны ΠΈ step-сцСнарии ΠΏΠΎΠ²Π΅Ρ€Ρ… session.
  • max-io/lib/i18n β€” YAML-локализация с ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ session.

ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅: docs/05-sessions-scenes-i18n.md.

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

Entry points

Import НазначСниС
max-io Runtime, Bot, Context, Api, helpers, основныС Ρ‚ΠΈΠΏΡ‹
max-io/types ΠŸΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ Bot API
max-io/lib/session Session middleware
max-io/lib/scene Scene manager
max-io/lib/i18n I18n middleware

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹

Π’ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ Π΅ΡΡ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ TypeScript-ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹ для Ρ€ΡƒΡ‡Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ:

  • examples/01-basic-minimum β€” Π±Π°Π·ΠΎΠ²Ρ‹Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, влоТСния, ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹, upload.
  • examples/02-chat-admin-management β€” ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ администраторами Ρ‡Π°Ρ‚Π°.
  • examples/03-webhook-subscriptions β€” webhook runtime, subscribe/unsubscribe, custom server mode.
  • examples/04-sessions-scenes-i18n β€” typed context, session, scene ΠΈ i18n.
  • examples/pr-scenarios β€” сцСнарии для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ PR/issues ΠΈ спорного повСдСния API.

ΠŸΠΎΠ»Π΅Π·Π½Ρ‹Π΅ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ

  • nestjs-max β€” интСграция Max IO с NestJS.

Бтатус API

Max Bot API развиваСтся, Π° Ρ‡Π°ΡΡ‚ΡŒ повСдСния зависит ΠΎΡ‚ сСрвСрной Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° Max. Π’ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ Π΅ΡΡ‚ΡŒ Ρ€ΡƒΡ‡Π½Ρ‹Π΅ сцСнарии ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ для upload, webhook, reply keyboard, chat admin API ΠΈ video details. Если ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ API Π½Π΅ ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΎ схСмой ΠΈΠ»ΠΈ ΠΆΠΈΠ²ΠΎΠΉ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΎΠΉ, Π»ΡƒΡ‡ΡˆΠ΅ Ρ„ΠΈΠΊΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ это ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ².

ЛицСнзия

MIT. ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΡΡ‚ΠΈ ΠΏΠΎ сторонним ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€Π°ΠΌ ΠΈ лицСнзиям см. Π² THIRD_PARTY_NOTICES.md.

About

πŸ€– TypeScript framework for building Max messenger bots with typed context, middleware, polling, webhooks, uploads, keyboards, sessions, scenes and i18n.

Topics

Resources

License

Contributing

Stars

Watchers

Forks

Contributors