| 
    
        
     
     | 
    
    
  | 
        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)Красава     
         | 
 | Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |