Введение: почему TypeScript, а не Python?
Привет, разработчик! Если ты читаешь это на PythonLib, наверняка удивлён: "Почему статья про TypeScript на ресурсе про Python?". Ответ прост: мир IT не терпит границ, а хороший разработчик умеет выходить за рамки одного языка. TypeScript — это не просто "надстройка над JavaScript", это мощный инструмент для создания надёжных, масштабируемых и предсказуемых приложений. А Telegram боты — идеальная песочница, чтобы попробовать его в деле.
Представь: ты пишешь код, и IDE заранее подсвечивает ошибки, типы данных не дают упасть в рантайме, а автодополнение работает как швейцарские часы. Это не магия — это TypeScript. В этом гайде мы создадим полноценного Telegram бота на TypeScript с нуля: от регистрации в BotFather до деплоя. Ты узнаешь, как настроить проект, обрабатывать команды, отправлять сообщения и работать с внешними API.
Готов? Тогда погнали!
Почему стоит выбрать TypeScript для Telegram бота
Прежде чем нырять в код, давай разберёмся, почему вообще стоит писать бота на TypeScript, а не на Python, который, казалось бы, — "родной" язык для таких задач.
- Типизация — твой друг. Когда в проекте 10+ команд и 20 обработчиков, TypeScript спасёт от глупых ошибок вроде передачи строки вместо числа.
- Современный синтаксис. Async/await, деструктуризация, модули — всё это делает код чище и читаемее.
- Экосистема Node.js. Огромное количество библиотек, включая Telegraf (лучший фреймворк для ботов).
- Производительность. Node.js — событийно-ориентированная платформа, идеальная для чат-ботов с высокими нагрузками.
Кстати, о Telegraf: это TypeScript-first фреймворк, который делает работу с Telegram Bot API максимально простой. Мы будем использовать именно его.
Подготовка: что нужно установить
Для начала работы тебе понадобится:
# Убедись, что установлены Node.js (версия 18+) и npm
node -v
npm -v
# Создай папку проекта
mkdir telegram-bot-ts
cd telegram-bot-ts
# Инициализируй проект
npm init -y
Теперь установим зависимости:
npm install telegraf dotenv
npm install -D typescript @types/node ts-node nodemon
Разберёмся, что мы установили:
- telegraf — основной фреймворк для бота.
- dotenv — для хранения токена в .env файле (безопасность превыше всего).
- typescript, @types/node, ts-node — для компиляции и запуска TS.
- nodemon — для автоматического перезапуска при изменениях.
Создай файл tsconfig.json:
{
"compilerOptions": {
"target": "ES2020",
"module": "commonjs",
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true,
"outDir": "./dist"
},
"include": ["src/**/*"],
"exclude": ["node_modules"]
}
И файл .env (не забудь добавить его в .gitignore!):
BOT_TOKEN=твой_токен_от_BotFather
Регистрация бота: знакомство с BotFather
Это самый простой этап. Открой Telegram, найди @BotFather и отправь команду /newbot. Следуй инструкциям:
- Введи имя бота (например, "Мой Умный Помощник").
- Введи username (должен заканчиваться на
bot, напримерmy_smart_helper_bot). - Скопируй полученный токен и вставь его в
.env.
Готово! Теперь у тебя есть ключ к API Telegram.
Структура проекта и первый запуск
Создай папку src и внутри неё файл index.ts:
// src/index.ts
import { Telegraf } from 'telegraf';
import { message } from 'telegraf/filters';
import dotenv from 'dotenv';
dotenv.config();
const BOT_TOKEN = process.env.BOT_TOKEN;
if (!BOT_TOKEN) {
throw new Error('BOT_TOKEN не найден в .env файле');
}
const bot = new Telegraf(BOT_TOKEN);
bot.start((ctx) => {
ctx.reply('Привет! Я бот на TypeScript. Чем могу помочь?');
});
bot.help((ctx) => {
ctx.reply('Вот что я умею:\n/start - начать\n/help - помощь\n/echo - повторить сообщение');
});
bot.command('echo', (ctx) => {
const text = ctx.message.text.replace('/echo', '').trim();
if (text) {
ctx.reply(`Эхо: ${text}`);
} else {
ctx.reply('Напиши что-нибудь после /echo');
}
});
bot.on(message('text'), (ctx) => {
ctx.reply(`Ты написал: ${ctx.message.text}`);
});
bot.launch();
console.log('Бот запущен!');
// Graceful shutdown
process.once('SIGINT', () => bot.stop('SIGINT'));
process.once('SIGTERM', () => bot.stop('SIGTERM'));
Добавь скрипты в package.json:
"scripts": {
"dev": "nodemon --exec ts-node src/index.ts",
"build": "tsc",
"start": "node dist/index.js"
}
Запусти бота командой npm run dev. Если всё сделано правильно, твой бот ответит на команду /start.
Продвинутые возможности: клавиатуры и инлайн-кнопки
Просто отвечать на сообщения — скучно. Давай добавим интерактивности.
Обычная клавиатура (ReplyKeyboardMarkup)
import { Markup } from 'telegraf';
bot.command('menu', (ctx) => {
ctx.reply('Выбери действие:', Markup
.keyboard(['/info', '/joke', '/random'])
.oneTime()
.resize()
);
});
Инлайн-кнопки (InlineKeyboardMarkup)
bot.command('inline', (ctx) => {
ctx.reply('Нажми на кнопку:', Markup.inlineKeyboard([
Markup.button.callback('Узнать время', 'time'),
Markup.button.url('Перейти на PythonLib', 'https://pythonlib.ru')
]));
});
// Обработка нажатия на инлайн-кнопку
bot.action('time', (ctx) => {
ctx.answerCbQuery('Узнаю время...');
const now = new Date().toLocaleTimeString('ru-RU');
ctx.editMessageText(`Текущее время: ${now}`);
});
Работа с внешними API: делаем бота полезным
Настоящая сила бота — в