Pull to refresh

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

Reading time3 min
Views18K
Много строк исписано про интеграцию Телеграма и 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 Files\Apache Software Foundation\Apache2.2\bin») появятся файлы ключей.

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

image

image

image

Обработчики методов создаются по умолчанию. В обработчик POST добавлю следующее, просто для проверки связи:

Функция ЛюбойPOST(Запрос)

	ВыслатьТестовоеСообщение(""); //chat_id
	Ответ = Новый HTTPСервисОтвет(200);
	Возврат Ответ;
	
КонецФункции


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

Осталось опубликовать базу и привязать вебхук.

Публикация делается как всегда, необходимо только добавить галочки на публикации HTTP-сервиса:

image

Последним шагом мы привяжем нашу 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

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

Articles

Change theme settings