Заказы на доработку 1С (сервис удаленной работы)

Хранилище

База знаний
Бесплатные отчеты, обработки, конфигурации, внешние компоненты для 1С Статьи, описание работы, методики по работе с 1С

Здравствуйте, гость ( Вход | Зарегистрироваться )



> Клавиатуры Telegram Bot Api          
kosalex Подменю пользователя
сообщение 16.02.18, 16:32
Сообщение #1

Ветеран
*******
Группа: Пользователи
Сообщений: 805
Спасибо сказали: 14 раз
Рейтинг: 0

Доброго времени суток!

Есть код
Процедура ОтправитьТекстовоеСообщение(Сообщение,Текст)

    клСтруктура = Новый Структура;
    мСтрок = Новый Массив;
    мКнопок = Новый Массив;

    мКнопок.Добавить(Новый Структура("text, callback_data", "Да", "1"));
    мКнопок.Добавить(Новый Структура("text, callback_data", "Нет", "2"));
    
    мСтрок.Добавить(мКнопок);    
    
    клСтруктура.Вставить("inline_keyboard",мСтрок);
    
    ЗаписьJSON = Новый ЗаписьJSON;
    ЗаписьJSON.УстановитьСтроку();
    ЗаписатьJSON(ЗаписьJSON,клСтруктура,,);
    
    Клавиатура = ЗаписьJSON.Закрыть();
    
    Ресурс = "/bot" + Константы.Токен.Получить() + "/sendMessage?text=" + КодироватьСтроку(Текст,СпособКодированияСтроки.КодировкаURL) + "&chat_id=" + Формат(Сообщение.from.id,"ЧГ=0") + "&reply_to_message_id=" + Сообщение.message_id + "&reply_markup=" + Клавиатура;
    Результат = ОтправитьЗапросНаОбработкуВTelegram(Ресурс);
    
    Если НЕ Результат.ok Тогда
        Возврат;
    КонецЕсли;
КонецПроцедуры


Отправляю сообщение боту, бот на него отвечает с выводом клавиатуры, после нажатия на кнопку ничего не происходит, кнопка ничего не возвращает.
Помогите разобраться! Все что нашел на форумах не помогает мне :-)

Сообщение отредактировал Vofka - 16.02.18, 16:57

podcast Подменю пользователя
сообщение 16.02.18, 16:42
Сообщение #2

Оратор
Иконка группы
Группа: Местный
Сообщений: 306
Спасибо сказали: 74 раз
Рейтинг: 0

kosalex @ Сегодня, 16:32 * ,
Что в Результат приходит?

kosalex Подменю пользователя
сообщение 16.02.18, 17:26
Сообщение #3

Ветеран
*******
Группа: Пользователи
Сообщений: 805
Спасибо сказали: 14 раз
Рейтинг: 0

podcast @ Сегодня, 16:42 * ,
все норм, затупил немного, код рабочий

kosalex Подменю пользователя
сообщение 25.02.18, 22:26
Сообщение #4

Ветеран
*******
Группа: Пользователи
Сообщений: 805
Спасибо сказали: 14 раз
Рейтинг: 0

Задача усложнилась :-) Но все по той же теме, клавиатур в telegram.

Нужно вывести изображение с клавиатурой "inline_keyboard".

Пользуюсь вот таким кодом:

