Задача:
Создать Телеграм бота и научится работать с ним с помощью 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.
Примечание: Создание ключей можно выполнить в «Командной строке», при помощи команды «ssh-keygen», например:
ssh-keygen -t rsa -b 4096
4. Подключение SSH – ключей
В панели управления https://cp.sprintbox.ru/customer/boxes/ssh, «Боксы» -> «SSH — ключи», добавляем скопированное содержимое публичного ключа и задаем название, например, «PuTTY»:
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
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«:
В документации «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
Дополнительная информация:
- Для удобства копирования файлов на сервер, можно воспользоваться программой WinSCP которая похожа на программу Total Commander:
- Телеграм бот 1С
- Linux для начинающих
Уведомление: 1С Kafka - Благин Константин