Найти тему

Telegram бот на NodeJS & Typescript: nestjs-telegraf + postgres

Оглавление

Тема телеграм ботов на моем канале уже была затронута, но это было давным-давно и не правда 😉 еще и на python

В этой статье хочу поделиться изи заготовкой для бота на nodejs с использованием пакета nestjs-telegraf и с бд на postgress.

Недавно столкнулся с задачей - разработать бота в телеге. Так как моя деятельность сейчас связана с фронтенд разработкой, не долго думая я уже искал npm пакет для начала разработки. Натолкнулся вначале на telegraf - ссылка 👈

Документация там вполне информативная, но со своими изъянами, местами бывало тяжко разбираться)

Но эти доки подойдут для того чтобы брать от туда методы и классы, так как они используются и в nestjs-telegraf - и вот о этом npm пакете и пойдет речь)

Так как разработка бота это больше история связанная про разработку бэкенда, то разрабатывая бот на nodejs надо было выбрать максимально готовые библиотеки для бэка. Использовать nestjs может и жирно будет, но считаю это хороший вариант, и тем более когда есть nestjs-telegraf

Итак, стек следующий:

- nestjs

- telegraf

- nestjs-telegraf

- typescript

- postgres

- typeorm

Инициализация:

npm i -g @nestjs/cli

nest new telegram-bot-nestjs

cd telegram-bot-nestjs

Следом просто пачку зависимостей перечислю текстом которые будут нужны:

npm i --save @nestjs/common @nestjs/config @nestjs/core @nestjs/mapped-types @nestjs/platform-express @nestjs/typeorm class-transformer nestjs-telegraf pg reflect-metadata rxjs typeorm

И также девелоп зависимости:

npm i -D @nestjs/cli @nestjs/schematics @nestjs/testing @types/express @types/jest @types/js-yaml @types/node @types/supertest @typescript-eslint/eslint-plugin @typescript-eslint/parser eslint eslint-config-prettier eslint-plugin-prettier jest js-yaml prettier source-map-support supertest ts-jest ts-loader ts-node tsconfig-paths typescript

Можно просто скопировать и вставить в консоль находясь в директории проекта и установить все пакеты.

Большинство пакетов уже идут вместе со сгенирированным приложением от nestjs, но я перечислил все пакеты которые у меня установлены. ( ссылка на package.json - github )

Конфиг

Далее потребуются конфиги, в которым будут данные о базе данных, телеграм боте, и некоторых настройках самого приложения. Мне нравится юзать yaml файл в качестве конфигурационного файла, для данного примера его будет достаточно.

Вот как выглядит мой config.yaml

Можете попробовать его использовать, но лучше создайте свой.

Хостинг бд я использовал https://neon.tech, авторизоваться можно по гугл акаунту или гиту. На момент написания статьи, там дают один бесплатный проект, на котором вполне хватает ресурсов чтобы по играться с бд.

Телеграм бота создают в @BotFather. Создаете и копируете выданный токен.

Подключим конфиг к проекту. Мне нравится подход, когда исполняющие файлы разделены по логике, то есть для подключения конфигов я вынес в отдельную директорию (сервис) с файлами ( ссылка на модуль config в гите )

В директории config есть модуль который можно будет подключить в app.module.ts, а так же в модулях в которых потребуется сервис с конфигами - ConfigurationService

app.module.ts должен выглядеть следующим образом

app.module.ts
app.module.ts

Если идете по шагам которые тут описываю, то UserModule скорее всего нету у вас, и его как раз сейчас будем создавать. А с подключением конфига все, теперь он должен будет без проблем подтянуться в модули TelegrafModule, TypeOrmModule и приложение должно запуститься без ошибок.

Создание модуля User

nest generate res Test
nest generate res Test

Создать ресурс можно командой nest generate res <имя>

Должно быть как на скрине выше ( вместо Test используйте User )

Создастся REST модуль, в контролере и сервисе уже будет функционал под REST API, но он не пригодится. Вместе с рест идет и UserEntity, в нем определим схему пользователя для базы данных. ( ссылка на гит - UserEntity )

Схема пользователя src/user/entities/user.entity.ts
Схема пользователя src/user/entities/user.entity.ts

Для подключения нужно прописать в user.module.ts импорт схемы и обернуть в typeorm. ( гит - user.module.ts )

user.module.ts
user.module.ts

Если запустить приложение, то в бд создастся таблица users с соответствующими столбцами из схемы UserEntity.

Взаимодействие с ботом

Наконец, запустим то для чего все это готовилось, напишем пару команд для бота, и пусть сохраняет пользователей в бд.

Я сделал две команды, помимо /start (стандартная), будет слушать текст от кнопки Регистрация и Инфа о пользователях

Кнопки которые появятся после команды /start
Кнопки которые появятся после команды /start

Скрин с кодом не буду прикреплять, посмотрите по ссылке гит - user.bot.ts

По кнопке Регистрация, сохраняем пользователя в бд, если его еще нет, и выводим сообщения, успешно или не успешно.

По кнопке Инфа о пользователях, появится список имен с датой регистрации всех зареганых пользователей.

Пример ответов бота
Пример ответов бота

Просто скопируйте код из ссылки которую оставил выше, создайте файл user.bot.ts в директории с модулем пользователя (user) и прокиньте в провайдер и экспорт модуля.

UserBot
UserBot

Ну вот и все :)

Конечно не очевидные шаги есть, если четко по описанию следовать, то присутствуют моменты, которые остались без деталей. Но вы всегда можете склонировать репозиторий ( ссылка - telegram-bot-nestjs ) и попробовать запустить приложение и смотреть код по ходу чтения статьи.

Спасибо! Подписывайтесь, пишите комментарии если появились вопросы, помогу)

Мой канал в телеграме - БлогНот