e di nuovo dll e mercato - pagina 18

 

Credo di aver trovato qualcosa con l'autorizzazione.

Реter Konow:

Quindi chiedete a Roman come fare l'autorizzazione sul server IBM conWebRequest, questa è la domanda chiave!

Roman, grazie per il commento! Penso che ce la faremo anche con l'autorizzazione.

Ora alcuni parametri. Nell'aiuto su WebRequest è indicato

[intestazioni di query del tipo "chiave: valore", separate da un'interruzione di riga "\r\n".

La variabile headers stessa è di tipo stringa

Cosa vuol dire che la stringa contiene un carattere di interruzione di riga, cioè la fine della stringa?

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:

devi avere ragione, e lo screenshot di postman, dove la coppia di output è scritta nell'intestazione della richiesta http è spiegata diversamente )

Ho il sospetto che stiamo ancora parlando della stessa cosa, ma con parole diverse )

Non so quanto male sia scritto postino, cosa sia, e cosa abbia a che fare con il tuo problema...

ma il 90% si risolve leggendo, e sta alla persona che risolve il problema leggere.

È una cosa abbastanza tipica - c'è la documentazione del servizio Rest-API (l'hai letta a proposito??), sei fortunato che hanno dato un esempio con curl e non c'è bisogno di analizzare altre lingue... e devi usare WebRequest MT.

Il curl inizia, il protocollo viene mostrato sullo schermo - quali intestazioni di parametri vengono generate e inviate, cosa viene ricevuto indietro, come viene compreso e dove viene messo.

Ed è direttamente visibile cosa inviare a WebRequest

---

 
Maxim Kuznetsov:

Non so quanto male sia scritto il postino, cosa sia, o cosa abbia a che fare con il tuo problema...

ma il 90% si risolve leggendo, e sta alla persona che risolve il problema leggere.

È una cosa abbastanza tipica - c'è la documentazione del servizio Rest-API (l'hai letta a proposito??), sei fortunato che hanno dato un esempio con curl e non c'è bisogno di analizzare altre lingue... e devi usare WebRequest MT.

Il curl inizia, il protocollo viene mostrato sullo schermo - quali intestazioni di parametri vengono generate e inviate, cosa viene ricevuto indietro, come viene compreso e dove viene messo.

Ed è direttamente visibile cosa inviare a WebRequest

---

leggere, leggere ) Si sta cercando di capire e si stanno facendo progressi.

 
Nikolai Karetnikov:

Credo di aver trovato qualcosa con l'autorizzazione.

Roman, grazie per il commento! Penso che ce la faremo anche con l'autorizzazione.

Ora alcuni parametri. Nell'aiuto su WebRequest dice

[intestazioni di query del tipo "chiave: valore", separate da un'interruzione di riga "\r\n".

La variabile headers stessa è di tipo stringa

Cosa vuol dire che la stringa contiene un carattere di interruzione di linea, cioè un carattere di interruzione di linea?

L'intestazione può contenere più di una stringa chiave/valore, quindi viene usata un'interruzione di riga.
Il doppio trattino"\r\n\r\n" deve essere messo alla fine dell'intestazione.
Questo è il modo in cui il server capisce la fine dell'intestazione, che è uno standard http.
Dopo il doppio trattino viene il corpo della richiesta o della risposta.

La
funzioneWebRequest separa questi blocchi per comodità.
Per le intestazioni il proprio parametro, per il corpo il proprio.
Ma la sintassi di scrittura della richiesta, richiede il rispetto dello standard http.

 
Continui, tenente.
 

//+------------------------------------------------------------------+
//|                                                   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);
     }
  }
//+------------------------------------------------------------------+

da questo sitohttps://example-files.online-convert.com/audio/wav/example.wav

scarica questo file "example.wav".

e dopo averlo scaricato, suonaPlaySound("\files\example.wav");

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

Ma il significato di questa funzione non è molto chiaro. Non credo proprio!

 

