und wieder dll und Markt - Seite 18

 

Ich glaube, ich komme mit der Genehmigung weiter.

Реter Konow:

Fragen Sie also Roman, wie man die Autorisierung auf dem IBM-Server mitWebRequest durchführt, das ist die Schlüsselfrage!

Roman, danke für den Kommentar! Ich denke, wir werden auch mit der Genehmigung zurechtkommen.

Nun zu ein paar Parametern. In der Hilfe zu WebRequest heißt es

[in] Abfragekopfzeilen des Typs "Schlüssel: Wert", getrennt durch einen Zeilenumbruch "\r\n".

Die Variable headers selbst ist vom Typ string

Was meinen Sie damit, dass die Zeichenfolge ein Zeilenumbruchzeichen enthält, d. h. das Ende der Zeichenfolge?

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:

Sie haben sicher recht, und der Screenshot von postman, wo das Ausgabepaar in den http-Request-Header geschrieben wird, ist anders erklärt )

ich vermute, dass wir immer noch über dieselbe Sache sprechen, nur mit anderen Worten )

Ich weiß nicht, wie schlecht Postman geschrieben ist, was es ist, und was es mit Ihrem Problem zu tun hat...

aber 90% werden durch Lesen gelöst, und es liegt an der Person, die das Problem löst, es zu lesen.

Es ist eine ziemlich typische Sache - es gibt Dokumentation von Rest-API-Dienst (haben Sie es übrigens gelesen??), Sie haben Glück, dass sie ein Beispiel mit curl und keine Notwendigkeit, andere Sprachen zu parsen gab... und Sie müssen WebRequest MT verwenden.

Curl startet, das Protokoll wird auf dem Bildschirm angezeigt - welche Header von Parametern generiert und gesendet werden, was zurückkommt, wie es verstanden wird und wo es abgelegt wird.

Und es ist direkt sichtbar, was an WebRequest gesendet werden soll

---

 
Maxim Kuznetsov:

Ich weiß nicht, wie schlecht der Postbote geschrieben ist, was er ist oder was er mit Ihrem Problem zu tun hat...

aber 90% werden durch Lesen gelöst, und es liegt an der Person, die das Problem löst, es zu lesen.

Es ist eine ziemlich typische Sache - es gibt Dokumentation von Rest-API-Dienst (haben Sie es übrigens gelesen??), Sie haben Glück, dass sie ein Beispiel mit curl und keine Notwendigkeit, andere Sprachen zu parsen gab... und Sie müssen WebRequest MT verwenden.

Curl startet, das Protokoll wird auf dem Bildschirm angezeigt - welche Header von Parametern generiert und gesendet werden, was zurückkommt, wie es verstanden wird und wo es abgelegt wird.

Und es ist direkt sichtbar, was an WebRequest gesendet werden soll

---

lesen, lesen ) Wir finden es heraus und machen Fortschritte.

 
Nikolai Karetnikov:

Ich glaube, ich komme mit der Genehmigung weiter.

Roman, danke für deinen Kommentar! Ich denke, wir werden auch mit der Genehmigung zurechtkommen.

Nun zu ein paar Parametern. In der Hilfe zu WebRequest heißt es

[in] Abfrageüberschriften des Typs "Schlüssel: Wert", getrennt durch einen Zeilenumbruch "\r\n".

Die Variable headers selbst ist vom Typ string

Was meinen Sie damit, dass die Zeichenfolge ein Zeilenumbruchzeichen enthält?

Die Kopfzeile kann mehr als eine Schlüssel/Wert-Zeichenkette enthalten, daher wird ein Zeilenumbruch verwendet.
Die doppelte Silbentrennung"\r\n\r\n" muss am Ende der Kopfzeile stehen.
So versteht der Server das Ende des Headers, was ein http-Standard ist.
Nach der doppelten Silbentrennung folgt der Text der Anfrage oder Antwort.

Die
FunktionWebRequest trennt diese Blöcke der Einfachheit halber.
Für Header ein eigener Parameter, für den Body ein eigener.
Aber die Syntax des Schreibens der Anfrage, erfordert die Einhaltung der Norm http.

 
Machen Sie weiter, Leutnant.
 

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

von dieser Websitehttps://example-files.online-convert.com/audio/wav/example.wav

lädt diese Datei "example.wav" herunter

und nach dem Herunterladen spielt esPlaySound("\\Files\\\example.wav") ab;

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

Aber die Bedeutung dieser Funktion ist nicht klar. Das glaube ich nicht!

 

Nun, meine Herren, lassen Sie uns weitermachen, ja?


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


