и снова dll и маркет - страница 18

 

с авторизацией, вроде, продвинулся

Реter Konow:

Так спросите у Романа, как осуществить авторизацию на сервере IBM с WebRequest. Это же ключевой вопрос!

Роман, спасибо за комментарий! Думаю, справимся и с авторизацией.

Теперь насчет нескольких параметров. В справке по WebRequest указано 

[in]  Заголовки запроса вида "ключ: значение", разделенные переносом строки "\r\n".

сама переменная headers типа string

Это как так, строка содержит символ перевода, т.е. окончания строки?

Discover new MetaTrader 5 opportunities with MQL5 community and services
Discover new MetaTrader 5 opportunities with MQL5 community and services
  • www.mql5.com
Dozens of new automated trading applications appear in the MQL5 Market every day. Choose the right app among 10,000 products and forget about unnecessary routine operations of manual trading. Sell your algorithmic trading programs through the largest store of trading applications! Kiss on billions on EURUSD The provided robot (KOB) is a result...
 
Nikolai Karetnikov:

наверняка Вы правы, и скриншот из postman, где пара output прописана в заголовке http запроса объясняется как то иначе ) 

подозреваю, что мы все-таки об одном и том же говорим, только разными словами )

я не знаю насколько кривыми руками писан postman, что это, и какое отношение имеет к вашей задаче...

но 90% решается чтением, и читать должен тот кто решает задачу.

Это довольно типовая штука - есть документация Rest-API сервиса (кстати вы её читали??) , повезло что дали пример с curl и не надо разбирать иные языки.. и надо обратиться через WebRequest MT.

запускается curl, на экран выводится протокол - какие заголовки из параметров сформированы и отправлены, что обратно получено, как понято и куда покладено.

И там прямо видно, что конкретно передать WebRequest

---

 
Maxim Kuznetsov:

я не знаю насколько кривыми руками писан postman, что это, и какое отношение имеет к вашей задаче...

но 90% решается чтением, и читать должен тот кто решает задачу.

Это довольно типовая штука - есть документация Rest-API сервиса (кстати вы её читали??) , повезло что дали пример с curl и не надо разбирать иные языки.. и надо обратиться через WebRequest MT.

запускается curl, на экран выводится протокол - какие заголовки из параметров сформированы и отправлены, что обратно получено, как понято и куда покладено.

И там прямо видно, что конкретно передать WebRequest

---

читаем, читаем ) Разбираемся и прогресс уже есть. 

 
Nikolai Karetnikov:

с авторизацией, вроде, продвинулся

Роман, спасибо за комментарий! Думаю, справимся и с авторизацией.

Теперь насчет нескольких параметров. В справке по WebRequest указано 

[in]  Заголовки запроса вида "ключ: значение", разделенные переносом строки "\r\n".

сама переменная headers типа string

Это как так, строка содержит символ перевода, т.е. окончания строки?

Заголовок может состоять из нескольких строк ключ/значение, по этому используется перенос строки.
В конце заголовка обязательно ставится двойной перенос "\r\n\r\n".
Таким образом сервер понимает конец заголовка, это стандарт http.
После двойного переноса идёт тело запроса или ответа.
В функции 
WebRequest  для удобства сделали разделение этих блоков.
Для заголовков свой параметр, для тела свой.
Но синтаксис написания запроса, требует соблюдения стандарта http.

 
Продолжайте, поручик. 
 

//+------------------------------------------------------------------+
//|                                                   WebRequest.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   string cookie=NULL,headers;
   char   post[],result[];
   string url="https://example-files.online-convert.com/audio/wav/example.wav";
//--- для работы с сервером необходимо добавить URL "https://finance.yahoo.com"
//--- в список разрешенных URL (Главное меню->Сервис->Настройки, вкладка "Советники"):
//--- обнуляем код последней ошибки
   ResetLastError();
