Профессиональный фреймворк для Telegram ботов на TypeScript. Встроенная база данных, управление сессиями и сценами из коробки.
npm install telekit-lib
import { TeleKit } from 'telekit-lib';
// 1. Инициализация
const bot = new TeleKit('YOUR_BOT_TOKEN');
// 2. Простая команда
bot.command('start', async (ctx) => {
await ctx.reply('Привет! Бот успешно запущен.');
});
// 3. Запуск
bot.start();
LocalDB — это имитация базы данных (похожа на массивы JS), которая сохраняет данные в файл.
Отлично подходит для хранения списка товаров, настроек или задач в небольших ботах.
import { LocalDB } from 'telekit-lib';
// 1. Опишите тип данных
interface Product {
id: number;
name: string;
price: number;
}
// 2. Создайте экземпляр (укажите имя файла)
const products = new LocalDB<Product>('products.json');
// --- Основные операции ---
// Добавить запись
await products.push({ id: 1, name: 'iPhone 15', price: 999 });
// Найти одну запись
const item = await products.findOne(p => p.id === 1);
if (item) console.log(item.name);
// Найти все записи по условию
const cheapItems = await products.find(p => p.price < 1000);
// Обновить запись
await products.update(
p => p.id === 1, // Условие поиска
{ price: 899 } // Новые данные
);
// Удалить запись
await products.delete(p => p.id === 1);
Чтобы данные пользователя не исчезали после перезагрузки бота, используйте
FileStore.
import { TeleKit, FileStore } from 'telekit-lib';
// Сессии будут сохраняться в 'sessions.json'
const bot = new TeleKit('TOKEN', {
store: new FileStore('sessions.json')
});
bot.onText('Имя', (ctx) => {
ctx.session.name = 'Алекс';
ctx.reply('Запомнил!');
});
Вы можете хранить сессии пользователей в PostgreSQL. А также использовать базу данных для бизнес-логики бота.
import { ISessionStore } from 'telekit-lib';
import { Client } from 'pg';
export class PostgresStore implements ISessionStore {
private client: Client;
constructor(connectionString: string) {
this.client = new Client({ connectionString });
this.client.connect();
// Убедитесь, что таблица sessions существует
this.client.query(`CREATE TABLE IF NOT EXISTS sessions (
key TEXT PRIMARY KEY,
value JSONB
)`);
}
async get(key: string) {
const res = await this.client.query(
'SELECT value FROM sessions WHERE key = $1',
[key]
);
return res.rows[0]?.value || null;
}
async set(key: string, value: any) {
await this.client.query(
`INSERT INTO sessions (key, value) VALUES ($1, $2)
ON CONFLICT (key) DO UPDATE SET value = $2`,
[key, value]
);
}
async delete(key: string) {
await this.client.query('DELETE FROM sessions WHERE key = $1', [key]);
}
}
Пример того, как выполнять SQL-запросы прямо внутри команд бота.
import { TeleKit } from 'telekit-lib';
import { Client } from 'pg';
// 1. Настройка подключения
const db = new Client({ connectionString: 'postgresql://user:pass@localhost:5432/mydb' });
await db.connect();
const bot = new TeleKit('TOKEN');
// 2. Команда отображения топа пользователей из БД
bot.command('top', async (ctx) => {
// ...
});
bot.start();
Вы можете перехватывать все обновления для логирования или проверки прав доступа.
// 1. Логирование всего
bot.use(async (ctx, next) => {
console.log(`[${new Date().toISOString()}] Update from ${ctx.userId}`);
await next(); // Передать управление дальше
});
// 2. Проверка прав администратора
const ADMIN_ID = 123456789;
bot.use(async (ctx, next) => {
if (ctx.text === '/secret' && ctx.userId !== ADMIN_ID) {
return ctx.reply('⛔ Доступ запрещен');
}
await next();
});
// Точное совпадение
bot.onText('Меню', (ctx) => ctx.reply('Вот меню...'));
// Регулярное выражение (RegExp)
bot.onText(/^Привет (.+)$/, (ctx) => {
const name = ctx.update.message.text.match(/^Привет (.+)$/)[1];
ctx.reply(`Здравствуй, ${name}!`);
});
Сцены нужны для пошагового сбора данных (например, анкета).
import { Scene } from 'telekit-lib';
// Создаем сцену 'register' с тремя шагами
const registerScene = new Scene('register',
// Шаг 1
(ctx) => {
ctx.reply('Введите ваше имя:');
ctx.next(); // Переход к следующему шагу
},
// Шаг 2
(ctx) => {
ctx.session.name = ctx.text;
ctx.reply('Сколько вам лет?');
ctx.next();
},
// Шаг 3
(ctx) => {
const age = ctx.text;
ctx.reply(`Спасибо, ${ctx.session.name}! Вам ${age} лет.`);
ctx.leave(); // Выход из сцены
}
);
bot.addScene(registerScene);
// Команда для входа в сцену
bot.command('reg', (ctx) => ctx.enter('register'));
Появляются под полем ввода текста. Удобны для главных меню.
import { Keyboard } from 'telekit-lib';
bot.command('menu', (ctx) => {
ctx.reply('Выберите действие:', {
reply_markup: Keyboard.reply([
['📦 Товары', '🛒 Корзина'], // Ряд 1
['⚙️ Настройки'] // Ряд 2
])
});
});
Прикрепляются к сообщению. У каждой кнопки есть callback_data
(ID действия) или url (ссылка).
bot.command('help', (ctx) => {
ctx.reply('Чем помочь?', {
reply_markup: Keyboard.inline([
// data: 'promo' - это ID кнопки
[Keyboard.callback('🔥 Акции', 'promo'), Keyboard.callback('ℹ️ О нас', 'about')],
[Keyboard.url('🌐 Наш сайт', 'https://example.com')]
])
});
});
Когда пользователь нажимает Инлайн-кнопку, срабатывает
bot.onCallback.
// Обработка кнопки 'promo'
bot.onCallback('promo', (ctx) => {
ctx.answerCallback(); // Скрыть часики загрузки
ctx.reply('Сегодня скидка 50% на всё!');
});
// Обработка по шаблону (RegExp)
// Например, для кнопок 'item_5', 'item_10'
bot.onCallback(/^item_(\d+)$/, (ctx) => {
const itemId = ctx.callbackData.match(/^item_(\d+)$/)[1];
ctx.answerCallback(`Выбран товар #${itemId}`); // Показать всплывашку
ctx.reply(`Информация о товаре ${itemId}...`);
});
ctx.reply(text, extra?)
Отправить сообщение.
ctx.answerCallback(text?, alert?)
Ответить на нажатие кнопки (скрыть часики).
ctx.editMessageText(text, extra?)
Изменить текст текущего сообщения.
ctx.deleteMessage()
Удалить текущее сообщение.
ctx.session
Объект сессии пользователя.
ctx.enter(sceneId)
Войти в сцену.
bot.start()
Запустить бота.
bot.command(cmd, handler)
Подписка на команду (/start).
bot.onText(trigger, handler)
Подписка на текст (строка или RegExp).
bot.onCallback(trigger, handler)
Подписка на инлайн-кнопку.
15 Января 2026
LocalDB и FileStore переведены на асинхронную
запись,
чтобы не блокировать процесс.15 Января 2026
ctx.userId для удобного доступа к ID пользователя.15 Января 2026
LocalDB для хранения данных в JSON.