ддКартинка = Блюдо.Ссылка.ОсновноеИзображение.Хранилище.Получить().ПолучитьДвоичныеДанные();
                
                времКаталог = КаталогВременныхФайлов();
                времФайлКартинки = ПолучитьИмяВременногоФайла("jpg");
                имяВремяФайла = СтрЗаменить(времФайлКартинки,времКаталог,"");
                                
                ддКартинка.Записать(времФайлКартинки);
                
                СтрокаСоединения = "/bot" + Константы.Токен.Получить() + "/sendPhoto";
                
                //Определяем массив для процедуры ОбъединитьФайлы
                МассивФайловДляОбъединения = Новый Массив;
                
                //Формируем начальный фрагмент файла POST-запроса
                ИмяФайлаОтправкиНачало = ПолучитьИмяВременногоФайла("txt");
                ФайлОтправкиНачало = Новый ЗаписьТекста(ИмяФайлаОтправкиНачало, КодировкаТекста.UTF8);
                
                //Формируем конечный фрагмент файла POST-запроса
                ИмяФайлаОтправкиКонец = ПолучитьИмяВременногоФайла("txt");
                ФайлаОтправкиКонец = Новый ЗаписьТекста(ИмяФайлаОтправкиКонец, КодировкаТекста.UTF8);
                
                ТекстДляОтправки = "";
                
                Boundary = "----" + Строка(Новый УникальныйИдентификатор());
                
                // ЧАТ
                ТекстДляОтправки = ТекстДляОтправки + "--" + Boundary + Символы.ПС;    
                ТекстДляОтправки = ТекстДляОтправки + "Content-Disposition: form-data; name=""chat_id"""+ Символы.ПС + Символы.ПС;    
                ТекстДляОтправки = ТекстДляОтправки + СокрЛП(Формат(Клиент.Код,"ЧГ=0")) + Символы.ПС;
                
                // ПОДПИСЬ  
                Подпись = "Наименование: " + Блюдо.Ссылка.Наименование + Символы.ПС + "Цена: " + Блюдо.Ссылка.Цена;  
                
                ТекстДляОтправки = ТекстДляОтправки + "--" + Boundary + Символы.ПС;    
                ТекстДляОтправки = ТекстДляОтправки + "Content-Disposition: form-data; name=""caption""" + Символы.ПС + Символы.ПС;    
                ТекстДляОтправки = ТекстДляОтправки + СокрЛП(Подпись) + Символы.ПС;
                                                                        
                // ФОТО
                ТекстДляОтправки = ТекстДляОтправки + "--" +  Boundary + Символы.ПС;    
                ТекстДляОтправки = ТекстДляОтправки + "Content-Disposition: form-data; name=""photo""; filename=""" + имяВремяФайла + """" + Символы.ПС;    
                ТекстДляОтправки = ТекстДляОтправки + "Content-Type: image/jpg" + Символы.ПС;
                
                //КЛАВИАТУРА
                клСтруктура = Новый Структура;
                Строки = Новый Массив;
                Кнопки = Новый Массив;
                Кнопки.Добавить(Новый Структура("text, callback_data", "В корзину", Блюдо.Ссылка.Код));
                Строки.Добавить(Кнопки);    
                клСтруктура.Вставить("inline_keyboard",Строки);
                ЗаписьJSON = Новый ЗаписьJSON;
                ЗаписьJSON.УстановитьСтроку(Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Нет));  //Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Нет,,,ЭкранированиеСимволовJSON.СимволыВнеASCII)  
                ЗаписатьJSON(ЗаписьJSON,клСтруктура,,);
                Клавиатура = ЗаписьJSON.Закрыть();

                ТекстДляОтправки = ТекстДляОтправки + "--" +  Boundary + Символы.ПС;    
                ТекстДляОтправки = ТекстДляОтправки + "Content-Disposition: form-data; name=""reply_markup""" + Символы.ПС+ Символы.ПС;    
                ТекстДляОтправки = ТекстДляОтправки + СокрЛП(Клавиатура) + Символы.ПС;                 
                
                ФайлОтправкиНачало.ЗаписатьСтроку(ТекстДляОтправки);
                ФайлОтправкиНачало.Закрыть();
                
                МассивФайловДляОбъединения.Добавить(ИмяФайлаОтправкиНачало);
                МассивФайловДляОбъединения.Добавить(времФайлКартинки);
                
                ТекстДляОтправки = "";
                ТекстДляОтправки = ТекстДляОтправки + Символы.ПС  + "--" +  Boundary+"--";
                ФайлаОтправкиКонец.ЗаписатьСтроку(ТекстДляОтправки);
                ФайлаОтправкиКонец.Закрыть();
                МассивФайловДляОбъединения.Добавить(ИмяФайлаОтправкиКонец);
                
                ИмяФайлаОтправки = ПолучитьИмяВременногоФайла("txt");
                
                ОбъединитьФайлы(МассивФайловДляОбъединения, ИмяФайлаОтправки);
                
                HTTPЗапрос = Новый HTTPЗапрос;
                HTTPЗапрос.Заголовки.Вставить("Connection", "keep-alive");
                HTTPЗапрос.Заголовки.Вставить("Content-Type", "multipart/form-data; boundary="+Boundary);
                HTTPЗапрос.УстановитьИмяФайлаТела(ИмяФайлаОтправки);    
                HTTPЗапрос.АдресРесурса = СтрокаСоединения;
                
                Результат = ОтправитьЗапросНаОбработкуВTelegramPOST(HTTPЗапрос);


