Telegram бот на TypeScript: пишем умного помощника с нуля

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Введение: почему 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. Следуй инструкциям:

  1. Введи имя бота (например, "Мой Умный Помощник").
  2. Введи username (должен заканчиваться на bot, например my_smart_helper_bot).
  3. Скопируй полученный токен и вставь его в .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: делаем бота полезным

Настоящая сила бота — в

Блоги

Рекомендаций по книгам