Для всего этого нам понадобится (или правильнее будет сказать, что было использовано мной):
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-сервисом и примером отправки тестового сообщения. К скачиванию необязателен, т.к. всё содержимое есть в статье.
Не совсем понимаю для чего вообще через WebHook делать, если есть штатная работа telegram api по longpolling, реализованная библиотека на python. в сочетании с flask. Можно поднять и не парится с переносом кода и правкой внутри конфигурации, гораздо более эффективное использование и не светить адрес в инет)))
(1) Согласен. Но есть люди, которым проще/удобней всё делать через 1С.
А у меня проблемы при попытке установить вебхук — пробовал и через 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с. Подскажите, куда копать?
(3) В код странички добавили токен бота?
«has_custom_certificate»: false — сертификат по инструкции делали? Эта строчка говорит, что он не принял ключа
(4) Да, сертификат делал через openssl, где в your domen — указывал внешний ip-адрес.
Токен бота конечно добавил
(5) Попробуйте в качестве your domen указать не ip-адрес, а адрес сервера (localhost или имя компа)
(6) Не проходит (
(7) Домена своего нет? Я через IP не пробовал, у меня домен 3-го уровня и через него зашло сразу же.
(2) Еще можно и в 1С поллинг реализовать фоновым заданием которое отрабатывает каждые несколько секунд и получает обновления с api.
главное иметь рабочий прокси и все)))
(9)
Не каждому нравится, что у него фоновое задание отрабатывает каждые несколько секунд
(3) попробуйте использовать прокси
Посмотрите последий релиз ЗУП КОРП, там есть подсистема чатбота для рекрутинга.
(10) Верно мне тоже не по вкусу фоновые))). Только вот в текущих конфигурациях все через фоновые задания делается, так что одним меньше одним больше)))
(13)
После такого заявления эксперты по производительности могут с вами сделать примерно то же самое, что и геологи после заявления, что нефть из динозавров.
(11) получилось с другого компьютера сделать setwebhook на сервер, с сертификатом сервера, теперь выдает все ок, has_custom_certificate = true.
Но в 1С сообщения от бота все равно не приходят ) Буду пробовать дальше, спасибо!
(7)В качестве имени хоста необходимо указывать dns имя, доступное извне. Т.е. Вам необходимо зарегистрировать домен (к примеру на freenom.com). Url webhook’а должен ссылаться на это dns имя. Также в свое время telegram не работал с self-signed сертификатами. Не знаю как обстоят дела сейчас. Вы можете создать бесплатный не self-signed сертификат бесплатно, к примеру на на sslforfree.com, месяца на три. Для тестов хватит.
(15) А что пишет getwebhookinfo?
(15) попробуйте раскомментировать строку
LoadModule ssl_module modules/mod_ssl.so
в конфиге апача
(14) Ну если рассматривать с точки зрения производительности то кажется мне что web server который обращается в бд за данными и обработкой кода будет кушать побольше чем фоновое задание запускаемое внутри системы)). Ну хотя тут может чего и не знаю)).
1) letsencrypt.
2) Смысл в переиспользовании сеансов появляется при массовых вызовах, но без него через 20 секунд после ухода последнего соединения рабочий процесс выгрузит контекст конфигурации, и следующий вызов будет долгим. Да и создание сеансов само по себе вещь затратная.
(19) Фоновое задание запускается не
, а вполне себе на сервере 1С. То, что нагружается web сервер, это как раз и хорошо, так как часть нагрузки выносится за контур сервера 1С. Гораздо дешевле масштабировать контур web серверов, чем 1С.
Домен не обязателен, достаточно иметь внешний IP адрес. А при генерации сертификата указывать в качестве домена IP адрес.
(10) Тогда ставим вебхук по апи телеги, а не по описанному в статье. Если честно, статья как-то оторвана от того процесса, который я выполнял при установке вебхука. Там нужен сам сертификат и один метод апи телеги. Всё.
(3) У вас банальный фаервол РКН срабатывает. Вам нужно выносить сервер за зону действия РКН.
(11) Не поможет. Прокси для отправки только работает. Штатный путь от сервера телеги до вашего хоста в любом случае лежит через фильтр провайдера, где действуют правила РКН. Вам нужно выносить хост за область действия РКН. Например, в Прибалтику. 2000 в месяц за виртуалку.
(23) У меня также используется сертификат и один метод телеги. Просто описана установка и настройка окружения для этого. Лично у меня много времени занял поиск инфы по настройке апача и HTTP-сервиса
(24) Спасибо! Думаю как раз в этом деле, а сколько уже мучались
Почему то сертификат Апач не принимает. После перезапуска не работает. В чем может быть дело? Всё сделал по инструкции
Что значит не принимает? Что логи пишут? Как сертификат делали?