
В этой статье мы разработаем бота для подготовки к собеседованиям. Он будет задавать вопросы по HTML, CSS, JS и React. При этом часть из них будет с вариантами ответа, а часть — без. Базу вопросов вы сможете пополнять самостоятельно.
Во время разработки вы научитесь работать с Telegram Bot API с помощью grammY и Node.js, а также самостоятельно деплоить ботов на сервер.
О чем пойдет речь:
→ Регистрация бота и настройка проекта
→ Разработка бота
→ Деплой бота на сервер
Регистрация бота и настройка проекта
Получение токена Telegram Bot API
Для начала нам нужно создать своего бота, а также получить его уникальный ключ — токен. Начинаем диалог с BotFather в Telegram, вводим команду
/newbot и настраиваем бота. После вы получите сообщение с уникальным токеном — он нам понадобится для работы с Telegram Bot API.
BotFather, профиль в Telegram.
Подготовка рабочего окружения
Далее понадобится установить Node.js и npm. Как это сделать — описано в официальной документации. Проверить наличие пакетов в системе можно с помощью следующих команд:
node -v
npm -v
Если в ответ на эти команды вы видите числовые значения, значит, все установлено корректно.
Теперь создадим директорию, в которой будем разрабатывать проект (у меня это frontend-interview-prep-bot), и инициализируем его с помощью npm:
npm init
В командной строке система задаст ряд вопросов про создаваемый пакет. Я оставил все поля, кроме имени, по умолчанию. Вы можете их заполнить или отредактировать позже.

Инициализация пакета.
После финального вопроса нажимаем Enter — в папке должен появиться файл package.json с ранее введенной информацией.
Теперь нам нужно подключить необходимые библиотеки. Главная — та, что позволит упростить разработку и удобно общаться с сервером Telegram. Здесь есть несколько популярных решений:
- node-telegram-bot-api — самая старая и популярная библиотека. По ней вы найдете множество туториалов, она довольно многословна, но проста и понятна.
- Telegraf — следующая по популярности, сложнее в использовании.
- grammY — более лаконичная и простая библиотека в отличие от Telegraf, но сложная в сравнении с node-telegram-bot-api.

Сравнение grammy, node-telegram-bot-api и telegraf в тренде.
В качестве главной библиотеки мы будем использовать grammY. Кроме того, нам понадобится хранить свой токен в переменных окружения — для этого воспользуемся библиотекой dotenv.
Установим библиотеки с помощью команды:
npm i grammy dotenv
После в папке появятся файл package-lock.json с подробным описанием библиотек и их зависимостей, папка node_modules с самими зависимостями. А также в package.json будут добавлены версии библиотек в поле
dependencies.Осталось только создать файл index.js, в котором будем писать код бота. Если решите использовать другое название, не забудьте также внести его в package.json.
Автоматизация перезапуска бота
Чтобы во время разработки бота не приходилось каждый раз перезапускать приложение, мы можем настроить автоматическое обновление при сохранении файлов. Это можно сделать с помощью пакета nodemon:
npm i nodemon
Переходим в package.json и добавляем команду запуска в свойстве
scripts:{
"name": "frontend-interview-prep-bot",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"start": "nodemon index.js"
},
"author": "Arseniy Pomazkov",
"license": "ISC",
"dependencies": {
"dotenv": "^16.3.1",
"grammy": "^1.18.1",
"nodemon": "^3.0.1"
}
}
На этом этапе структура проекта и рабочая среда готовы, переходим к написанию кода.

Разработка бота
Основная структура
Открываем index.js, инициализируем объект Bot, используя API-токен, и запускаем бота:
// Обращаемся к библиотеке grammy и импортируем класс Bot
const { Bot } = require('grammy');
// Создаем бота на основе импортированного класса, передавая
// в качестве аргумента строку с уникальным токеном, который
// получили ранее в BotFather
const bot = new Bot('1234567890:UIEaeSx_YsRXdD-C39M0t1PzcdnZZ4HgsKq');
// Запускаем бота
bot.start();
Хоть мы и написали всего три строчки, уже есть проблема. Стоит нам, например, загрузить код в открытый репозиторий на GitHub, и токен будет скомпрометирован. Чтобы такого не произошло, нужно записать ключ в переменную окружения.
Создадим отдельный файл .env в корне проекта и переместим токен туда, записав в переменную BOT_API_KEY:
// Файл .env
// Обратите внимание, что кавычек нигде нет
BOT_API_KEY=1234567890:UIEaeSx_YsRXdD-C39M0t1PzcdnZZ4HgsKq
Теперь в файле index.js надо импортировать библиотеку dotenv, и токен будет доступен по вызову
process.env.BOT_API_KEY.require('dotenv').config();
const { Bot } = require('grammy');
const bot = new Bot(process.env.BOT_API_KEY);
bot.start();
Для запуска бота нужно в консоли выполнить команду:
node index.js
Все работает, но смысла в этом мало, ведь мы пока не настроили поведение бота. Поэтому реализуем базовые сценарии:
- реагирование бота на команду
/start, - ответ на пользовательские сообщения,
- обработку ошибок.
Команда /start
Чтобы реагировать на команды пользователя (
/start, /help и другие), нужно настроить прослушивание события «команда» с помощью метода command. Первым аргументом он принимает название команды без слеша, а вторым — колбэк с реакцией.Колбэк получает первым аргументом контекст — это объект, который включает информацию о чате, пользователе, отправленном сообщении и т. д. Чтобы ответить на команду, боту достаточно вызвать метод
reply у полученного контекста и передать в него строку с ответом.Поскольку отправка сообщения — это асинхронная операция, нам необходимо дождаться ее выполнения через
await, сделав колбэк-функцию асинхронной:bot.command('start', async (ctx) => {
await ctx.reply(
'Привет! Я - Frontend Interview Prep Bot
Поделиться ссылкой:
Интересные статьи
Интересные статьи
В статье рассмотрим как создавать шаблоны в продуктах Jesbrains (WebStorm, PhpStorm, Intellij, PyCharm).
В публикации речь идет о warnings и vulnerabilities при установке библиотек с помощью yarn и о том, как от них избавиться. Я рассмотрел несколько случаев, приведенных ниже, но решения можно применять ...
Привет, Хабр!В одной из предыдущих статей блога ISPsystem уже упоминался тот факт, что после февральских событий этого года на волне активного импортозамещения количество запросов на наши продукты выр...
Какие задачи пользователю нужно выполнять в рамках CI-пайплайна или при локальной разработке? Среди них может быть что угодно, но самое очевидное — это, наверное, запуск линтеров, всевозможных unit-те...
Все мы в какой-то степени подвержены Троянской угрозе сегодня. Любой девайс, который был куплен в ближайшем магазине под домом, может служить не только Вам, как потребите...
