Телеграм + 1С + Вебхуки + Апач + Самоподписанный сертификат

Много строк исписано про интеграцию Телеграма и 1С. Но нигде не увидел полной инструкции по установке и настройке вебхуков. Попробую её написать.

Для всего этого нам понадобится (или правильнее будет сказать, что было использовано мной): 

1) Apache 2.2.24
2) OpenSSL (входящий в установку апача)
3) 1C (с модулями веб-сервера)
4) Свой домен 
5) Созданный бот в Телеграм (не буду описывать его создание, т.к. оно достаточно тривиально)

Предполагается, что весь софт у вас установлен.

Итак, начнем с получения сертификата. Открываем командную строку и выполняем следующий код:

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.2in") появятся файлы ключей. 

Я их скопировал в папку 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 

На стороне вебсервера все готово. Переходим к 1С.

 

В конфигурации создаем 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-сервису. Напоминаю, что полный путь к сервису будет выглядеть следующим образом: 
https://ВашДомен/ИмяБазы/hs/ИмяСервиса/v1/

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

Публикация была написана, т.к. ни одного рабочего примера по работе с вебхуками на сайте не нашел, кроме Конструктор ботов Телеграм. Но она платная и, возможно, не всем нужна в таком виде.

В архиве содержится установка апача 2.2.24 вместе с Openssl (почему-то поиск оной занял у меня много времени), файл html для регистрации вебхука, файл конфигурации апача и cf конфигурации с http-сервисом и примером отправки тестового сообщения. К скачиванию необязателен, т.к. всё содержимое есть в статье.

