- .7 Создаем основной файл бота:
- . Регистрация Телеграм бота
- . Создаем Телеграм бота в Node.js
- .2 Выполняем инициализацию проекта:
- .3 Для разработки телеграм бота на Node.js используется «Telegraf», для этого в рабочей директории проекта, выполним установку необходимого модуля:
- .4 Дополнительно устанавливаем пакет «dotenv», для хранения токена бота в отдельном файле «.env»:
- .8 Запуск бота осуществляется командой:
- Создание SSH – ключей
- Создание VDS
- Подключение к VDS по SSH
- Подготовка к установке Node.js
- 1 Проверим версию по умолчанию в потоке «AppStream»:
- 2 Переключимся на поток с версией 14:
- 3 Устанавливаем Node.js:
- 4 Проверяем установку:
- A certificate, where do i get one and how?
- A domain name
- A self-signed certificate
- An untrusted root
- How do i check that i’m handling the right version?
- Intermediate certificates
- Not all ssl/tls is equal
- Setting a verified webhook with an untrusted root
- Ssl/tls, what is it and why do i have to handle this for a webhook?
- Supplying an intermediate certificate
- Supported certificates
- The short version
- Verified or self-signed
- Вебхук. путь телеграма
- Пишем telegram бота на вебхуках
- Телеграм 1с вебхуки апач самоподписанный сертификат
.7 Создаем основной файл бота:
touch index.js
Исходный код телеграм бота Node.js с использование webhook:
. Регистрация Телеграм бота
Регистрируем нового Телеграм бота, см. п.1 Телеграм бот 1С.
. Создаем Телеграм бота в Node.js
Разрабатывать Телеграм бота на Node.js с использованием webhook, можно локально, в дальнейшем копируя файлы на сервер либо сразу же на сервере, в примере будет использован смешанный способ.
.2 Выполняем инициализацию проекта:
npm init
.3 Для разработки телеграм бота на Node.js используется «Telegraf», для этого в рабочей директории проекта, выполним установку необходимого модуля:
npm install telegraf
.4 Дополнительно устанавливаем пакет «dotenv», для хранения токена бота в отдельном файле «.env»:
npm install dotenv
.8 Запуск бота осуществляется командой:
node index.js
Создание SSH – ключей
Создаем пару SSH — ключей, при помощи программы «PuTTYgen», которая идет в составе с программой «PuTTY». В программе «PuTTYgen» нажимаем «Generate» и перемещаем курсор мыши в произвольном порядке. После генерации, будут созданы два ключа, публичный и приватный (секретный), сохраняем их с помощью соответствующих кнопок и копируем текст публичного ключа из окна программы. Созданные ключи, будут использоваться в программе «PuTTY», для удаленного подключения по протокол SSH.
Примечание: Создание ключей можно выполнить в «Командной строке», при помощи команды «ssh-keygen», например:
ssh-keygen -t rsa -b 4096
Создание VDS
В панели управления, «Боксы» — «Управление», добавляем новый бокс, выбираем «Аутентификация по ключу «PuTTY»», кликаем на логотип «CentOS» и выбираем «CentOS 8» и «Создать бокс». Выбираем самый дешевый тариф и подтверждаем действия.
Будет создан бокс и на почту придет информация с данными для подключения.
Примечание
Подключение к VDS по SSH
Запускаем «PuTTY», указываем полученный из письма IP-адрес бокса. В ветке «Connection – SSH — Auth» настроек программы, с помощью кнопки «Browse…» выбираем приватный ключ, созданные в п.3.Для удобства, в ветке «Session», поле «Saved Session» можно задать наименование сессии и сохранить, чтобы в дальнейшем не пришлось настраивать все заново.
Подготовка к установке Node.js
Перед установкой Node.js выполним обновление:
dnf update
и перезагрузку системы:
reboot
При перезагрузке сессия SSH завершится, необходимо пере подключится через несколько минут.
1 Проверим версию по умолчанию в потоке «AppStream»:
dnf module list nodejs
2 Переключимся на поток с версией 14:
dnf module enable nodejs:14
3 Устанавливаем Node.js:
dnf install nodejs
4 Проверяем установку:
node –v
A certificate, where do i get one and how?
You need a certificate, pick on of these types;
A domain name
Setting a webhook needs a URL for us to post to. For that you’ll need a server with a domain name. If you don’t have one, you’ll need to obtain one first. Telegram currently doesn’t offer hosting or domain name services. There are quite a few VPS/Web hosting providers around the internet, feel free to pick one to your liking.
A self-signed certificate
Using a self-signed certificate means you’ll forfeit on the chain of trust backed by a CA. Instead you are the CA. For this to work, a slight difference in setup is required. Because Telegram will have no chain of trust to verify your certificate, you have to use the generated public certificate as an input file when setting the webhook.
An untrusted root
Ok, so you already had a certificate installed and just discovered it’s not on our list.Start by ignoring it, and just try to set it. We occasionally add extra root certificates to keep up with popular demand, so the list isn’t always exhaustive.
Unlucky after all? We’ll allow you to supply an unsupported root certificate when setting the webhook. This method is nearly identical to setting a self-signed certificate webhook. Instead of your self-signed certificate you’ll be sending us the root certificate as inputFile.Setting a verified webhook with an untrusted root
How do i check that i’m handling the right version?
You just read up on the whole SSL/TLS stuff, figured out that it’s not all that bad to setup and we add some more requirements. Here are some tips to check if you’re indeed supporting at least TLS1.2.
Intermediate certificates
Some verified certificates require an intermediate certificate. In this construction the provider of your verified certificate has used their root certificate to sign an intermediate certificate. This intermediate certificate is then used to sign your verified certificate.
Not all ssl/tls is equal
We support any SSL/TLS version TLS1.2 and up for your webhook. This means that SSLV2/3/TLS1.0/TSL1.1 are NOT supported, due to security issues associated with those older versions.How do I check that I’m handling the right version?
Setting a verified webhook with an untrusted root
If you already have a verified certificate and our servers don’t trust your root CA, we have an alternative way for you to set a webhook. Instead of using the setWebhook method without the certificate parameter, you can use the self-signed method. Your CA’s root certificate has to be used as an inputFile for the certificate parameter.
You can use these commands to quickly convert a DER formatted root certificate to PEM:
Using OpenSSL:
openssl x509 -inform der -in root.cer -out root.pemUsing Java keytool:
keytool -import -alias Root -keystore YOURKEYSTORE.JKS -trustcacerts -file ROOTCERT.CER
The root certificate needs to be imported in your keystore first:keytool -exportcert -alias Root -file <YOURROOTPEMFILE.PEM> -rfc -keystore YOURKEYSTORE.JKS
Once done, set your webhook with the root-pem-file and you’ll be good to go. If you need more pointers, have a look at the self-signed part of this guide.
Ssl/tls, what is it and why do i have to handle this for a webhook?
You’re already familiar with it in some form or another. Whenever you see that (nicely green) lock in your browser bar, you know it’s reasonably safe to assume that you’ve landed on the site you actually wanted to visit. If you see the green lock, that’s SSL/TLS in action. If you want to learn more about how SSL/TLS works in general, it’s best to search the internet.
Supplying an intermediate certificate
Once you’ve crafted your certificate, your CA might present you with a nice bundle. Most bundles contain a root certificate, your public certificate and sometimes an intermediate certificate. StartSSL is one of many CA’s that’ll supply such an intermediate beast.
This certificate has to be supplied in the chain of certificates you’re presenting to us when we connect to your server. If an intermediate was used to sign your certificate but isn’t supplied to our servers, we won’t be able to verify the chain of trust and your webhook will not work.
If your webhook isn’t working and you’re wondering if the chain is complete:
Here’s an example of a complete chain, note that in this case 2 intermediate certificates have been supplied.
Even though your browser might not complain when visiting your page, an incomplete chain will not work for your webhook. If your chain is incomplete we have some tips to add them to your current setup:
Apache:
Add the intermediate certificate to the end of the file configured in theSSLCertificateFiledirective of your virtual host configuration. If you’re using an older version than Apache 2.4.8, you may use theSSLCertificateChainFiledirective instead.Nginx:
Add the intermediate certificate to the end of the file configured in thessl_certificate_keydirective of your virtual host configuration.A quick command for doing this correctly:
cat your_domain_name.pem intermediate.pem >> bundle.pem
Make sure the order is correct, expect failure otherwise.Java keytool:
keytool -import -trustcacerts -alias intermediate -file intermediate.pem -keystore YOURKEYSTORE.jks
The end result of all this is a complete certificate chain, backed by either a root certificate we trust or, in the case of an untrusted root, a root certificate you’re supplying to us. Make sure to verify your setup again after adding the intermediate, once done, you’re good to go!
Supported certificates
Not all verified certificates are supported. Certificates are based on a network of trust and come in a chain. Trusting your verified certificate means we have to trust the provider of that certificate, the Certificate Authority (and hence its root certificate).
The short version
You’ll need a server that:
That’s almost all there’s to it.If you decide to limit traffic to our specific range of addresses, keep an eye on this document whenever you seem to run into trouble. Our IP-range might change in the future.
Verified or self-signed
A certificate can either be verified or self-signed. Setting a webhook with a self-signed certificate differs a little from setting a webhook with a verified certificate. Ensure you’re using the correct setup for the type of certificate you’ve chosen for your webhook.How do I set a webhook for either type?
Вебхук. путь телеграма
Многие уже знают, что в релизе платформы 8.3.14.1565, браузер Internet Explorer был заменен на Web-Kit, это на самом деле большой шаг вперед, но я уверен, многим, как и мне, пока не совсем понятно, что к чему. Возник опыт использования web-kit в 1С, вызова JS из 1С и вызова 1С из JS. Давайте вместе попробуем понять, чем одно отличается от другого, и заодно сделаем, что-нибудь полезное. Да и наверняка многим придется переписывать свои подобные поделки после обновления на новую платформу, так что надеюсь мой опыт окажется полезным.
2 стартмани
08.12.2021
9784
Бэнни
25
Пишем telegram бота на вебхуках
Эта статья является дополнением к предыдущей «
Пишем бота для Telegram и хостим его на heroku
». Здесь я покажу, как сделать бота с поддержкой вебхуков на Heroku и с самоподписанным сертификатом на своём сервере. Расскажу о новых возможностях библиотеки tgbots-module, а также покажу пример встраивания двух ботов в один проект.
Содержание – tgbots-module
– 1. Базовая реализация бота
– 2. Добавляем систему команд
– 3. Команда на регулярных выражениях
– 4. Группа команд
– 5. config.yaml и профили
– 6a. Запуск на Heroku
– 6b. Запуск на своём сервере с самоподписанным сертификатом
– 7. Второй модуль бота
tgbots-module
tgbots-module основана на библиотеке TelegramBots и имеет ряд улучшений:
• Возможность вести разработку ботов в отдельных проектах, а затем собирать всех в одном исполняемом файле. Это позволяет работать над каждым ботом отдельно, заводить для них отдельные репозитории и т.д.
TelegramBots поддерживает регистрацию нескольких обработчиков для ботов в одном проекте, но для отключения бота приходится пересобирать проект. В tgbots-module для включения/отключения бота можно просто добавить или удалить строчку в конфиге, а затем перезапустить приложение.
• Возможность переключать способ получения обновлений с long polling на webhook и обратно без пересборки проекта. В TelegramBots для этого нужно менять базовый класс (TelegramLongPollingBot и TelegramWebHookBot), а затем пересобирать проект.
• Система команд с поддержкой ролей. Есть простые текстовые команды (/start, /help), команды с аргументами (/say hello), команды на регулярных выражениях (/donate (d{1,3})) и команды для CallbackQuery и InlineQuery.
• Различные улучшения в API и полезные утилиты. Загрузчик yaml-конфигов, классы для локализации ботов, препроцессинг методов API. Есть возможность вызывать методы Telegram API из класса Methods. В таком случае появляются дополнительные полезные методы, которых нет в TelegramBots:
Можно вызывать синхронный
.call(this)
, а можно асинхронный
.callAsync(this)
.
1. Базовая реализация бота
Чтобы было проще понять, на каком этапе что реализуется, я разбил создание двухмодульного бота на мелкие шаги. Начнём с создания простого бота. Можно смотреть коммит.
Создаём модуль бота и его обработчик:
Токен и юзернейм бота будут браться из yaml конфига testbot.yaml:
И помещаться в объект:
В конфиге строчка
env(TOKEN)
говорит о том, что значение следует взять из переменной окружения. Это в дальнейшем будет полезно при работе с Heroku. Чтобы поместить токен в переменную окружения, можно настроить Run configurations в идее:

Содержимое метода onUpdate должно быть уже вам знакомо по библиотеке TelegramBots: если в update приходит сообщение боту, в котором есть текст, то выводит id юзера в консоль и отправляем этот же текст в верхнем регистре юзеру.
Запускаем проект, пишем боту и получаем ответ:
2. Добавляем систему команд
Добавляем систему команд с простой текстовой командой /start:
Система команд поддерживает разделение прав доступа. Можно задать команду, которая будет доступна только главному админу бота. По умолчанию команда доступна всем пользователям.
Чтобы реестр команд понимал кто есть кто, нужно реализовать интерфейс Authority или воспользоваться встроенным SimpleAuthority, которому нужно передать userId главного админа бота. Как обычно, чтобы не хардкодить, добавляем значение в конфиг:
Наконец, нужно добавить строку в onUpdate:
Коммит
со всеми изменениями на этом шаге.
3. Команда на регулярных выражениях
Обработчики простых команд удобно регистрировать лямбдой, а вот команды побольше лучше вынести в отдельный класс. Рассмотрим пример команды, которая распознаёт ссылку на YouTube:
Для RegexCommand указываем регулярное выражение, роли и сам обработчик.
Чтобы зарегистрировать команду, нужно добавить одну строчку:
Коммит
для этого шага.
4. Группа команд
Ещё одной полезной возможностью является вынесение команд в группу.
Например, есть простая текстовая команда /game, которая создаёт игру и отправляет сообщение с inline-клавиатурой. Также есть команда для обработки CallbackQuery этой игры. Почему бы не задать эти команды в одном классе?
callback data для inline-кнопки выглядит так:
Где, guess это команда, распознаваемая системой команд, а всё остальное — аргументы. Они разделяются пробелом и их можно достать по порядковому номеру через
ctx.argument(..)
Регистрируем набор команд:
Коммит
с изменениями.
5. config.yaml и профили
В config.yaml задаются настройки вебхуков, а также перечисляются модули ботов:
Именно здесь можно переключать long polling и webhook, а также отключать ботов.
Конфиг можно размещать как файл, либо как ресурс внутри приложения (удобно, если бот запускается на Heroku).
При этом, конфиг не является обязательным. По умолчанию используется long polling, а модулем становится тот, который указан в main:
Также есть поддержка профилей. Профиль по умолчанию использует config.yaml, но если задать профиль test или prod, то использоваться будут config-test.yaml или config-prod.yaml соответственно.
Чтобы указать профиль, необходимо передать его первым аргументом в Runner. Я делаю это из командной строки:
Всё это позволяет запускать одного бота на лонг поллинге при разработке, и всех ботов на вебхуках уже в продакшене.
Коммит для этого шага.
6a. Запуск на Heroku
Добавляем Procfile:
Так как используется Java 11, указываем это в system.properties:
Также добавляем gradle таск stage в build.gradle:
Иначе Heroku не сможет собрать приложение.
Не забываем добавить файл config.yaml:
Heroku запускает веб-приложение каждый раз на разном порту, заранее узнать и записать значение порта нельзя. Но поскольку номер порта помещается в переменную окружения PORT, можно указать env(PORT) в конфиге.
То же самое проделываем с URL, чтобы не коммитить новый адрес при смене приложения в Heroku.
Создаём приложение в Heroku, добавляем в Config Vars токен от бота и адрес приложения:
Деплоим бота из гитхаба или из Heroku Git и радуемся работающему на вебхуках боту.
В отличие от лонг поллинга, который держит приложение всегда активным и, тем самым отъедая бесплатную квоту, бот на вебхуках может засыпать при длительном бездействии, что экономит дино-часы. Пробуждение составляет порядка 10-15 секунд, это вполне терпимо для обычного бота, но совершенно не подходит для инлайн ботов, имейте в виду.
6b. Запуск на своём сервере с самоподписанным сертификатом
Имеем: Debian или Ubuntu сервер, на котором порты 80 и 443 заняты основным сайтом, но хочется на нём запустить бота на вебхуках на порту 8443, который, благо, поддерживается телеграмом.
Допустим, IP-адрес сервера 123.45.67.89, находится он в Москве.
1. Создаём сертификат при помощи openssl
certgen.sh
Изменяем IP адрес и информацию о локации сервера на этой строчке:
Запускаем скрипт, придумываем и вводим несколько раз пароль от сертификата, получаем в итоге два файла:
keystore.jks
и
public_cert.pem
.
2. Настраиваем вебхуки в config.yaml
3. Запускаем приложение со всеми необходимыми переменными окружения
7. Второй модуль бота
Если вы планируете запускать бота на собственном сервере, а не на Heroku, тогда можно создать Gradle Multiproject в котором подпроектами будут отдельные модули бота:
При этом остаётся возможность держать отдельные модули в отдельных репозиториях, запускать их по отдельности при отладке и собирать все модули в один jar при сборке.
Но Heroku требует лишь один репозиторий. И чтобы подключить второй репозиторий как зависимость для первого и основного, мы воспользуемся JitPack.
Создаём отдельный проект со вторым ботом (можно сразу смотреть весь репозиторий tgbotsmodule-bot2).
В build.gradle должны присутствовать как минимум эти три плагина:
Первый позволит точнее указывать зависимости (
api
,
implementation
), второй позводит запускать приложение для отладки, а третий подготовит нужные файлы для релиза.
Так как используется Java 11, создаём файл jitpack.yml:
Создаём конфиг для второго бота secondbot.yaml:
Не забываем о возможном конфликте переменных окружения, токен для второго бота должен задаваться в другой переменной, нежели токен для первого.
config.yaml у второго ботмодуля в этот раз уже не понадобится, он будет у главного приложения.
В главном приложении в build.gradle добавляем новый репозиторий maven и зависимость:
Правильно подключить зависимость поможет главная страница
https://jitpack.io/
Вставляем адрес репозитория и нажимаем Look up, а напротив нужного коммита кнопку Get it:

Ниже появятся инструкции для подключения зависимости в проект.
В config.yaml главного приложения добавляем ещё один модуль:
Остаётся только запушить изменения на гитхаб, добавить в Heroku новую переменную окружения с токеном для второго бота и сделать Deploy.
Коммит с изменениями на этом шаге.
После успешного деплоя, оба бота будут работать на вебхуках в одном проекте.
Посмотреть в действии можно тут:
Первый бот
:
@tgbotsmodulebot
(
исходники
)
Второй бот
:
@tgbotsmodule2bot
(
исходники
)
Телеграм 1с вебхуки апач самоподписанный сертификат
Много строк исписано про интеграцию Телеграма и 1С. Но нигде не увидел полной инструкции по установке и настройке вебхуков. Попробую её написать.
Для всего этого нам понадобится (или правильнее будет сказать, что было использовано мной):
- Apache 2.2.24
- OpenSSL (входящий в установку апача)
- 1C (с модулями веб-сервера)
- Свой домен
- Созданный бот в Телеграм (не буду описывать его создание, т.к. оно достаточно тривиально)
Предполагается, что весь софт у вас установлен.
Итак, начнем с получения сертификата. Открываем командную строку и выполняем следующий код:
openssl req -newkey rsa:2048 -sha256 -nodes -keyout YOURPRIVATE.key -x509 -days 365 -out YOURPUBLIC.pem -subj "/C=US/ST=New York/L=Brooklyn/O=Example Brooklyn Company/CN=YOURDOMAIN.EXAMPLE"Где:
YOURPRIVATE.key — закрытый ключ сертификата. Будет использован в апаче
YOURPUBLIC.pem — открытый ключ сертификата. Будет использован при регистрации вебхука
YOURDOMAIN.EXAMPLE — адрес вашего домена с вебхуком. Должен таки совпадать с адресом вебхука!!!
После выполнения этого кода в папке openssl ( у меня это «C:Program FilesApache Software FoundationApache2.2bin») появятся файлы ключей.
Я их скопировал в папку conf апача.
Переходим к настройке Apache.
Я видел много разных способов. У меня сработал следующий:
В httpd.conf добавлены следующие строки:
Listen 443 для того, чтобы апач «слушал» 443 порт.
Блок <IfModule ssl_module> приведен к следующему виду:
<IfModule ssl_module>
SSLMutex default
SSLSessionCache none
</IfModule>В самом конце добавлены строчки, где указываю пути к сертификату:
SSLEngine On
SSLCertificateFile conf/YOURPUBLIC.pem
SSLCertificateKeyFile conf/YOURPRIVATE.keyИ раскомменитурйте строчку:
LoadModule ssl_module modules/mod_ssl.so В конфигурации создаем HTTP-сервис. Именно он будет отвечать телеграму и обрабатывать его обращения.
В моём случае указаны следующие параметры:
Имя: ТГВебхук
КорневойURL: webhook
Повторное использование сеансов: Не использовать (с автоматическим режимом у меня не заработало)
Время жизни: 20
Шаблоны URL: создан шаблон «Любой» с двумя методами: GET и POST



Обработчики методов создаются по умолчанию. В обработчик POST добавлю следующее, просто для проверки связи:
Функция ЛюбойPOST(Запрос)
ВыслатьТестовоеСообщение(""); //chat_id
Ответ = Новый HTTPСервисОтвет(200);
Возврат Ответ;
КонецФункции
&НаСервере
Процедура ВыслатьТестовоеСообщение(Чат)
Сообщение = "Тестовое сообщение";
Токен = "";//Ваш токен telegram
Сервер = "api.telegram.org";
Ресурс = "bot" Токен "/sendMessage?chat_id=" СтрЗаменить(Формат(Чат, "ЧДЦ=; ЧС=; ЧРГ=."), ".", "") "&text=" Сообщение;
Соединение = Новый HTTPСоединение(Сервер,443,,,,,Новый ЗащищенноеСоединениеOpenSSL());
Запрос = Новый HTTPЗапрос(Ресурс);
Ответ = Соединение.Получить(Запрос);
КонецПроцедурыОсталось опубликовать базу и привязать вебхук.
Публикация делается как всегда, необходимо только добавить галочки на публикации HTTP-сервиса:

Последним шагом мы привяжем нашу 1С к телеграму. Я для этого использовал простую html страничку со следующим кодом:
<html>
<body>
<form action="https://api.telegram.org/bot<ЗдесьДолженБытьТокен>/setwebhook" method="post" enctype="multipart/form-data">
Select Certificate to upload:
<input type="file" name="certificate" id="fileToUpload">
URL: <input type="text" name="url" value="https://<YOURWEBSITE>/<YOUR_PHP_URL>"><br>
<input type="submit" value="Upload Certificate" name="submit">
</form>
</body>
</html>В форме просто выбираем публичный ключ и вводим полный путь к нашему http-сервису. Напоминаю, что полный путь к сервису будет выглядеть следующим образом:
ВашДомен/ИмяБазы/hs/ИмяСервиса/v1
Прошу не пинать ногами за код, некоторые вещи умышленно сделаны хардкодом, т.к. это всё делалось исключительно в демонстрационных целях.
Публикация была написана, т.к. ни одного рабочего примера по работе с вебхуками на сайте не нашел, кроме Конструктор ботов Телеграм. Но она платная и, возможно, не всем нужна в таком виде.
В архиве содержится установка апача 2.2.24 вместе с Openssl (почему-то поиск оной занял у меня много времени), файл html для регистрации вебхука, файл конфигурации апача и cf конфигурации с http-сервисом и примером отправки тестового сообщения. К скачиванию необязателен, т.к. всё содержимое есть в статье.
