Роботы, плагины и скрипты к чату MyChat. Разработка альтернативных клиентов и различных утилит. Технические вопросы по программированию, замечания и предложения по развитию API
ANDiv
Форматирование строки не отрабатывается в майчате при передачи текста из 1С!
Сделал код схожим как в примере:

Код: Выделить всё
РазделительСтрок = "\r\n";
   ТекстСообщения = "Задача "+ДанныеОтправки.ТочкаМаршрута.НаименованиеЗадачи+""""+ДанныеОтправки.Наименование+""""+" от "+ДанныеОтправки.ДатаСтарта;
   ТекстСообщения = ТекстСообщения + Символы.ВК + Символы.ПС + "Срок исполнения: "+ДанныеОтправки.СрокИсполнения;
   ТекстСообщения = ТекстСообщения + Символы.ВК + Символы.ПС + "Задачу поставил: "+ДанныеОтправки.Автор;
   ТекстСообщения = ТекстСообщения + Символы.ВК + Символы.ПС + "Описание задачи: "+ДанныеОтправки.Описание;
   
   ТекстСообщения = СтрЗаменить(ТекстСообщения, "\", "/"); // замена обратного слэша на прямой
   ТекстСообщения = СтрЗаменить(ТекстСообщения, Символы.ПС, РазделительСтрок);
   ТекстСообщения = СтрЗаменить(ТекстСообщения, """", "'"); // замена двойной кавычки на одинарную

при выводе в майчате получаем текст:

Задача Согласовать'тестовая задача' от 28.08.2019 14:44:27\r\nСрок исполнения: 29.08.2019 14:44:00\r\nЗадачу поставил: ФИО пользователя\r\nОписание задачи: тестовый текст задачи
Аватара пользователя
Алексей Пикуров
Перенёс тему в раздел скриптов. Посмотрите содержимое JSON объекта перед отправкой, что там?
ANDiv
Если следовать вашему примеру то в строке JSON вот такой код:
Код: Выделить всё
{
"cmd": "0002",
"UserFrom": "432",
"UserTo": "nickname",
"Msg": "Задача Согласовать'тестовая задачаё' от 29.08.2019 8:40:42\rСрок исполнения: 30.08.2019 8:40:00\rЗадачу поставил: имя пользователя\rОписание задачи: тестовое описание задачи",
"APIStype": "mcrest",
"ServerKey": "пароль"
}

на выходе майчата получаем вот такой текст:
Код: Выделить всё
Задача Согласовать'тестовая задачаё' от 29.08.2019 8:40:42Срок исполнения: 30.08.2019 8:40:00Задачу поставил: nickname Описание задачи: тестовое описание задачи


Попробовал следовать правилам JSON и сформировать строку другим путем. Строки текста решил выводить через массив:
Код: Выделить всё
{
"cmd": "0002",
"UserFrom": "432",
"UserTo": "nickname",
"APIStype": "mcrest",
"ServerKey": "пароль",
"Msg": [
"Задача Согласовать\"тестовая задача\" от 29.08.2019 8:39:23",
"Срок исполнения: 30.08.2019 8:39:00",
"Задачу поставил: nickname",
"Описание задачи: тестовое описание задачи"
]
}

На выходе в майчате получаем:
Код: Выделить всё
 ["Задача Согласовать\"тестовая задача\" от 29.08.2019 8:39:23","Срок исполнения: 30.08.2019 8:39:00","Задачу поставил: nickname","Описание задачи: тестовое описание задачи"]
Аватара пользователя
Георгий Лысенко
Для корректной работы переноса строк используйте не \r, a \r\n и обязательно произведите urlencode результирующей JSON-строки.
ANDiv
\r\n - тот же результат. данная управляющая цепочка выводится как обычный текст и весь текст в одну строку.
при кодировании всего JSON текста - ничего не происходит. MyChat - не выводит текст.
при кодировании только MSG строки - майчат выводит так же закодированную в URL формат строку.
Аватара пользователя
Георгий Лысенко
Вся строка запроса в результате должна выглядеть приблизительно так:
Код: Выделить всё
http://127.0.0.1/API/?data=%7B%0A%22cmd%22%3A%20%220002%22%2C%0A%22UserFrom%22%3A%20%22432%22%2C%0A%22UserTo%22%3A%20%22nickname%22%2C%0A%22Msg%22%3A%20%22%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0%20%D0%A1%D0%BE%D0%B3%D0%BB%D0%B0%D1%81%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%27%D1%82%D0%B5%D1%81%D1%82%D0%BE%D0%B2%D0%B0%D1%8F%20%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B0%D1%91%27%20%D0%BE%D1%82%2029.08.2019%208%3A40%3A42%5Cr%5Cn%D0%A1%D1%80%D0%BE%D0%BA%20%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F%3A%2030.08.2019%208%3A40%3A00%5Cr%5Cn%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D1%83%20%D0%BF%D0%BE%D1%81%D1%82%D0%B0%D0%B2%D0%B8%D0%BB%3A%20%D0%B8%D0%BC%D1%8F%20%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8F%5Cr%5Cn%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5%20%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8%3A%20%D1%82%D0%B5%D1%81%D1%82%D0%BE%D0%B2%D0%BE%D0%B5%20%D0%BE%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5%20%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8%22%2C%0A%22APIStype%22%3A%20%22mcrest%22%2C%0A%22ServerKey%22%3A%20%22%D0%BF%D0%B0%D1%80%D0%BE%D0%BB%D1%8C%22%0A%7D

Только что проверил, использовал \r\n для переноса строки, все работает корректно.
ANDiv
Код: Выделить всё
http://192.168.1.231:8080/API/?data=%7B%0A%22cmd%22%253A%20%220002%22%252C%0A%22UserFrom%22%253A%20%22432%22%252C%0A%22UserTo%22%253A%20%22NickName%22%252C%0A%22Msg%22%253A%20%22Test%22%252C%0A%22APIStype%22%253A%20%22mcrest%22%252C%0A%22ServerKey%22%253A%20%22Пароль%22%0A%7D

Не работает!
Возвращает - Access denied. Can't convert data to object

Код: Выделить всё
http://192.168.1.231:8080/API/?data={"cmd":"0002","UserFrom":"432","UserTo":"NickName","Msg":"Test","APIStype":"mcrest","ServerKey":"Пароль"}

Работает. Вывод текста происходит.

Передавал из браузера напрямую.
ANDiv
Еще вот такой вариант работает:
Код: Выделить всё
http://192.168.1.231:8080/API/?data={%22cmd%22:%220002%22,%22UserFrom%22:%22432%22,%22UserTo%22:%22NickName%22,%22Msg%22:%22Test%22,%22APIStype%22:%22mcrest%22,%22ServerKey%22:%22Пароль%22}
ANDiv
при добавлении в строке любого закодированного управляющего символа с кодом ниже %20 идет возврат ошибки. т.е. возникает ошибка с отработкой символа табуляции, возврат коретки и т.п.
Аватара пользователя
Алексей Пикуров
Пожалуйста, используйте тег code для обрамления строк, иначе текст нечитаемый.
Аватара пользователя
sertak
Приведенный тест из 1С не отправляется, т.к. мешает символ "Возврат каретки" (Символы.ВК), надо их заменить. Это стоит добавить в документацию.
Код: Выделить всё
ТекстСообщения = СтрЗаменить(ТекстСообщения, Символы.ВК, "");

Предполагаю даже, что в будущем еще мы еще столкнемся с символами из мира 1С, из-за которых сообщения не отправляются в MyChat.
После добавления этой строки JSON будет такой:
{"cmd":"0002","UserFrom":"0","UserTo":"3","Msg":"Задача Согласовать'тестовая задача' от 28.08.2019 14:44:27\r\nСрок исполнения: 29.08.2019 14:44:00\r\nЗадачу поставил: ФИО пользователя\r\nОписание задачи: тестовый текст задачи","APIStype":"mydata","ServerKey":"*************"}

Картинка чата с текстом:

1111.jpg
1111.jpg (50.36 КБ) Просмотров: 220
Аватара пользователя
sertak
ANDiv, приведите, пожалуйста, весь ваш код, похоже я дал неверный совет в предыдущем сообщении. Скиньте и скрин окна MyChat.
Аватара пользователя
sertak
У меня проблема с символами возникала при сборке JSON вручную из текста, потому и СтрЗаменить. А если ЗаписьJSON использовать, то должно нормально отрабатывать.
ANDiv
Код: Выделить всё
Сервер = "192.168.1.231";
     Порт = 8080;
     Ресурс = "/API/?data=";
     Ключ = "ПышвордСервера";
   РазделительСтрок = "\r\n";
   //РазделительСтрок = "";
   ТекстСообщения = "Задача "+ДанныеОтправки.ТочкаМаршрута.НаименованиеЗадачи+""""+ДанныеОтправки.Наименование+""""+" от "+ДанныеОтправки.ДатаСтарта;
   ТекстСообщения = ТекстСообщения + Символы.ПС + "Срок исполнения: "+ДанныеОтправки.СрокИсполнения;
   ТекстСообщения = ТекстСообщения + Символы.ПС + "Задачу поставил: "+ДанныеОтправки.Автор;
   ТекстСообщения = ТекстСообщения + Символы.ПС + "Описание задачи: "+ДанныеОтправки.Описание;
   
   ТекстСообщения = СтрЗаменить(ТекстСообщения, "\", "/"); // замена обратного слэша на прямой
   ТекстСообщения = СтрЗаменить(ТекстСообщения, Символы.ПС, РазделительСтрок);
   ТекстСообщения = СтрЗаменить(ТекстСообщения, """", "'"); // замена двойной кавычки на одинарную
   ТекстСообщения = СтрЗаменить(ТекстСообщения, Символы.ВК, "");

         СтруктураДанных = Новый Структура;
   СтруктураДанных.Вставить("cmd", "0002");
   СтруктураДанных.Вставить("UserFrom", "432");
   СтруктураДанных.Вставить("UserTo", UINПолучателя);
   СтруктураДанных.Вставить("Msg", ТекстСообщения);
   СтруктураДанных.Вставить("APIStype", "mcrest");
   СтруктураДанных.Вставить("ServerKey", Ключ);   

         ЗаписьJSON = Новый ЗаписьJSON;
   ЗаписьJSON.УстановитьСтроку();
   ЗаписатьJSON(ЗаписьJSON, СтруктураДанных);
   СтрокаJSON = ЗаписьJSON.Закрыть();

Попытка
      HTTP = Новый HTTPСоединение(Сервер,Порт,,,,30);
      HTTPЗапрос = Новый HTTPЗапрос(Ресурс);
      HTTPЗапрос.Заголовки.Вставить("Content-type", "application/x-www-form-urlencoded");
      HTTPЗапрос.УстановитьТелоИзСтроки(СтрокаJSON, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
      Результат  = HTTP.ОтправитьДляОбработки(HTTPЗапрос);
      Если Результат.КодСостояния <> 200 Тогда
         Сообщить("Ошибка при отправке запроса: " + Результат.КодСостояния);
      КонецЕсли;
   Исключение
      Сообщить("Ошибка при отправке запроса: " + ОписаниеОшибки());
   КонецПопытки;

Вложения
Скриншот 1.jpg
Скриншот 1.jpg (40 КБ) Просмотров: 212
Аватара пользователя
sertak
Попробуйте так:
Код: Выделить всё
    Сервер = "192.168.1.231";
     Порт = 8080;
     Ресурс = "/API/?data=";
     Ключ = "ПышвордСервера";
   ТекстСообщения = "Задача "+ДанныеОтправки.ТочкаМаршрута.НаименованиеЗадачи+""""+ДанныеОтправки.Наименование+""""+" от "+ДанныеОтправки.ДатаСтарта;
   ТекстСообщения = ТекстСообщения + Символы.ВК + Символы.ПС + "Срок исполнения: "+ДанныеОтправки.СрокИсполнения;
   ТекстСообщения = ТекстСообщения + Символы.ВК + Символы.ПС + "Задачу поставил: "+ДанныеОтправки.Автор;
   ТекстСообщения = ТекстСообщения + Символы.ВК + Символы.ПС + "Описание задачи: "+ДанныеОтправки.Описание;
   
   //ТекстСообщения = СтрЗаменить(ТекстСообщения, "\", "/"); // замена обратного слэша на прямой
   //ТекстСообщения = СтрЗаменить(ТекстСообщения, Символы.ПС, РазделительСтрок);
   //ТекстСообщения = СтрЗаменить(ТекстСообщения, """", "'"); // замена двойной кавычки на одинарную
  // ТекстСообщения = СтрЗаменить(ТекстСообщения, Символы.ВК, "");

...
ANDiv
Результат аналогичен!
Аватара пользователя
sertak
Прогнал у себя последний пример, выводит разными строками, как положено.
Проверьте еще раз: строки должны переноситься через Символы .ВК + Символы.ПС, а все СтрЗаменить должны быть удалены.
Аватара пользователя
sertak
Попробуйте почистить кэш 1С, довольно странно, что настолько по-разному отрабатывает один код.
Аватара пользователя
sertak
Попробуйте выполнить мой код один в один:

Код: Выделить всё
&НаСервере
Процедура КомандаТестНаСервере()

   Сервер       = "**********";
   Порт       = 8081;
   UINОтправителя = 0;
   UINПолучателя    = ***;
   
   Ключ = "********";
   
   Ресурс = "API/?data=";

   ДанныеОтправки = новый Структура;
   ДанныеОтправки.Вставить("НаименованиеЗадачи", "Тестовая задача");
   ДанныеОтправки.Вставить("Наименование", "тест");
   ДанныеОтправки.Вставить("ДатаСтарта",ТекущаяДата() + 10000);
   ДанныеОтправки.Вставить("СрокИсполнения", ТекущаяДата() + 100000);
   ДанныеОтправки.Вставить("Автор", "Иванов Иван");
   ДанныеОтправки.Вставить("Описание", "Надо выполнить задачу");
   
   ТекстСообщения = "Задача "+ДанныеОтправки.НаименованиеЗадачи+""""+ДанныеОтправки.Наименование+""""+" от "+ДанныеОтправки.ДатаСтарта;
   ТекстСообщения = ТекстСообщения + Символы.ВК + Символы.ПС + "Срок исполнения: "+ДанныеОтправки.СрокИсполнения;
   ТекстСообщения = ТекстСообщения + Символы.ВК + Символы.ПС + "Задачу поставил: "+ДанныеОтправки.Автор;
   ТекстСообщения = ТекстСообщения + Символы.ВК + Символы.ПС + "Описание задачи: "+ДанныеОтправки.Описание;

   СтруктураДанных = Новый Структура;
   СтруктураДанных.Вставить("cmd", "0002");
   СтруктураДанных.Вставить("UserFrom", "0");
   СтруктураДанных.Вставить("UserTo", UINПолучателя);
   СтруктураДанных.Вставить("Msg", ТекстСообщения);
   СтруктураДанных.Вставить("APIStype", "mcrest");
   СтруктураДанных.Вставить("ServerKey", Ключ);   

   ЗаписьJSON = Новый ЗаписьJSON;
   ЗаписьJSON.УстановитьСтроку();
   ЗаписатьJSON(ЗаписьJSON, СтруктураДанных);
   СтрокаJSON = ЗаписьJSON.Закрыть();

   Попытка
      HTTP = Новый HTTPСоединение(Сервер,Порт,,,,30);
      HTTPЗапрос = Новый HTTPЗапрос(Ресурс);
      HTTPЗапрос.Заголовки.Вставить("Content-type", "application/x-www-form-urlencoded");
      HTTPЗапрос.УстановитьТелоИзСтроки(СтрокаJSON, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
      Результат  = HTTP.ОтправитьДляОбработки(HTTPЗапрос);
      Если Результат.КодСостояния <> 200 Тогда
         Сообщить("Ошибка при отправке запроса: " + Результат.КодСостояния);
      КонецЕсли;
   Исключение
      Сообщить("Ошибка при отправке запроса: " + ОписаниеОшибки());
   КонецПопытки;
 
КонецПроцедуры
ANDiv
Заработало!
После перехода с версии 7.6.0 на 7.7.0 и после того как убрал замену символов. хотя в примере оно было. Сейчас это убрано из примера.
Благодарю!
Аватара пользователя
sertak
Да, дело в замене символов. Это я ввел разработчиков в заблуждение и предложил включить эти строки в пример. Извиняюсь, коллеги.
ANDiv
Главное нашли, исправили и все заработало!
Еще раз благодарю!