Если убрать раздел с клавиатурой то все ок, картинка отправляется. Если включить, сервер возвращает ""Bad Request: IMAGE_PROCESS_FAILED"".
Помогите пожалуйста! Шел третий день...

logist Подменю пользователя
сообщение 25.02.18, 23:14
Сообщение #5

Про1С-ник
Иконка группы
Квалифицированный бухгалтерГений телепатии и социального моделированияЗа заслуги на форуме в 2010 годуМодератору Про1С (за заслуги в 2011 году)
Группа: Местный
Сообщений: 9564
Из: Kharkiv, UA
Спасибо сказали: 2536 раз
Рейтинг: 0

Цитата(kosalex @ 25.02.18, 22:26) *
Помогите пожалуйста! Шел третий день...

Поищите на гитхабе по тегам telegram-bot и/или telegram-bot-api + текст ошибки (IMAGE_PROCESS_FAILED), код 1С вы там не найдете, но решения проблем по другим языкам может подсказать куда думать.


Signature
Личные бесплатные консультации не даю, для этого есть форум!

kosalex Подменю пользователя
сообщение 26.02.18, 7:41
Сообщение #6

Ветеран
*******
Группа: Пользователи
Сообщений: 805
Спасибо сказали: 14 раз
Рейтинг: 0

logist @ Вчера, 23:14 * ,
Дело в том что на гит хабе смотрел) и если отправить картинку уже ту которая есть на сервере то кнопки будут, потому как там запись немного по другому. Просто строкой "Ресурс = "/bot" + Константы.Токен.Получить() + "/sendPhoto?photo=" + АйдиФайла + "&chat_id=" + Формат(Сообщение.from.id,"ЧГ=0") + "&caption=" + КодироватьСтроку(Заголовок,СпособКодированияСтроки.КодировкаURL);"

А вот в мое случае строка запроса собирается немного по другому...

Может я не правильно задаю параметры ?

kosalex Подменю пользователя
сообщение 26.02.18, 10:17
Сообщение #7

Ветеран
*******
Группа: Пользователи
Сообщений: 805
Спасибо сказали: 14 раз
Рейтинг: 0

Функция отправки на сервер выглядит так:

Функция ОтправитьЗапросНаОбработкуВTelegramPOST(Запрос)
    Попытка
        Соединение  =  Новый HTTPСоединение(Константы.Сервер.Получить(),443,,,,,Новый ЗащищенноеСоединениеOpenSSL());
        
        Ответ = Соединение.ОтправитьДляОбработки(Запрос);
        ТекстовыеДанныеОтвета = Ответ.ПолучитьТелоКакСтроку();
        
        ДеревоЗн = Новый ДеревоЗначений();
        ЧтениеJSON = Новый ЧтениеJSON();
        ЧтениеJSON.УстановитьСтроку(ТекстовыеДанныеОтвета);
        Результат = ПрочитатьJSON(ЧтениеJSON);
        ЧтениеJSON.Закрыть();
        
        Возврат Результат;
    Исключение
        ЗаписьЖурналаРегистрации("ОтправитьЗапросНаОбработкуВTelegramPOST",,Метаданные.ОбщиеМодули.TelegramAPI,"Ошибка!" + ИнформацияОбОшибке().Описание,ИнформацияОбОшибке().Причина,);
        Возврат Неопределено;
    КонецПопытки;