29 Comments

  1. mussolene

    Не совсем понимаю для чего вообще через WebHook делать, если есть штатная работа telegram api по longpolling, реализованная библиотека на python. в сочетании с flask. Можно поднять и не парится с переносом кода и правкой внутри конфигурации, гораздо более эффективное использование и не светить адрес в инет)))

    Reply
  2. alexlx

    (1) Согласен. Но есть люди, которым проще/удобней всё делать через 1С.

    Reply
  3. DarkPinch222

    А у меня проблемы при попытке установить вебхук — пробовал и через postman, попробовал и через вашу html-страничку.

    При установке вебхука, в ответ:

    {

    «ok»: true,

    «result»: true,

    «description»: «Webhook was set»

    }

    При попытке проверить методом getWebhookInfo:

    {

    «ok»: true,

    «result»: {

    «url»: «https://мой урл»,

    «has_custom_certificate»: false,

    «pending_update_count»: 7,

    «max_connections»: 40

    }

    }.

    При этом сообщения от бота не приходят.

    При попытке выполнить вашу html-страничку — отображается Ошибка при установлении защищённого соединения

    При этом сообщения так и не приходят в 1с. Подскажите, куда копать?

    Reply
  4. alexlx

    (3) В код странички добавили токен бота?

    «has_custom_certificate»: false — сертификат по инструкции делали? Эта строчка говорит, что он не принял ключа

    Reply
  5. DarkPinch222

    (4) Да, сертификат делал через openssl, где в your domen — указывал внешний ip-адрес.

    Токен бота конечно добавил

    Reply
  6. alexlx

    (5) Попробуйте в качестве your domen указать не ip-адрес, а адрес сервера (localhost или имя компа)

    Reply
  7. DarkPinch222

    (6) Не проходит (

    Reply
  8. alexlx

    (7) Домена своего нет? Я через IP не пробовал, у меня домен 3-го уровня и через него зашло сразу же.

    Reply
  9. mussolene

    (2) Еще можно и в 1С поллинг реализовать фоновым заданием которое отрабатывает каждые несколько секунд и получает обновления с api.

    главное иметь рабочий прокси и все)))

    Reply
  10. alexlx

    (9)

    фоновым заданием которое отрабатывает каждые несколько секунд

    Не каждому нравится, что у него фоновое задание отрабатывает каждые несколько секунд

    Reply
  11. dinn

    (3) попробуйте использовать прокси

    Reply
  12. dinn

    Посмотрите последий релиз ЗУП КОРП, там есть подсистема чатбота для рекрутинга.

    Reply
  13. mussolene

    (10) Верно мне тоже не по вкусу фоновые))). Только вот в текущих конфигурациях все через фоновые задания делается, так что одним меньше одним больше)))

    Reply
  14. GreenDragon

    (13)

    одним меньше одним больше

    После такого заявления эксперты по производительности могут с вами сделать примерно то же самое, что и геологи после заявления, что нефть из динозавров.

    Reply
  15. DarkPinch222

    (11) получилось с другого компьютера сделать setwebhook на сервер, с сертификатом сервера, теперь выдает все ок, has_custom_certificate = true.

    Но в 1С сообщения от бота все равно не приходят ) Буду пробовать дальше, спасибо!

    Reply
  16. blackhole321

    (7)В качестве имени хоста необходимо указывать dns имя, доступное извне. Т.е. Вам необходимо зарегистрировать домен (к примеру на freenom.com). Url webhook’а должен ссылаться на это dns имя. Также в свое время telegram не работал с self-signed сертификатами. Не знаю как обстоят дела сейчас. Вы можете создать бесплатный не self-signed сертификат бесплатно, к примеру на на sslforfree.com, месяца на три. Для тестов хватит.

    Reply
  17. alexlx

    (15) А что пишет getwebhookinfo?

    Reply
  18. alexlx

    (15) попробуйте раскомментировать строку

    LoadModule ssl_module modules/mod_ssl.so

    в конфиге апача

    Reply
  19. mussolene

    (14) Ну если рассматривать с точки зрения производительности то кажется мне что web server который обращается в бд за данными и обработкой кода будет кушать побольше чем фоновое задание запускаемое внутри системы)). Ну хотя тут может чего и не знаю)).

    Reply
  20. asved.ru

    1) letsencrypt.

    2) Смысл в переиспользовании сеансов появляется при массовых вызовах, но без него через 20 секунд после ухода последнего соединения рабочий процесс выгрузит контекст конфигурации, и следующий вызов будет долгим. Да и создание сеансов само по себе вещь затратная.

    Reply
  21. GreenDragon

    (19) Фоновое задание запускается не

    внутри системы

    , а вполне себе на сервере 1С. То, что нагружается web сервер, это как раз и хорошо, так как часть нагрузки выносится за контур сервера 1С. Гораздо дешевле масштабировать контур web серверов, чем 1С.

    Reply
  22. Sergey_Borisovi4

    Домен не обязателен, достаточно иметь внешний IP адрес. А при генерации сертификата указывать в качестве домена IP адрес.

    Reply
  23. PLAstic

    (10) Тогда ставим вебхук по апи телеги, а не по описанному в статье. Если честно, статья как-то оторвана от того процесса, который я выполнял при установке вебхука. Там нужен сам сертификат и один метод апи телеги. Всё.

    Reply
  24. PLAstic

    (3) У вас банальный фаервол РКН срабатывает. Вам нужно выносить сервер за зону действия РКН.

    Reply
  25. PLAstic

    (11) Не поможет. Прокси для отправки только работает. Штатный путь от сервера телеги до вашего хоста в любом случае лежит через фильтр провайдера, где действуют правила РКН. Вам нужно выносить хост за область действия РКН. Например, в Прибалтику. 2000 в месяц за виртуалку.

    Reply
  26. alexlx

    (23) У меня также используется сертификат и один метод телеги. Просто описана установка и настройка окружения для этого. Лично у меня много времени занял поиск инфы по настройке апача и HTTP-сервиса

    Reply
  27. DarkPinch222

    (24) Спасибо! Думаю как раз в этом деле, а сколько уже мучались

    Reply
  28. vsesam80

    Почему то сертификат Апач не принимает. После перезапуска не работает. В чем может быть дело? Всё сделал по инструкции

    Reply
  29. alexlx

    Что значит не принимает? Что логи пишут? Как сертификат делали?

    Reply

Leave a Comment

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