y de nuevo dll y el mercado - página 18

 

Creo que estoy llegando a algo con la autorización.

Реter Konow:

Así que pregúntale a Roman cómo hacer la autorización en el servidor de IBM conWebRequest, ¡esa es la pregunta clave!

Roman, ¡gracias por el comentario! Creo que también nos las arreglaremos con la autorización.

Ahora sobre algunos parámetros. En la ayuda de WebRequest se indica

[en] Cabeceras de consulta del tipo "clave: valor", separadas por un salto de línea "\r\n".

La propia variable headers es de tipo string

¿Qué quiere decir que la cadena contiene un carácter de salto de línea, es decir, el final de la cadena?

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:

debes tener razón, y la captura de pantalla de postman, donde el par de salida se escribe en la cabecera de la solicitud http se explica de manera diferente )

sospecho que seguimos hablando de lo mismo, pero con palabras diferentes )

No sé qué tan mal escrito está el cartero, qué es y qué tiene que ver con tu problema...

pero el 90% se resuelve leyendo, y es la persona que resuelve el problema la que debe leerlo.

Es algo bastante típico - hay documentación del servicio Rest-API (¿lo has leído por cierto?) , tienes la suerte de que dieron un ejemplo con curl y no hay que parsear otros lenguajes... y tienes que usar WebRequest MT.

El curl se inicia, el protocolo se muestra en la pantalla - qué cabeceras de parámetros se generan y envían, qué se recibe de vuelta, cómo se entiende y dónde se pone.

Y es directamente visible lo que hay que enviar a WebRequest

---

 
Maxim Kuznetsov:

No sé qué tan mal escrito está el cartero, ni qué es, ni qué tiene que ver con tu problema...

pero el 90% se resuelve leyendo, y es la persona que resuelve el problema la que debe leerlo.

Es algo bastante típico - hay documentación del servicio Rest-API (¿lo has leído por cierto?) , tienes la suerte de que dieron un ejemplo con curl y no hay que parsear otros lenguajes... y tienes que usar WebRequest MT.

El curl se inicia, el protocolo se muestra en la pantalla - qué cabeceras de parámetros se generan y envían, qué se recibe de vuelta, cómo se entiende y dónde se pone.

Y es directamente visible lo que hay que enviar a WebRequest

---

leer, leer ) Se están haciendo progresos.

 
Nikolai Karetnikov:

Creo que estoy llegando a algo con la autorización.

Roman, ¡gracias por el comentario! Creo que también nos las arreglaremos con la autorización.

Ahora sobre algunos parámetros. En la ayuda de WebRequest dice

[en] Cabeceras de consulta del tipo "clave: valor", separadas por un salto de línea "\r\n".

La propia variable headers es de tipo string

¿A qué te refieres con que la cadena contiene un carácter de salto de línea?

La cabecera puede contener más de una cadena de clave/valor, por lo que se utiliza un salto de línea.
El doble guión"\N" debe colocarse al final de la cabecera.
Así es como el servidor entiende el final de la cabecera, que es un estándar de http.
Después del doble guión viene el cuerpo de la solicitud o respuesta.

La
funciónWebRequest separa estos bloques por comodidad.
Para las cabeceras su propio parámetro, para el cuerpo el suyo propio.
Pero la sintaxis de escribir la solicitud, requiere el cumplimiento de la norma http.

 
Continúe, teniente.
 

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

de este sitio webhttps://example-files.online-convert.com/audio/wav/example.wav

descarga este archivo "example.wav"

y después de descargarlo, reproducePlaySound("\Files\\\\ de ejemplo.wav");

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

Pero el significado de esta función es el de una función de la que no se puede prescindir. ¡No lo creo!

 

Bueno, señores, sigamos adelante, ¿quieren?


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


En primer lugar, simplifiquemos al máximo el código de la propia solicitud. Dejemos sólo una cabecera: la autorización propiamente dicha, que sigue funcionando. En este caso, sin ninguna cabecera adicional, el servidor de IBM nos dará un flujo en formato de audio .ogg. Al diablo, pensamos, hagamos algo que funcione primero. Abandonemos los intentos inútiles de formatear el flujo a wav con cabeceras adicionales y tratemos con .ogg (por cierto, error similar con la sintaxis de WebRequesthttps://www.mql5.com/en/forum/310891#comment_16643324 )

El script se registra en el servidor y se cuelga. Bien, ejecutémoslo en modo de depuración o algo así...

¿Ves, no? )


Soltamos el script del gráfico, pero por alguna razón no deja de ejecutarse por completo, sino que interrumpe la WebRequest sincrónica y continúa, lo que generalmente nos beneficia.

Sigamos adelante. En char result[] tenemos ahora un flujo .ogg y lo escribimos en un archivo.

El archivo obtiene 6Kb también (además, porque la petición de curl o postman con los mismos parámetros devuelve un archivo .ogg de 6Kb, ¡que se reproduce correctamente! Es bueno escuchar la palabra Test ))))


Ahora escribimos toda la matriz de caracteres en el archivo. Especificar especialmente que no debemos medir el tamaño del array, sino tomarWHOLE_ARRAY.

Así es como se ve ahora:

El único problema es que el archivo curl se reproduce bien, pero nuestro archivo, por alguna razón, no.

Veamos el interior de ambos archivos



Archivo descargado por curl en la parte inferior, rellenado desde el flujo de WebRequest en el binario en la parte superior

¿Ves estas manchas 00000089, 00000004 en el archivo superior testmql5.ogg? ))) ¿Es un programa de bonos o qué? ))) ¿De dónde viene todo esto? ))))))))


Resumiendo

1. La sintaxis sigue siendo un misterio para mí. Sólo se ha conseguido autentificar al servidor, los intentos de añadir otras cabeceras han fallado hasta ahora

2. me pregunto si WebRequest recibe el flujo con salpicaduras, o si lo estoy escribiendo en un archivo de forma incorrecta, pero el formato de archivo .ogg obtenido del resultado de la matriz de caracteres mediante el método WebRequest es incorrecto.

Los tomates podridos son bienvenidos.

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:

de este sitio webhttps://example-files.online-convert.com/audio/wav/example.wav

descarga este archivo "example.wav"

y después de descargarlo, reproducePlaySound("\Files\\\\ de ejemplo.wav");

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

Pero el significado de esta función es el de una función de la que no se puede prescindir. ¡No creo que tenga ningún sentido!

Alexsandr,

es genial, ¡gracias! Pero el archivo wav debe ser generado por el motor TTS (TextToSpeech)

 
Nikolai Karetnikov:

Alexsandr,

Todo genial, ¡gracias! Pero el archivo wav debe ser generado por el motor TTS (TextToSpeech)

Lo tengo - debería funcionar ???

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

Foto de

aquí hay algo similarhttps://cloud.yandex.ru/docs/speechkit/tts/request

 
Nikolai Karetnikov:

...

Resumiendo

1. La sintaxis sigue siendo un misterio para mí. Sólo se ha conseguido autentificar al servidor, los intentos de añadir otras cabeceras han fallado hasta ahora

2. me pregunto si WebRequest recibe el flujo con salpicaduras, o si lo estoy escribiendo en un archivo de forma incorrecta, pero el formato de archivo .ogg obtenido del resultado de la matriz de caracteres mediante el método WebRequest es incorrecto.

Los tomates podridos son bienvenidos.

Pensemos con lógica. Alexander demostró que el script descarga y reproduce el archivo desde el otro servidor normalmente. Por lo tanto, la webrequest está configurada correctamente. El único problema es la especificidad del servidor de IBM. Las peculiaridades de sus respuestas a las peticiones.