Телеграм + 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 не будет опубликован. Обязательные поля помечены *