КонецФункции




Цитата(logist @ 25.02.18, 23:14) *
решения проблем по другим языкам


таких проблем в других языках нет)) потому как они умеют работать с двоичными данными, отправлять картинку на сервер.

 клСтруктура = Новый Структура;
                Строки = Новый Массив;
                Кнопки = Новый Массив;
                Кнопки.Добавить(Новый Структура("text, callback_data", "В корзину", Блюдо.Ссылка.Код));
                Строки.Добавить(Кнопки);    
                клСтруктура.Вставить("inline_keyboard",Строки);
                ЗаписьJSON = Новый ЗаписьJSON;
                ЗаписьJSON.УстановитьСтроку(Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Нет));  //Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Нет,,,ЭкранированиеСимволовJSON.СимволыВнеASCII)  
                ЗаписатьJSON(ЗаписьJSON,клСтруктура,,);
                Клавиатура = ЗаписьJSON.Закрыть();


В "Клавиатура" после выполнения этого кода будет же строка JSON ?

logist Подменю пользователя
сообщение 26.02.18, 11:11
Сообщение #8

Про1С-ник
Иконка группы
Квалифицированный бухгалтерГений телепатии и социального моделированияЗа заслуги на форуме в 2010 годуМодератору Про1С (за заслуги в 2011 году)
Группа: Местный
Сообщений: 9564
Из: Kharkiv, UA
Спасибо сказали: 2536 раз
Рейтинг: 0

Цитата(kosalex @ 26.02.18, 10:17) *
таких проблем в других языках нет))

Есть, иначе бы я не писал, полистав вчера немного увидел что чаще всего описывают проблему с именем файла.

Цитата(kosalex @ 26.02.18, 10:17) *
потому как они умеют работать с двоичными данными, отправлять картинку на сервер.

1С это тоже умеет.

Цитата(kosalex @ 26.02.18, 10:17) *
В "Клавиатура" после выполнения этого кода будет же строка JSON ?

По идее да, единственное не понял зачем это:
Цитата(kosalex @ 26.02.18, 10:17) *
ЗаписьJSON.УстановитьСтроку(Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Нет)); 


Достаточно так (у меня в REST по крайней мере работает):
    Запись = Новый ЗаписьJSON;
    ЗаписатьJSON(Запись, ТелоЗапроса);
    Запись.Закрыть();


