Телеграм бот Node.js Webhook

Телеграм бот Node.js Webhook

Задача:
Создать Телеграм бота и научится работать с ним с помощью Node.js и библиотеки «Telegraf», через webhook, используя для этого виртуальный выделенный сервер (VDS) и самоподписанный SSL сертификат.

1. Регистрация в sprintbox.ru

Регистрируемся по адресу sprintbox.ru, с помощь промо кода «SPRINTBOXPROMO» пополняем счет на 100 рублей. После чего станет доступно создание VDS — виртуального выделенного сервера (бокса), с минимальными характеристиками.

2. Установка «PuTTY»

По адресу https://www.putty.org скачайте установочный пакет (MSI) «PuTTY» и установите все программы входящие в комплект. Программа «PuTTY» используется для удаленного подключение по протоколу SSH: https://ru.wikipedia.org/wiki/SSH.

3. Создание SSH – ключей

Создаем пару SSH — ключей, при помощи программы «PuTTYgen», которая идет в составе с программой «PuTTY». В программе «PuTTYgen» нажимаем «Generate» и перемещаем курсор мыши в произвольном порядке. После генерации, будут созданы два ключа, публичный и приватный (секретный), сохраняем их с помощью соответствующих кнопок и копируем текст публичного ключа из окна программы. Созданные ключи, будут использоваться в программе «PuTTY», для удаленного подключения по протокол SSH.

PuTTYgen создание SSH ключей

PuTTYgen создание SSH ключей


Примечание: Создание ключей можно выполнить в «Командной строке», при помощи команды «ssh-keygen», например:

ssh-keygen -t rsa -b 4096

4. Подключение SSH – ключей

В панели управления https://cp.sprintbox.ru/customer/boxes/ssh, «Боксы» -> «SSH — ключи», добавляем скопированное содержимое публичного ключа и задаем название, например, «PuTTY»:

Sprintbox добавляем SSH ключ

Sprintbox добавляем SSH ключ

5. Создание VDS

В панели управления, «Боксы» — «Управление», добавляем новый бокс, выбираем «Аутентификация по ключу «PuTTY»», кликаем на логотип «CentOS» и выбираем «CentOS 8» и «Создать бокс». Выбираем самый дешевый тариф и подтверждаем действия.


Будет создан бокс и на почту придет информация с данными для подключения.
Примечание https://help.sprintbox.ru/service-work/ssh-keys-usage: «в этом случае root-пароль не генерируется, соответственно, он будет отсутствовать в письме о создании бокса, а доступ по паролю будет запрещён.»

6. Подключение к VDS по SSH

Запускаем «PuTTY», указываем полученный из письма IP-адрес бокса. В ветке «Connection – SSH — Auth» настроек программы, с помощью кнопки «Browse…» выбираем приватный ключ, созданные в п.3.
Для удобства, в ветке «Session», поле «Saved Session» можно задать наименование сессии и сохранить, чтобы в дальнейшем не пришлось настраивать все заново.

7. Подготовка к установке Node.js

Перед установкой Node.js выполним обновление:

dnf update

и перезагрузку системы:

reboot

При перезагрузке сессия SSH завершится, необходимо пере подключится через несколько минут.

8. Устанавливаем Node.js

Воспользуемся инструкций по адресу: https://www.digitalocean.com/community/tutorials/how-to-install-node-js-on-centos-8:

8.1 Проверим версию по умолчанию в потоке «AppStream»:

dnf module list nodejs

8.2 Переключимся на поток с версией 14:

dnf module enable nodejs:14

8.3 Устанавливаем Node.js:

dnf install nodejs

8.4 Проверяем установку:

node –v
Установка Node.js

Установка Node.js

9. Создаем самоподписанный SSL сертификат

Пример из Telegram bot API https://core.telegram.org/bots/self-signed:

openssl req -newkey rsa:2048 -sha256 -nodes -keyout /etc/ssl/private/private-nodejs.key -x509 -days 365 -out /etc/ssl/certs/public-nodejs.pem -subj "/C=RU/ST=Republic of Tatarstan/L=Kazan/O=Blagin.ru/OU=Research team/emailAddress=name@domen.tld/CN=000.000.000.000"

Примечание: В конце, в параметре CN, вместо нулей, необходимо указать ваш IP-адрес бокса, полученный при регистрации. Будут созданы два файла, публичный и приватный (секретный) ключ. Данные ключи будут использоваться для установки webhook.

10. Регистрация Телеграм бота

Регистрируем нового Телеграм бота, см. п.1 Телеграм бот 1С.

11. Создаем Телеграм бота в Node.js

Разрабатывать Телеграм бота на Node.js с использованием webhook, можно локально, в дальнейшем копируя файлы на сервер либо сразу же на сервере, в примере будет использован смешанный способ.

11.1 Создаем директорию, в которой будет производится работа, например:

mkdir /home/telegram-bot

11.2 Выполняем инициализацию проекта:

npm init

11.3 Для разработки телеграм бота на Node.js используется «Telegraf», для этого в рабочей директории проекта, выполним установку необходимого модуля:

npm install telegraf

11.4 Дополнительно устанавливаем пакет «dotenv», для хранения токена бота в отдельном файле «.env»:

npm install dotenv

11.5 Создаем файл: «.env» и сохраняем в нем токен:

echo BOT_TOKEN= 123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11 > .env

11.6 Вручную устанавливаем адрес webhook, с помощью setwebhook и программы CURL:

curl -F "url=https://000.000.000.000:8443/bot" -F "certificate=@/etc/ssl/certs/public-nodejs.pem" https://api.telegram.org/bot123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11/setwebhook

Примечание: Вместо нулей, необходимо указать ваш IP-адрес бокса, полученный при регистрации.
Ответ от Telegram Bot API:

{"ok":true,"result":true,"description":"Webhook was set"}

Проверяем установку в Postman с помощью метода «getWebhookInfo«:

Postman getWebhookInfo

Postman getWebhookInfo


В документации «telegraf» есть метод установки:

bot.telegram.setWebhook('https://server.tld:8443/secret-path', {
  source: 'server-cert.pem'
});

К сожалению, с помощью него не удалось выполнить установку webhook.

11.7 Создаем основной файл бота:

touch index.js

Исходный код телеграм бота Node.js с использование webhook:

const { Telegraf } = require('telegraf');
const fs = require('fs');
require('dotenv').config();

const bot = new Telegraf(process.env.BOT_TOKEN);

bot.start((ctx) => ctx.reply('Бот запущен!'));
bot.help((ctx) => ctx.reply('Телеграм бот Node.js Webhook.'));

bot.on('message', (ctx) => {
    ctx.telegram.copyMessage(ctx.message.chat.id, ctx.message.from.id, ctx.message.message_id);
});

const tlsOptions = {
    key: fs.readFileSync('/etc/ssl/private/private-nodejs.key'),
    cert: fs.readFileSync('/etc/ssl/certs/public-nodejs.pem')
};

// bot.telegram.setWebhook(`https://185.251.90.198:8443/bot`, {
//     source: `public-nodejs.pem`
// });

bot.startWebhook(`/bot`, tlsOptions, 8443);

11.8 Запуск бота осуществляется командой:

node index.js
Результат работы бота на Node.js

Результат работы бота на Node.js

Дополнительная информация:

Метки:

1 комментарий для “Телеграм бот Node.js Webhook”

  1. Уведомление: 1С Kafka - Благин Константин

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *