Роботы, плагины и скрипты к чату MyChat. Разработка альтернативных клиентов и различных утилит. Технические вопросы по программированию, замечания и предложения по развитию API
Аватара пользователя
Vladimir Kuzmin
Собственно пробую пример https://nsoft-s.com/mcserverhelp/index.html?integrationapiexample1crest.htm и получаю в логах
Ошибка #0102: попытка подключения неизвестного приложения, IP: "10.15.хх.хх", Data: "POST /API/?data= HTTP/1.1"
Подскажите куда копать?
Аватара пользователя
Алексей Пикуров
Здравствуйте. Что возвращается в 1с?
Аватара пользователя
Алексей Пикуров
Покажите свой код, пожалуйста.
Аватара пользователя
Vladimir Kuzmin
Вызывается исключение и Ошибка при отправке запроса: {ВнешняяОбработка.ВнешняяОбработка1.МодульОбъекта(64)}: Ошибка при вызове метода контекста (ОтправитьДляОбработки): Ошибка работы с Интернет: Server returned nothing (no headers, no data)
Аватара пользователя
Vladimir Kuzmin
Код: Выделить всё
Сервер = "хх.хх.40.ххх";
  Порт = 80;
  Ресурс = "/API/?data=";
  Ключ = "ывывывфыв58";
  UINПолучателя = "4";
   
  ТекстСообщения = "Тестовое сообщение от " + ТекущаяДата() + Символы.ВК + Символы.ПС + "строка 2";

  СтруктураДанных = Новый Структура;
  СтруктураДанных.Вставить("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 Тогда
            Сообщить("Ошибка при отправке запроса: " + Результат.КодСостояния);
        КонецЕсли;
    Исключение
        Сообщить("Ошибка при отправке запроса: " + ОписаниеОшибки());
    КонецПопытки;
Аватара пользователя
Алексей Пикуров
Ок, завтра посмотрю. Вы 8.2.3 версию используете?
Аватара пользователя
Vladimir Kuzmin
1С:Предприятие 8.3 (8.3.15.1656)
"Управление торговым предприятием для Украины", редакция 1.2. (1.2.57.1)

Есть возможность посмотреть детальный лог?
Аватара пользователя
Алексей Пикуров
Я про сервер MyChat спросил :) Извините, неточно выразился.
Аватара пользователя
Алексей Пикуров
Подробных логов на сервере пока нет.
Аватара пользователя
Алексей Пикуров
Я так понимаю, ваш сервер MyChat использует HTTPS-сертификат.

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

Кстати, сообщение про ошибку в 1C есть, если запускать его как управляемое приложение:
1с-rest-error.png
Ошибка работы с REST в 1С, запущенным как управляемое приложение
1с-rest-error.png (8.86 КБ) Просмотров: 5239
Аватара пользователя
Vladimir Kuzmin
Ошибка при отправке запроса: {ВнешняяОбработка.ВнешняяОбработка1.МодульОбъекта(72)}: Ошибка при вызове метода контекста (ОтправитьДляОбработки): Ошибка работы с Интернет: Ошибка инициализации SSL-соединения

SSL нее используется. Считаю что проблема в моей версии 1С. Уже сталкивался что функции работы с JSON работают не корректно. Завтра-послезавтра попробую поправить код.
Аватара пользователя
Vladimir Kuzmin
Проблема решена. Функционал MyChat и 1С отработали нормально. Проблема была в пробросе портов на Микротике, из двух практически идентичных строк НАТа одна не работала.
Аватара пользователя
Алексей Пикуров
Аллилуйя :) Спасибо, что отписали, рад, что у вас всё получилось.
Аватара пользователя
Vladimir Kuzmin
1C арендованная в облаке. Закрыто все по самое немогу. Ни норм.тунель поднять, ни ВЕБ-сервис запустить, ни ocx прикрутить для работы с сокетами. А желательно получать уведомления от Mychat в 1С, что в API не реализовано. В общем пока голову ломаю...
Аватара пользователя
Алексей Пикуров
А как постучать в 1С ? Она может поймать REST-запрос?
Аватара пользователя
Vasec666
Здравствуйте!
У меня такая же ошибка. Версия платформы 8.3.18.1289. Конфигурация самописная. Код ровно такой же. SSL не используем. Версия MyChat 5.7.0.3
Код: Выделить всё

&НаСервере
Процедура ОправитьТестовоеСообщениеНаСервере()
   
   Сервер = "192.168.3.8";
   Порт = 2004;
   Ресурс = "/API/?data=";
   //Ключ = "iddqd";

   ТекстСообщения= "Тестовое сообщение";
   
   СтруктураДанных = Новый Структура;
   СтруктураДанных.Вставить("cmd", "0002");
   СтруктураДанных.Вставить("UserFrom", "147");
   СтруктураДанных.Вставить("UserTo", "7");
   СтруктураДанных.Вставить("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.Форма.Форма.Форма(33)}: Ошибка при вызове метода контекста (ОтправитьДляОбработки): Ошибка работы с Интернет: Server returned nothing (no headers, no data)
Не могу разобраться в чем дело. Подскажете?
Аватара пользователя
Алексей Пикуров
Подскажу. Используйте последнюю версию MyChat. 8.14.5.
Аватара пользователя
Vasec666
Обновили до последней версии - все так же.
Аватара пользователя
Алексей Пикуров
В вашем скрипте вы прописали 2004 порт и закомментировали ключ доступа к Integration API.

Однако, Get-запросы вы должны отправлять не на ядро сервера (TCP 2004), а на порт веб-сервера. Точный номер порта можете посмотреть в ваших настройках, но обычно это 80-й порт.

Для начала откройте ваш сервер в браузере http://192.168.3.8

В примере из справки также указан 80-й порт.
Аватара пользователя
Vasec666
Да, спасибо, работает! На старой версии перебирал все порты. На 5 версии на 80 порту выдавало ошибку 404.
Аватара пользователя
Алексей Пикуров
Пожалуйста. Всегда используйте последнюю версию, на 5-й версии этой технологии ещё не было.