По поводу отправки двоичного файла, у меня есть такой вариант (это не телеграм, но работает), может что-то пригодится:
Код
Function SendJPGImageToServer(FilePath, Connecting, Parametres) Export
    
    FilePost        = New File(FilePath);
    Boundary        = StrReplace(String(New UUID()),"-","");
    FileContents    = Base64Строка(New BinaryData(FilePath));
    TmpFileName        = GetTempFileName();
    
    FileToSend = New TextWriter(TmpFileName, TextEncoding.ANSI, Chars.LF, False);
    FileToSend.WriteLine("--" + Boundary);
    FileToSend.WriteLine("Content-Disposition: form-data; name=""datafile""; filename=""" + FilePost.Name + """");
    FileToSend.WriteLine("Content-Type: image/jpg" + Chars.LF + Chars.LF);
    FileToSend.WriteLine(FileContents);
    FileToSend.WriteLine("--" + Boundary + "--");     
    FileToSend.Close();
    
    Stream            = New File(TmpFileName);
    StreamSize        = XMLString(Stream.Size());
    
    Headers = New Map;
    Headers.Insert("Content-Type", "multipart/form-data; boundary="+Boundary);
    Headers.Insert("Content-Length", StreamSize);
    
    Request = New HTTPRequest;
    Request.ResourceAddress    = Parametres.ServerPath + Parametres.AddParam;
    Request.Headers            = Headers;
    Request.SetBodyFileName(TmpFileName);
    
    Response = SendRequestToServer(Request, Connecting, Parametres.Errors);
    
    Return  Response;

EndFunction


Сообщение отредактировал logist - 26.02.18, 11:12


Signature
Личные бесплатные консультации не даю, для этого есть форум!

kosalex Подменю пользователя
сообщение 26.02.18, 11:37
Сообщение #9

Ветеран
*******
Группа: Пользователи
Сообщений: 805
Спасибо сказали: 14 раз
Рейтинг: 0

Рабочий код! Проблема была в неправильном порядке и заполнении параметров. Определил сначала клавиатуру,а потом уже изображение! И ПОЛУЧИЛОСЬ! :-)

    ддКартинка = Блюдо.Ссылка.ОсновноеИзображение.Хранилище.Получить().ПолучитьДвоичныеДанные();
                
                времКаталог = КаталогВременныхФайлов();
                времФайлКартинки = ПолучитьИмяВременногоФайла("jpg");
                имяВремяФайла = СтрЗаменить(времФайлКартинки,времКаталог,"");
                                
                ддКартинка.Записать(времФайлКартинки);
                
                СтрокаСоединения = "/bot" + Константы.Токен.Получить() + "/sendPhoto";
                
                //Определяем массив для процедуры ОбъединитьФайлы
                МассивФайловДляОбъединения = Новый Массив;
                
                //Формируем начальный фрагмент файла POST-запроса
                ИмяФайлаОтправкиНачало = ПолучитьИмяВременногоФайла("txt");
                ФайлОтправкиНачало = Новый ЗаписьТекста(ИмяФайлаОтправкиНачало, КодировкаТекста.UTF8);
                
                //Формируем конечный фрагмент файла POST-запроса
                ИмяФайлаОтправкиКонец = ПолучитьИмяВременногоФайла("txt");
                ФайлаОтправкиКонец = Новый ЗаписьТекста(ИмяФайлаОтправкиКонец, КодировкаТекста.UTF8);
                
                ТекстДляОтправки = "";
                
                Boundary = "----" + Строка(Новый УникальныйИдентификатор());
                
                //ЧАТ++
                ТекстДляОтправки = ТекстДляОтправки + "--" + Boundary + Символы.ПС;    
                ТекстДляОтправки = ТекстДляОтправки + "Content-Disposition: form-data; name=""chat_id"""+ Символы.ПС + Символы.ПС;    
                ТекстДляОтправки = ТекстДляОтправки + СокрЛП(Формат(Клиент.Код,"ЧГ=0")) + Символы.ПС;
                //ЧАТ++
                
                //ПОДПИСЬ++  
                Подпись = "Наименование: " + Блюдо.Ссылка.Наименование + Символы.ПС + "Цена: " + Блюдо.Ссылка.Цена;  
                
                ТекстДляОтправки = ТекстДляОтправки + "--" + Boundary + Символы.ПС;    
                ТекстДляОтправки = ТекстДляОтправки + "Content-Disposition: form-data; name=""caption""" + Символы.ПС + Символы.ПС;    
                ТекстДляОтправки = ТекстДляОтправки + СокрЛП(Подпись) + Символы.ПС;
                //ПОДПИСЬ--
                                                                        
                //КЛАВИАТУРА++
                клСтруктура = Новый Структура;
                Строки = Новый Массив;
                Кнопки = Новый Массив;
                Кнопки.Добавить(Новый Структура("text, callback_data", "В корзину", Блюдо.Ссылка.Код));
                Строки.Добавить(Кнопки);    
                клСтруктура.Вставить("inline_keyboard",Строки);
                
                ЗаписьJSON = Новый ЗаписьJSON;
                ЗаписьJSON.УстановитьСтроку(Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Нет,,,ЭкранированиеСимволовJSON.Нет));  //Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Нет,,,ЭкранированиеСимволовJSON.СимволыВнеASCII)  
                ЗаписатьJSON(ЗаписьJSON,клСтруктура,,);
                Клавиатура = ЗаписьJSON.Закрыть();
                
                ТекстДляОтправки = ТекстДляОтправки + "--" +  Boundary + Символы.ПС;    
                ТекстДляОтправки = ТекстДляОтправки + "Content-Disposition: form-data; name=""reply_markup""" + Символы.ПС+ Символы.ПС;    
                ТекстДляОтправки = ТекстДляОтправки + СокрЛП(Клавиатура) + Символы.ПС;
                //КЛАВИАТУРА--
                
                //ФОТО++
                ТекстДляОтправки = ТекстДляОтправки + "--" +  Boundary + Символы.ПС;    
                ТекстДляОтправки = ТекстДляОтправки + "Content-Disposition: form-data; name=""photo""; filename=""" + имяВремяФайла + """" + Символы.ПС;    
                ТекстДляОтправки = ТекстДляОтправки + "Content-Type: image/jpg" + Символы.ПС;
                //ФОТО--
                
                ФайлОтправкиНачало.ЗаписатьСтроку(ТекстДляОтправки);
                ФайлОтправкиНачало.Закрыть();
                
                МассивФайловДляОбъединения.Добавить(ИмяФайлаОтправкиНачало);
                МассивФайловДляОбъединения.Добавить(времФайлКартинки);
                
                ТекстДляОтправки = "";
                
                ТекстДляОтправки = ТекстДляОтправки + Символы.ПС  + "--" +  Boundary+"--";
                ФайлаОтправкиКонец.ЗаписатьСтроку(ТекстДляОтправки);
                
                ФайлаОтправкиКонец.Закрыть();
                МассивФайловДляОбъединения.Добавить(ИмяФайлаОтправкиКонец);
                
                ИмяФайлаОтправки = ПолучитьИмяВременногоФайла("txt");
                
                ОбъединитьФайлы(МассивФайловДляОбъединения, ИмяФайлаОтправки);
                
                HTTPЗапрос = Новый HTTPЗапрос;
                HTTPЗапрос.Заголовки.Вставить("Connection", "keep-alive");
                HTTPЗапрос.Заголовки.Вставить("Content-Type", "multipart/form-data; boundary="+Boundary);
                HTTPЗапрос.УстановитьИмяФайлаТела(ИмяФайлаОтправки);    
                HTTPЗапрос.АдресРесурса = СтрокаСоединения;
                
                Результат = ОтправитьЗапросНаОбработкуВTelegramPOST(HTTPЗапрос);
                
                Для Каждого Файл Из МассивФайловДляОбъединения Цикл
                    УдалитьФайлы(Файл);    
                КонецЦикла;

Спасибо сказали: qSergey, serpanik,

pbahushevich Подменю пользователя
сообщение 01.11.18, 14:38
Сообщение #10

Молчаливый
*
Группа: Пользователи
Сообщений: 1
Спасибо сказали: 0 раз
Рейтинг: 0

kosalex @ 26.02.18, 11:37 * ,
отдельное спасибо за рабочий код!!!

Vofka Подменю пользователя
сообщение 01.11.18, 15:21
Сообщение #11

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13948
Из: Киев
Спасибо сказали: 4514 раз
Рейтинг: 3635.6

pbahushevich, для спасибо у нас есть специальная кнопочка.

qSergey Подменю пользователя
сообщение 14.01.21, 8:46
Сообщение #12

Молчаливый
*
Группа: Пользователи
Сообщений: 1
Спасибо сказали: 0 раз
Рейтинг: 0

Цитата(kosalex @ 26.02.18, 11:37) *
kosalex

Хорошо написанный, сразу рабочий код, спасибо, добрый человек!

Не нашли ответа на свой вопрос?
Зарегистрируйтесь и задайте новый вопрос.


Ответить Новая тема
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

RSS Текстовая версия Сейчас: 29.03.24, 17:16
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!