Zunächst einmal sollten wir den Code der Anfrage selbst so weit wie möglich vereinfachen. Lassen wir nur eine Kopfzeile übrig - die Genehmigung selbst, die immer noch funktioniert! In diesem Fall liefert uns der IBM-Server ohne zusätzliche Header einen Stream im .ogg-Audioformat. Zum Teufel damit, denken wir, lasst uns erst einmal etwas auf die Beine stellen. Lassen Sie uns aufgeben vergebliche Versuche zu formatieren Stream zu wav mit zusätzlichen Header und befassen sich mit .ogg (übrigens, ähnlichen Fehler mit WebRequest Syntaxhttps://www.mql5.com/en/forum/310891#comment_16643324 )

Das Skript wird beim Server angemeldet und bleibt hängen. Ok, lassen wir es im Debug-Modus laufen oder so...

sehen, nicht wahr? )


Wir lassen das Skript aus dem Graphen fallen, aber aus irgendeinem Grund stoppt es die Ausführung nicht vollständig, sondern unterbricht nur die synchrone WebRequest und fährt fort, was im Allgemeinen zu unserem Vorteil ist.

Weiter geht's. In char result[] haben wir jetzt einen .ogg-Stream und schreiben ihn in eine Datei.

Die Datei erhält auch 6Kb (auch, weil die Abfrage von curl oder postman mit denselben Parametern eine 6Kb .ogg-Datei zurückgibt, die korrekt abgespielt wird! Gut zu hören das Wort Test ))))


Jetzt schreiben wir alle char-Arrays in eine Datei. Geben Sie speziell an, dass wir nicht die Array-Größe messen, sondernWHOLE_ARRAY nehmen sollen.

So sieht es jetzt aus:

Das einzige Problem ist, dass die Curl-Datei problemlos abgespielt wird, unsere Datei aber aus irgendeinem Grund nicht.

Werfen wir einen Blick in beide Dateien



Unten mit curl heruntergeladene Datei, oben aus dem WebRequest-Stream in die Binärdatei gefüllt

Sehen Sie diese Blobs 00000089, 00000004 in der oberen Datei testmql5.ogg? ))) Ist es ein Bonusprogramm oder was? ))) Woher kommt das alles? ))))))))


Zusammenfassend

1. Die Syntax ist mir immer noch ein Rätsel. Es ist nur gelungen, sich beim Server zu authentifizieren, Versuche, andere Header hinzuzufügen, sind bisher fehlgeschlagen

2. Ich frage mich, wenn WebRequest Stream mit Sprinkles empfängt, oder ich schreibe es in eine Datei falsch, aber das .ogg-Dateiformat aus char Array Ergebnis mit WebRequest-Methode erhalten ist falsch.

Faule Tomaten willkommen!

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:

von dieser Websitehttps://example-files.online-convert.com/audio/wav/example.wav

lädt diese Datei "example.wav" herunter

und nach dem Herunterladen spielt esPlaySound("\\Files\\\example.wav") ab;

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

Aber die Bedeutung dieser Funktion ist nicht klar. Ich glaube nicht, dass das Sinn macht!

Alexsandr,

Das ist großartig, danke! Aber die wav-Datei sollte von der TTS-Engine (TextToSpeech) erzeugt werden

 
Nikolai Karetnikov:

Alexsandr,

Alles großartig, danke! Aber die wav-Datei sollte von einer TTS-Engine (TextToSpeech) erzeugt werden.

Ich habe es verstanden - es sollte funktionieren.

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

Foto von

Hier ist etwas Ähnlicheshttps://cloud.yandex.ru/docs/speechkit/tts/request

 
Nikolai Karetnikov:

...

Zusammenfassende Darstellung

1. Die Syntax ist mir immer noch ein Rätsel. Es ist nur gelungen, sich beim Server zu authentifizieren, Versuche, andere Header hinzuzufügen, waren bisher erfolglos

2. Ich frage mich, wenn WebRequest Stream mit Sprinkles empfängt, oder ich schreibe es in eine Datei falsch, aber das .ogg-Dateiformat aus char Array Ergebnis mit WebRequest-Methode erhalten ist falsch.

Faule Tomaten willkommen!

Lassen Sie uns logisch denken. Alexander hat gezeigt, dass das Skript die Datei ganz normal vom anderen Server herunterlädt und abspielt. Webrequest ist also korrekt eingerichtet. Das einzige Problem sind die Besonderheiten des IBM-Servers. Die Eigenheiten ihrer Antworten auf Anfragen.