Тема телеграм ботов на моем канале уже была затронута, но это было давным-давно и не правда 😉 еще и на 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 должен выглядеть следующим образом
Если идете по шагам которые тут описываю, то UserModule скорее всего нету у вас, и его как раз сейчас будем создавать. А с подключением конфига все, теперь он должен будет без проблем подтянуться в модули TelegrafModule, TypeOrmModule и приложение должно запуститься без ошибок.
Создание модуля User
Создать ресурс можно командой nest generate res <имя>
Должно быть как на скрине выше ( вместо Test используйте User )
Создастся REST модуль, в контролере и сервисе уже будет функционал под REST API, но он не пригодится. Вместе с рест идет и UserEntity, в нем определим схему пользователя для базы данных. ( ссылка на гит - UserEntity )
Для подключения нужно прописать в user.module.ts импорт схемы и обернуть в typeorm. ( гит - user.module.ts )
Если запустить приложение, то в бд создастся таблица users с соответствующими столбцами из схемы UserEntity.
Взаимодействие с ботом
Наконец, запустим то для чего все это готовилось, напишем пару команд для бота, и пусть сохраняет пользователей в бд.
Я сделал две команды, помимо /start (стандартная), будет слушать текст от кнопки Регистрация и Инфа о пользователях
Скрин с кодом не буду прикреплять, посмотрите по ссылке гит - user.bot.ts
По кнопке Регистрация, сохраняем пользователя в бд, если его еще нет, и выводим сообщения, успешно или не успешно.
По кнопке Инфа о пользователях, появится список имен с датой регистрации всех зареганых пользователей.
Просто скопируйте код из ссылки которую оставил выше, создайте файл user.bot.ts в директории с модулем пользователя (user) и прокиньте в провайдер и экспорт модуля.
Ну вот и все :)
Конечно не очевидные шаги есть, если четко по описанию следовать, то присутствуют моменты, которые остались без деталей. Но вы всегда можете склонировать репозиторий ( ссылка - telegram-bot-nestjs ) и попробовать запустить приложение и смотреть код по ходу чтения статьи.
Спасибо! Подписывайтесь, пишите комментарии если появились вопросы, помогу)
Мой канал в телеграме - БлогНот