Bene, signori, andiamo avanti, va bene?


//+------------------------------------------------------------------+
//|                                                   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);
     }
  }
//+------------------------------------------------------------------+


Prima di tutto, semplifichiamo il più possibile il codice della richiesta stessa. Lasciamo solo un'intestazione - l'autorizzazione stessa, che funziona ancora! In questo caso, senza alcuna intestazione aggiuntiva, il server IBM ci darà un flusso nel formato audio .ogg. Al diavolo, pensiamo, facciamo funzionare qualcosa prima. Abbandoniamo i futili tentativi di formattare il flusso in wav con intestazioni aggiuntive e occupiamoci di .ogg (a proposito, errore simile con la sintassi di WebRequesthttps://www.mql5.com/en/forum/310891#comment_16643324 )

Lo script viene registrato nel server e si blocca. Ok, eseguiamolo in modalità debug o qualcosa del genere...

vedere, no? )


Eliminiamo lo script dal grafico, ma per qualche motivo non smette di essere eseguito completamente, semplicemente interrompe la WebRequest sincrona e continua, il che è generalmente a nostro vantaggio.

Andiamo avanti. In char result[] abbiamo ora un flusso .ogg e lo scriviamo in un file.

Anche il file ottiene 6Kb (anche perché la query di curl o postman con gli stessi parametri restituisce un file .ogg di 6Kb, che suona correttamente! È bello sentire la parola Test ))))


Ora scriviamo tutto l'array di char nel file. Specialmente specificare che non dovremmo misurare la dimensione dell'array, ma prendereWHOLE_ARRAY.

Ecco come appare ora:

L'unico problema è che il file curl funziona bene, ma il nostro file, per qualche motivo, no.

Guardiamo all'interno di entrambi i file



File scaricato da curl in basso, riempito dal flusso WebRequest in binario in alto

Vedi questi blob 00000089, 00000004 nel file superiore testmql5.ogg? ))) È un programma di bonus o cosa? ))) Da dove viene tutto questo ))))))))


Riassumendo

1. La sintassi è ancora un mistero per me. È riuscito solo ad autenticarsi al server, i tentativi di aggiungere altre intestazioni sono falliti finora

2. mi chiedo se WebRequest riceve il flusso con spruzzi, o lo sto scrivendo su un file in modo errato, ma il formato del file .ogg ottenuto dal risultato di char array usando il metodo WebRequest non è corretto.

Pomodori marci benvenuti!

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:

da questo sitohttps://example-files.online-convert.com/audio/wav/example.wav

scarica questo file "example.wav".

e dopo averlo scaricato, suonaPlaySound("\files\example.wav");

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

Ma il significato di questa funzione non è molto chiaro. Non credo che abbia alcun senso!

Alexsandr,

è fantastico, grazie! Ma il file wav dovrebbe essere generato dal motore TTS (TextToSpeech)

 
Nikolai Karetnikov:

Alexsandr,

Tutto fantastico, grazie! Ma il file wav dovrebbe essere generato dal motore TTS (TextToSpeech)

Ce l'ho, dovrebbe funzionare, ma non è possibile.

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

Foto di

Ecco qualcosa di similehttps://cloud.yandex.ru/docs/speechkit/tts/request

 
Nikolai Karetnikov:

...

Riassumendo

1. La sintassi è ancora un mistero per me. È riuscito solo ad autenticarsi al server, i tentativi di aggiungere altre intestazioni sono falliti finora

2. mi chiedo se WebRequest riceve il flusso con spruzzi, o lo sto scrivendo su un file in modo errato, ma il formato del file .ogg ottenuto dal risultato di char array usando il metodo WebRequest non è corretto.

Pomodori marci benvenuti!

Pensiamo in modo logico. Alexander ha mostrato che lo script scarica e riproduce il file dall'altro server normalmente. Quindi, webrequest è impostato correttamente. L'unico problema sono le specifiche del server IBM. Le peculiarità delle loro risposte alle richieste.