//--- загрузка html-страницы с Yahoo Finance
   int res=WebRequest("GET",url,cookie,NULL,5000,post,0,result,headers);
   if(res==-1)
     {
      Print("Ошибка в WebRequest. Код ошибки  =",GetLastError());
      //--- возможно, URL отсутствует в списке, выводим сообщение о необходимости его добавления
      MessageBox("Необходимо добавить адрес '"+url+"' в список разрешенных URL во вкладке 'Советники'","Ошибка",MB_ICONINFORMATION);
     }
   else
     {
      if(res==200)
        {
         //--- успешная загрузка
         PrintFormat("Файл успешно загружен, размер %d байт.",ArraySize(result));
         //PrintFormat("Заголовки сервера: %s",headers);
         //--- сохраняем данные в файл
         int filehandle=FileOpen("example.wav",FILE_WRITE|FILE_BIN);
         if(filehandle!=INVALID_HANDLE)
           {
            //--- сохраняем содержимое массива result[] в файл
            FileWriteArray(filehandle,result,0,ArraySize(result));
            //--- закрываем файл
            FileClose(filehandle);
            Sleep(1*1000);
            PlaySound("\\Files\\example.wav");
           }
         else
            Print("Ошибка в FileOpen. Код ошибки =",GetLastError());
        }
      else
         PrintFormat("Ошибка загрузки '%s', код %d",url,res);
     }
  }
//+------------------------------------------------------------------+

 с этого сайта  https://example-files.online-convert.com/audio/wav/example.wav

загружает этот файл "example.wav"

и после скачивания проигрывает             PlaySound("\\Files\\example.wav");

-------------------------------------------------

Только смысл, от этой функции ??? я думаю - ноль!

 

ну что, господа, продолжим, пожалуй.


//+------------------------------------------------------------------+
//|                                                   WebRequest.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   string cookie=NULL,headers;
   char   post[],result[];
   char cost_char_data[];
   string  result_headers;
   
   ResetLastError();
   ArrayFree(result);
  // headers = "Authorization: Basic YXBpa2V5OkdSMWJiM3pWTXM5ZmNOS0w2cEE5LTV6ajlwdFdsaUN1NmVoOW91cFVucFpC/r/n";
   headers = "Authorization: Basic YXBpa2V5OkdSMWJiM3pWTXM5ZmNOS0w2cEE5LTV6ajlwdFdsaUN1NmVoOW91cFVucFpC";
//   headers = headers + "Accept: audio/wav";
   //headers = headers + "Accept: audio/wav/r/n";
  // headers = headers + "Accept: audio/wav/r/n";
 
   string url="https://api.eu-gb.text-to-speech.watson.cloud.ibm.com/instances/9886a3ce-5734-455f-8f78-7a56381da686/v1/synthesize?text=TEST";
               
   int res = WebRequest("GET",url,headers,1000,cost_char_data,result,result_headers);

   if(res==-1)
     {
      printf("Ошибка в WebRequest. Код ошибки  =",GetLastError());
      //--- возможно, URL отсутствует в списке, выводим сообщение о необходимости его добавления
      MessageBox("Необходимо добавить адрес '"+url+"' в список разрешенных URL во вкладке 'Советники'","Ошибка",MB_ICONINFORMATION);
     }
   else
     {
      if(res==200)
        {
         //--- успешная загрузка
         printf("Файл успешно загружен, размер %d байт.",ArraySize(result));
         printf("Заголовки сервера: %s",result_headers);
         //--- сохраняем данные в файл
         int filehandle=FileOpen("testmql5.ogg",FILE_WRITE|FILE_BIN);
         if(filehandle!=INVALID_HANDLE)
           {
            //--- сохраняем содержимое массива result[] в файл
            FileWriteArray(filehandle,result,0,WHOLE_ARRAY);
            //--- закрываем файл
            FileClose(filehandle);
            printf("FileClose");
            
           }
         else
            printf("Ошибка в FileOpen. Код ошибки =",GetLastError());
        }
      else
         printf("Ошибка загрузки '%s', код %d",url,res);
     }
  }
//+------------------------------------------------------------------+


во-первых, максимально упростим код самого запроса. Оставим только один заголовок - собственно авторизацию которая все же работает! В таком варианте, без дополнительных заголовков, сервер IBM отдаст нам поток в аудио формате  .ogg. Да и черт бы с ним, думаем мы, давайте сначала заставим работать хоть что-то. Оставим тщетные попытки дополнительными заголовками отформатировать поток в wav и разберемся с .ogg (вот, кстати, похожая непонятка с синтаксисом WebRequest'а  https://www.mql5.com/en/forum/310891#comment_16643324 ) 

Скрипт авторизовывается на сервере и подвисает. Ок, запустим в режиме отладки, что-ли...

видно, нет? )

 


Мы скидываем скрипт с графика, но он, почему-то, не прекращает выполнение полностью, а лишь прерывает синхронный WebRequest и продолжается, что в целом нам на руку.

Идем дальше. В char result[] у нас теперь поток .ogg и мы записываем его в файл.

Файл получается размером тоже 6Kb (тоже, потому что запрос curl или postman, как кому больше нравится, с теми же параметрами возвращает .ogg файл размером 6Kb, который проигрывается как надо! Хорошо слышно слово Test )))) 


Теперь записываем весь char массив в файл. Спецом указываем, что нужно не мерять размер массива, а брать WHOLE_ARRAY

Вот так красиво теперь:

Вот только проблема, curl файл проигрывается нормально, а наш файл, почему-то нет

Давайте заглянем внутрь обоих файлов



Файл, скачанный curl внизу, залитый с WebRequest потока в бинарник вверху

Видите эти вкрапления 00000089, 00000004 в верхнем файле testmql5.ogg? ))) Это бонусная программа такая, что-ли? ))) Откуда это все взялось ))))))))


Суммирую

1. Синтаксис для меня по-прежнему загадка. Удалось только авторизоваться на серваке, попытки добавить другие заголовки пока неудачны

2. То ли WebRequest принимает поток с вкраплениями, то ли я его записываю в файл неправильно, но формат .ogg файла полученного из char массива result методом WebRequest - неверен

Тухлые помидоры приветствуются! 

Send headers via WebRequest()
Send headers via WebRequest()
  • 2019.04.15
  • www.mql5.com
Hi, I am trying to use WebRequest to send a header and get a response. Basically I have the follow parameters: url: "http://www.b3.com.br/main...
 
Alexsandr San:

 с этого сайта  https://example-files.online-convert.com/audio/wav/example.wav

загружает этот файл "example.wav"

и после скачивания проигрывает             PlaySound("\\Files\\example.wav");

-------------------------------------------------

Только смысл, от этой функции ??? я думаю - ноль!

Alexsandr,

все здорово, спасибо! Но wav файл должен быть сгенерирован движком TTS (TextToSpeech)

 
Nikolai Karetnikov:

Alexsandr,

все здорово, спасибо! Но wav файл должен быть сгенерирован движком TTS (TextToSpeech)

я понял так - должно получится ???

Синтез в реальном времени
Отправив текст для синтеза, ваш сервис или приложение сразу же получит в ответ аудиозапись: задержка настолько мала, что позволяет создавать программное обеспечение с потоковым воспроизведением.

Снимок

вот что то похожее https://cloud.yandex.ru/docs/speechkit/tts/request

 
Nikolai Karetnikov:

...

Суммирую

1. Синтаксис для меня по-прежнему загадка. Удалось только авторизоваться на серваке, попытки добавить другие заголовки пока неудачны

2. То ли WebRequest принимает поток с вкраплениями, то ли я его записываю в файл неправильно, но формат .ogg файла полученного из char массива result методом WebRequest - неверен

Тухлые помидоры приветствуются! 

Давайте рассуждать логически. Александр показал, что скрипт нормально загружает и проигрывает файл с другого сервера. Следовательно, вебреквест настроен верно. Проблема только в специфике сервера IBM. В особенностях их ответов на запросы.