|
1С взаимодействие с Telegram. Установка Webhook | ☑ | ||
---|---|---|---|---|
0
Oldman06
24.01.25
✎
10:49
|
Приветствую.
Устанавливаю адрес сервиса обслуживания Webhook для телеграм-бота. Для сервиса используется самоподписной сертификат. Код: &НаКлиенте Процедура setWebhook() ДанныеСертификата = Неопределено; Если ЗначениеЗаполнено(ИмяФайлаСертификата) Тогда ДанныеСертификата = Новый Структура; СтруктураИмяФайла = ОбщегоНазначенияКлиентСервер.РазложитьПолноеИмяФайла(ИмяФайлаСертификата); ДанныеСертификата.Вставить("ИмяФайла", СтруктураИмяФайла.Имя); ДанныеСертификата.Вставить( "Адрес", ПоместитьВоВременноеХранилище( Новый ДвоичныеДанные(ИмяФайлаСертификата), УникальныйИдентификатор ) ); КонецЕсли; setWebhookНаСервере(ДанныеСертификата); КонецПроцедуры &НаСервере Процедура setWebhookНаСервере(ДанныеСертификата) Boundary = СтрЗаменить(Строка(Новый УникальныйИдентификатор()), "-", ""); Поток = Новый ПотокВПамяти; ЗаписьДанных = Новый ЗаписьДанных(Поток); Если ДанныеСертификата <> Неопределено Тогда ЗаписьДанных.ЗаписатьСтроку("--" + Boundary); ЗаписьДанных.ЗаписатьСтроку("Content-Disposition: form-data; name=""certificate""; filename=""" + ДанныеСертификата.ИмяФайла + """"); ЗаписьДанных.ЗаписатьСтроку("Content-Type: application/x-octet-stream"); ЗаписьДанных.ЗаписатьСтроку(""); ДДСертификата = ПолучитьИзВременногоХранилища(ДанныеСертификата.Адрес); ЗаписьДанных.Записать(ДДСертификата); КонецЕсли; ЗаписьДанных.ЗаписатьСтроку("--" + Boundary); ЗаписьДанных.ЗаписатьСтроку("Content-disposition: form-data; name=""url""" + Символы.ПС); ЗаписьДанных.ЗаписатьСтроку(WebHookURL); ЗаписьДанных.ЗаписатьСтроку("--" + Boundary); ЗаписьДанных.ЗаписатьСтроку("Content-disposition: form-data; name=""secret_token""" + Символы.ПС); ЗаписьДанных.ЗаписатьСтроку(ТокенWebHook); ЗаписьДанных.ЗаписатьСтроку("--" + Boundary + "--"); ЗаписьДанных.Закрыть(); ТелоЗапроса = Поток.ЗакрытьИПолучитьДвоичныеДанные(); ПараметрыПодключения = СервисыВзаимодействияПовтИсп.ПараметрыПодключения( Перечисления.КаналыВзаимодействий.Telegram ); Соединение = Новый HTTPСоединение( ПараметрыПодключения.Host, 443, , , , 5, Новый ЗащищенноеСоединениеOpenSSL() ); URLЗапроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( "bot%1/%2", ПараметрыПодключения.Token, "setWebhook" ); Запрос = Новый HTTPЗапрос(URLЗапроса); Запрос.Заголовки.Вставить("Content-Type", "multipart/form-data; boundary=" + Boundary); Запрос.УстановитьТелоИзДвоичныхДанных(ТелоЗапроса); Попытка Ответ = Соединение.ОтправитьДляОбработки(Запрос); Если Ответ.КодСостояния = 200 Тогда ОтветСервиса = Ответ.ПолучитьТелоКакСтроку(); Иначе ОтветСервиса = Ответ.ПолучитьТелоКакСтроку("UTF-8"); КонецЕсли; Исключение КонецПопытки; КонецПроцедуры Если устанавлюваю Webhook без передачи открытого ключа сертификата, то Webhook устанавливается, но с ошибкой SSL: Ответ метода setWebhook: { "ok": true, "result": true, "description": "Webhook was set" } Вывод getWebhookInfo: { "ok": true, "result": { "url": "https://ххх.ххх.ххх.ххх:8443/telegram , "has_custom_certificate": false, "pending_update_count": 0, "last_error_date": 1737703195, "last_error_message": "SSL error {error:0A000086:SSL routines::certificate verify failed}", "max_connections": 40, "ip_address": "ххх.ххх.ххх.ххх" } } Если при установке указываю публичный ключ самоподписного сертификата, то ответ следующий: { "ok": true, "result": true, "description": "Webhook is already deleted" } как будто я вызываю метод deleteWebhook, когда Webhook не установлен. В чем может быть дело? |
|||
1
Vostochnick
24.01.25
✎
11:01
|
(0) ну и вопросики в пятницу )
|
|||
2
CepeLLlka
24.01.25
✎
11:07
|
(0)Попробуйте сначала загрузить файл сертификата на сервера телеграмма и потом уже при установке ВебХука передайте в параметр Айди файла
|
|||
3
Oldman06
24.01.25
✎
11:20
|
(2) Не могу в документации найти метод позволяющий загрузить файл и получить его Id. Нахожу только методы отправки какому-либо контакту. Если не сложно, ткните.
|
|||
4
CepeLLlka
24.01.25
✎
11:28
|
(3)Так и есть. Пусть ваш бот отправит вам файл сертификата.
|
|||
5
Oldman06
24.01.25
✎
21:17
|
Короче, вот так все работает:
&НаСервере Процедура setWebhookНаСервере(ДанныеСертификата) Boundary = СтрЗаменить(Строка(Новый УникальныйИдентификатор()), "-", ""); Поток = Новый ПотокВПамяти; ЗаписьТекста = Новый ЗаписьТекста(Поток, КодировкаТекста.UTF8); ЗаписьТекста.ЗаписатьСтроку("--" + Boundary); ЗаписьТекста.ЗаписатьСтроку("Content-Disposition: form-data; name=""url"""); ЗаписьТекста.ЗаписатьСтроку(""); ЗаписьТекста.ЗаписатьСтроку(WebHookURL); Если ДанныеСертификата <> Неопределено Тогда ЗаписьТекста.ЗаписатьСтроку("--" + Boundary); ЗаписьТекста.ЗаписатьСтроку("Content-Disposition: form-data; name=""certificate""; filename=""" + ДанныеСертификата.ИмяФайла + """"); ЗаписьТекста.ЗаписатьСтроку(""); ДДСертификата = ПолучитьИзВременногоХранилища(ДанныеСертификата.Адрес); ПотокДанныхСертификата = ДДСертификата.ОткрытьПотокДляЧтения(); ЧтениеТекста = Новый ЧтениеТекста(ПотокДанныхСертификата, КодировкаТекста.UTF8); ЗаписьТекста.Записать(ЧтениеТекста.Прочитать()); ЧтениеТекста.Закрыть(); ПотокДанныхСертификата.Закрыть(); КонецЕсли; ЗаписьТекста.ЗаписатьСтроку("--" + Boundary + "--"); ЗаписьТекста.Закрыть(); ТелоЗапроса = Поток.ЗакрытьИПолучитьДвоичныеДанные(); ПараметрыПодключения = СервисыВзаимодействияПовтИсп.ПараметрыПодключения( Перечисления.КаналыВзаимодействий.Telegram ); Соединение = Новый HTTPСоединение( ПараметрыПодключения.Host, 443, , , , 5, Новый ЗащищенноеСоединениеOpenSSL() ); URLЗапроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( "bot%1/%2", ПараметрыПодключения.Token, "setWebhook" ); Запрос = Новый HTTPЗапрос(URLЗапроса); Запрос.Заголовки.Вставить("Connection", "keep-alive"); Запрос.Заголовки.Вставить("Content-Type", "multipart/form-data; boundary=" + Boundary); Запрос.УстановитьТелоИзДвоичныхДанных(ТелоЗапроса); Попытка Ответ = Соединение.ОтправитьДляОбработки(Запрос); Если Ответ.КодСостояния = 200 Тогда ОтветСервиса = Ответ.ПолучитьТелоКакСтроку("UTF-8"); Иначе ОтветСервиса = Ответ.ПолучитьТелоКакСтроку("UTF-8"); КонецЕсли; Исключение КонецПопытки; КонецПроцедуры |
|||
6
CepeLLlka
24.01.25
✎
22:48
|
(5)Красава
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |